You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
feat(prm): make the dashboard leg part of the close-out
Shipped and half-shipped tasks keep showing up on the PyAutoMind dashboard as
pickable backlog. The render was never the problem: `intake dashboard --check`
on 2026-08-25 reported the page current, while `intake reconcile` over the same
tree ranked 24 suspects of 138 scanned. dashboard_refresh.yml self-heals a stale
*render* and nothing else — a prompt the merge finished and nobody retired
renders faithfully, and no workflow can tell the difference.
So the gap is at close-out, and /prm is the door that owns close-out. Step 5
gains a Mind sub-step 4, "leave the page true":
- sweep the slug and prompt filename across draft/, active/, epics.md and the
registry files, repointing what the merge falsified (a blocked-by now
unblocked, an epic phase now done, a superseded-by chain that now ends in a
record);
- reconcile the neighbourhood with `intake reconcile draft/<work-type>/<target>`
— folder-scoped, since both runs are fast but the bare one hands back 24
suspects spanning work this task never touched, which /prm has no proof for
and cannot adjudicate without a second question. Proof retires, resemblance
reports: a sibling whose issue this PR closed or whose scope sits inside the
record gets its own record and a git rm; one that merely looks alike gets a
ledger line and the /intake reconcile prefix;
- regenerate, and commit the pages *with* the record. The workflow fallback is
strictly worse — its heal commit is made with GITHUB_TOKEN, so it triggers no
other workflow and has to dispatch pages_dashboard.yml itself.
Sub-step 3 also gains the half-shipped rule: record the scope you merged, not
the scope you filed. `lifecycle.py check` compares active.md slugs against
complete/ records and knows nothing about how much of a prompt's scope the merge
covered, so a campaign prompt recorded whole on a phase-1 merge is drift no
guard catches. Record what shipped; re-file the remainder as a fresh draft/
prompt pointing back at the record.
Why this is a skill step rather than a `lifecycle.py record` step (reference.md
says so where the question arises): complete/index.md and the active.md prune
were both folded into `record` for exactly this "easy to forget" reason, but the
dashboard cannot follow — the state is Mind's and the renderer is Brain's, and a
Mind script importing a Brain module inverts the organ boundary. That is why
dashboard_refresh.yml checks out both repos.
Worktree/branches/ledger renumber to 5/6/7 in prm.md and reference.md. The
matching PyAutoMind doc correction ships on the same branch there.
Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011QFJaycmUfaEhR4XoZajy9
description: The last thing you type for a task — "PR, CI green, then merge", then the full close-out. Watches a feature PR's checks until every workflow run and every matrix leg is green, merges (library-first gate honoured), closes the issue, moves the PyAutoMind prompt active/ → complete/, removes the task worktree and deletes the merged branches. Use when the user says merge this PR once CI is green, close this task out, or types /prm. Runs anywhere gh is authenticated: CLI, mobile Claude Code chat, Codex.
3
+
description: The last thing you type for a task — "PR, CI green, then merge", then the full close-out. Watches a feature PR's checks until every workflow run and every matrix leg is green, merges (library-first gate honoured), closes the issue, moves the PyAutoMind prompt active/ → complete/, reconciles and regenerates the Mind dashboard, removes the task worktree and deletes the merged branches. Use when the user says merge this PR once CI is green, close this task out, or types /prm. Runs anywhere gh is authenticated: CLI, mobile Claude Code chat, Codex.
4
4
---
5
5
6
6
# /prm — PR, CI green, then merge, then close the task out
It is **read-only by design**: `--apply` is ignored with *"intake reconcile is
209
+
read-only — retiring prompts stays human"*, and the emit closes with the same
210
+
rule. Under `/prm` that human authorization is the typed `/prm` — but it extends
211
+
only as far as *proof*:
212
+
213
+
| Evidence | Action |
214
+
|---|---|
215
+
| The sibling's issue was closed by this PR (`Closes #N`), or its scope sits inside the record you just wrote, or its own body names a now-merged PR | Write its record (`lifecycle.py record …`), `git rm` the prompt, repoint references |
216
+
|`shared-identifiers` / `rare-topic-overlap` / `stale-status` only | Leave it filed; name it in the ledger with the prefix to re-run |
217
+
218
+
`record` serves a `draft/` prompt too, with one catch: `--prompt` resolves under
219
+
`active/` only, so the fold does not happen — append the draft's full text under
220
+
a `## Original prompt` heading in the `--from-file` body yourself, then `git rm`
221
+
the draft. Everything else (`complete/index.md`, the `active.md` prune) is
222
+
folded into `record` already.
223
+
224
+
**Why this is a skill step and not a `record` step.** Two chores that used to sit
225
+
here were folded into `lifecycle.py record` precisely because a separate step was
226
+
easy to forget — `complete/index.md` and the `active.md` prune, both after their
227
+
own drift-alarm email storms. The dashboard cannot follow them: the state is
228
+
Mind's but the renderer is Brain's (`agents/conductors/intake/_intake.py`), and a
229
+
Mind script importing a Brain module inverts the organ boundary — which is why
230
+
`dashboard_refresh.yml` checks out both repos to do it. So the render stays a
231
+
step someone has to take, and `/prm` is the door that takes it.
232
+
233
+
**Regenerate, and commit the render with the record:**
0 commit comments