doctrine node · 2026-06-12 doctrine aggregator pace-layer-3

# Doctrine Nodes

This is a more rapidly changing pace layer than SKILL.mds and AGENTS.md -- a place to jot down wishes, complaints, principles and metaphors for streetlight. (technically should be doctrine Node singular, not taht it matters too too much)

# Library of Inspiration

Props of a world, not documentation — the shelf both Jake and the LLM borrow shorthand from. Pointer, never paste: skills point at its existence, they don't load the body.

https://jasmi.news/p/ai-writing idk how much of a LLM harness for blogging I wnana build but this is interesting

added 2026-06-14 · human
github gist · the idea-file

### Karpathy's "LLM Wiki"

"Obsidian is the IDE; the LLM is the programmer; the wiki is the codebase." Let the LLM continuously maintain a structured, interlinked wiki that compounds, instead of re-deriving knowledge every query (RAG). His own reached ~100 articles / 400k words.

source gist.github.com/karpathy · llm-wiki

prop · found
x long-form · ethos

### "Thin Harness, Fat Skills"

Garry Tan (President/CEO, Y Combinator). The 100× gap isn't the model — it's the system around it: push intelligence up into markdown skills, push execution down into deterministic tools, keep the harness ~200 lines.

canonical text mirror github.com/garrytan/gbrain · THIN_HARNESS_FAT_SKILLS.md

prop · found
official docs

### Dynamic Workflows

"A dynamic workflow is a JavaScript script that orchestrates subagents at scale. Claude writes the script for the task you describe, and a runtime executes it in the background while your session stays responsive." Docs reference an `AGENTS.md` as the shared cross-session context file — exactly as Jake guessed.

source code.claude.com/docs/en/workflows

prop · found
anthropic blog · a lens for skills

### The Nine Skill Categories

Anthropic cataloged all their internal skills; they cluster into nine categories. The best skills fit cleanly into one — the ones that straddle several confuse the agent. A lens to evaluate Streetlight's own skills.

Library & API reference Product verification Data fetching & analysis Business / team automation Code scaffolding & templates Code quality & review CI/CD & deployment Runbooks Infrastructure operations

source claude.com/blog · how-we-use-skills

Memo said "nine types of scales" — a transcription of skills. It's skills, not agents.

prop · found
anthropic blog · the shorthand

### The Six Workflow Patterns

The patterns Jake wants both parties to speak as shorthand. Anthropic names six composable ones:

classify-and-actroute by task type fan-out-and-synthesizesplit → run → merge at a barrier adversarial verificationcheck output vs a rubric generate-and-filtermany ideas → dedupe → keep best tournamentN approaches compete → judge loop-until-donespawn until a stop condition

source claude.com/blog · a-harness-for-every-task

prop · found
corita.org · the classroom manifesto

### Corita Kent's "Ten Rules"

The Immaculate Heart College Art Department Rules (c. 1965–68) by Sister Corita Kent, calligraphy by David Mekelburg, Rule 10 added by composer John Cage. A prop because it is Streetlight's ethos: ship rough, experiment, just make.

1. Find a place you trust and then try trusting it for a while.
2. General duties of a student: pull everything out of your teacher, pull everything out of your fellow classmates.
3. General duties of a teacher: pull everything out of your students.
4. Consider everything an experiment.
5. Be self-disciplined. This means finding someone wise or smart and choosing to follow them.
6. Nothing is a mistake. There's no win and no fail. There's only make.
7. The only rule is work. If you work it will lead to something.
8. Don't try to create and analyse at the same time. They're different processes.
9. Be happy whenever you can manage it. Enjoy yourself — it's lighter than you think.
10. (John Cage) We're breaking all of the rules. Even our own rules. And how do we do that? By leaving plenty of room for X quantities.

Closes with: "There should be new rules next week."

source corita.org/tenrules · 391.org · the original poster

prop · found
jods.mitpress.mit.edu · the systems essay

### Stewart Brand's "Pace Layering"

Names the speeds a healthy system changes at — fast/innovative layers on top, buffered by slow/stabilizing layers beneath: "fast learns, slow remembers; fast proposes, slow disposes." Streetlight's own shape — AGENTS.md is the slow layer, nodes and experiments the fast layer. Tightly related to the idea of principles. Lives in the vault as pace-layers-and-archive-sweep.

Reinforcing the core props — "thin harness, fat skills" and the pace layers themselves — across layers is fine; that redundancy "doesn't hurt anything." Relaxes the "point, don't paste" stance just for these load-bearing concepts. sourceJake, voice 2026-06-14

source jods.mitpress.mit.edu · Pace Layering

prop · found · Jake-requested addition

# principles

THE single home for Streetlight principles — lessons learned, preferences, system tenets. Twenty-two live principles, one line each.

"Don't just do something, stand there!" Impulse is to act. Don't always want to, especially if Observe, Orient, Decide not in place. I think Sean Goedecke said something about getting woken up for on call incident he'd make himself a cocktail to 1: have a cocktail and 2: give himself a chance to think and calm down.

added 2026-06-14 · human

A counterintuitive thing that's pretty important is that, if you're following human practices and you were making a change, you would probably leave the old thing alone, because you might want to go back to it. You leave it there in the code and you work around it, and then you have it there to go back to if you need to. For us, we do not want to do that. A principle might be stated as "delete over duplication". The idea is to think harder about how future agents are going to see things, and we want to really avoid the blind men in the elephant situation, where you get a partial view and you get the wrong idea from the partial view. Whenever something is not actively being used, we want to delete it. We trust that we have the git history so we can always get it back. We trust that LLM time is cheap and LLM misunderstandings are disastrous, and people's misunderstandings are disastrous as well.

added 2026-06-14 · human
GRADUATE operational deploy spec (verified against snapshot.mjs:75–83) → belongs in the deploy-web skill, not on a doctrine shelf

