@gtrabanco/pi-agentic-workflow 0.1.0

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.
Files changed (137) hide show
  1. package/LICENSE +21 -0
  2. package/README.es.md +154 -0
  3. package/README.md +148 -0
  4. package/dist/config/defaults.d.ts +8 -0
  5. package/dist/config/defaults.js +11 -0
  6. package/dist/config/load.d.ts +19 -0
  7. package/dist/config/load.js +76 -0
  8. package/dist/config/merge.d.ts +4 -0
  9. package/dist/config/merge.js +43 -0
  10. package/dist/config/schema.d.ts +21 -0
  11. package/dist/config/schema.js +144 -0
  12. package/dist/config/types.d.ts +53 -0
  13. package/dist/config/types.js +12 -0
  14. package/dist/extension/factory.d.ts +47 -0
  15. package/dist/extension/factory.js +49 -0
  16. package/dist/extension/index.d.ts +4 -0
  17. package/dist/extension/index.js +84 -0
  18. package/dist/routing/catalogue.d.ts +35 -0
  19. package/dist/routing/catalogue.js +79 -0
  20. package/dist/routing/dispatch.d.ts +34 -0
  21. package/dist/routing/dispatch.js +191 -0
  22. package/dist/routing/state.d.ts +13 -0
  23. package/dist/routing/state.js +65 -0
  24. package/dist/routing/types.d.ts +90 -0
  25. package/dist/routing/types.js +3 -0
  26. package/dist/settings/console.d.ts +55 -0
  27. package/dist/settings/console.js +266 -0
  28. package/dist/settings/store.d.ts +3 -0
  29. package/dist/settings/store.js +24 -0
  30. package/dist/settings/view.d.ts +11 -0
  31. package/dist/settings/view.js +46 -0
  32. package/package.json +59 -0
  33. package/skills/audit-docs/SKILL.md +171 -0
  34. package/skills/audit-pr/SKILL.md +201 -0
  35. package/skills/audit-pr/references/01_MERGE_GATES.md +24 -0
  36. package/skills/audit-pr/references/02_CLOSURE_AND_SCOPE_GATES.md +83 -0
  37. package/skills/audit-pr/references/03_AUDIT_PROCESS.md +69 -0
  38. package/skills/audit-pr/references/04_VERDICT.md +69 -0
  39. package/skills/audit-pr/references/05_ROUTING_AND_GUARDRAILS.md +58 -0
  40. package/skills/audit-pr/references/PORTABILITY.md +17 -0
  41. package/skills/design-feature/SKILL.md +162 -0
  42. package/skills/design-feature/references/INTERVIEW.md +52 -0
  43. package/skills/design-feature/references/PORTABILITY.md +15 -0
  44. package/skills/design-feature/references/UPSERT_EXAMPLE.md +8 -0
  45. package/skills/design-feature/references/WRITE_AND_UPSERT.md +92 -0
  46. package/skills/discover-repository-state/SKILL.md +83 -0
  47. package/skills/execute-phase/SKILL.md +115 -0
  48. package/skills/execute-phase/references/BATCH_AND_PORTABILITY.md +54 -0
  49. package/skills/execute-phase/references/CLOSEOUT.md +74 -0
  50. package/skills/execute-phase/references/DESCOPE.md +35 -0
  51. package/skills/execute-phase/references/EXECUTION_CONTRACT.md +147 -0
  52. package/skills/execute-phase/references/FOLDING.md +73 -0
  53. package/skills/execute-phase/references/FORGE_BODY.md +24 -0
  54. package/skills/execute-phase/references/HANDOFF.md +21 -0
  55. package/skills/execute-phase/references/OPPORTUNISTIC_FINDING.md +45 -0
  56. package/skills/execute-phase/references/PREFLIGHT.md +152 -0
  57. package/skills/execute-phase/references/UNIT_LOOP.md +88 -0
  58. package/skills/execute-phase/references/WORKFLOWS_FEATURE.md +37 -0
  59. package/skills/execute-phase/references/WORKFLOWS_FIX.md +43 -0
  60. package/skills/execute-phase/references/WORKFLOWS_LEGACY.md +26 -0
  61. package/skills/execute-phase/references/WORKFLOWS_SMALL_PHASED.md +38 -0
  62. package/skills/fold-findings/SKILL.md +141 -0
  63. package/skills/fold-findings/references/FOLD_POLICY.md +43 -0
  64. package/skills/fold-findings/references/FOLD_PROCESS.md +41 -0
  65. package/skills/generate-docs/SKILL.md +145 -0
  66. package/skills/generate-docs/references/ADAPTERS.md +15 -0
  67. package/skills/generate-docs/references/ADAPTER_DISCOVERY.md +33 -0
  68. package/skills/generate-docs/references/GENERATION_PROCESS.md +90 -0
  69. package/skills/init-workspace/SKILL.md +152 -0
  70. package/skills/init-workspace/references/BOOTSTRAP_DISCOVERY.md +70 -0
  71. package/skills/init-workspace/references/BOOTSTRAP_WRITE.md +58 -0
  72. package/skills/init-workspace/references/PORTABILITY.md +16 -0
  73. package/skills/init-workspace/references/UPGRADE.md +83 -0
  74. package/skills/log-session/SKILL.md +159 -0
  75. package/skills/loop-review-fold/SKILL.md +168 -0
  76. package/skills/orchestration-envelope/SKILL.md +81 -0
  77. package/skills/orchestration-envelope/references/TURN_CONTRACT.md +21 -0
  78. package/skills/phase-contract/SKILL.md +82 -0
  79. package/skills/plan-feature/SKILL.md +179 -0
  80. package/skills/plan-feature/references/ROUTING.md +83 -0
  81. package/skills/plan-feature-from-issue/SKILL.md +140 -0
  82. package/skills/plan-feature-scaffold/SKILL.md +93 -0
  83. package/skills/plan-feature-scaffold/references/SCAFFOLD_PROCESS.md +76 -0
  84. package/skills/plan-fix/SKILL.md +115 -0
  85. package/skills/plan-fix/references/PLANNING_PROCESS.md +118 -0
  86. package/skills/plan-fix/references/SPEC_CONTRACT.md +22 -0
  87. package/skills/planning-preflight/SKILL.md +130 -0
  88. package/skills/product-audit/SKILL.md +225 -0
  89. package/skills/product-audit/references/AUDIT_DIMENSIONS.md +24 -0
  90. package/skills/product-audit/references/AUDIT_PROCESS.md +85 -0
  91. package/skills/resolve-repository-state/SKILL.md +79 -0
  92. package/skills/review-a11y/SKILL.md +60 -0
  93. package/skills/review-brand/SKILL.md +65 -0
  94. package/skills/review-change/SKILL.md +156 -0
  95. package/skills/review-change/references/ADVERSARIAL_RECOMMENDATION.md +31 -0
  96. package/skills/review-change/references/ADVERSARIAL_SETUP.md +86 -0
  97. package/skills/review-change/references/ADVERSARIAL_SYNTHESIS.md +53 -0
  98. package/skills/review-change/references/OUTPUT_AND_GUARDRAILS.md +85 -0
  99. package/skills/review-change/references/PERSIST_AND_DECIDE.md +151 -0
  100. package/skills/review-change/references/PORTABILITY.md +74 -0
  101. package/skills/review-change/references/REVIEW_PROCESS.md +86 -0
  102. package/skills/review-code/SKILL.md +69 -0
  103. package/skills/review-debt/SKILL.md +72 -0
  104. package/skills/review-design/SKILL.md +60 -0
  105. package/skills/review-implementation/SKILL.md +108 -0
  106. package/skills/review-implementation/references/CLASSIFY.md +96 -0
  107. package/skills/review-implementation/references/FIND.md +35 -0
  108. package/skills/review-perf/SKILL.md +79 -0
  109. package/skills/review-security/SKILL.md +65 -0
  110. package/skills/review-seo/SKILL.md +65 -0
  111. package/skills/review-verify/SKILL.md +66 -0
  112. package/skills/ship-roadmap/SKILL.md +120 -0
  113. package/skills/ship-roadmap/references/ADVANCE.md +90 -0
  114. package/skills/ship-roadmap/references/AUDIT_AND_MERGE.md +64 -0
  115. package/skills/ship-roadmap/references/CLOSEOUT_AND_LOG.md +26 -0
  116. package/skills/ship-roadmap/references/FOUNDING.md +101 -0
  117. package/skills/ship-roadmap/references/GUARDRAILS.md +56 -0
  118. package/skills/ship-roadmap/references/MODEL_ROUTING.md +14 -0
  119. package/skills/ship-roadmap/references/PORTABILITY.md +34 -0
  120. package/skills/ship-roadmap/references/RECOVERY_AND_SELECTION.md +93 -0
  121. package/skills/ship-roadmap/references/STOP_CONDITIONS.md +9 -0
  122. package/skills/ship-roadmap/references/TERMINAL_REPORT.md +34 -0
  123. package/skills/triage-issue/SKILL.md +148 -0
  124. package/skills/triage-issue/references/AUDIT_FINDINGS.md +35 -0
  125. package/skills/triage-issue/references/FOLD_LEDGER.md +32 -0
  126. package/skills/triage-issue/references/ISSUE_PROCESS.md +101 -0
  127. package/skills/triage-issue/references/LABELS.md +83 -0
  128. package/skills/triage-issue/references/REVIEW_FINDING_PROCESS.md +41 -0
  129. package/skills/verification-contract/SKILL.md +77 -0
  130. package/skills/workflow-status/SKILL.md +143 -0
  131. package/skills/workflow-status/references/CRASH_RECOVERY.md +66 -0
  132. package/skills/workflow-status/references/ENVELOPE_CORE.md +107 -0
  133. package/skills/workflow-status/references/ENVELOPE_FIELDS.md +77 -0
  134. package/skills/workflow-status/references/GUARDRAILS.md +17 -0
  135. package/skills/workflow-status/references/PORTABILITY.md +14 -0
  136. package/skills/workflow-status/references/SENSOR_CORE.md +95 -0
  137. package/skills/workflow-status/references/SENSOR_SIGNALS.md +128 -0
