baldart 5.11.0 → 5.11.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +24 -0
- package/VERSION +1 -1
- package/framework/.claude/skills/new/CHANGELOG.md +40 -0
- package/framework/.claude/skills/new/SKILL.md +16 -3
- package/framework/.claude/skills/new/references/final-review.md +16 -3
- package/framework/.claude/skills/new/references/merge-cleanup.md +23 -0
- package/framework/.claude/skills/new/references/metrics.md +14 -0
- package/framework/.claude/skills/new/references/production-readiness.md +3 -2
- package/framework/.claude/skills/new/references/team-mode.md +2 -0
- package/framework/agents/runtime-portability-protocol.md +1 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,30 @@ All notable changes to BALDART will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [5.11.2] - 2026-07-07
|
|
9
|
+
|
|
10
|
+
**`/new` final report — including the v5.8.0 wave-aware launch plan — is now the SINGLE terminal message on BOTH runtimes; fixes the "buried wave summary" on Codex.**
|
|
11
|
+
A user reported that despite the v5.8.0 wave-launch-plan update, a **Codex-hosted** `/new` run ended not on the mandated `## Prossimi Passi` / `### Prossime wave da sviluppare` section but on an ad-hoc operational status (`db:check-sync OK`, `registry:sync OK`, `Repo allineate`, `card 01-05 DONE`). Root cause, confirmed after adversarially refuting the obvious diagnoses: the `/prd` wave-tag persistence is engine-agnostic (backlog-phase.md — fine) and `new2`'s wave line is Claude-only (not the Codex path), so the defect is entirely in `/new`'s **terminal reporting structure**. The wave-aware Next Steps lives only in Final Review **F.6 step 4b**, which the phase order places **before** Phase 6 (merge) / Phase 7 (production readiness) / Phase 8 (metrics). On **Claude** the near-silent rule suppresses that trailing Phase 6/7/8 narration, so the mid-run report survives *by accident* as the last block. On **Codex** the runtime does **not** honor that suppression (it narrates `db:check-sync` / `registry:sync` / `git status`), so the report gets buried and the run closes on operational noise + a self-composed summary. F.6 4b also had **no `Codex:` branch**, against the runtime-portability discipline.
|
|
12
|
+
|
|
13
|
+
The fix makes the Final Report **engine-independent** by turning it into a genuine terminal emission (no reliance on suppression):
|
|
14
|
+
- **Compose + persist, don't emit mid-run** — Final Review F.6 (steps 4/4b, `final-review.md`) now composes the verdict + per-card result block + actionable residue + **wave-aware Next Steps** and writes them to the tracker under a `## Final Report` section instead of emitting them in place; Phase 7 (`production-readiness.md`) appends its checklist to the same block instead of rendering standalone.
|
|
15
|
+
- **New terminal step** (`metrics.md` § "Terminal — Final Report emission") — runs LAST, after every Phase 8 step, and **ALWAYS** (even if the non-blocking metrics write SKIPPED/failed): it reads `## Final Report` from the tracker and emits it verbatim as the ONE terminal user-facing message, with a fallback that re-derives the wave summary if the tracker block is missing (legacy / compaction) rather than closing on a bare status line.
|
|
16
|
+
- **Explicit `Codex:` reinforcement** on F.6 4b + the terminal step: on Codex the run MUST still END on the `## Final Report` (wave-aware Next Steps included) regardless of any preceding operational narration.
|
|
17
|
+
- **New binding-table row** in `framework/agents/runtime-portability-protocol.md` § "Terminal report emission" (the SSOT the three skill modules now cite) — Claude relies on near-silent suppression; Codex must compose+persist+emit-terminally. SKILL.md § near-silent case 3 updated to name the terminal anchor.
|
|
18
|
+
|
|
19
|
+
**Codex parity: portable** (prose-only; the persist-then-emit-terminally design is what makes it engine-independent — it is the fix's whole point). `new2` is unaffected (Claude-only; its report is the workflow return, terminal by construction). **No new `baldart.config.yml` key** → the schema-change propagation rule does NOT apply. `/new` skill version → 2.4.2. Parity guard (`scripts/check-new-parity.mjs`) green.
|
|
20
|
+
|
|
21
|
+
## [5.11.1] - 2026-07-07
|
|
22
|
+
|
|
23
|
+
**`/new` now tears down its idle background subagents at end of run — closes the "Background work is running" leak on terminal exit.**
|
|
24
|
+
A user reported that after every interactive `/new` run, closing the terminal warns `Background work is running` and lists the batch's teammates (`## AUTONOMOUS CARD IMPLEMENTATION — FEAT-00NN`, the `i18n-translator` fill, the doc closer) as if they were still executing. They are not — they **finished**. Root cause: `/new` spawns its coder + closer subagents with `run_in_background: true`, and a background subagent that completes its work does **NOT** terminate — it goes idle ("rests") so the orchestrator could `SendMessage`/resume it (deliberate: the empty-result gate reads their transcripts from disk, and the framework explicitly forbids messaging a rested teammate). Phase 6c's teardown ended the **Codex broker** (a Bash process) + reaped orphan MCP servers, but there was **no `TaskStop` anywhere in the framework** — so the idle teammates stayed alive until Claude Code's `SessionEnd` (whenever the user closes the terminal). Harmless to the committed work (already merged), but noisy and wasteful of session resources.
|
|
25
|
+
|
|
26
|
+
- **New Phase 6c step 5c** (`framework/.claude/skills/new/references/merge-cleanup.md`) — after the merge and after every teammate's transcript has been consumed, `TaskList` → `TaskStop` the batch's idle teammates, scoped to THIS run only: matched by the `coder-<CARD-ID>` name prefix OR any card ID in the tracker `## Card Queue` (so the match survives a compaction). NEVER stops a task outside the batch signature (the user's unrelated background work in the same session). Best-effort + non-blocking + one log line (`Background subagents teardown: <stopped N | none alive | N/A (Codex) | skipped>`).
|
|
27
|
+
- **Mirror on early exit** (`framework/.claude/skills/new/SKILL.md` § "Terminal hygiene") — the same `TaskList`→`TaskStop` runs when the batch ends before Phase 6c (unrecoverable HALT / killed final-review workflow), exactly as the Codex-broker early teardown already did.
|
|
28
|
+
- **Pointer** in `references/team-mode.md` — the parallel `coder-<CARD-ID>` fan-out is the widest source of the leak; noted that Phase 6c 5c tears them down after merge.
|
|
29
|
+
- **`/new2` is unaffected** — its agents run inside the dynamic-workflow runtime and die with the workflow; only the classic `/new` (Task-tool background subagents) leaked.
|
|
30
|
+
- **Codex parity: N/A** — no observable Agent/Task tool on Codex, team-mode is forced sequential there, and Codex named-agent spawns do not persist as idle background tasks (`framework/agents/runtime-portability-protocol.md`). **No new `baldart.config.yml` key** → the schema-change propagation rule does NOT apply. `/new` skill version → 2.4.1.
|
|
31
|
+
|
|
8
32
|
## [5.11.0] - 2026-07-06
|
|
9
33
|
|
|
10
34
|
**Seamless framework-drift reconciliation in `baldart update` — a trivially-drifted shared framework file no longer dead-ends the whole update.**
|
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
5.11.
|
|
1
|
+
5.11.2
|
|
@@ -2,6 +2,46 @@
|
|
|
2
2
|
|
|
3
3
|
Formato: [Keep a Changelog](https://keepachangelog.com/) · [SemVer](https://semver.org/).
|
|
4
4
|
|
|
5
|
+
## 2.4.2 — 2026-07-07
|
|
6
|
+
|
|
7
|
+
- **Il report finale (incl. il piano wave v5.8.0) è ora l'UNICO messaggio terminale su entrambi i runtime — fix del "riepilogo wave sepolto" su Codex.**
|
|
8
|
+
Su un run Codex-hosted il `/new` chiudeva su uno status operativo ad-hoc (`db:check-sync OK`,
|
|
9
|
+
`registry:sync OK`, `Repo allineate`, `card 01-05 DONE`) invece della sezione `## Prossimi Passi` /
|
|
10
|
+
`### Prossime wave da sviluppare`. Refutate le diagnosi ovvie: la persistenza dei tag wave in `/prd`
|
|
11
|
+
è engine-agnostica (ok) e la riga wave di `new2` è Claude-only (non il path Codex) → il difetto è
|
|
12
|
+
tutto nella **struttura di reporting terminale** di `/new`. Le Next Steps wave-aware vivono solo in
|
|
13
|
+
Final Review **F.6 step 4b**, che l'ordine delle fasi colloca **prima** di Phase 6/7/8. Su **Claude**
|
|
14
|
+
la regola near-silent sopprime la narrazione di Phase 6/7/8, quindi il report a metà run sopravvive
|
|
15
|
+
*per caso* come ultimo blocco; su **Codex** quella soppressione non è onorata → il report viene
|
|
16
|
+
sepolto e il run chiude su rumore operativo + riepilogo auto-composto. 4b non aveva ramo `Codex:`.
|
|
17
|
+
Fix (rende il report engine-independent, senza dipendere dalla soppressione): (1) F.6 4/4b
|
|
18
|
+
**compone + persiste** verdict + result block + residue + Next Steps wave-aware nel tracker
|
|
19
|
+
`## Final Report` invece di emetterli in loco (`final-review.md`); (2) Phase 7 vi **appende** la
|
|
20
|
+
checklist (`production-readiness.md`); (3) **nuovo step terminale** `metrics.md` § "Terminal — Final
|
|
21
|
+
Report emission" che gira PER ULTIMO, SEMPRE (anche se la telemetria non-bloccante salta), legge
|
|
22
|
+
`## Final Report` e lo emette come UNICO messaggio finale, con fallback che ri-deriva il riepilogo
|
|
23
|
+
wave se il blocco manca; (4) rinforzo `Codex:` esplicito su 4b + step terminale; (5) nuova riga
|
|
24
|
+
della binding-table in `framework/agents/runtime-portability-protocol.md` § "Terminal report
|
|
25
|
+
emission" (SSOT citato dai tre moduli). SKILL.md § near-silent caso 3 aggiornato. Codex parity:
|
|
26
|
+
portable. `new2` non affetto (Claude-only, report = ritorno del workflow). Nessuna nuova chiave
|
|
27
|
+
`baldart.config.yml`.
|
|
28
|
+
|
|
29
|
+
## 2.4.1 — 2026-07-07
|
|
30
|
+
|
|
31
|
+
- **Teardown dei subagent in background a fine run (chiude il leak "Background work is running").**
|
|
32
|
+
I coder + closer di `/new` sono spawnati con `run_in_background: true`; un subagent che finisce il
|
|
33
|
+
lavoro **non termina** — va in idle ("rests") così l'orchestratore *potrebbe* farne resume. Il
|
|
34
|
+
teardown di Phase 6c fermava solo il **broker Codex** (processo Bash), mai i subagent → restavano
|
|
35
|
+
vivi in idle fino al `SessionEnd`, comparendo come "Background work is running" alla chiusura del
|
|
36
|
+
terminale. Nuovo step **6c.5c** (`references/merge-cleanup.md`): dopo il merge, `TaskList` →
|
|
37
|
+
`TaskStop` sui soli teammate di QUESTO batch — matchati per `coder-<CARD-ID>` o per card-ID dal
|
|
38
|
+
tracker `## Card Queue` (sopravvive alla compaction); mai un task fuori dalla firma del batch
|
|
39
|
+
(lavoro background non correlato dell'utente). Best-effort + non-bloccante + riga di log. Mirror
|
|
40
|
+
dello stesso teardown nel path di uscita anticipata (`SKILL.md` § "Terminal hygiene"); pointer in
|
|
41
|
+
`references/team-mode.md` (i coder paralleli sono la fonte principale del leak). `/new2` non è
|
|
42
|
+
affetto (agent nel runtime del workflow → muoiono col workflow). Codex parity: N/A (nessun
|
|
43
|
+
Agent/Task tool osservabile; team-mode forzato sequenziale). Nessuna nuova chiave `baldart.config.yml`.
|
|
44
|
+
|
|
5
45
|
## 2.4.0 — 2026-07-06
|
|
6
46
|
|
|
7
47
|
- **Prossime wave per NOME nel messaggio finale.** Il Step F.6 "Prossimi Passi"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: new
|
|
3
3
|
effort: medium
|
|
4
|
-
version: 2.4.
|
|
4
|
+
version: 2.4.2
|
|
5
5
|
requires_feature: has_backlog
|
|
6
6
|
description: >
|
|
7
7
|
Orchestrate a team of specialized agents to implement one or more backlog cards
|
|
@@ -349,8 +349,13 @@ baselines. Keep that bulk on disk and pass **paths**, not bodies.
|
|
|
349
349
|
> error string verbatim), no prose around them.
|
|
350
350
|
> 3. **One minimal end-of-batch result block** — one line per card (`CARD-ID: merged @<sha> | failed:
|
|
351
351
|
> <one clause> | deferred → <followup-id>`) plus only the actionable residue (unresolved/flagged items,
|
|
352
|
-
> the launch command
|
|
353
|
-
> lives in the tracker + `skill-runs.jsonl`, never rendered.
|
|
352
|
+
> the **wave-aware Next Steps / launch command**, any production-readiness manual step). NOT a per-phase
|
|
353
|
+
> report — process telemetry lives in the tracker + `skill-runs.jsonl`, never rendered. **This block is
|
|
354
|
+
> the SINGLE terminal user-facing message: it is composed + persisted to the tracker `## Final Report`
|
|
355
|
+
> during Final Review F.6 / Phase 7, then emitted ONCE as the LAST thing the run outputs, AFTER Phase 8
|
|
356
|
+
> (`metrics.md` § "Terminal — Final Report emission") — never mid-run, never followed by an ad-hoc status
|
|
357
|
+
> line. On Codex, where Phase 6/7/8 operational output is not suppressed, the run MUST still END on this
|
|
358
|
+
> `## Final Report`.**
|
|
354
359
|
> This governs the orchestrator's *prose*, not any agent's return contract (that is § "Context economy" above).
|
|
355
360
|
>
|
|
356
361
|
> These rules reduce the *number* of replays; the bulk-content rule above reduces the *size* of each.
|
|
@@ -472,6 +477,14 @@ printf '%s' "$TD" | grep -qi "unknown command" \
|
|
|
472
477
|
This NEVER touches a broker for another worktree or the user's interactive session (different cwd). If the
|
|
473
478
|
orchestrator is hard-killed and never resumed, the `baldart doctor` reaper is the final safety net.
|
|
474
479
|
|
|
480
|
+
**Also stop THIS batch's idle background subagents on that early exit** (Claude-only, best-effort) — the
|
|
481
|
+
same teardown Phase 6c step 5c runs on the normal close. `/new`'s coder + closer teammates (`run_in_background`)
|
|
482
|
+
go idle rather than terminate, so an early exit leaves them alive and they surface as "Background work is
|
|
483
|
+
running" when the user closes the terminal. `TaskList` → `TaskStop` each task named `coder-<CARD-ID>` or whose
|
|
484
|
+
name/prompt references a card ID from the tracker `## Card Queue`; NEVER stop a task that does not match the
|
|
485
|
+
batch signature (the user's unrelated background work). Any `TaskStop` error / absent tool is fine — never
|
|
486
|
+
gate the exit on it. (Codex: N/A — no observable Task tool.)
|
|
487
|
+
|
|
475
488
|
---
|
|
476
489
|
|
|
477
490
|
|
|
@@ -410,9 +410,22 @@ that is a **gate violation**: log it as
|
|
|
410
410
|
If the project ships a `knowledge-sync` corpus agent (declared in `.baldart/overlays/new.md`), invoke it after doc updates so the external corpus stays aligned. If no such agent exists, skip this step with a one-line notice (do NOT dispatch a non-existent agent).
|
|
411
411
|
|
|
412
412
|
3. **Proceed to Phase 6** (post-batch merge & cleanup).
|
|
413
|
-
4.
|
|
413
|
+
4. **Compose** the **minimal end-of-batch result block** (per § "orchestrator is near-silent" in the core SKILL.md — this is NOT a per-phase report) and **persist it verbatim to the tracker under a `## Final Report` section — do NOT emit it here.** ONE line per card and nothing more of the process telemetry:
|
|
414
414
|
- `<CARD-ID>: merged @<sha> | failed: <one clause> | deferred → <followup-id>`
|
|
415
415
|
|
|
416
|
+
> **Terminal-emission anchor (v5.11.2 — the fix for the Codex "buried wave summary").** The Final
|
|
417
|
+
> Report (this result block + the Next Steps / wave plan in 4b + the Phase 7 Production Readiness
|
|
418
|
+
> checklist) is the **single user-facing terminal message** of the whole run — it is emitted **ONCE,
|
|
419
|
+
> as the LAST thing the user reads, AFTER Phase 8** (`metrics.md` § "Terminal — Final Report
|
|
420
|
+
> emission"), **not here**. F.6 runs before Phase 6/7/8, so emitting the report now buries it under
|
|
421
|
+
> the merge / production-readiness / metrics output that follows. On **Claude** the near-silent rule
|
|
422
|
+
> (SKILL.md case 3) suppresses that trailing output so the mid-run report happens to survive as the
|
|
423
|
+
> last block; on **Codex** the runtime does NOT honor that suppression (it narrates the Phase 7
|
|
424
|
+
> `db:check-sync` / `registry:sync` steps), so a mid-run report is lost and the run closes on an
|
|
425
|
+
> ad-hoc operational status instead of the mandated wave summary. Persisting to `## Final Report`
|
|
426
|
+
> and emitting terminally makes the report engine-independent. So here in F.6: **compose the content,
|
|
427
|
+
> write it to the tracker's `## Final Report`, and continue** — the terminal step emits it.
|
|
428
|
+
|
|
416
429
|
**Report verdict (v5.6.0 — HARD headline rule, FEAT-0068 post-mortem).** The FIRST line of the
|
|
417
430
|
result block is a verdict, and it is computed, not felt:
|
|
418
431
|
- `⚠️ PARTIAL — obiettivo epic NON raggiunto: <one clause naming the gap>` whenever ANY of:
|
|
@@ -426,9 +439,9 @@ that is a **gate violation**: log it as
|
|
|
426
439
|
user discovered it only by asking. "Nulla perso" (tracking) is never a substitute for "non
|
|
427
440
|
finito" (truth): a follow-up that holds the epic's remaining work is REMAINING WORK.
|
|
428
441
|
|
|
429
|
-
Then, **only if non-empty**, the **actionable residue**: issues needing user attention (anything unresolved, partially wired, or flagged — terse, with `path:line` / `CARD-ID` exact). All process telemetry — files changed, test/build/lint status, fix cycles, review-finding counts, UX/QA verdicts, commit + merge hashes, card-status reconciliation, worktree cleanup, knowledge-corpus sync — is **NOT rendered**: it lives in the tracker and `$METRICS/skill-runs.jsonl`. (The Next Steps & Launch Command in 4b below and any Production Readiness manual steps ARE part of the actionable residue — keep them.)
|
|
442
|
+
Then, **only if non-empty**, the **actionable residue**: issues needing user attention (anything unresolved, partially wired, or flagged — terse, with `path:line` / `CARD-ID` exact). All process telemetry — files changed, test/build/lint status, fix cycles, review-finding counts, UX/QA verdicts, commit + merge hashes, card-status reconciliation, worktree cleanup, knowledge-corpus sync — is **NOT rendered**: it lives in the tracker and `$METRICS/skill-runs.jsonl`. (The Next Steps & Launch Command in 4b below and any Production Readiness manual steps ARE part of the actionable residue — keep them.) **The verdict line + result block + actionable residue all go into the same persisted `## Final Report` block** (do NOT emit them now — the terminal step in `metrics.md` does).
|
|
430
443
|
|
|
431
|
-
4b. **Next Steps & Launch Command** (MANDATORY section — always present):
|
|
444
|
+
4b. **Next Steps & Launch Command** (MANDATORY section — always present). **Compose it and APPEND it to the persisted `## Final Report` block from step 4 — do NOT emit it here** (the terminal step in `metrics.md` emits the whole `## Final Report`). **Codex (runtime-portability): this section is engine-INDEPENDENT and MUST be present in the terminal message on a Codex-hosted run exactly as on Claude** — the near-silent suppression of Phase 6/7/8 narration is NOT guaranteed on Codex, so persisting-then-emitting-terminally (not the suppression) is what keeps the wave summary from being buried. Rule: `framework/agents/runtime-portability-protocol.md` § "Terminal report emission".
|
|
432
445
|
|
|
433
446
|
Check for remaining not-yet-DONE cards in the same epic group (match "not DONE",
|
|
434
447
|
not a hard-coded status value — see the `status enum` SSOT in REGISTRY.md):
|
|
@@ -263,6 +263,28 @@ The most common failure mode is leaving cards IN_PROGRESS after merge. This crea
|
|
|
263
263
|
Never gate the close on these — any error or a "nothing to do" result is fine; capture each one-line
|
|
264
264
|
summary for the log.
|
|
265
265
|
|
|
266
|
+
5c. **Background subagent teardown — stop THIS batch's idle teammates (Claude-only, NON-BLOCKING)**.
|
|
267
|
+
`/new` spawns coder + closer subagents with `run_in_background: true` (team-mode coders
|
|
268
|
+
`coder-<CARD-ID>`, the step-7c `i18n-translator` fill, the doc closer). A background subagent that
|
|
269
|
+
finishes its work does **NOT** terminate — it goes idle ("rests") so the orchestrator *could*
|
|
270
|
+
resume it (and the empty-result gate reads its transcript from disk, never via `SendMessage`). By
|
|
271
|
+
Phase 6c every card is merged and every teammate's transcript has already been consumed, so these
|
|
272
|
+
idle teammates are pure dead weight — but the broker teardown above only ends the **Codex broker**
|
|
273
|
+
(a Bash process); it does NOT touch the subagents. Left alone they stay alive until Claude Code's
|
|
274
|
+
`SessionEnd` (hours away) and surface as **"Background work is running"** the moment the user tries
|
|
275
|
+
to close the terminal — noise + held session resources, though the committed work is already safe.
|
|
276
|
+
Stop ONLY the teammates belonging to THIS batch — matched by the batch's card IDs (read from the
|
|
277
|
+
tracker `## Card Queue`, so the match survives a compaction) or the `coder-` name prefix:
|
|
278
|
+
- `TaskList` → for each task still `running`/idle whose `name` is `coder-<CARD-ID>` OR whose
|
|
279
|
+
`name`/prompt references any card ID in `## Card Queue` (e.g. `FEAT-00NN`) → `TaskStop` it.
|
|
280
|
+
- **NEVER** `TaskStop` a task that does not match the batch signature — the user may have unrelated
|
|
281
|
+
background work in the same session. When a task's ownership is ambiguous, LEAVE it (a stray idle
|
|
282
|
+
`/new` teammate is harmless; killing the user's unrelated work is not).
|
|
283
|
+
Best-effort: a `TaskStop` error / "already stopped" / an absent `TaskList` tool is all fine —
|
|
284
|
+
capture a one-line count for the log, never gate the close on it. **(Codex path — N/A:** no
|
|
285
|
+
observable Agent/Task tool, team-mode is forced sequential, and Codex named-agent spawns do not
|
|
286
|
+
persist as idle background tasks — see `framework/agents/runtime-portability-protocol.md`.)
|
|
287
|
+
|
|
266
288
|
6. **Log and exit**:
|
|
267
289
|
```
|
|
268
290
|
## Phase 6c — Workspace Hygiene Post-merge
|
|
@@ -273,6 +295,7 @@ The most common failure mode is leaving cards IN_PROGRESS after merge. This crea
|
|
|
273
295
|
Phase 0 snapshot restore: <n/a | popped clean | conflict-deferred-to-user>
|
|
274
296
|
Codex broker teardown: <graceful (pid) | signalled N | none | skipped (error)>
|
|
275
297
|
Codex MCP hygiene (reap): <reaped N/M | nothing to reap | skipped (error)>
|
|
298
|
+
Background subagents teardown: <stopped N | none alive | N/A (Codex) | skipped (error)>
|
|
276
299
|
Completed: <timestamp>
|
|
277
300
|
```
|
|
278
301
|
If any step ended in HALT, set `Status: HALT` and report — Phase 7 must NOT start with an unclean main repo unless the user explicitly chose `[Lascia così]`.
|
|
@@ -70,3 +70,17 @@ has no blocking consequence the honest label is "monitoring signal".
|
|
|
70
70
|
**If `$METRICS/skill-runs.jsonl` does not exist**: create it first with `mkdir -p "$METRICS" && touch "$METRICS/skill-runs.jsonl"`.
|
|
71
71
|
**If batch tracker is missing or unreadable**: log "Metrics Log: SKIPPED (tracker not found)" and proceed without blocking.
|
|
72
72
|
**This phase is NON-BLOCKING** — if it fails for any reason, do not abort the run. The `-stats` step in particular is best-effort: the script is fail-safe (always exits 0), so never let it block the commit.
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## Terminal — Final Report emission (v5.11.2 — the SINGLE user-facing end message)
|
|
77
|
+
|
|
78
|
+
**This runs LAST, after every Phase 8 step above, and it ALWAYS runs — even if the Phase 8 telemetry SKIPPED or failed** (the report is a user deliverable; the metrics write is monitoring). It is the ONE terminal user-facing message of the whole `/new` run (case 3 of the near-silent rule, SKILL.md).
|
|
79
|
+
|
|
80
|
+
1. **Read the `## Final Report` section from the tracker** (`$TRACKER`). Final Review F.6 (steps 4/4b) composed it — verdict line + one line per card + actionable residue + Next Steps / **wave-aware launch plan** — and Phase 7 appended the Production Readiness checklist to the same block.
|
|
81
|
+
|
|
82
|
+
2. **Emit that `## Final Report` verbatim as the run's terminal message** — nothing after it. This is the last thing the user reads. Do NOT re-render process telemetry around it (§ "orchestrator is near-silent").
|
|
83
|
+
|
|
84
|
+
3. **Fallback (tracker `## Final Report` missing / empty — legacy or a mid-run compaction that lost it):** re-derive the report on the spot from the tracker's `## Completed Cards` + `## Worktree Merges` + the epic card's wave tags (final-review.md F.6 step 4b procedure) rather than closing on a bare status line. A terminal message that is only "repo aligned / cards DONE" is the exact regression this step fixes.
|
|
85
|
+
|
|
86
|
+
> **Codex (runtime-portability — the fix's target case).** On a **Codex-hosted** run the near-silent suppression of the Phase 6/7/8 operational narration (`db:check-sync`, `registry:sync`, `git status`, …) is NOT guaranteed, so that output may precede this message. It does not matter: **the run MUST still END with the `## Final Report` block** (verdict + result lines + **wave-aware Next Steps**), emitted here as the terminal message — never let an ad-hoc operational summary ("repo allineate / card DONE") be the last thing the user sees. The persisted-then-emitted-terminally design is exactly what makes this engine-independent. Rule: `framework/agents/runtime-portability-protocol.md`.
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
## Phase 7 — Production Readiness Checklist
|
|
6
6
|
|
|
7
|
-
After Phase 6 completes
|
|
7
|
+
After Phase 6 completes, compose a **Production Readiness Checklist** — a clear list of all manual or infrastructure actions required to launch the implemented changes in production. **Do NOT emit it standalone here: APPEND it to the persisted `## Final Report` block (the one Final Review F.6 started) — the single terminal step in `metrics.md` § "Terminal — Final Report emission" emits the whole report AFTER Phase 8.** (Auto-executing the agent-doable items below still happens in THIS phase — only the *rendering* of the checklist is deferred to the terminal message.)
|
|
8
8
|
|
|
9
9
|
> **Minimal light lane (v5.4.1): SKIP the spawn for an all-`light` batch** — a light card
|
|
10
10
|
> carries no deployable surface by Rule C (no migrations, indexes, cron, schema, env); the
|
|
@@ -39,7 +39,8 @@ asking the user.
|
|
|
39
39
|
|
|
40
40
|
### Output format
|
|
41
41
|
|
|
42
|
-
|
|
42
|
+
Compose the checklist as a clearly formatted section and append it to the persisted
|
|
43
|
+
`## Final Report` (emitted terminally after Phase 8 — see the note at the top of this phase).
|
|
43
44
|
The example below assumes `stack.deployment: firebase` + `stack.database: firestore`;
|
|
44
45
|
adapt commands and tags to the project's resolved stack.
|
|
45
46
|
|
|
@@ -348,4 +348,6 @@ Before starting group N, verify ALL cards in groups 0..N-1 are status: done. If
|
|
|
348
348
|
|
|
349
349
|
After all groups are complete, run the same Final Review, Phase 6 (merge), and Phase 7 (production readiness) as documented above. Since v3.37.0 the Final Review runs a **single FULL `/codexreview` over the entire batch diff** (per the Final-review FULL gate) — no scope reduction — so every team-mode card, including any reviewed at `light` in D.4b, receives a guaranteed full review before merge.
|
|
350
350
|
|
|
351
|
+
> **The parallel `coder-<CARD-ID>` teammates are torn down at Phase 6c step 5c** (`references/merge-cleanup.md`) — a `run_in_background` coder goes idle rather than terminating, so team mode (the widest fan-out) is the main source of the "Background work is running" idle-teammate leak. The Phase 6c teardown `TaskStop`s them after merge; nothing to do here.
|
|
352
|
+
|
|
351
353
|
---
|
|
@@ -66,6 +66,7 @@ Three of the operations below are already binding cross-tool in
|
|
|
66
66
|
| **Decision gate (ask user)** | `AskUserQuestion` (STOP, wait — the only action that turn) | a plain, single, concise user prompt (or `request_user_input` if the runtime exposes it); in autonomous mode, the skill's AUTONOMOUS RESOLUTION RULE | this module (gate *policy* — e.g. no-silent-AC-deferral — stays in the skill) |
|
|
67
67
|
| **Read / write path** | `Read` / `Write` / `Edit` (absolute paths) | shell / `apply_patch` / filesystem tools | invariant is **worktree-rooted absolute path**, NOT a tool name — `cd` is not sufficient (an absolute path can still escape). Isolation rule: AGENTS.md (CITE) |
|
|
68
68
|
| **Adversarial vs cross-model review** | an external Codex companion from Claude = genuinely **cross-model** | a same-runtime Codex pass (when the host IS Codex) = **adversarial fresh-context only, NOT cross-model** | this module |
|
|
69
|
+
| **Terminal report emission** | the near-silent rule suppresses trailing phase narration, so a mid-run report survives as the last block | narration is NOT suppressed → a mid-run report gets buried; **compose+persist the report to the run's state file, then emit it ONCE as the terminal message after the last phase** — engine-independent, never rely on suppression | this module |
|
|
69
70
|
|
|
70
71
|
## Capability detection contract
|
|
71
72
|
|