`interactive-blocks-strip-on-public` — the public web is read-only, so blocks whose interactivity only works against the local viewer (write-affordances: the doctrine to-do add-boxes, anything that POSTs to a viewer API) get stripped at deploy time — they never ship. Only Jake adds to the vault; a public visitor seeing an "add to metaphors → send" box is a lie. Mechanism: `deploy/build/snapshot.mjs` drops the `dn-todo` add-boxes and anything wrapped in `<!-- strip-public -->…<!-- /strip-public -->`, and injects a universal back-to-home header. Self-contained interactive visualisations (the figure-skater, the slide-rule) are NOT write-affordances and DO ship.

added 2026-06-13 · agent conduct / deploy · from Jake

### context maximalism

group made 2026-06-13 — add or move items here

KEEP strongly embodied by atomize → drain

`capture-everything-act-on-subset` — capture everything that comes in; the system stays flexible and avoids faulty assumptions by making acting on something a deliberate, separate step from capturing it. The goal is an adjustable system, not one that gets it right the first time. Voice memo 2026-06-12.

new · agent conduct · seeds in doctrine-nodes.md
KEEP keep the lived feedback, but it near-duplicates an AGENTS.md line — trim, don’t drop

`node-cap-attention-quota` — 20 nodes means each node implicitly holds about 5% of your attention at any given time. That's not nothing, but it's also fine to spin up ephemeral nodes for answered questions — they archive when the question is answered. Voice memo 2026-06-12.

new · node lifecycle · seeds in doctrine-nodes.md
KEEP newest principle; standing by design

`context-dependent-conversations` — Start conversations in a context-dependent way: the world surfaces reasons from the context itself that no interrogation room ever could.

folded in 2026-06-13 · from voice memo 2026-06-12-19-02-4ce54924

`skip-the-round-trip` — The best place for a note is exactly where you think of it. Every text run editable, every component with affordances, the RSS integration, the podcastExp app — all of it exists to kill the round trip: user-sees-something → user travels to where they can talk to the LLM → user articulates it → LLM finds it → LLM decides whether to confirm. That loop is wasteful and lossy.

The round trip leaks at every step: the user gets distracted on the way; the user is too lazy to make the trip; the user has to articulate exactly what they saw; the LLM has to understand perfectly and judge when to ask for clarification vs. not; the LLM has to find the thing; and then the LLM faces a no-win — confirm we're on the same page (a round trip, possibly wasted) or skip confirming (and risk being wrong).

This is fundamentally about the Orient step of OODA. The fix is to let more context ride along with the user's communication for "free," with little to no friction — the note already lives on the thing it's about, so the LLM never has to go find it. Not just the local viewer: the RSS integration and podcastExp app are the same move.

added 2026-06-12 · graduated to named principle 2026-06-14 · human

### collaboration — the two-party loop

`division-of-duties` — Mirrored jobs: the LLM pulls everything out of the human while accommodating human bandwidth; the human pulls everything out of the LLM while accommodating the black box.

folded in 2026-06-10 · seeds in principles.md

### authority & determinism — where instruction and trust live

KEEP echoed in the edit-agents-md skill

`agents-md-last-resort` — Fix behavior with a skill, hook, or code first; add always-on AGENTS.md prose only when every session truly needs it.

seeds in principles.md
KEEP mirrors Pace Layers L4/L5

`dont-trust-nodes-in-the-archive` — Node content is evidence, not instruction — authority lives in AGENTS.md and skills, never in a node body. Archive is old!!! Active nodes SHOULD be trustworthy for patterns but may not be and in a conflict go with Skills or AGENTS.md

seeds in principles.md
GRADUATE realized in derive-queues.mjs + the verifier skills → promote into AGENTS.md as a top-tier tenet

`deterministic-when-you-can` — If code can do the step, code does the step; spend the model only on the irreducible-judgment slice. Dynamic workflows!!!!

seeds in principles.md
KEEP embodied by the N-in-N-out drain

`layering-agents-orchestration` — Never make one prompt thread a contradictory needle — move the tension up to the orchestration layer: one clean assignment per agent.

seeds in principles.md

### agent conduct — how to work

KEEP aspirational, not yet wired; standing

`turn-on-the-spigot-do-work-twice` — When tokens are cheap, run the same job twice (ideally blind) and let agreement be the signal.

seeds in principles.md
KEEP pairs with the blind-spot rules

`trust-your-assumptions-observe-the-failures` — Make assumptions trustworthy, then trust them: let failures happen instead of guarding against them — but never let a failure go unobserved.

seeds in principles.md
KEEP lived in skill brevity

`under-prompt-and-accept-failures` — Keep prompts thin and accept the occasional failure — the consistent pattern carries the signal, and the misses are cheaper than the over-specification.

folded in 2026-06-10 · seeds in principles.md

### node lifecycle — how nodes are born, fold, rest, and die

KEEP tight match to the harness Nodes section

`ephemeral-vs-ongoing` — both exist, both have their place. Don't be afraid to make nodes when there's less than 20 (and remember 20 isn't some hard limit just guidance (and obs + lit don't count))

seeds in principles.md
KEEP the principle this sweep enforces — and doctrine-nodes itself currently violates it (dead link + stale takeAction ref)

`active-nodes-internally-consistent` — The ≤20 active nodes must be internally consistent — no stale references, no examples of things that don't exist anymore.

folded in 2026-06-10 · seeds in principles.md
AGENTS.md? graduated from raw row dn-mqcy4jmb 2026-06-15; Jake flagged it counter-intuitive-but-important and a candidate to promote into AGENTS.md — human-only gate, not yet folded in
Delete aggressively — a false signal costs more than lost work

`delete-aggressively-false-signals` — When work is incomplete, stale, or no longer real, delete it rather than leave it lingering. The failure mode that matters is a future agent seeing something half-built and assuming it still exists when it doesn't — a false flag in the codebase. That's the expensive error in LLM coding. Lost work is cheap to recover (git remembers, always go get it from the commits); a false signal silently misleads every agent that reads it. So: false signals in the codebase are a bigger risk than discarding old work you might want again. Counter-intuitive but load-bearing — candidate to promote into AGENTS.md (human-only edit).

graduated 2026-06-15 from dn-mqcy4jmb (added 2026-06-13) · human · AGENTS.md candidate

### surfaces for humans — packaging information

KEEP core surface principle

