diff --git a/capsite-checklist.md b/capsite-checklist.md index 517e7ce..d39051e 100644 --- a/capsite-checklist.md +++ b/capsite-checklist.md @@ -138,6 +138,30 @@ narrative. running webapp as the primary worker so its own port serves the form directly; revisit as the UI grows. - [ ] @endo/errors for structured error details (needs node_modules). +- [ ] **toybox: typed pieces that fit together, peer to peer** (working + name; tinker toys per the madmode.com home page). Kinds are typed + interfaces, à la Genode session interfaces, but wired by + introduction (E's Granovetter diagram), not a parent tree; named by + petnames; each piece guards its own resources. Why: + [the toybox user stories](toybox-stories.md). + - [ ] **T1. Changed signal**: a reader can subscribe to "this cache + changed" instead of polling (Genode's ROM-session sigh is the + model: public cache ≈ ROM, `/_publish` ≈ report). Fires on 1f's + head refresh when it upserts anything new. Shape TBD: a Cap'n Web + callback stub the cache holds (live only), or a durable + subscription it calls back via a webkey (survives eviction). + - [ ] **T2. Compose with [Blockly](https://developers.google.com/blockly)**: + connector checks (`setCheck(kind)`) are the shapes; a workspace + is a set of introductions. **Blocks refer to capabilities by + petname**, never by key: workspace JSON is shareable; the keys + live with whatever runs it. + - [ ] **T3. Run compositions in [Dynamic Workers](https://developers.cloudflare.com/dynamic-workers/)**: + code from anywhere: Blockly's JS generator, code written by + agents, by hand. Confinement makes codegen safe: the Worker + Loader isolate's `env` holds only the stubs its petnames resolve + to, with `globalOutbound: null`, so the code's authority is + exactly what it was handed. (Ordinary Workers forbid `eval`; + lifting that is the point of the Worker Loader.) ## How to run (continuation prompts) @@ -196,6 +220,7 @@ to every goal in this tree. ## Pointers +- [the toybox user stories](toybox-stories.md) — what the pieces are for - [the zotero goal tree](zotero-checklist.md) and [the social.coop goal tree](social-coop-checklist.md) — the next caches - [the capsite notes](capsite-notes.md) — the original goal and the EmDash diff --git a/toybox-stories.md b/toybox-stories.md new file mode 100644 index 0000000..a15b102 --- /dev/null +++ b/toybox-stories.md @@ -0,0 +1,74 @@ +# toybox user stories + +What the pieces are for. A goal in [the capsite checklist](capsite-checklist.md) +earns its place by serving one of these; architecture with no story +waits. + +## S1. Weekly roundup + +> Monday morning, I open madmode and find last week's bookmarks waiting +> as a draft roundup. I drop a few, add a line of commentary to a +> couple, and publish: 10 minutes, not an hour of copy-paste. + +[Weekly PESOS a la Tim Bray, madmode-blog#23](https://github.com/dckc/madmode-blog/issues/23). +Later sources join the same weekly shape: Zotero additions +([bib sync, madmode-blog#195](https://github.com/dckc/madmode-blog/issues/195); +[the zotero goal tree](zotero-checklist.md)) and social.coop posts +([the social.coop goal tree](social-coop-checklist.md)). + +- source: the diigo cache, read-only (public items) +- sink: a madmode draft post +- trigger: weekly, a human in the loop +- glue: editorial — the human picks and comments + +## S2. Album to album, unattended + +> Every time I add a photo to Google Photos album A, it shows up in +> Amazon Photos folder A' (so it's on the TV). + +[Copy on insert, IFTTT-style, endojs/playground#16](https://github.com/endojs/playground/issues/16); +context in [photo album on TV, madmode-blog#118](https://github.com/dckc/madmode-blog/issues/118). + +- source: Google Photos, read-only, **one album**, with a stream of + photos added to it +- sink: Amazon Photos, write to **one folder**, plus a read-only + view of it to avoid duplicates +- trigger: each insert, nobody watching +- glue: a one-line rule + +## S3. Drag photos to archive.org + +> I browse my Google Photos and drag the ones worth keeping onto an +> archive.org target, which publishes them. + +[The drag-and-drop comment on madmode-blog#118](https://github.com/dckc/madmode-blog/issues/118); +background in [archive.org and IPFS for the commons, madmode-blog#108](https://github.com/dckc/madmode-blog/issues/108). +The plugins should be "boring enough for an LLM to do most of the +work", given [ocap-discipline clues for LLMs, awesome-ocap#55](https://github.com/dckc/awesome-ocap/issues/55). + +- source: Google Photos, read-only +- sink: archive.org, post +- trigger: a human gesture (drag-and-drop) +- glue: a UI that holds both capabilities + +## What the stories share + +| need | S1 | S2 | S3 | goal | +|---|---|---|---|---| +| session-cookie read where the official API is closed | diigo | Google Photos | Google Photos | webapp (done for diigo) | +| a cache of what's been read | ✓ | ✓ | ✓ | 1c (done for diigo) | +| fresh data | ✓ | ✓ | | 1f | +| **narrowed capabilities** (one album, one folder, public only) | public only | ✓ | ✓ | *no goal yet* | +| a changed signal / stream of additions | | ✓ | | T1 | +| generated code, confined | | rule | plugins | T3 | +| visual composition | | | | T2 (no story yet: parked) | + +Notes: + +- Google's Photos Library API stopped serving a user's own library in + 2025 (only media the app itself uploaded), as far as we know; that's + the diigo situation again, and why #118 links a + [browser-console approach](https://github.com/Ninefrm/console-automation-google-photos/). + Check before building on it. +- S1 is the first to ship; S2 is the first unattended one, so it's + where T1 and narrowed capabilities stop being optional.