log
Capture front door. Logs 1..N observations as card files at docs/work/{ID}.md (BUG / DEBT / GAP), gateway-inline — no dispatch. Use when the user says "log this", "track that", "note this down", or ty
SKILL.mdplugins/super-bootstrap/skills/log/SKILL.md
GitHubLog — Capture Front Door
Muscle-memory capture, run gateway-inline in the calling session — no dispatch. Takes one observation or a batch, classifies each into BUG / DEBT / GAP, checks against open cards, and writes each clear entry as docs/work/{ID}.md in docs/work/TEMPLATE.md's shape. Capture is unconditional about worth (bugs, debt, design gaps, unverified ideas all land); the real/worth/now call runs at /super-bootstrap:triage on pickup.
All new cards route through this door — user-initiated and Claude-initiated captures alike. Hand-copying docs/work/TEMPLATE.md with an ID from step 4's generator is the same door, by hand.
When it fires
- User — explicit
/super-bootstrap:log <observation>, or natural-language "log this / track that / note this down". Bare/super-bootstrap:log→ ask what to capture (one line). - Claude — its own captures: a bug spotted mid-task, out-of-scope findings a review or returned subagent surfaced. Batch them into one pass.
A card is owed only for deferred or dropped work — work that exits the current flow incomplete. Work completed in-flow carries no card debt. The trigger is completion-state (observable), not worth.
Out of lane: root-cause investigation (the triage lane), card deletion (the resolving session), rewriting existing blocks (threads are append-only). Feature ideas and unverified hunches are in lane — they log as GAP.
Procedure
- Read
docs/work/README.md— categories and thread contract. README absent → write nothing; route: "run/super-bootstrap:harness-bootstrapto plant the work substrate, then re-log." When present: runbash <skill-base>/assets/closed-forks.shfrom the repo root, issued as its own tool call —<skill-base>is theBase directory for this skill:path surfaced at invocation. It resolvesdocs/decisions.md§ Closed Forks to one line per row, or toabsent, and ends with the outcome checklist step 2 emits. A non-zero exit names the file and the cause → surface the script's message and hold for the user's pick: they fix the doc and re-log, or the batch logs on withdecisions.md § Closed Forks — unresolvedas each entry's step-2 outcome. The doc fix is the user's. Readdocs/parked.md's header anddocs/outward/README.md's header too — each skipped silently when absent. - Classify each entry — BUG (broken behavior) / DEBT (works but rotting) / GAP (design hole or unverified idea). Three gates per entry, in order:
- Mover — ask once, whose hands move the next step — the repo's, yours, or an outside party's? The repo → a card, through the gates below. Yours or an outside party's (a taste sitting, a line-by-line review, a portal registration, a reply to wait for) → an outward thread at
docs/outward/{ID}.mdwhen the folder exists, itsOUTID from step 4: origin block only,docs/outward/TEMPLATE.md's shape (H1# {ID} — {summary}, thenLogged:/Source:/Next move:/Waiting on:/Repo tail — fires on:, plusOwning card:when a card waits on that step; drop the template's leading comment). Ask for the repo tail in one line whenever the observation doesn't name one — the answer lands the thread; only an item with no tail at all drops, per the container README. Nodocs/outward/but a flatdocs/outward.md→ the container predates the folder shape: write nothing for that entry and route: "run/super-bootstrap:harness-bootstrap— its sync splitsdocs/outward.mdintodocs/outward/— then re-log." Neither present → a card whoseProblem:line nameswaiting on {party}, which the board's wait override reads. Mixed → split at capture: the repo's remainder is the card, the other step the thread, carryingOwning card:when the card waits on that step. - Card shape — every card names something to do, fix, or decide. A standing-watch entry (monitor / revisit later) rephrases as an action; names a trigger +
docs/parked.mdexists → park as a### {ID} — {summary}entry, itsPARKID from step 4; otherwise return it with the real fork: wire an observer at the fire-moment, or drop. - Closed forks — hold each entry against the rows step 1's script printed, and emit one outcome line per entry that reaches this gate, in the reply, whatever the read found:
decisions.md § Closed Forks — collides: <row>/decisions.md § Closed Forks — no collision/decisions.md § Closed Forks — absent(or— unresolved, per step 1's pick). Collides → surface the fork (open the row for its Because + Ref) instead of logging; genuinely new counter-evidence → ask as a reopen question. Never silently re-log a closed direction.
- Mover — ask once, whose hands move the next step — the repo's, yours, or an outside party's? The repo → a card, through the gates below. Yours or an outside party's (a taste sitting, a line-by-line review, a portal registration, a reply to wait for) → an outward thread at
- Dedup — the call is the user's, not capture's. Grep the open cards — plus the
docs/outward/OUT-*.mdthreads when present — for each entry's subject (title keywords,Area:paths for cards; H1 summary orRepo tailpath for outward threads); open a suspected match to confirm coverage. A suspected dup — pure duplicate or duplicate-with-new-fact alike — writes nothing yet: surface the entry, the covering card or thread (ID + the covering line), and the pick — amend (append the new fact) / new card (genuinely distinct) / drop. Execute the pick: amend → append## Amendment — {date} · {source}at the owning card's or outward thread's end, the new fact alone, nothing restated — on an outward thread whoseNext move/Waiting onthe fact changes, that block restates those two lines and leads from there. - Assign IDs — run
bash <skill-base>/assets/new-id.sh <CAT>...from the repo root, once for the whole batch, issued as its own tool call: one category argument (BUG/DEBT/GAP/OUT/PARK) per file about to be written (a mixed entry = card +OUT), in entry order. It prints one ID per argument, in the same order —{CAT}-xxxx, a random 4-char suffix the script redraws on any ID already in the repo or its commit messages. Use each printed ID verbatim for its entry's file name and heading. Never compose, edit, or increment an ID by hand, and never derive one from the live files or another ID — a hand-made ID is the cross-clone collision the generator exists to prevent. A non-zero exit → surface its message and write nothing. Legacy numeric IDs (GAP-101) on existing cards stay valid; there is no counter to bump. - Write each clear entry as
docs/work/{ID}.md— origin block only,TEMPLATE.md's shape (H1 +Logged:/Source:/Problem:/Area:/Prior:; drop the template's leading comment). Stamp today's date. Capture the claim faithfully — this is the richest-context moment; the pickup session reads it cold.Prior:is a one-line suspected cause at most — later work falsifies it. Scale-module fact fields ride the origin block as further field lines when known at capture. - An entry too thin to classify or phrase as a readable card → hold it unwritten and ask its one discriminating question (e.g. "broken now, or works-but-suboptimal?"); the answer lands it.
Rules
- Batch over loop. Classify the whole batch in one pass; clear entries land immediately, dup and too-thin entries surface together — never block clear writes waiting on one fork.
- Capture, don't gate. Write every classifiable, non-duplicate entry — unverified ideas included. Worth is triage's call at pickup.
- Append, never overwrite. Origin blocks are frozen at capture; the only write to an existing card is a new dated
## Amendmentat end of file — and only on the user's amend pick. - Write cards, never investigate. No root-cause prose, no fix design.
- Minimum questions. One discriminating question per genuinely ambiguous entry — capture dies if logging becomes an interrogation.