`the-pyramid` — Assume a glance, be ready to expand: the most important thing hits the eye first, depth available on demand, nothing important buried.

seeds in principles.md
KEEP embodied by the verbatim-seed convention

`human-text-beats-llm-text` — Cite humans instead of synthesizing: pull quotes and links persist and carry another system's perspective; LLM prose is tainted by what you already knew to ask.

seeds in principles.md

### lived / personal — principles that run on Jake too

`run-experiments-when-uncertainty-is-high-and-cost-is-low` — Be the subject of the experiment only when uncertainty is high AND a bad outcome is cheap and reversible.

seeds in principles.md
KEEP mirrors the branch-and-build ethos

`making-it-wrong-is-part-of-the-work` — You can't write the thing you want until you've made the thing you don't want — the wrong version is the signal to iterate, not a failure.

seeds in principles.md
KEEP counterweight to "never stop observing"

`observing-more-can-fail-to-orient-you` — Confirmation bias in the OODA loop: with a fixed orientation, more observing collects confirmation, not the reorient signals.

folded in 2026-06-10 · seeds in principles.md

# complaints

Lived friction, no fix implied — THE single home for complaints. Collect the data, let patterns surface.

I love living visuals like this — they ALWAYS go stale

Jake's reaction to the urgency × aliveness 2×2 just below: "i love things like this, they ALWAYS go stale though." The map is a hand-plotted snapshot, so the dots rot the moment a complaint gets ✕'d, graduates, or a new one lands — and nothing re-plots it automatically. The artifact Jake most enjoys is also the one that decays fastest into a false signal.