@@ -0,0 +1,56 @@
1
+ ## Guardrails
2
+
3
+ - **Never work on the default branch** — the empty-repo initial scaffold commit
4
+ is the single exception. One PR per unit, never stacked; roadmap status flips
5
+ ride PR-bound commits only.
6
+ - **Forge bodies are Markdown, not shell — never hand-escape.** Every explicitly
7
+ authorized issue, PR, or comment the run creates (subagent PRs, triage
8
+ comments) carries a body of **real Markdown**: backticks / `*` / `_` are
9
+ formatting, and a `\` before them renders literally (`` \`code\` `` instead
10
+ of `` `code` ``). Write the body to a file and pass **`--body-file <path>`**
11
+ to `gh issue create` / `gh pr create` / `gh issue comment` (or the declared
12
+ forge's equivalent) — never inline `--body "…"` or a quoted heredoc. Verify
13
+ with `gh … --json body` that no literal `` \` `` survived. (execute-phase
14
+ subagents already follow this; the conductor must too.)
15
+ - **Never commit red; never merge red.** The gate and the floors are
16
+ unconditional — no flag, mode, or interview answer disables them.
17
+ - **Never request or retain a direct-merge permission.** Fullauto calls only
18
+ the repository wrapper with command-scoped variables; a missing wrapper or
19
+ active guard blocks the run and routes to `init-workspace` upgrade.
20
+ - **No stage ends dirty or unpushed.** The clean close-out check (Mode B
21
+ step 5) is part of every stage: tracked modifications — docs included — are
22
+ committed with the stage, and a PR-backed branch is pushed before the
23
+ iteration logs the stage complete. Merging while anything is uncommitted,
24
+ unpushed, or unpulled is forbidden: push, wait for CI, re-audit, then merge.
25
+ - **The conductor never writes application code.** All implementation flows
26
+ through fresh cheap-tier `execute-phase` workers, one phase per context —
27
+ that keeps the cost model honest and `execute-phase` the single pathway.
28
+ - **Tier discipline.** Compose in-turn only skills at ≤ opus/high;
29
+ implementation goes below the turn tier via explicit subagent model
30
+ overrides; `product-audit` is never run by this skill. `ultracode` is a
31
+ user-owned session setting — recommended, never claimed.
32
+ - **Interview once, then silence.** Mid-run gaps — including a mid-run
33
+ `idea`/`defined` unit's product-half gaps in the DESIGN stage — are resolved
34
+ from the decision record and logged; contradictions park the feature with
35
+ the evidence recorded. Re-interviewing mid-run is forbidden, in DESIGN as in
36
+ every other stage: an undesignable unit is parked (`NEEDS_INPUT` on that
37
+ unit, `state: CONTINUE` on the run), never asked about. The recovery from a
38
+ wrong founding call is a reported stop and a human-restarted run.
39
+ - **Scope discipline.** Defects and ideas discovered mid-run become report
40
+ proposals — never automatically-created issues or in-run side quests. Only
41
+ existing user/forge issues enter the issue sweep.
42
+ - **Stack/architecture/forge agnostic; English artifacts** regardless of the
43
+ interview language; recommendations proportional to the interviewed scale,
44
+ recorded in the project's own docs so every sub-skill discovers them through
45
+ its normal Step 0.
46
+
47
+ **Known limits (stated, not hidden):** subagent overrides pin the model but
48
+ not the effort, so execution subagents inherit the session's effort — cost can
49
+ drift if the session runs high. `/loop`'s stop-on-banner matching should be
50
+ treated as a convenience, not a guarantee — iterations after a terminal banner
51
+ are idempotent no-ops, and the loop can always be stopped manually. Budget caps
52
+ count iterations, not tokens — and the count lives in the machine-local log, so
53
+ it bounds each machine's run, not the run's lifetime across machines. Verdicts
54
+ persist in the run log and feature docs,
55
+ but a crash between PR close-out and review may re-run one receipt check —
56
+ accepted cost, never a correctness risk.
@@ -0,0 +1,14 @@
1
+ ### Model routing
2
+
3
+ | Stage | Tier | Mechanism |
4
+ |---|---|---|
5
+ | Interview, founding, roadmap creation | opus/high | this skill's frontmatter; composes `init-workspace` (equal tier), answers pre-fed |
6
+ | Recovery, routing, logging | opus/high | in-turn (tiny token volume; a subagent would add cost, not save it) |
7
+ | JIT feature design (mid-run `idea`/`defined` unit) | opus/high | compose `design-feature` + `plan-feature-scaffold` in-turn (equal tier, deriving only from `SHIP_DECISIONS.md` — no new questions) |
8
+ | JIT feature planning | opus/high | compose `plan-feature` in-turn (its internals are opus/high–medium: ≥ holds) |
9
+ | Phase execution, single-pass, fixes | **cheap worker** | fresh context per phase following `execute-phase`; Claude branch maps this role to `sonnet`, portable drivers use their validated worker tier |
10
+ | Final review/correction loop | opus/high | compose `loop-review-fold`; it selects review or fold from persisted evidence and routes unresolved findings to `triage-issue --prioritize-now` |
11
+ | Merge gate | opus/high | compose `audit-pr` in-turn (the highest-stakes automated verdict; must share one turn with the floor checks) |
12
+ | Forge/git mechanics | — | Bash tool calls; no model judgment involved |
13
+ | Final-report evidence gathering | haiku (optional) | fan-out subagents for grep-shaped per-feature log collection when ultracode is on; synthesis stays opus |
14
+ | `product-audit` | opus/max | **never composed, never imitated by a subagent** — its effort (max) exceeds the conductor's (high) and a subagent override cannot carry `effort: max`. Hand-off only: the report prescribes when to run it. |
@@ -0,0 +1,34 @@
1
+ ## Portability (agents other than Claude Code)
2
+
3
+ The workflow is the contract; Claude Code features are conveniences. This skill
4
+ leans on them harder than any other — here is the manual equivalent of each:
5
+
6
+ - **No `/loop`** — two equivalent replacements, both vendor-neutral: (a) an
7
+ **external orchestrator** loops `/ship-roadmap --continue` headless and
8
+ routes its native fixed `SHIP:` banner plus closing `→ Next:` block (full
9
+ protocol + driver skeleton in `docs/workflow/ORCHESTRATION.md`); (b) manual
10
+ re-invocation after each iteration. Iterations are
11
+ stateless-by-reconstruction, so any driver is exactly equivalent; stop when
12
+ the first line is a terminal `SHIP:` banner. **Every iteration ending is
13
+ announced** — "iteration complete (normal; re-invoke to continue)" vs a
14
+ parked/terminal reason — so a stop is never ambiguous.
15
+ - **No subagents** — execute phases sequentially: for each phase, one **fresh
16
+ headless invocation (or conversation) on a cheaper model** following the
17
+ installed `execute-phase` SKILL.md for exactly one phase (same two autopilot
18
+ overrides) — the external-driver pattern in `docs/workflow/ORCHESTRATION.md`
19
+ does exactly this. The conductor stages (recover/plan/PR/review/audit) stay
20
+ on your strongest model.
21
+ - **No slash-command menu** — where this skill says `/<skill>`, open that
22
+ skill's `SKILL.md` (wherever your agent installed the skills) and follow it
23
+ literally in the conversation the routing table assigns it (in-turn = this
24
+ conversation; subagent/hand-off = a fresh one).
25
+ - **No per-skill `model:`/`effort:`** — the `#claude` branch's routing table pins these tiers; here, pick tiers yourself:
26
+ judgment stages on your **strongest** model, implementation on a cheaper one,
27
+ and `product-audit` always as its own maximum-effort run.
28
+ - **Provider concurrency limits** — when spawning parallel subagents (or
29
+ parallel headless invocations), cap concurrency at the provider's documented
30
+ parallel-request limit per API key, leaving one slot free for the conductor
31
+ (e.g. a provider allowing 5 concurrent requests → at most 3–4 parallel
32
+ executors). An agentic loop spends one request per tool round-trip, so
33
+ parallel executors also eat the per-minute request budget fast; on a 429,
34
+ reduce parallelism before retrying rather than hammering the limit.
@@ -0,0 +1,93 @@
1
+ ### Mode B — One loop iteration: `/ship-roadmap --continue [--fullauto]`
2
+
3
+ Every iteration is stateless-by-reconstruction — no memory is assumed between
4
+ turns:
5
+
6
+ 1. **RECOVER.** Read `SHIP_DECISIONS.md` (missing → `SHIP: STOPPED — no run
7
+ policy; run /ship-roadmap first`) and `.ship-run.log` (missing on this
8
+ machine → recreate empty; policy lives in the committed record). **Verify
9
+ the substrate landed:** `SHIP_DECISIONS.md` must exist on the default
10
+ branch — an open `docs/ship-founding` PR means the substrate isn't merged
11
+ yet → `SHIP: BLOCKED` with "merge the founding PR" as the unblock map.
12
+ Read ROADMAP.md; query the forge for open/merged PRs on `feat/*`, `fix/*`,
13
+ `docs/ship-founding` and `docs/ship-report` heads; check git state.
14
+ Reconcile: a feature flips to `done` when its **PR opens** (built, not merged
15
+ — see the PR stage), so a `done` row with an open PR is awaiting a human merge
16
+ (default mode), not finished shipping. A **merged** PR needs no status change
17
+ (already `done`) — it means *shipped*, and **unblocks its dependents** + counts
18
+ toward `SHIP: COMPLETE`. The done-flip rides the PR-bound commit, never a lone
19
+ commit on the default branch. A dirty feature branch from a crashed phase
20
+ is handed to the next phase subagent to finish or restart (counts against
21
+ the red-gate retry cap). Uncommitted changes on the default branch confined
22
+ to `docs/features/<NN-slug>/` + ROADMAP.md that match an in-flight roadmap
23
+ row are the loop's own planning output — resume that feature; the
24
+ dirty-default stop fires only for changes matching no roadmap unit.
25
+ 2. **STOP-CHECK.** Evaluate the stop conditions (below). Terminal → write or
26
+ refresh the final report, open the report PR, print the `SHIP:` banner +
27
+ status table, end the turn.
28
+ 3. **SELECT one unit.** Priority order, first match wins:
29
+ 1. **Urgency labels first (feature 15, injection-safe).** Read
30
+ `workflow-status`'s `detail.urgent` (labels-only, presence-only —
31
+ never derived from issue text; see `skills/triage-issue/SKILL.md`, the
32
+ sole owner of the `urgent`/`fix-next` vocabulary):
33
+ - Any open issue labeled **`fix-next`** → its fix jumps to the head of
34
+ the queue exactly like a blocking fix below (`plan-fix` →
35
+ `execute-phase --fix`), **no interrupt** of the in-flight unit — it
36
+ waits for the current stage to finish this iteration, then is
37
+ SELECTed next.
38
+ - Any open issue labeled **`urgent`** → run the canonical pause-vs-finish
39
+ rubric in `docs/workflow/ORCHESTRATION.md` **by reference, never
40
+ forked here** — feed it the issue content plus `detail.urgent
41
+ .interruptibility` for the current in-flight unit.
42
+ `INTERRUPT_NOW` → park the in-flight unit (WIP commit + `progress.md`
43
+ note, same as any voluntary park) and SELECT the urgent issue's fix as
44
+ this iteration's unit instead. `FINISH_FIRST` → this iteration
45
+ proceeds normally (steps below); the urgent fix is queued head-of-line
46
+ for the **next** iteration, same as `fix-next`.
47
+ - No `urgent`/`fix-next` issues in `detail.urgent` → fall through to the
48
+ normal priority order below.
49
+ 2. **Blocking fixes first.** A fix-index entry classified fix-now whose
50
+ subject blocks the next startable feature (same module, a dependency's
51
+ defect, or a red gate cause) → its fix is the selected unit
52
+ (`plan-fix` → `execute-phase --fix` through the normal stages). Fixes
53
+ that block nothing wait for the report's triage batch.
54
+ 3. An in-progress feature's next pending stage.
55
+ 4. The next feature at status `idea` **or** `planned` whose depends-on rows
56
+ are all **merged** (forge state, not merely `done` — a `done` dep with
57
+ an open PR isn't on the default branch yet, so a dependent cut from it
58
+ would lack its code). A `defined`-but-not-`planned` row is treated the
59
+ same as `idea` here — its design exists but its planning artifacts
60
+ don't, so it still needs a scaffold pass before PLAN.
61
+ **Verify the closure transitively:** a dep row marked merged whose own
62
+ dependencies aren't merged means the roadmap's statuses are inconsistent
63
+ → `SHIP: STOPPED` (substrate invariant broken), never build on top of it.
64
+ → `idea`/`defined`: DESIGN first (see ADVANCE). `planned`: → PLAN
65
+ directly.
66
+ 5. **Issue sweep — features exhausted, run NOT over.** Every roadmap feature
67
+ is `done` **and merged** but the sweep hasn't completed → the run
68
+ continues with issues; finishing the features is not finishing the run:
69
+ 1. **INVENTORY (once per run, its own iteration).** Enumerate (a) every
70
+ open forge issue and fix-index entry; (b) every *documented residue*
71
+ the run itself generated — each feature's `known-issues.md`, the
72
+ trade-offs in `decisions.md`, and every review report's
73
+ proposals/trade-offs. Residue without an existing issue remains a
74
+ deduplicated **proposal** in the report; the run never creates backlog
75
+ to make inventory look complete. Log existing issue numbers and
76
+ proposal sources separately.
77
+ 2. **TRIAGE (compose `triage-issue` in-turn, equal tier).** Classify
78
+ each existing inventoried issue against the CURRENT codebase. fix-now → it
79
+ becomes a selectable unit; postpone / wontfix / promote-to-feature →
80
+ the dated verdict is recorded on the issue and carried into the
81
+ report (promotions and untracked residue become report proposals,
82
+ never in-run scope or automatically-created issues).
83
+ 3. **SHIP the fix-now issues** one unit at a time through the normal
84
+ stages (`plan-fix` → EXECUTE (`--fix`) → PR → REVIEW → AUDIT), same
85
+ budget caps, floors, and merge policy as features.
86
+ 6. Nothing startable → `SHIP: BLOCKED` with the **unblock map** ("merging
87
+ #12 unblocks 05 and 07") and the resume command.
88
+
89
+ `execute-phase`'s own dependency gate stays active inside every subagent —
90
+ it's the belt to this braces. **The autopilot never passes `--force`:** a
91
+ gate stop inside a subagent parks the feature with the unmet chain recorded;
92
+ forcing through unmet dependencies is a human-only decision, made outside
93
+ the loop.
@@ -0,0 +1,9 @@
1
+ ### Stop conditions
2
+
3
+ | Banner | Fires when |
4
+ |---|---|
5
+ | `SHIP: COMPLETE` | Every roadmap feature is `done` **and its PR merged** (default mode: the human merged them all; `--fullauto`: merged under the floors) — `done` alone is not enough, since it only means *built + PR open* — **AND the issue sweep ran to completion**: existing issues inventoried/triaged, every fix-now issue shipped or parked, and untracked residue deduplicated as report proposals without creating backlog. Features merged but sweep pending → the run is NOT complete. Report written, report PR open. |
6
+ | `SHIP: BLOCKED` | Everything remaining is `done`-but-pr-open awaiting human merges, or planned with unmerged deps (default mode); or a parked feature transitively blocks the rest. Always includes the unblock map. |
7
+ | `SHIP: STOPPED` | Budget/iteration cap; a Round-5 milestone stop line; substrate invariant broken (gate unrunnable, roadmap unparseable, unexplained dirty default branch, decision record missing); forge unavailable (no stage that depends on PR state may proceed on guesses). |
8
+ | (feature parked, run continues) | Repeated red gate (retry cap), review ping-pong (2 cycles), audit ping-pong (2 cycles), capacity guard (3 partials), planning contradiction, **undesignable-from-record** (DESIGN stage `NEEDS_INPUT` — the recorded gap is a human-only unpark, never a mid-run re-ask). |
9
+ | **Systemic drift stop** | `review-change` flags SPEC drift on **two consecutive features** → the locked founding assumptions are probably stale; the whole run stops rather than auto-merging a compounding error. |
@@ -0,0 +1,34 @@
1
+ ### Final report
2
+
3
+ Written by the terminal iteration to `docs/features/SHIP_REPORT_<date>.md` on a
4
+ `docs/ship-report` branch as a docs-only PR (default: human merges; `--fullauto`:
5
+ audit-gated like any PR), and printed in full under the banner:
6
+
7
+ 1. **Run summary** — mode, iterations used vs cap, stop reason, feature counts
8
+ (merged / `done`-awaiting-merge / parked / not started).
9
+ 2. **Per-feature outcomes** — size planned vs final, phases, gate history,
10
+ review findings folded vs postponed, audit verdict + SHA, PR + final state,
11
+ merged by human or autopilot.
12
+ 3. **Issues** — the sweep's existing-issue inventory and outcomes: fix-now issues
13
+ shipped (PR links), postponed/wontfix verdicts with the trigger that
14
+ should reopen each (feeds `triage-issue`'s verification model), and
15
+ anything the sweep could not finish (budget/parked) as the explicit
16
+ remaining triage batch. Untracked residue is listed separately as proposals;
17
+ the run created no backlog for it.
18
+ 4. **New feature proposals** — capabilities discovered during the build that
19
+ serve the product goal (Round 1 quoted as the yardstick), each sized with a
20
+ suggested roadmap slot. Recommend-only.
21
+ 5. **Residual risks** — weak test areas, `--fullauto` merges deserving a second
22
+ look, parked features and why, silent decisions with outsized consequences.
23
+ 6. **Manual-verification checklist** — the deduplicated union of every review
24
+ checkpoint's manual checks plus audit notes: what no gate proved.
25
+ 7. **Going forward** — concrete `product-audit` cadence for this project
26
+ (first one now if ≥2–3 features merged; then ~every 5 or pre-release), and
27
+ the suggested command sequence to continue, closed with the canonical block:
28
+
29
+ ```
30
+ → Next: <merge the open PRs | /triage-issue <batch> | /plan-feature --next>
31
+ · accepted proposals → /plan-feature · product-audit due → /product-audit
32
+ ```
33
+
34
+ Closing line, verbatim policy: **this report recommends; the human decides.**
@@ -0,0 +1,148 @@
1
+ ---
2
+ name: triage-issue
3
+ user-invocable: true
4
+ version: 2.6.0
5
+ argument-hint: <issue-number> [more issue numbers…] | <audit-id> F<k> [F<j>…] | --prioritize-now <unit> F<k> [F<j>…]
6
+ author: "Gabriel Trabanco <gtrabanco@users.noreply.github.com>"
7
+ license: MIT
8
+ description: >
9
+ Verify an issue, persisted audit finding, or unresolved review finding against
10
+ current code, classify it, and write only the contracted forge/ledger
11
+ outcome. Supports independent batches and an immediate-fix review-finding
12
+ route. Triggers: "triage-issue", "triage issue N", "triage this finding",
13
+ "is this trigger met".
14
+ ---
15
+
16
+ # Triage Issue
17
+
18
+ Decide what happens to an issue, grounded in evidence — not vibes. Prevents both
19
+ premature work (acting on a deferred item whose trigger is unmet) and silent rot
20
+ (a fix-now bug left to drift).
21
+
22
+ ## Turn contract — verify before ending the turn
23
+
24
+ ```
25
+ ✓ One fixed-format verdict block per issue (Trigger / Checked / Evidence / VERDICT / Action) — plus the summary table when batched
26
+ ✓ Nothing deferred was implemented inline
27
+ ✓ Audit-finding mode (`<audit-id> F<k>`): the audit file carries its `↳ triaged` note, and any opened issue cites `Origin: product audit <id>, finding F<k>`
28
+ ✓ Review-finding mode (`--prioritize-now <unit> F<k>`): every named unresolved finding gets a verdict, an immediate-fix attempt, or an explicit replan/user-decision route
29
+ ✓ Batched input? The closing recommendation maps every issue/finding ID to its own next command, joined with ` + `; it never collapses to one generic action
30
+ ✓ Artifact language: explicit user instruction > the project's declared docs language > English. The CONVERSATION language never decides — a Spanish prompt still produces English PRs/issues/commits/SPECs unless one of the first two says otherwise
31
+ ✓ The closing `→ Next:` block is printed as the ABSOLUTE last output
32
+ ```
33
+
34
+ About to end the turn with any box unchecked? The turn is NOT done — complete
35
+ the missing box first (weak models drop end-of-document duties; this list is
36
+ first on purpose).
37
+
38
+ ## When to use
39
+
40
+ - Any issue needing a decision: a freshly filed bug, a `postpone`/`needs-triage`
41
+ item, or a periodic re-confirmation of a deferred tradeoff.
42
+ - **Batch triage** — pass several numbers (`triage-issue 12 14 17`): each issue
43
+ gets its own independent verdict + evidence, then one summary table at the
44
+ end. Batching applies to *triage only* — any resulting fix still gets its own
45
+ branch and PR.
46
+ - **Audit findings** — `triage-issue <audit-id> F<k> [F<j> …]` triages findings
47
+ from a persisted `product-audit` report instead of existing issues (see
48
+ *Audit-finding mode* below). Batching works the same way.
49
+ - **Review findings** — `triage-issue --prioritize-now <unit> F<k> [F<j> …]`
50
+ triages unresolved rows from the current feature/fix unit's
51
+ `review-findings.md`. This route is for findings that `fold-findings` could
52
+ not close. `--prioritize-now` means attempt to resolve every named finding
53
+ immediately; it does not permit a downgrade, postponement, or silent drop.
54
+
55
+
56
+ ## Step 0 — Discover the project (always first)
57
+
58
+ Per the agent guide's **Workflow conventions** + **documentation map**, then read
59
+ what THIS skill needs: the fix index (e.g. `docs/fix/README.md`) and fix SPEC
60
+ template, and the roadmap. In review-finding mode, read the target unit's SPEC,
61
+ acceptance, `review-findings.md`, current diff, and PR instead of looking for an
62
+ issue comment. Otherwise read the issue in full, including comments and labels
63
+ (forge CLI per the project's Workflow conventions — examples use `gh`):
64
+
65
+ ```sh
66
+ gh issue view <N> --json number,title,body,labels,state,comments
67
+ ```
68
+
69
+
70
+ ## Progressive loading — select the triage source
71
+
72
+ The reference allowlist is exactly the five linked paths below. Never invent or
73
+ read another `references/` path. After Step 0:
74
+
75
+ - Forge issue number(s): read [issue process](references/ISSUE_PROCESS.md).
76
+ - Review finding(s): read [review finding process](references/REVIEW_FINDING_PROCESS.md).
77
+ - Persisted audit finding(s): first read
78
+ [audit findings](references/AUDIT_FINDINGS.md), then use the verification and
79
+ decision steps in [issue process](references/ISSUE_PROCESS.md).
80
+ - Before applying an urgency or disposition label, read
81
+ [label vocabulary](references/LABELS.md); this file is the sole definition of
82
+ names, colors, and mutation rules.
83
+ - Only when the verdict is `fix-in-unit`, read
84
+ [fold ledger](references/FOLD_LEDGER.md) before writing the row.
85
+
86
+ Every resource is one hop from this file. A missing source artifact or required
87
+ resource stops that item; batch items remain independent. Never invent a label,
88
+ trigger, ledger row, verdict shape, or reference filename. A forge-issue
89
+ `postpone` route loads exactly issue process then label vocabulary; it skips
90
+ audit findings and fold ledger.
91
+
92
+ ## Guardrails
93
+
94
+ - Don't build deferred work just because asked to "look at" the issue — surface
95
+ that the trigger is unmet and stop.
96
+ - Keep issues, the fix index, and docs in sync with reality.
97
+ - Otherwise per the project's **Workflow conventions** (docs-language, evidence):
98
+ state exactly what you checked.
99
+
100
+
101
+ ## Portability
102
+
103
+ Use the project's declared forge CLI and translate commands one-for-one. The
104
+ classification, label ownership, and persisted-output contracts do not change.
105
+
106
+ ## Relationship to other skills
107
+
108
+ ```
109
+ ┌─ fix-now ─────────▶ plan-fix ─▶ execute-phase --fix
110
+ ├─ fix-in-unit ─────▶ execute-phase <NN> P<k> (fold into phase)
111
+ triage-issue ────┤ or fold-findings (ledger row)
112
+ │ or design-feature / plan-feature (replan)
113
+ ├─ promote ─────────▶ plan-feature (router → from-issue)
114
+ ├─ postpone ────────▶ dated comment, leave open
115
+ └─ wontfix ─────────▶ propose close
116
+ ```
117
+
118
+ In review-finding mode, `replan-in-unit` routes to `/plan-feature` for a
119
+ feature or `/plan-fix` for a fix, with new `P<n>` phases appended to the same
120
+ unit. The user manually runs those phases; this skill never implements them.
121
+
122
+ ## Done when
123
+
124
+ - The issue has a clear verdict with cited evidence.
125
+ - Each review finding has a clear verdict with cited evidence; an oversized
126
+ finding has an explicit planning command and a manual `/execute-phase` hand-off.
127
+ - The verdict is recorded (routed, commented, and/or index-updated), and nothing
128
+ deferred was implemented inline.
129
+ - **The closing `→ Next:` block is printed** per verdict:
130
+
131
+ ```
132
+ Single issue:
133
+ → Next: <command for the recorded verdict> — act on the issue's evidence-backed action
134
+
135
+ Batch:
136
+ → Next: apply every verdict: #<n1> → <command> + #<n2> → <command> + #<n3> → <command>
137
+ · fix-now → /plan-fix <n> · promote → /plan-feature <n>
138
+ · fix-in-unit → /execute-phase <NN> P<k> or /fold-findings — never /plan-fix
139
+ · postpone → dated comment, leave open · wontfix → propose close
140
+ · same inconsistency across several issues → /product-audit (a recurring pattern,
141
+ not isolated tickets — sweep the product rather than triaging one by one)
142
+ ```
143
+
144
+ Replace every placeholder with every actual issue/finding ID and its recorded
145
+ route before printing; never print `<n2>`, `<command>`, or `…` in a live batch.
146
+
147
+ The `/product-audit` line fires **only on a recurring inconsistency** — the same
148
+ underlying problem behind multiple issues, not any single triage.
@@ -0,0 +1,35 @@
1
+ ## Audit-finding mode (`triage-issue <audit-id> F<k> …`)
2
+
3
+ When the first argument is an **audit id** (a plain integer matching a
4
+ `docs/audits/<id>-*.md` file) followed by one or more `F<k>` finding ids, the
5
+ input is a `product-audit` finding, not an existing issue. Detection is
6
+ mechanical: `F`-prefixed second argument → audit-finding mode; otherwise every
7
+ argument is an issue number, unchanged.
8
+
9
+ 1. **Read the audit report** `docs/audits/<id>-*.md` (exactly one file matches;
10
+ zero or several → stop and report the mismatch). Locate each requested
11
+ `F<k>` row in `## Findings` and any proposal citing it (`from: F<k>`).
12
+ 2. **Verify against current code** — same as Process step 2: the audit may be
13
+ stale; re-check its evidence (paths, counts, repro) before acting. An
14
+ already-fixed finding → verdict **wontfix** (obsolete), no issue opened.
15
+ 3. **Check for an existing issue** — `gh issue list --search "Audit <id> F<k>"`
16
+ plus a title match; if one exists, triage THAT issue via the normal Process
17
+ (never open a duplicate).
18
+ 4. **Classify** with the same four verdicts (plus `fix-in-unit` via step 3 of
19
+ the Process). Then:
20
+ - **fix-now / postpone / promote** → this is the moment the GitHub issue is
21
+ **opened** (the audit itself never files issues): body written with the
22
+ Write tool and `gh issue create --body-file`, citing provenance on its
23
+ first line — `Origin: product audit <id>, finding F<k>
24
+ (docs/audits/<id>-<date>.md)` — plus the finding's evidence, severity, and
25
+ class. Then apply the verdict's labels/comment/routing exactly as the
26
+ normal Process dictates for that verdict.
27
+ - **wontfix / already-fixed** → open nothing; the verdict block is the record.
28
+ 5. **Mark the finding triaged** in the audit file: append directly under the
29
+ `F<k>` line one indented note —
30
+ `↳ triaged <YYYY-MM-DD>: <verdict> — issue #<n> | no issue (<why>)` —
31
+ and commit with `docs(audits): triage audit <id> F<k>`. Never renumber or
32
+ rewrite the finding itself.
33
+ 6. **Report** the same fixed verdict block, with
34
+ `ISSUE #<n>` replaced by `AUDIT <id> F<k> — <finding title>` when no issue
35
+ ends up existing.
@@ -0,0 +1,32 @@
1
+ ## Ledger-append mechanism (`fix-in-unit` → fold-into-ledger sub-route)
2
+
3
+ When the *fold into the unit's ledger* sub-route (step 3 above) applies,
4
+ append one row to the open unit's `review-findings.md` — the same fold ledger
5
+ `review-change` and `audit-pr` write to, in their **fixed 7-column schema,
6
+ never redefined here**:
7
+
8
+ ```
9
+ | id | file:line | axis | severity | class | route | folded |
10
+ ```
11
+
12
+ The appended row: `folded` starts `no` (this skill never sets `folded: yes` —
13
+ that transition belongs solely to `/fold-findings`), and the `route` cell
14
+ carries a **provenance marker** identifying this row was born from a triage
15
+ verdict, not a review/audit pass: `triage #<n> <YYYY-MM-DD>` (the issue number
16
+ and today's date), e.g. `route: fold into phase — triage #86 2026-07-18`. The
17
+ marker sits **inside the existing `route` cell** — no new column, so
18
+ `fold-findings`, `workflow-status`, and the npm schema mirror all keep reading
19
+ the same 7 columns unchanged.
20
+
21
+ This is **not** a silent reclassification: the row's `severity`/`class`/`route`
22
+ are set once, here, by the disposition-owning skill's own dated, evidence-
23
+ grounded verdict — exactly the frozen-classification guarantee
24
+ `fold-findings` already enforces on rows `review-change`/`audit-pr` write.
25
+ `fold-findings` then processes the row like any other `folded: no` row in its
26
+ next run — one queue, no separate lane.
27
+
28
+ **`Closes #<n>` on the unit's own PR.** A `fix-in-unit` verdict never opens a
29
+ new PR: the issue closes via the **open unit's** existing PR — its body gains
30
+ a `Closes #<n>` line for this issue (or, if the unit's PR isn't open yet,
31
+ whoever opens it later adds the line then). State this explicitly in the
32
+ verdict's `Action taken:` field.
@@ -0,0 +1,101 @@
1
+ ## Process
2
+
3
+ 1. **Parse the issue's own contract.** Extract its severity and any "When to
4
+ fix" / "Trigger" / "Acceptance (when triggered)" clause. Many issues carry an
5
+ explicit signal-based trigger — honor it.
6
+ 2. **Verify the trigger against current code.** Do the actual check, e.g.:
7
+ - count real consumers of a duplicated helper (is the "3rd consumer" here?),
8
+ - check a threshold (article count, p95 latency, row count),
9
+ - reproduce a reported defect, or confirm it's already fixed.
10
+ Use `grep`/`gh`/tests — cite the evidence (paths, counts, line refs).
11
+ 3. **Scope-membership check.** Before classifying, decide whether this issue
12
+ already belongs to a unit that is currently open, per this fixed checklist
13
+ (every item independently checkable):
14
+ - List candidate open units mechanically: roadmap/fix-index rows with
15
+ status `in-progress` or `planned`, plus any unit with an open PR
16
+ (`gh pr list --state open`).
17
+ - For each candidate, compare the issue against it: membership = ✓ the
18
+ issue's ask overlaps a SPEC **acceptance criterion** or a **phase task**
19
+ — quote **both** sides (the issue's own line and the matching SPEC/phase
20
+ line) before calling it a match; no quote pair means not a member.
21
+ - **Member of an open unit → verdict `fix-in-unit <unit>`.** Resolve the
22
+ issue on that unit's own branch, never as a new standalone unit. Pick
23
+ exactly one of these sub-routes:
24
+ - *repairable as-is* → **fold into the unit's** current/next phase, or
25
+ append a provenance-marked row to the unit's `review-findings.md` (see
26
+ *Ledger-append mechanism* below).
27
+ - *changes the unit's shape* → **incremental replan** on the same unit:
28
+ name the exact command — `design-feature <slug> "<instruction>"`
29
+ (product half, upsert) for a product-shape change, `plan-feature
30
+ <slug>` (re-run, engineering half) for an engineering-shape change, or
31
+ a user-approved, dated `## Amendments` entry per #66's mechanism (fix
32
+ units). Never write "replan if needed" — always name which of the
33
+ three applies and why.
34
+ - *born as an un-amended descope of an unmerged unit* →
35
+ **scope-bleed restore**: the route is restore-the-criterion-in-the-unit
36
+ (no matching `## Amendments` entry); the issue closes as
37
+ scope-returned, not as new work.
38
+ - No candidate matched → fall through to today's four-verdict
39
+ classification below, unchanged.
40
+ 4. **Classify** into one of:
41
+ - **fix-now** — defect or trigger met → route to `plan-fix` then
42
+ `execute-phase --fix`; add the entry to the fix index. **High severity** →
43
+ apply the urgency label per *Urgency label vocabulary* above (`urgent` by
44
+ default; `fix-next` when the call is "queue it next" rather than "maybe
45
+ interrupt now" — see that section's table). Non-high severity → no label.
46
+ - **promote-to-feature** — really new capability → route to `plan-feature`
47
+ (the router handles the issue path). Apply the `promoted` disposition
48
+ label per *Disposition label vocabulary* above.
49
+ - **postpone** — valid but trigger unmet → leave open; post a **dated
50
+ re-confirmation** comment stating what you checked and why it stays
51
+ deferred. Do **not** implement deferred work inline. Apply the
52
+ `postponed` disposition label per *Disposition label vocabulary* above.
53
+ - **wontfix** — obsolete or explicitly bounded by the issue → propose closing,
54
+ with rationale. Apply the `wontfix` disposition label per *Disposition
55
+ label vocabulary* above.
56
+ 5. **When the call is the user's, ask.** If the decision hinges on product/risk
57
+ judgment rather than evidence, present the verdict and options and let the
58
+ user choose before acting.
59
+ 6. **Report and keep docs coherent.** Post the decision as a dated issue comment
60
+ with evidence. **The comment is Markdown, not shell — never hand-escape it:**
61
+ backticks / `*` / `_` in the body are formatting; a `\` before them renders
62
+ literally (`` \`code\` `` instead of `` `code` ``). Write the comment body to
63
+ a file with the Write tool (plain Markdown, real backticks, zero backslashes)
64
+ and post it with **`gh issue comment <n> --body-file <path>`** (or the
65
+ declared forge's equivalent) — never an inline `--body "…"` or a quoted
66
+ heredoc, which mangle backticks. After posting, `gh issue view <n> --json
67
+ comments` must show the backticks rendering, no literal `` \` ``. On a
68
+ fix-now + high-severity verdict, the comment also states the urgency label
69
+ applied (or the failure to apply it — see *Apply-on-verdict (urgency)*
70
+ above); on a **postpone**, **promote**, or **wontfix** verdict, the comment
71
+ states the disposition label applied instead (or its failure — see
72
+ *Apply-on-verdict (disposition)* above). Either way this is
73
+ the one GitHub-state mutation this skill makes without separate
74
+ confirmation, because it is fully determined by the verdict just reached,
75
+ never by issue text. If it
76
+ becomes an active fix, register it in the fix index; if
77
+ closed, remove any stale index entry. Any **other** GitHub state mutation
78
+ (closing, unrelated labels) still needs confirmation when ambiguous.
79
+ 7. **Return exactly, per issue** (fixed verdict format — batch runs repeat it,
80
+ then add one summary table):
81
+
82
+ ```
83
+ ISSUE #<n> — <title>
84
+ Trigger (the issue's own): <quoted clause | "none stated">
85
+ Checked: <the exact commands/counts/repro run>
86
+ Evidence: <paths, counts, line refs, output>
87
+ VERDICT: fix-now | fix-in-unit | promote | postpone | wontfix
88
+ Action taken: <fix-index entry + route | dated comment posted + disposition label applied | close proposed + disposition label applied>
89
+ ```
90
+
91
+ No member unit matched a `fix-in-unit` candidate for this issue → the
92
+ verdict, evidence, and action above are exactly what they would have been
93
+ without the scope-membership step — today's four-verdict classification,
94
+ unchanged.
95
+
96
+ **Batch summary table — group by home unit.** When triaging several issues
97
+ in one run, the closing summary table groups every `fix-in-unit` issue
98
+ under its home unit's heading (one heading per unit, its member issues
99
+ listed beneath), with any issue that matched no open unit listed last under
100
+ a plain "no member unit" heading — this is the signal that surfaces N
101
+ issues sharing one open unit at a glance, not N separate rows.