From e7044c5f172a86a783317932e999d8b93bc7784b Mon Sep 17 00:00:00 2001 From: Cameron Date: Thu, 9 Jul 2026 13:55:18 -0700 Subject: [PATCH] Wire decision-required and decision-made labels. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cameron added the two Tangled labels; agents need them on every human ask and harvest path so the tracker itself shows what waits on him. Defense: process only — no game behavior change. Labels are the scan surface for open decisions; filing without decision-required leaves asks invisible in the label filter. Co-authored-by: Cursor --- .agents/skills/design-session/SKILL.md | 4 ++- .agents/skills/tick/SKILL.md | 10 ++++--- .claude/skills/design-session/SKILL.md | 4 ++- .claude/skills/tick/SKILL.md | 10 ++++--- AGENT.md | 4 +++ AGENTS.md | 5 ++-- CLAUDE.md | 5 ++-- prompts/README.md | 3 ++- prompts/ask-the-human.md | 14 +++++----- prompts/find-contradiction.md | 15 ++++++----- prompts/harvest-issues.md | 22 ++++++++++------ wiki/log/2026-07-09-decision-labels.md | 33 +++++++++++++++++++++++ wiki/log/DEVLOG.md | 9 +++++++ wiki/process/design-sessions.md | 13 +++++----- wiki/process/development-style.md | 3 ++- wiki/process/meta.md | 3 ++- wiki/process/tick.md | 36 ++++++++++++++++++++++++-- 17 files changed, 146 insertions(+), 47 deletions(-) create mode 100644 wiki/log/2026-07-09-decision-labels.md diff --git a/.agents/skills/design-session/SKILL.md b/.agents/skills/design-session/SKILL.md index eb32fe3e..623503f1 100644 --- a/.agents/skills/design-session/SKILL.md +++ b/.agents/skills/design-session/SKILL.md @@ -17,4 +17,6 @@ with devlog, defense commits, push. Taste calls that leave the chat become Tangled issues and must follow the issue body standard in `wiki/process/tick.md`: singular `## Question` (numbered choices), `## Why this is open`, `## Options`, -`## Recommendation`, `## What your answer unlocks`. No narrative dumps. +`## Recommendation`, `## What your answer unlocks`. Label them +`decision-required`; flip to `decision-made` when answered. No narrative +dumps. diff --git a/.agents/skills/tick/SKILL.md b/.agents/skills/tick/SKILL.md index c90945f1..812675ea 100644 --- a/.agents/skills/tick/SKILL.md +++ b/.agents/skills/tick/SKILL.md @@ -15,10 +15,12 @@ The canonical procedure is `wiki/process/tick.md` — follow it exactly. Summary issues (`tang issue create "Question: ..."` / `"Contradiction: ..."`) that obey the **issue body standard** in `wiki/process/tick.md`: `## Question` (numbered choices), `## Why this is open`, `## Options`, - `## Recommendation`, `## What your answer unlocks`. Never file a - narrative dump. If an existing open issue is incomprehensible, rewrite - it with `tang issue edit` before other work. Small ambiguities are - resolved by making the constitution more precise. + `## Recommendation`, `## What your answer unlocks`. Label them + `decision-required` (`tang label add issue decision-required`); + flip to `decision-made` when Cameron answers. Never file a narrative + dump. If an existing open issue is incomprehensible, rewrite it with + `tang issue edit` before other work. Small ambiguities are resolved by + making the constitution more precise. 4. Leave a trace (commit, issue, or [OPEN] marker) and end the tick. If `tang` reports not-authenticated, ask the user to run `tang auth login` diff --git a/.claude/skills/design-session/SKILL.md b/.claude/skills/design-session/SKILL.md index eb32fe3e..623503f1 100644 --- a/.claude/skills/design-session/SKILL.md +++ b/.claude/skills/design-session/SKILL.md @@ -17,4 +17,6 @@ with devlog, defense commits, push. Taste calls that leave the chat become Tangled issues and must follow the issue body standard in `wiki/process/tick.md`: singular `## Question` (numbered choices), `## Why this is open`, `## Options`, -`## Recommendation`, `## What your answer unlocks`. No narrative dumps. +`## Recommendation`, `## What your answer unlocks`. Label them +`decision-required`; flip to `decision-made` when answered. No narrative +dumps. diff --git a/.claude/skills/tick/SKILL.md b/.claude/skills/tick/SKILL.md index c90945f1..812675ea 100644 --- a/.claude/skills/tick/SKILL.md +++ b/.claude/skills/tick/SKILL.md @@ -15,10 +15,12 @@ The canonical procedure is `wiki/process/tick.md` — follow it exactly. Summary issues (`tang issue create "Question: ..."` / `"Contradiction: ..."`) that obey the **issue body standard** in `wiki/process/tick.md`: `## Question` (numbered choices), `## Why this is open`, `## Options`, - `## Recommendation`, `## What your answer unlocks`. Never file a - narrative dump. If an existing open issue is incomprehensible, rewrite - it with `tang issue edit` before other work. Small ambiguities are - resolved by making the constitution more precise. + `## Recommendation`, `## What your answer unlocks`. Label them + `decision-required` (`tang label add issue decision-required`); + flip to `decision-made` when Cameron answers. Never file a narrative + dump. If an existing open issue is incomprehensible, rewrite it with + `tang issue edit` before other work. Small ambiguities are resolved by + making the constitution more precise. 4. Leave a trace (commit, issue, or [OPEN] marker) and end the tick. If `tang` reports not-authenticated, ask the user to run `tang auth login` diff --git a/AGENT.md b/AGENT.md index b342f943..5a6c3fac 100644 --- a/AGENT.md +++ b/AGENT.md @@ -50,6 +50,10 @@ and `## What your answer unlocks`. No narrative dumps, no buried asks, no multi-decision bundles. If an existing open issue is incomprehensible, rewrite it with `tang issue edit` before anything else. +Label every human decision issue: `tang label add issue decision-required` +when filing; flip to `decision-made` once Cameron answers (harvest converts +and closes). The two labels are mutually exclusive. + ## The one rule Any change to how the game functions ships with its DESIGN.md amendment in the diff --git a/AGENTS.md b/AGENTS.md index 8b2fbbb9..87ae8a47 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -45,8 +45,9 @@ only the navigation shortcut so sessions stop rediscovering the layout. never `git add -A`. - Tangled issues are decision packets for Cameron: singular numbered question, short analysis, options, recommendation, unlocks (see - `wiki/process/tick.md`). Rewrite incomprehensible open issues before - leaving them. + `wiki/process/tick.md`). Label with `decision-required` when filing; + flip to `decision-made` when answered. Rewrite incomprehensible open + issues before leaving them. - Ledger files (wiki/log/DEVLOG.md, the DESIGN.md decisions log, wiki status tables) merge by UNION — keep both sides' entries in any conflict. - Landing: rebase onto `origin/main`, re-run the **appropriate scoped diff --git a/CLAUDE.md b/CLAUDE.md index 3da4cf20..d4477b38 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -45,8 +45,9 @@ only the navigation shortcut so sessions stop rediscovering the layout. never `git add -A`. - Tangled issues are decision packets for Cameron: singular numbered question, short analysis, options, recommendation, unlocks (see - `wiki/process/tick.md`). Rewrite incomprehensible open issues before - leaving them. + `wiki/process/tick.md`). Label with `decision-required` when filing; + flip to `decision-made` when answered. Rewrite incomprehensible open + issues before leaving them. - Ledger files (wiki/log/DEVLOG.md, the DESIGN.md decisions log, wiki status tables) merge by UNION — keep both sides' entries in any conflict. - Landing: rebase onto `origin/main`, re-run the **appropriate scoped diff --git a/prompts/README.md b/prompts/README.md index 41a9953c..d57836de 100644 --- a/prompts/README.md +++ b/prompts/README.md @@ -48,7 +48,8 @@ These rules bind every prompted agent, and each prompt file assumes them: devlog note) so nothing is lost. Tangled issues obey the body standard in [wiki/process/tick.md](../wiki/process/tick.md): a singular numbered question, short analysis, options, recommendation, - and unlocks — never a session narrative. + and unlocks — never a session narrative. Label human asks + `decision-required`; flip to `decision-made` when answered. ## For stateful agents (Letta or similar) diff --git a/prompts/ask-the-human.md b/prompts/ask-the-human.md index 8e37845b..ac1fbabe 100644 --- a/prompts/ask-the-human.md +++ b/prompts/ask-the-human.md @@ -42,13 +42,13 @@ so you never file a duplicate. - **`## What your answer unlocks`** — which wiki/DESIGN.md section the next agent edits, so the answer converts to work instantly. 4. **Raise it:** `tang issue create "Question: " -F - body.md` (prefer `-F` so markdown stays intact). Title as the - question, not the topic ("Chargen: four origins or five?" not - "Chargen thoughts"). Self-check before filing: can Cameron answer - from the issue alone in under two minutes? If not, rewrite. If - `tang` fails, put the identical body in - `wiki/log/YYYY-MM-DD-question-.md` and flag it in - `wiki/log/DEVLOG.md` as awaiting Cameron. + body.md` (prefer `-F` so markdown stays intact), then immediately + `tang label add issue decision-required`. Title as the question, + not the topic ("Chargen: four origins or five?" not "Chargen + thoughts"). Self-check before filing: can Cameron answer from the + issue alone in under two minutes? If not, rewrite. If `tang` fails, + put the identical body in `wiki/log/YYYY-MM-DD-question-.md` + and flag it in `wiki/log/DEVLOG.md` as awaiting Cameron. 5. **Mark the source.** At the `[OPEN]` marker that spawned the question, add the issue reference so no other agent re-raises it. Commit that marker edit (docs-only), land it, DEVLOG line, clean up. diff --git a/prompts/find-contradiction.md b/prompts/find-contradiction.md index 26bc23cf..82087e8d 100644 --- a/prompts/find-contradiction.md +++ b/prompts/find-contradiction.md @@ -44,13 +44,14 @@ are executing a specialized form of). Obey the shared contract in - **Directional / taste call:** do NOT improvise. File it with the binding issue body standard in `wiki/process/tick.md`: `tang issue create "Contradiction: " -F body.md` - whose body has `## Question` (numbered choices), `## Why this is - open` (quote both sides verbatim with file:line and why they - conflict), `## Options` (2–3 resolutions), `## Recommendation`, - and `## What your answer unlocks`. Cameron must be able to answer - from the issue alone. (If `tang` is unavailable, write the same - content to a dated `wiki/log/` file and flag it in - `wiki/log/DEVLOG.md` as needing Cameron.) + then `tang label add issue decision-required`. Body has + `## Question` (numbered choices), `## Why this is open` (quote both + sides verbatim with file:line and why they conflict), `## Options` + (2–3 resolutions), `## Recommendation`, and `## What your answer + unlocks`. Cameron must be able to answer from the issue alone. + (If `tang` is unavailable, write the same content to a dated + `wiki/log/` file and flag it in `wiki/log/DEVLOG.md` as needing + Cameron.) 4. **Land** whatever you changed: check.sh, rebase, push to main, DEVLOG entry, worktree removed. A filed issue also gets a DEVLOG line. diff --git a/prompts/harvest-issues.md b/prompts/harvest-issues.md index c6f213e0..88b9745e 100644 --- a/prompts/harvest-issues.md +++ b/prompts/harvest-issues.md @@ -10,24 +10,29 @@ digestive system between "discussed" and "done". ## Before you start Read `AGENT.md` and the shared contract in `prompts/README.md`. Then -`tang issue list`, and `tang issue view ` on everything open. Have -`DESIGN.md`'s decisions log and `wiki/process/specs.md`'s status table -beside you — an issue's fate is usually written in one of them. +`tang issue list`, and `tang issue view ` on everything open. Check +labels (`tang label list issue `): prioritize `decision-made`, then +unlabeled open issues, and leave `decision-required` alone except to +rewrite incomprehensible bodies. Have `DESIGN.md`'s decisions log and +`wiki/process/specs.md`'s status table beside you — an issue's fate is +usually written in one of them. ## Procedure For each open issue, classify and act: 1. **Answered by Cameron (or overtaken by a decisions-log entry) but - not executed.** This is the harvest. Convert the answer into its - artifact: + not executed** — including anything labeled `decision-made`. This is + the harvest. Convert the answer into its artifact: - a design answer -> the DESIGN.md amendment and/or spec edit it implies (quote the issue in the commit's `Defense:`), or - an implementation-shaped answer -> a `wiki/process/ROADMAP.md` dispatch item (or take it yourself if it fits one run — then follow `prompts/implement-gap.md` discipline). Then `tang issue close ` with a comment/body edit noting the - landing commit or ROADMAP item. + landing commit or ROADMAP item. If an answered issue is still on + `decision-required`, flip it to `decision-made` first + (`tang label add issue decision-made`) before or while converting. 2. **Resolved by history without anyone noticing** (the code moved, a decision superseded it, the file it concerns was deleted). Verify in the tree, then close with one line of evidence ("superseded by @@ -40,7 +45,8 @@ For each open issue, classify and act: and still matches today's tree. An issue Cameron cannot answer in under two minutes from the body alone is process debt — rewrite it before leaving it open. Note the refresh date in the body. -4. **Still open and current *and* answerable.** Leave it, but if it +4. **Still open and current *and* answerable** (`decision-required` or + unlabeled). Leave it, but ensure it carries `decision-required`. If it gates READY work and has sat unanswered, bump it to the top of your report. If it is current but fails the body standard, treat it as case 3 and rewrite. @@ -59,7 +65,7 @@ actually reads). - Closures cite evidence; conversions cite their artifact (commit, ROADMAP item, spec edit). - The DEVLOG entry gives Cameron the two lists that matter: what moved, - and what waits on him. + and what waits on him (`decision-required` titles). ## What to carry forward (stateful agents) diff --git a/wiki/log/2026-07-09-decision-labels.md b/wiki/log/2026-07-09-decision-labels.md new file mode 100644 index 00000000..1a89a748 --- /dev/null +++ b/wiki/log/2026-07-09-decision-labels.md @@ -0,0 +1,33 @@ +# 2026-07-09 — Decision labels + +``` +Type: log +``` + +## Intent + +Cameron added Tangled custom labels `decision-required` and +`decision-made`. Issues need those labels wired into every filing / +harvest path so the tracker itself shows what waits on him versus what +is ready to convert. + +## Changed + +- Bound both labels in `wiki/process/tick.md` (mutually exclusive; + required on human asks; harvest priority). +- Mirrored across AGENT.md / AGENTS.md / CLAUDE.md, development-style, + design-sessions, meta, prompts, and tick/design-session skills. +- Added `tang label` CLI (`defs` / `list` / `add` / `remove`) in + `~/code/tangled-cli` so agents can apply labels without the web UI. +- Labeled open issues #1 and #2 `decision-required`; rewrote #2 into the + answerable body standard. + +## Checks + +Docs/process only in this repo: `./tools/check.sh` focused path. +CLI: `bun run build`; `tang label defs`; `tang label list issue 1`. + +## Follow-up + +Answer #1 and #2 (or flip to `decision-made` after answering) so harvest +can convert them. diff --git a/wiki/log/DEVLOG.md b/wiki/log/DEVLOG.md index e939449e..1c4e0a2a 100644 --- a/wiki/log/DEVLOG.md +++ b/wiki/log/DEVLOG.md @@ -5,6 +5,15 @@ Type: log ``` Reverse chronological implementation notes. Keep this factual: what changed, why, checks, and spec impact. +## 2026-07-09 - Decision labels + +- Intent: wire `decision-required` / `decision-made` through every issue + filing and harvest path so Cameron can scan the tracker by label. +- Changed: tick.md binding section; AGENT maps, prompts, skills; labeled + issues #1 and #2; `tang label` CLI in tangled-cli. +- Checks: focused docs gate; `tang label defs` / `list issue 1`. +- Log: wiki/log/2026-07-09-decision-labels.md. + ## 2026-07-09 - Day-job demand ingress: Voss desktop -> switch -> host - Intent: Lab demand should enter as wired cargo from Voss, not teleport onto diff --git a/wiki/process/design-sessions.md b/wiki/process/design-sessions.md index cc33e039..dc6d9535 100644 --- a/wiki/process/design-sessions.md +++ b/wiki/process/design-sessions.md @@ -36,12 +36,13 @@ future session can run it. 4. **Ask questions only for genuine taste calls.** Prefer a Tangled issue that follows the binding body standard in [tick.md](tick.md) (`## Question` with numbered choices, short analysis, options, - recommendation, unlocks) so Cameron can answer from the issue list - without re-reading the session. In-chat, keep the same shape: 2 to 4 - concrete options, a recommendation marked, previews when visual. If - Cameron says "pause and respond to that first," respond to the idea - before re-posing any question, and re-frame stale questions in the new - fiction's terms before they get answered. + recommendation, unlocks) and is labeled `decision-required`, so Cameron + can answer from the issue list without re-reading the session. In-chat, + keep the same shape: 2 to 4 concrete options, a recommendation marked, + previews when visual. If Cameron says "pause and respond to that first," + respond to the idea before re-posing any question, and re-frame stale + questions in the new fiction's terms before they get answered. When he + answers, flip the label to `decision-made` (or harvest immediately). 5. **When a system firms up, spec it.** Constitution sections say what and why; `Type: spec` wiki pages say exactly how and when-done (acceptance criteria, [TUNE] markers for implementation-time constants). The goal diff --git a/wiki/process/development-style.md b/wiki/process/development-style.md index 42c69132..31b97427 100644 --- a/wiki/process/development-style.md +++ b/wiki/process/development-style.md @@ -49,7 +49,8 @@ That only works if: code; act on one violation / contradiction / question / bug / insecurity. Contradictions and directional questions become Tangled issues (`tang`) that follow the issue body standard in tick.md — a clear question - Cameron can answer in under two minutes, not a session narrative. + Cameron can answer in under two minutes, not a session narrative — + and carry the `decision-required` label until answered. 1. Read the constitution ([DESIGN.md](../../DESIGN.md)) and relevant `Type: knowledge` wiki pages. 2. Amend the constitution with what is about to change (or confirm it already diff --git a/wiki/process/meta.md b/wiki/process/meta.md index 12d6a2c5..ce901159 100644 --- a/wiki/process/meta.md +++ b/wiki/process/meta.md @@ -150,7 +150,8 @@ Every bug found by a tick should be classified against either a constitutional/player contract clause or a spec acceptance criterion. If no criterion exists for the violated behavior, clarify the spec or file a Tangled issue that follows the issue body standard in -[tick.md](tick.md); do not let the bug float as vibes. +[tick.md](tick.md) and carries `decision-required`; do not let the bug +float as vibes. ## Spec-change rule diff --git a/wiki/process/tick.md b/wiki/process/tick.md index 1ba36860..a43df8d8 100644 --- a/wiki/process/tick.md +++ b/wiki/process/tick.md @@ -31,8 +31,8 @@ constitution more precise or surfaces the thing preventing that. | Finding | Action | |---|---| | **Violation** | Fix the code toward the constitution. If investigation shows the *code* is right, amend the constitution deliberately instead — with a defense (below). Never let them drift silently. | -| **Contradiction** | File a Tangled issue quoting both passages (`tang issue create`), using the issue body standard below. Do not silently pick a side — contradictions are the human's to resolve unless one reading is obviously a typo. If it blocks work, add an `[OPEN]` marker in DESIGN.md referencing the issue. | -| **Question** | If it is small and answerable within the constitution's existing intent: answer it by making the spec more precise, with a defense. If it is directional or a matter of taste: file a Tangled issue that follows the issue body standard below, and add an `[OPEN]` marker. | +| **Contradiction** | File a Tangled issue quoting both passages (`tang issue create`), using the issue body standard below, and label it `decision-required`. Do not silently pick a side — contradictions are the human's to resolve unless one reading is obviously a typo. If it blocks work, add an `[OPEN]` marker in DESIGN.md referencing the issue. | +| **Question** | If it is small and answerable within the constitution's existing intent: answer it by making the spec more precise, with a defense. If it is directional or a matter of taste: file a Tangled issue that follows the issue body standard below, label it `decision-required`, and add an `[OPEN]` marker. | | **Bug** | Fix it, add a regression test, commit with a defense. | | **Insecurity** | Fix or remove it. Never ship the insecure path because it was convenient. Defense in the commit. | @@ -63,8 +63,10 @@ symlink to `~/code/tangled-cli/dist/index.js`. tang context # verify repo resolution tang issue list tang issue create "Question: ..." -F body.md +tang label add issue decision-required # waiting on Cameron tang issue view 1 tang issue edit 1 -F body.md # rewrite if an issue is not answerable +tang label add issue decision-made # Cameron answered; harvest next ``` - **Auth is one-time per machine and human-only**: `tang auth login` (browser @@ -109,6 +111,36 @@ If you find an existing open issue that fails this standard, rewrite it with `tang issue edit` before doing other harvest work on it. An unanswerable issue is process debt, same species as a stale `[OPEN]` marker. +### Decision labels (binding) + +Two custom Tangled labels track whether an issue still needs Cameron: + +| Label | Meaning | Who applies it | +|---|---|---| +| **`decision-required`** | Open ask waiting on Cameron. Body must already meet the issue standard above. | Agent, when filing or refreshing a human decision | +| **`decision-made`** | Cameron has answered (in the issue thread, chat, or a decisions-log entry). Ready for harvest to convert into DESIGN/wiki/ROADMAP motion, then close. | Agent, as soon as the answer is recorded — or Cameron | + +Rules: + +- Every newly filed Question/Contradiction issue that needs a human call gets + `decision-required` in the same turn as `tang issue create`. +- The two labels are mutually exclusive: applying one removes the other + (`tang label add` does this swap automatically). +- Harvest prioritizes `decision-made` first (convert + close), then unlabeled + / stale open issues, and leaves `decision-required` alone except to rewrite + incomprehensible bodies. +- Do not close a `decision-required` issue just because it is old. Do not leave + an answered issue on `decision-required` — flip it to `decision-made` (or + convert and close in the same harvest). + +```bash +tang label defs +tang label list issue 1 +tang label add issue 1 decision-required +tang label add issue 1 decision-made # also clears decision-required +tang label remove issue 1 decision-made +``` + ## Tick etiquette - **Metered resources are not tick fuel.** Anything that spends a shared, -- 2.51.2