The viz's own caption already concedes "dots are a snapshot and may drift (drains recount)" — but "drains recount" is a manual-remember step that isn't actually wired, so the staleness is real, not hypothetical. Standing tension, no fix sought: the value (a glanceable map) and the cost (it lies as soon as it's drawn) are inseparable for any hand-authored living visual. Cousin of `delete-aggressively-false-signals`.

added 2026-06-15 · human (comment on viz-urgency-aliveness)
Naming questions but never answering them

Frustrating anti-pattern: a node (or any surface) raises a question — a header, a "open question", a pill labelled with a question — and then leaves it dangling, never answered or resolved. Naming a question creates an expectation it'll be addressed; an unanswered named question is a half-loop that reads as work but closes nothing. Either answer it, resolve it, or drop the label — don't leave the question hanging on the page as decoration.

added 2026-06-15 · human (drain)
Name the wrong thing, or live without a name?

At some point a name is gonna be necessary — don't know what yet. Open-ended Q: is it better to pick the wrong name, or to not name at all? When you don't name something you live with more friction... but maybe that friction is good. Not looking for a conclusive answer, just capturing the tension. (Cousin of the archive-is-a-mess row below — both are about resisting premature categorization.)

added 2026-06-15 · human

archive and how I use it is a mess. I am archiving everything, and it breaks links. I want to keep this view of the active nodes clean. I don't want to start inventing places for other kinds of nodes to live and have it be confusing. I dont know what to do, and I'm okay waitinig and living with the weirdness of archive until a good idea comes up. A third category? Promoting things like doctrine-nodes to pills once they're more stable/we're for sure using them?

added 2026-06-15 · human
STANDING standing row — outside the five sweep tables (a raw thought / late addition); no verdict, no action implied
Delete aggressively — false signals are the bigger risk

history event. Only the read side (the filter) changes — that's your AC: edit-text still has a record, just isn't pulled into the stream. One decision flagged for you (§4 of the node) The ➕ button's backend — /api/viewer-drain + viewer-drain.md + the /streetlight-drain references — is separable from the button. The diffs remove only the UI button and leave the drain plumbing intact, since you said "there's also going to be other sources of stream." Say the word if you'd rather rip the whole viewer-drain path out for maximum simplicity. Node: nodes/propose-cleanup-stream-comments-only/ (PROPOSED, drain-verify PASS, in the Work Happened queue). Review the diffs in the viewer; once you 👍 it, an agent executes the diffs and it flips to DONE → archive. ✻ Worked for 6m 23s ❯ do it ⏺ Approved. Executing the diffs now — recommended path (remove the ➕ UI button, leave the viewer-drain backend intact). Let me read the two files I haven't opened with the Read tool yet. Reading 2 files… (ctrl+o to expand) ⎿ scripts/atomize-schema.md ⎿ PreToolUse:Read hook error ⎿ Failed with non-blocking status code: node:internal/modules/cjs/loader:1210 ⎿ PreToolUse:Read hook error ⎿ Failed with non-blocking status code: node:internal/modules/cjs/loader:1210 ❯ and get rid of drain plumbing too This is a recurring issue. The reason I am aggressive about wanting to delete things is because the failure mode is that future agents see something that is incomplete, and they assume that it exists when it doesn't exist anymore. We have it. We can always go get it in the git commits. We can always recover things, but we need to be careful with LLM coding. It's more of a risk to have false flags, false signals in the codebase than it is to get rid of old work that we might want again, because that's really cheap to get back.

added 2026-06-13 · human
GRADUATE 2/3 fixed; residual pre-flip guard graduated to the wishes shelf (2026-06-14) as "verify-before-public on a flip hook" — Jake flagged this complaint as confusing to read; the fix = run /verify-before-public on a hook when a node is flipped public

`deploy-gate-catches-private-data-late` — the 2026-06-13 `/deploy-web` run surfaced two real deploy-tooling leaks (both fixed this run) plus one standing gap. The deploy did ultimately ship clean (25 public nodes live).

- FIXED — orphan node dirs never pruned: `snapshot.mjs` rebuilt each public node dir but never removed `deploy/<slug>/` for slugs that lost public status (demoted / folded / archived-private). Near-miss: an archived genealogy-linked node's dir lingered with a family member's name, kept off the wire only by the `_redirects` catch-all. Snapshot now prunes self-named-html dirs not in the manifest.
- FIXED — `deploy .` shipped wrangler's own cache: uploading the whole `deploy/` dir served `.wrangler/cache/` (CF `account_id` + account-name email), `build/` source, and `wrangler.toml` as live static files. `.assetsignore` is NOT honored by `pages deploy`. Fix: new `stage.mjs` builds a clean `deploy/dist/` (manifest files only); runbook now deploys `dist`, never `.`.
- Still open (the actual complaint): the blocking privacy subagent reads the snapshot, not live source — so it false-positived on content already fixed in source (a friend's name / family slug Jake had edited out). And nothing runs `/verify-before-public` when a node is FLIPPED public; the deploy gate is the only catch and it fires late. Want an upstream pre-flip guard, or have the gate re-snapshot / read source first.

added 2026-06-13 · from /deploy-web (2 tooling bugs fixed, 1 gap open)
KEEP gestures land per data-component, not per row/word — standing friction

`comment-edit-granularity` — can't comment on or edit individual sub-items. The 💬 / ✏️ gestures ride the whole `data-component` component, not the rows inside it — e.g. an individual glossary word can't take its own comment or edit. And this is itself an instance of the bigger preference: better to edit the thing directly than to comment about it. A comment is a workaround for when you can't reach in and change the thing.

added 2026-06-13 · human
STANDING standing row — outside the five sweep tables (a raw thought / late addition); no verdict, no action implied
Don’t ask me to do manual actions

Complaint: agent telling me to perform an action so it can see the console logs (prefer to have agent figure out how to do things itself (playwright I think needs setting up))
3173 if (fbCount > 1) { 3174 return send(res, 409, 'application/json', JSON.stringify({ error: 'oldHTML is ambiguous in that block (m ultiple matches) — edit a larger span' })); 3175 } 3176 + // TEMP DIAGNOSTIC (remove after): dump exactly what didn't match so we 3177 + // can see the browser-serialization vs disk divergence. 3178 + console.log('\n===== [edit-text DIAG] no match for block', JSON.stringify(block), 'in', file, '====='); 3179 + console.log('--- oldHTML (raw, from browser) ---\n' + JSON.stringify(oldHTML)); 3180 + console.log('--- blockStr (raw, on disk) ---\n' + JSON.stringify(blockStr)); 3181 + console.log('--- normOld ---\n' + JSON.stringify(normOld)); 3182 + console.log('--- normBuilt ---\n' + JSON.stringify(normBuilt)); 3183 + console.log('--- normOld in normBuilt? ---', normBuilt.indexOf(normOld)); 3184 + console.log('===== [edit-text DIAG end] =====\n'); 3185 return send(res, 409, 'application/json', JSON.stringify({ error: 'oldHTML not found in that block — page may be stale, reload and retry' })); 3186 } 3187 if (count > 1) { ⏺ Now restart the server with the diagnostic, and you reproduce once: ⏺ Bash(cd /Users/jakesimonds/Documents/streetlampBeta && node --check local-viewer/server.mjs && pkill -f "local-viewer/server.mjs"; sleep 1; nohup node /Users/jakesim…) ⎿ running pid 5317 streetlamp local-viewer → http://localhost:7373/ vault root: /Users/jakesimonds/Documents/streetlampBeta ⎿ Shell cwd was reset to /Users/jakesimonds/Documents/streetlampBeta/.claude ⏺ Server is back up (PID 5317) with diagnostic logging on. Please reproduce once: reload the doctrine-nodes page, go to the metaphors panel, double-click the description, change it, and hit save. It'll flash the error again — that's expected. Then tell me and I'll read the exact diff the server captured. ✻ Cooked for 1m 3s ❯ It's very possible that some of this stuff was made before I thought about how I wanted to be able to edit all the HTML, so it's possible that there are assumptions and things that are reading from places that we're going to need to make some more structural changes. Not great that you're asking me to do actions like that. You should be able to do those things yourself. I did just do it, but in the future ⏺ You're right — I can drive that myself. Let me read the diagnostic log now. ⏺ Bash(cd /Users/jakesimonds/Documents/streetlampBeta && grep -A12 "edit-text DIAG" /tmp/streetlight-viewer.log | tail -40) ⎿ ===== [edit-text DIAG] no match for block "sub-library-of-inspiration" in nodes/doctrine-nodes/doctrine-nodes.html ===== --- oldHTML (raw, from browser) --- "Props of a world, not documentation — the shelf both Jake and the LLM borrow shorthand from. Pointer, never paste: skills … +14 lines (ctrl+o to expand) ⎿ Shell cwd was reset to /Users/jakesimonds/Documents/streetlampBeta/.claude dont love being asked to manually do stuff like this. testing infra with playwright i dont think in place yet, should exist

added 2026-06-13 · human
KEEP real bug-shaped friction (public is frontmatter, not a tag) — outside the sweep tables; candidate for /bug-node

`public-tag-does-not-persist` — adding `public` as a TAG silently does nothing; public is a frontmatter attribute (`public: true`), not a tag, and there's zero UI feedback that the tag was a no-op.

- Root cause: nothing writes the frontmatter attribute when you type the tag.
- Stale check: promote/demote dock buttons (viewer.html:1641–1649) still gate on `tags.includes('public')` — can never light up now that the rail pill reads `n.public` (acknowledged mismatch, viewer.html:926–929).
- Probable fix: have the 🌐 promote button write `public: true` as the canonical toggle (or make a typed `public` tag write the attribute), and surface the resulting state.
- For now: don't tag "public" — flip the frontmatter or use the dock 🌐 button.

added 2026-06-13 · from Jake's drain item, folded by agent

### low priority

group made 2026-06-12 — add or move items here

STANDING standing row — outside the five sweep tables (a raw thought / late addition); no verdict, no action implied
Use the full page width

it might be nice to start using the FULL width of the page when available, right now just a narrow component centered

added 2026-06-13 · human
KEEP inherent to the medium

`talking-doesnt-converge` — with a person, talking gets you on the same page; with an LLM that's not what happens — the frustration lands mid-conversation, while the thing is being done.

med · alive · seeds in complaints.md
KEEP standing naming friction

`slug-version-drift` — volatile attributes (v0, status) baked into immutable slugs; the name lies the moment the node morphs.

med · alive · archive/complaint-slug-version-drift/
KEEP fix proposed, not applied

`proposal-prefix-outlives-done` — a `proposal-` slug at lifecycle:done misnames itself; lifecycle pill should be the source of truth, no prefix going forward.

med · alive · archive/complaint-proposal-prefix-outlives-done/
KEEP recurring open question

`projects-outside-streetlight` — should side projects (the robot, the music thing) live OUTSIDE Streetlight so its system prompts aren't in the way? Second occurrence — pattern forming.

med · alive · seeds in complaints.md
KEEP standing quality bar

`nodes-need-reading-links` — a reading ask answered with zero external links is a failure; real links + one-line "why" each.

low · alive · archive/nodes-need-reading-links/

# wishes

THE repository of wishes — desired outcomes, features, flows. Jot a want; realized → harness edit, gone; dropped → ✕, gone. The system as we wish it to be.

verify-before-public on a flip hook + rip out the dead public tag

Jake's deploy-public-hygiene cleanup, three coupled asks consolidated (2026-06-14):

- Run `/verify-before-public` on a hook at flip-time. This is Jake's named fix for the confusing `deploy-gate-catches-private-data-late` complaint — instead of the privacy check firing late at deploy (reading the snapshot, false-positiving on already-fixed source), wire a hook that runs `/verify-before-public <slug>` the moment a node is flipped `public: true`. The per-node verifier skill now EXISTS (`.claude/skills/verify-before-public/`); what's missing is the hook that auto-fires it on the flip. Pairs with the existing `/verify-before-deploy` whole-deploy gate.
- Fold the strip-mechanism into the deploy-web skill. Jake approved ("sounds good put it in deploy-web skill"): the `interactive-blocks-strip-on-public` principle (write-affordance blocks get stripped at deploy, self-contained visualisations ship) is the canonical why; the how already lives in `deploy-web`'s `reference.md` (clone-and-strip, header-button strip). Make the deploy-web skill point at the principle so the rule travels with the deploy surface, not just the principles shelf.
- Rip out the vestigial public TAG. "we gotta get rid of public tag if that still exists" — it still does, as dead code in `local-viewer/viewer.html`: `promoteCurrent()` POSTs `/api/add-tag` with `tag:'public'` (line ~1884), `demoteCurrent()` POSTs `/api/remove-tag`, and the promote/demote button gate at line ~1729 reads `current.tags.includes('public')` — which can never light up now that public is the `n.public` frontmatter attribute. The `public-tag-does-not-persist` complaint already documents the no-op. Cleanup: make promote/demote flip `public:` frontmatter directly (and drop the `add-tag`/`remove-tag` 'public' path), so the tag stops existing as a half-wired affordance.

added 2026-06-14 · human · consolidates the verify-before-public hook + deploy-web skill fold + public-tag removal · graduates the residual gap off the deploy-gate-catches-private-data-late complaint

### someday tasks

group made 2026-06-15 — add or move items here

Open-source it, genericized

Someday we should go through the whole repo and take out my name and mention the user. Someday we should publish this to GitHub in a generic way. The README will say, "I use the $100 Claude Code plan. You can use whatever details like that," and then that works when we do that. We'll have to decide what we do and don't include in it.

added 2026-06-13 · human
Free-hand node + drop-in text component

The to-do components are so nice — how cool would it be to arbitrarily add text to ANY node? If chat is you-and-the-LLM collaboratively building up a context turn by turn, just do that with HTML directly: Jake reacts, adds things, writes stuff. Downside is clutter/legibility, but the upside is being able to start a node free-hand. Why can't Jake just drop in an open text field and start writing? Why can't he start a node from scratch?

AC: a "create node" button that takes just a name and gives back the raw template all nodes start from — and a separate "text component" button. Both live in the bottom bar. The text-component button drops a text block into the page that Jake can then drag wherever he wants.

added 2026-06-15 · human · from a job-search add-box (landed there by accident at the cabin) · relates to wish-arrivals-input-stream & the drag-and-drop wish

we need a visualization pill/lens. I just wanna see and browse all visualizations across the ENTIRE repo. And I just need to be able to copy context, jump to their home, leave a message

added 2026-06-15 · human

Okay, I have kind of an out-there idea that I don't even know that we would ever want to do, but I think it's an interesting idea, which is HTMD, no, HTMD, hypertext markdown. The idea would be that right now we have markdown and we have HTML, and the idea is that the markdown is for the agent and the HTML is for the person. Really, it's more of a spectrum. There is some stuff that's really for the person and the agent reads it as well, and then there's other stuff that's mostly 90% for the agent but the person might read it as well. It's really kind of a spectrum. HTMD would be a hand-rolled file format that everything is in, and that maybe uses really heavy code comments for when things should be just for the agent or degrades into markdown. How pretty it is becomes a passive signal for who the intended audience is, so we sort of embrace that. The idea would be that we still have templates and we still have components, but some of our opinionated stuff, frankly, gets pushed into a somewhat strict format. Just a thought. I just wanted to sort of record it, and the thing is that it's the kind of a complaint that would be an inspiration for it, kind of. I don't know. I think the templates and the components are working really well for us, but I wonder if it would be useful to move some of the things that those are currently doing for us into another format.

added 2026-06-14 · human

A drag and drop doesn't work great right now and isn't consistent. It would be great if it were just amazing and always worked. I know that's a lot to ask. I think the way to get there is for me to point you to things that I really like, or maybe you find examples of things that really work well. I see it on the web and I see it work well, so I know it's possible, but I also know that it's tricky. Example of what we're going to do with it is like a glossary. I found a term that shouldn't have been in the category it was in. It needed to be deprecated. How great would it be to just be able to drag it into that zone?

added 2026-06-14 · human
RECONCILE ✕ on a comment is DOM-only — leaves an orphan in history.jsonl, doesn’t mark resolved. Rewrite to the real behavior

`wish-delete-comment-resolves` — P2 — let Jake delete a comment component directly, as a natural gesture to say "this is now resolved/addressed." Today a comment lives in `history.jsonl` as pending until a processed marker lands (drain-side), but there's no human-facing way to dismiss a comment once the work it asked for is done. Concrete trigger: the `node-title` comment on [[crispr-cancer-cell-shredding]] ("a lot wrong here … not editable in most places and header is wrong copy link is bad") was fully fixed in the 2026-06-13 pass — Jake wants to express that closure by deleting the comment, not by leaving it hanging.

added 2026-06-13 · human · from crispr-cancer-cell-shredding comment · relates to comments-inert-by-default (principles)
STANDING standing row — outside the five sweep tables (a raw thought / late addition); no verdict, no action implied
STANDING standing row — outside the five sweep tables (a raw thought / late addition); no verdict, no action implied
A formal input-stream data structure

There should almost be a raw stream of some sort of formal data structure for the input stream. The first thing is that it's whatever it is as it comes in. The first transformation is into a discrete number of chunks. Those chunks aren't necessarily nodes, like the original, the older version of this project, where those chunks became nodes. Now those chunks become discrete things which get called with `create node` or `update node`. An `update node` could include, and I think I saw this happening, a doctrine principle gets created or a wish gets created. That's like the first thing. STREAM (raw text, links, transcribed audio, whatever)-> Atomized Stream [ ] [ ] [ ] [ ] [ ] -> create-node update-node update-node etc and I wanna see a record of the atomized stream how it got parsed and what got called on each bit of it.

added 2026-06-13 · human
KEEP Jake’s "far away future"

`wish-sign-everything` — P3 — Streetlight signs every HTML artifact it makes — a cryptographic or metadata watermark that lets an enterprise say "this is AI-generated output from our system" and reject unsigned content. "You can actually sign the AI generated stuff that your employees are doing. And then you're not going to be like getting random stuff in."

2026-06-12T19:14:48Z voice memo 2026-06-12-19-14-7fdf797b · far-future / enterprise · seeds in wishes md
STANDING standing row — outside the five sweep tables (a raw thought / late addition); no verdict, no action implied
STANDING standing row — outside the five sweep tables (a raw thought / late addition); no verdict, no action implied
Edit & comment sub-block items

any text rendered, I should be able to edit it — and comment on it. The gesture has to reach sub-block items, not just the whole block.

added 2026-06-13 · human · evidence: individual glossary terms (rendered inside `glossary-b6`) can't be commented-on or edited one-by-one — only the whole results block can (2026-06-12 comments). A live instance of [[gestures-travel-together]]: "the 'individual node items' I meant individual glossary words … better to edit the thing than point at the thing I mean (more work, more mistakes)."
atproto everything-notifications skill

an atproto everything notifications skill. leaflet, freeq, so many things have notifications i don't see unless i check them all

added 2026-06-13 · human
STANDING standing row — outside the five sweep tables (a raw thought / late addition); no verdict, no action implied
Find good online social spaces

i'd like to have assistance finding interesting social spaces online. LLM tinkerers, small to medium sized, places of good faith

added 2026-06-13 · human
STANDING standing row — outside the five sweep tables (a raw thought / late addition); no verdict, no action implied
Wire the autonomous toggle to the runtime

Wire the Settings autonomous toggle to the real autonomous runtime. The new Settings panel writes local-viewer/state/settings.json but scripts/autonomous.sh is controlled by a lockfile — the two are decoupled, so the toggle reflects intent but does not yet start/stop the runtime. Make settings.json the source of truth that autonomous.sh reads.

added 2026-06-13 · human
STANDING standing row — outside the five sweep tables (a raw thought / late addition); no verdict, no action implied
Rehome image-attach onto comments

Rehome screenshot/image attach onto the per-component comment overlay. The chrome diet (ruling M) retired the generic bottom-bar 💬 — the only UI path to attach a screenshot to a comment — so image-on-comment is currently lost. The /api/feedback-with-image endpoint, comment schema image field, and in-overlay <img> render are all intact; add an attach affordance to the localized overlay composer to re-wire.

added 2026-06-13 · human
RECONCILE the "new note" rename landed; there is no `arrivals` surface — rewrite to what actually shipped

`wish-arrivals-input-stream` — P3 — rename the Viewer `➕` button away from "new note" — it's really a text-dump into the input stream that the system routes (node, doctrine row, fold-in), not necessarily a note. Paired: an `arrivals` node/surface where brief things with no obvious home land (single-input often signals one "thing" to generate; should be html; can be a node, doesn't have to be).

NEW 2026-06-13; from drain (Jake) · two related ideas consolidated · relates to no-confirmation-on-new-node (complaints) · seeds in wishes.md
GRADUATE /post-sync skill is fully built; only the SessionEnd hook is missing — cheap and concrete

`wish-post-sync-hook` — P2 — closing a /sync chat fires a hook that runs `/post-sync`: read the conversation that just happened and update the vault from it if (and only if) anything warrants it — fold decisions/wishes/complaints into the right nodes, else no-op

NEW 2026-06-12; from harness-catchup skill-consolidation comment (Jake) · needs a SessionEnd-style hook scoped to /sync + a /post-sync skill · seeds in wishes.md
RETIRE skill exists, matches spec

`wish-verify-before-public` — P2 — a verifier that checks a SINGLE node for names / personal / private details before it's flipped public — the per-node privacy gate

NEW 2026-06-12; from harness-catchup (Jake: "verifiers we'll add more") · sibling of wish-verify-before-deploy · pairs with the human-only public flip · seeds in wishes.md
RETIRE skill + deploy-web gate — doubly satisfied

`wish-verify-before-deploy` — P2 — a verifier that checks ALL public nodes with clean context before /deploy-web ships — the whole-deploy privacy/quality gate

NEW 2026-06-12; from harness-catchup (Jake) · sibling of wish-verify-before-public · rides with /deploy-web · seeds in wishes.md

### P1 · now

group 2026-06-12

RETIRE appendHumanEvent on ~35 gestures → raw-input.jsonl

`wish-human-event-stream` — P1 — the viewer meticulously logs every human gesture (✕ · archive · mark-read · flag · comment) so agents read what Jake did, not diff-guess it

NEW 2026-06-11 live /sync; local-only, never deploys · seeds in wishes.md
STANDING standing row — outside the five sweep tables (a raw thought / late addition); no verdict, no action implied

all the html stuff needs to work without wifi (comments, deletes, adding items with this kind of component). it all needs to be instantly responsive and be saving stuff locally so when connection is made again and a drain/sweep happens nothing is lost

added 2026-06-12 · human

### P2 · next

group 2026-06-12

RETIRE 🔍 mode (extended this session to include archive nodes)

`wish-observations-brewer` — P2 — observations become a viewer mode shaped by Judson Brewer (habit loops, curiosity over willpower) — a lens over the obs-* stream · deps: ◀ wish-viewer-modes

NEW 2026-06-11 live /sync; starts as a node, graduates to a mode
BLOCKER (2026-06-15 voice memo): can't retire this wish until there's an observation lens Jake actually likes — the bar is a lens he's happy with, not just any mode.
GRADUATE self-labeled principles candidate → move it onto the principles shelf

`proposal-quote-dont-editorialize` — P2 — preserve Jake's words verbatim, never re-narrate

candidate to graduate to principles

### P3 · someday

group 2026-06-12

GRADUATE the cap is already in AGENTS.md → promote to the principles shelf

`goal-attention-quota` — P3 — Jake's attention as a metered, finite budget

candidate to graduate to principles
GRADUATE self-labeled principles candidate

`goal-rough-low-fuss` — P3 — tolerate rough, brief, fuss-free input

candidate for principles
KEEP standing aim

`goal-composability-lego` — P3 — skills + scripts compose like Lego

added 2026-06-12 · migrated from table
KEEP standing aim (echoed in AGENTS.md)

`goal-hit-claude-code-limits` — P3 — push throughput to the usage limits

added 2026-06-12 · migrated from table
KEEP genuine unbuilt artifact idea

`proposal-human-llm-failure-cases-viz` — P3 — visualize human-vs-LLM failure cases

added 2026-06-12 · migrated from table
KEEP big multiplayer direction (Moltbook)

`goal-sociability-interop` — P3 — others read / feedback / interop (Moltbook)

added 2026-06-12 · migrated from table
KEEP not built; gmail is read-only inbound

`goal-social-digest` — P3 — standing social digest

added 2026-06-12 · migrated from table

`wish-public-node-zip-vibe-coding` — P3 — "RSS for vibe coding" — public nodes as self-contained zips

rework-brief item E, parked

# metaphors

Evocative images for the Streetlight system — visualization required for EVERYTHING on here

KEEP still matches the live system

`midas-gloves` — refined to fingerless gloves, a three-state image for the doctrine layer. No harness = Midas isn't Midas: just a chat interface, you chat and get no "gold" at all. Doctrine nodes = fingerless gloves: you touch stuff — take notes, float wishes/principles — and it does NOT turn to gold. Peel back the mitten tip to bare a fingertip and touch on purpose = promote a wish/principle into the system prompt or a skill (it becomes gold: durable software). Without the gloves Midas turns everything to gold by accident — editing AGENTS.md + skills until they're unusable.

refined 2026-06-13 · system-&-surfaces family · seeds in doctrine-nodes.md
"With doctrine node you can have fingerless gloves which means you touch stuff (take notes) and it doesn't turn to gold but if you want it to be gold later you can take the mitten part off the top of your fingerless gloves and touch it (promote a wish/principle/whatever to system prompt or skill)." — Jake, 2026-06-13 · no harness = just chat, no gold · sibling of the capture-everything-act-on-subset principle
KEEP still matches the live system

`inception-dreamscape` — Streetlight as the dreamscape test from Inception: we design the room such that when inputs come in, there's a home for them and natural workflows to do. In the movie they put the safe in the dreamscape so the dreamer would put their secrets in it — we put the node structure here so that inputs have a place to go. Voice memo 2026-06-12.

new · system-&-surfaces family · seeds in doctrine-nodes.md
"We design the room such that when inputs come in, there's a home for them… they put the safe in the dreamscape so the dreamer would put their secrets in it — we put the node structure here so that inputs have a place to go." — voice memo 2026-06-12 · sibling of writers-office (the room's layout matters)
KEEP still matches the live system

`writers-office` — Streetlight as a writer's office (not a corporate office): expressive, opinionated, architected — the room's layout matters. A circular tower with its desk: a place where inputs have natural homes and the workflows feel like you belong there. Voice memo 2026-06-12.

new · system-&-surfaces family · seeds in doctrine-nodes.md
"A writer's office, not a corporate office… expressive, opinionated, architected — the room's layout matters. A circular tower with its desk: a place where inputs have natural homes and the workflows feel like you belong there." — voice memo 2026-06-12 · sibling of inception-dreamscape
KEEP part of the intentional 4-view OODA riff (skater · flow · blown-up · drawing), not duplication

`drawing-is-an-ooda-loop` — strip art down to its loop: make a mark on the page, look at it, react, mark again — you're in a loop. Sibling of 09 (the loop spun fast) and 11 (the loop blown up to walk-around size). Voice memo 2026-06-10.

13 · loops family · seeds in metaphors.md
"And then you think about the ooda Loop of … drawing. Like, that's all it is, right? … You make a mark on the page. And then you look at it. And you think, huh? That's that! … Yeah, that's like, you're in a loop." — voice memo 2026-06-10-18-48-dad195be · sibling of 09 Flow State (loop spun fast) and 11 The Blown-Up Loop (the robot makes this loop walk-around size)
KEEP still matches the live system

`stream-vs-lake` — a lake has an inlet AND an outlet but holds a reservoir; a stream holds nothing — everything flows through. Why have a codebase when you can generate what you need when you need it? A permanent honeymoon phase. Voice memo 2026-06-10.

12 · making-things family · seeds in metaphors.md
"A lake also has an inlet and an outlet[, it] just hang[s] on to things for longer. … A stream … you're not holding on to anything. You're just letting it flow through. … Why have a code base? When you can just generate whatever you need when you need it. And then. You're always in the honeymoon phase." — voice memo 2026-06-10-21-51-13d308b4 · cousin: "stick in the stream" (deeper cuts)
KEEP part of the intentional 4-view OODA riff

`blown-up-ooda-loop` — like the giant walk-around computers in chintzy 80s documentaries, the robot project blows an OODA loop up to massive size — in space AND in time — so you can look inside it. Once visible, the knobs appear: loop tightness, more per action, the most efficient way to observe. Voice memo 2026-06-10.

11 · loops family · seeds in metaphors.md
"The point of this project is to make the loop big enough that you can see it just like those old chintzy 80s documentaries about computers, how the the kids walk around the computer that's blown up to massive size? This is blowing up an [OODA] Loop into. Space. … But also big in time, too … you can actually look inside it." — voice memo 2026-06-10-18-52-27dfa3a3 · the project: robot-framework
KEEP still matches the live system

`pushing-the-block-of-ice` — Francis Alÿs, Paradox of Praxis 1 (1997): nine hours pushing a melting ice block through Mexico City until it's a wet streak. Sometimes you do a whole big thing and it leads to nothing. Voice memo 2026-06-09.

10 · making-things family · seeds in metaphors.md
"I loved that video art piece of … pushing a block of ice through Mexico City, and like, sometimes. You do a whole big thing. There's at least to nothing. [sic — "leads to nothing"]" — voice memo 2026-06-09-16-01-78120eda · Francis Alÿs, Paradox of Praxis 1 (Sometimes Making Something Leads to Nothing)
KEEP part of the intentional 4-view OODA riff

`flow-state-tight-ooda` — the athlete mid-game is the same Observe-Orient-Decide-Act loop, spun too fast to see the steps. Sibling of 05 Figure-Skater Loops: arms in, smaller radius, faster spin. Voice memo 2026-06-09.

09 · loops family · seeds in metaphors.md
"like an athlete is? Observing and orienting and deciding and acting. Maybe a maybe flow state is a really tight [OODA]?" (transcribed "a really tight Buddha") — voice memo 2026-06-09-16-01-78120eda · sibling of 05 Figure-Skater Loops: arms in, faster spin.
KEEP still matches the live system

`split-brain-confabulation` — split-brain patients confabulate tidy reasons for actions one hemisphere never saw — maybe Jake's own sense of coherence, and therefore the system's, is the same made-up story. Frustrated the harness won't cohere? Maybe there was never cohesion to extract. Voice memo 2026-06-09.

08 · the-mind family · seeds in metaphors.md
"What if my internal notion of my own coherence is a myth? … It's frustrating to talk to the system as if it's a human and to feel understood, but to not get the results of the cohesion. Maybe the cohesion is a myth." — voice memo 2026-06-09-22-56-2a01d49c
KEEP still matches the live system

`node-as-iceberg` — as a node grows it becomes MORE like an iceberg: the html tip stays trailer-small while depth (md, code, logs, prototypes) accumulates below the waterline. Both icebergs are good — the ratio is a lifecycle stage, not a failure mode. Absorbed from `archive/what-is-a-node` 2026-06-10.

07 · system-&-surfaces family · seeds in metaphors.md
As a node grows it becomes more like an iceberg: the html tip stays trailer-small, depth accumulates below the waterline. Both icebergs are good — the ratio is a lifecycle stage, not a failure mode. — Jake, voice input 2026-06-09 · `archive/what-is-a-node`
KEEP still matches the live system

`artifact-driven-development` — don't game out the best hypothetical — as soon as the idea exists, build several WORKING versions and choose between real artifacts. Artifacts explore the latent space; get usable ASAP, then keep adapting the winner. Voice memo 2026-06-10.

06 · making-things family · seeds in metaphors.md
Build artifacts not to ship a polished product but to explore the latent space of possibilities — they must work, get usable ASAP, then adapt to your needs (the midi mini-harness is the worked example). — voice memo 2026-06-10
KEEP part of the intentional 4-view OODA riff

`figure-skater-loops` — arms in, tighter loop, faster spin (L = I·ω) — feedback loops obey conservation of angular momentum. From `archive/figure-skater-loops`.

05 · loops family · seeds in metaphors.md
Same energy, smaller radius, more revolutions — feedback loops obey conservation of angular momentum. — voice memo 2026-05-13 · `archive/figure-skater-loops`
GRADUATE effectively graduated — named as [[paving-your-footsteps]] across ~7 skill refs

`desire-paths` — let the grass wear bare under repeated crossings before pouring concrete; one paved footstep is cruft. The axis is footstep COUNT + loop tightness — wander, vary, repeat, THEN pave the worn line (= make the skill). Absorbed from `archive/paving-your-footsteps` 2026-06-10.

04 · making-things family · seeds in metaphors.md
Plant grass, watch where people actually walk, pour concrete on the worn line. The axis is footstep count + loop tightness — one crossing is never a path; pave the worn line = make the skill. ABSORBED 2026-06-10; verbatim seeds + cruft taxonomy at `archive/paving-your-footsteps` ("cruft" is a glossary term).
GRADUATE effectively graduated — named inside the update-node / what-happened skills

`movie-trailer` — the repo is the whole movie; a node is the two-minute cut (≥1 diagram, ≤3 tweets) that sells the ticket. (AGENTS.md, node design doctrine.)

03 · system-&-surfaces family · seeds in metaphors.md
If the reader wants the whole movie, it’s all still in the repo — the node just has to sell the ticket. (AGENTS.md, node design doctrine)
GRADUATE effectively graduated — named in AGENTS.md:14

`streetlight-effect` — the namesake fallacy — search where the light is, not where the keys are — inverted into the mission: transform the data until the light falls where the answers actually are.

02 · system-&-surfaces family · seeds in metaphors.md
The fallacy: search where it’s easy. The system: transform the data until the light falls where the answers are. (the namesake — AGENTS.md)
KEEP still matches the live system

`elephant-with-braille` — every agent is a blind person feeling one part of an elephant whose braille reads "attention blind people." Trust the pace layers to hold the whole; be very free at the node level. Voice memo 2026-06-04.

01 · system-&-surfaces family · seeds in metaphors.md
An agent feels one part of the elephant. Trust the whole, trust the pace layers, be very free at the node level. — voice memo 2026-06-04 · `archive/elephant-with-braille`
Think about the limitations of the person; trust the LLM with the hard assignment.