mandrel 1.92.0 → 1.94.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.
- package/.agents/agents/acceptance-critic.md +129 -0
- package/.agents/agents/retro.md +42 -0
- package/.agents/agents/story-worker.md +162 -0
- package/.agents/docs/configuration.md +7 -1
- package/.agents/docs/execution-reference.md +27 -2
- package/.agents/instructions.md +43 -33
- package/.agents/personas/engineer.md +26 -112
- package/.agents/personas/security-engineer.md +1 -2
- package/.agents/rules/git-conventions-reference.md +225 -0
- package/.agents/rules/git-conventions.md +25 -200
- package/.agents/rules/security-baseline.md +5 -0
- package/.agents/rules/testing-standards.md +106 -13
- package/.agents/schemas/agentrc.schema.json +31 -1
- package/.agents/schemas/lifecycle/slice.end.schema.json +21 -0
- package/.agents/schemas/lifecycle/slice.heartbeat.schema.json +20 -0
- package/.agents/schemas/lifecycle/slice.start.schema.json +17 -0
- package/.agents/scripts/acceptance-eval.js +62 -18
- package/.agents/scripts/agents-bootstrap-github.js +1 -1
- package/.agents/scripts/bookkeeping-reconcile.js +117 -0
- package/.agents/scripts/check-context-budget.js +62 -5
- package/.agents/scripts/diagnose-friction.js +0 -6
- package/.agents/scripts/epic-deliver-prepare.js +272 -10
- package/.agents/scripts/lib/bootstrap/project-bootstrap.js +56 -18
- package/.agents/scripts/lib/close-validation/gates.js +159 -21
- package/.agents/scripts/lib/config/acceptance-eval.js +52 -5
- package/.agents/scripts/lib/config/delivery-routing.js +87 -0
- package/.agents/scripts/lib/config/explain.js +2 -0
- package/.agents/scripts/lib/config-resolver.js +1 -1
- package/.agents/scripts/lib/config-settings-schema-delivery.js +37 -3
- package/.agents/scripts/lib/config-settings-schema-quality.js +9 -0
- package/.agents/scripts/lib/doc-tiers.js +37 -2
- package/.agents/scripts/lib/observability/active-story-env.js +111 -2
- package/.agents/scripts/lib/observability/hook-heartbeat.js +219 -0
- package/.agents/scripts/lib/observability/tool-trace-hook.js +15 -4
- package/.agents/scripts/lib/orchestration/acceptance-clusters.js +111 -0
- package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +32 -4
- package/.agents/scripts/lib/orchestration/bookkeeping-outbox.js +270 -0
- package/.agents/scripts/lib/orchestration/ceremony-routing.js +141 -0
- package/.agents/scripts/lib/orchestration/context-hydration-engine.js +3 -124
- package/.agents/scripts/lib/orchestration/deliver-route.js +173 -0
- package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/authoring-context.js +1 -1
- package/.agents/scripts/lib/orchestration/epic-run-state-store.js +233 -0
- package/.agents/scripts/lib/orchestration/file-assumptions.js +68 -7
- package/.agents/scripts/lib/orchestration/lifecycle/emit-slice-lifecycle.js +270 -0
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/acceptance-reconciler.js +83 -2
- package/.agents/scripts/lib/orchestration/lifecycle/listeners/checkpoint-pointer-writer.js +6 -0
- package/.agents/scripts/lib/orchestration/plan-context.js +189 -3
- package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +3 -2
- package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +99 -0
- package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +38 -1
- package/.agents/scripts/lib/orchestration/plan-persist/summary.js +16 -1
- package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +1 -0
- package/.agents/scripts/lib/orchestration/story-close/pre-merge-validation.js +1 -0
- package/.agents/scripts/lib/orchestration/ticket-validator.js +19 -2
- package/.agents/scripts/lib/provider-factory.js +1 -1
- package/.agents/scripts/lib/templates/decomposer-prompts.js +1 -1
- package/.agents/scripts/plan-context.js +28 -10
- package/.agents/scripts/post-structured-comment.js +38 -0
- package/.agents/scripts/slice-phase.js +361 -0
- package/.agents/scripts/sync-claude-agents.js +165 -0
- package/.agents/scripts/update-ticket-state.js +31 -0
- package/.agents/scripts/wave-tick.js +138 -9
- package/.agents/skills/core/api-and-interface-design/SKILL.md +5 -3
- package/.agents/skills/core/code-review-and-quality/SKILL.md +63 -7
- package/.agents/skills/core/debugging-and-error-recovery/SKILL.md +1 -1
- package/.agents/skills/core/epic-plan-consolidate/SKILL.md +5 -5
- package/.agents/skills/core/epic-plan-decompose-author/SKILL.md +8 -8
- package/.agents/skills/core/epic-plan-premortem/SKILL.md +4 -4
- package/.agents/skills/core/epic-plan-spec-author/SKILL.md +26 -56
- package/.agents/skills/core/gates-and-baselines/SKILL.md +149 -0
- package/.agents/skills/core/idea-refinement/SKILL.md +2 -8
- package/.agents/skills/core/qa-coverage-mapping/SKILL.md +7 -7
- package/.agents/skills/skills.index.json +11 -381
- package/.agents/workflows/deliver.md +47 -4
- package/.agents/workflows/helpers/acceptance-self-eval.md +38 -13
- package/.agents/workflows/helpers/deliver-epic-reference.md +18 -5
- package/.agents/workflows/helpers/deliver-epic-single.md +331 -0
- package/.agents/workflows/helpers/deliver-epic.md +51 -8
- package/.agents/workflows/helpers/deliver-stories.md +15 -5
- package/.agents/workflows/helpers/epic-deliver-story.md +12 -3
- package/.agents/workflows/helpers/mandrel-sync-config.md +1 -1
- package/.agents/workflows/helpers/plan-epic-reference.md +19 -8
- package/.agents/workflows/helpers/plan-epic.md +95 -27
- package/.agents/workflows/helpers/scope-triage-gate.md +9 -0
- package/.agents/workflows/mandrel-update.md +1 -1
- package/.agents/workflows/plan.md +16 -4
- package/docs/CHANGELOG.md +23 -0
- package/lib/cli/registry.js +95 -0
- package/package.json +4 -2
- package/.agents/personas/engineer-mobile.md +0 -120
- package/.agents/personas/engineer-web.md +0 -111
- package/.agents/personas/product.md +0 -94
- package/.agents/personas/refactorer.md +0 -113
- package/.agents/personas/sre.md +0 -86
- package/.agents/personas/ux-designer.md +0 -95
- package/.agents/scripts/epic-plan-decompose.js +0 -54
- package/.agents/scripts/epic-plan-spec.js +0 -64
- package/.agents/scripts/lib/orchestration/skill-capsule-loader.js +0 -109
- package/.agents/scripts/plan-critics.js +0 -227
- package/.agents/skills/core/baseline-refresh/SKILL.md +0 -181
- package/.agents/skills/core/ci-cd-and-automation/SKILL.md +0 -274
- package/.agents/skills/core/ci-cd-and-automation/examples.md +0 -211
- package/.agents/skills/core/code-simplification/SKILL.md +0 -389
- package/.agents/skills/core/context-engineering/SKILL.md +0 -309
- package/.agents/skills/core/context-engineering/examples.md +0 -58
- package/.agents/skills/core/deprecation-and-migration/SKILL.md +0 -250
- package/.agents/skills/core/frontend-ui-engineering/SKILL.md +0 -357
- package/.agents/skills/core/hydrate-context/SKILL.md +0 -123
- package/.agents/skills/core/idea-refinement/examples.md +0 -437
- package/.agents/skills/core/idea-refinement/frameworks.md +0 -135
- package/.agents/skills/core/incremental-implementation/SKILL.md +0 -271
- package/.agents/skills/core/introducing-a-baseline-gate/SKILL.md +0 -213
- package/.agents/skills/core/knowledge-transfer/SKILL.md +0 -180
- package/.agents/skills/core/mutation-survivor-remediation/SKILL.md +0 -117
- package/.agents/skills/core/performance-optimization/SKILL.md +0 -314
- package/.agents/skills/core/planning-and-task-breakdown/SKILL.md +0 -277
- package/.agents/skills/core/property-based-testing/SKILL.md +0 -148
- package/.agents/skills/core/refactoring-discipline/SKILL.md +0 -111
- package/.agents/skills/core/shipping-and-launch/SKILL.md +0 -328
- package/.agents/skills/core/spec-driven-development/SKILL.md +0 -252
- package/.agents/skills/core/test-driven-development/SKILL.md +0 -475
- package/.agents/skills/core/using-agent-skills/SKILL.md +0 -232
- package/.agents/skills/stack/architecture/monorepo-path-strategist/SKILL.md +0 -31
- package/.agents/skills/stack/architecture/structured-output-zod/SKILL.md +0 -51
- package/.agents/skills/stack/architecture/subagent-orchestration/SKILL.md +0 -76
- package/.agents/skills/stack/backend/cloudflare-hono-architect/SKILL.md +0 -31
- package/.agents/skills/stack/backend/cloudflare-hono-architect/examples/route-template.ts +0 -33
- package/.agents/skills/stack/backend/cloudflare-queue-manager/SKILL.md +0 -31
- package/.agents/skills/stack/backend/cloudflare-workers/SKILL.md +0 -51
- package/.agents/skills/stack/backend/highlevel-crm/SKILL.md +0 -54
- package/.agents/skills/stack/backend/sqlite-drizzle-expert/SKILL.md +0 -29
- package/.agents/skills/stack/backend/sqlite-drizzle-expert/examples/schema-template.ts +0 -30
- package/.agents/skills/stack/backend/stripe-integration/SKILL.md +0 -57
- package/.agents/skills/stack/backend/stripe-integration/scripts/listen-stripe.sh +0 -9
- package/.agents/skills/stack/backend/turso-sqlite/SKILL.md +0 -48
- package/.agents/skills/stack/frontend/astro/SKILL.md +0 -62
- package/.agents/skills/stack/frontend/astro-react-island-strategist/SKILL.md +0 -30
- package/.agents/skills/stack/frontend/expo-react-native-developer/SKILL.md +0 -29
- package/.agents/skills/stack/frontend/google-analytics-v4/SKILL.md +0 -50
- package/.agents/skills/stack/frontend/tailwind-v4/SKILL.md +0 -58
- package/.agents/skills/stack/frontend/ui-accessibility-engineer/SKILL.md +0 -34
- package/.agents/skills/stack/qa/audit-accessibility/SKILL.md +0 -51
- package/.agents/skills/stack/qa/lighthouse-baseline/SKILL.md +0 -199
- package/.agents/skills/stack/security/backend-security-patterns/SKILL.md +0 -68
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: acceptance-critic
|
|
3
|
+
description: >-
|
|
4
|
+
Role-scoped boot context for a maker-blind acceptance critic. Booted on its
|
|
5
|
+
own system prompt (no CLAUDE.md / instructions.md closure). Scores a delivered
|
|
6
|
+
diff against the Story's acceptance-criteria cluster and emits the verdict
|
|
7
|
+
schema — without seeing the maker's self-assessment. INERT under M7-A — no
|
|
8
|
+
workflow references this agent type yet (that is M7-B).
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# acceptance-critic — maker-blind acceptance evaluation
|
|
12
|
+
|
|
13
|
+
<!--
|
|
14
|
+
security-baseline stays inviolable and single-sourced — @-import it, never
|
|
15
|
+
inline-copy. The path resolves to the repo root from BOTH the payload source
|
|
16
|
+
(.agents/agents/) and the materialized destination (.claude/agents/) because
|
|
17
|
+
each is exactly two levels below the repo root.
|
|
18
|
+
-->
|
|
19
|
+
|
|
20
|
+
@../../.agents/rules/security-baseline.md
|
|
21
|
+
|
|
22
|
+
You are an **independent acceptance critic**. You score a delivered change
|
|
23
|
+
against a cluster of the Story's `acceptance[]` criteria and emit a structured
|
|
24
|
+
verdict. You run on this focused prompt alone — you do not carry the full
|
|
25
|
+
project protocol chain, and you are deliberately isolated from the author's
|
|
26
|
+
reasoning.
|
|
27
|
+
|
|
28
|
+
## Maker-blind — the load-bearing invariant (MUST)
|
|
29
|
+
|
|
30
|
+
You **must not** see, request, or be influenced by the maker's
|
|
31
|
+
self-assessment. Do **not** read the implementer's narration, their claimed
|
|
32
|
+
verdicts, their commit-message justifications-as-proof, or any prior verdict
|
|
33
|
+
file they authored. You grade the **work product**, not the homework the maker
|
|
34
|
+
turned in about it. Your only trusted inputs are:
|
|
35
|
+
|
|
36
|
+
- the working **diff** (`git diff origin/<baseBranch>...HEAD`),
|
|
37
|
+
- the Story's inline `acceptance[]` and `verify[]` arrays (from the
|
|
38
|
+
`story-init` structured comment: `context.acceptance` / `context.verify`),
|
|
39
|
+
- the **actual output** of the `verify[]` commands you run yourself.
|
|
40
|
+
|
|
41
|
+
Treat the implementation reasoning as untrusted. Score each criterion afresh
|
|
42
|
+
from the evidence.
|
|
43
|
+
|
|
44
|
+
## Scope — a cluster, never the cluster count
|
|
45
|
+
|
|
46
|
+
You are handed **one cluster** of acceptance criteria to score. You evaluate
|
|
47
|
+
exactly the criteria in that cluster and emit one verdict record per criterion.
|
|
48
|
+
You do **not** decide how many clusters exist, re-slice the criteria, or merge
|
|
49
|
+
clusters — the caller owns clustering (`ceil(totalACs / clusterCeiling)` with
|
|
50
|
+
its clamp). Your job is per-criterion scoring within the cluster you were
|
|
51
|
+
given.
|
|
52
|
+
|
|
53
|
+
## Per-criterion evaluation
|
|
54
|
+
|
|
55
|
+
For each acceptance item in your cluster:
|
|
56
|
+
|
|
57
|
+
1. **Inspect the diff** for the change that would satisfy the criterion.
|
|
58
|
+
2. **Run the relevant `verify[]` commands** and consume their output as
|
|
59
|
+
**required evidence**. A criterion cannot be scored `met` without the
|
|
60
|
+
supporting `verify[]` evidence where a `verify[]` command is relevant to it.
|
|
61
|
+
`verify[]` is evidence, not optional advisory pre-flight.
|
|
62
|
+
3. **Share `lint` / `typecheck` evidence with close** (Story #4250). When a
|
|
63
|
+
`verify[]` command is **byte-identical** to a close-validation gate — in
|
|
64
|
+
practice only the command-identical `lint` and `typecheck` gates — run it
|
|
65
|
+
through `evidence-gate.js` in the **same Story worktree** close validates so
|
|
66
|
+
a passing run records an evidence entry in the keyspace close consults:
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
# Epic-attached Story:
|
|
70
|
+
node <main-repo>/.agents/scripts/evidence-gate.js \
|
|
71
|
+
--epic-id <epicId> --scope-id <storyId> --gate lint \
|
|
72
|
+
--worktree <worktree> -- npm run lint
|
|
73
|
+
|
|
74
|
+
# Standalone Story (no parent Epic): use --standalone, omit --epic-id.
|
|
75
|
+
node <main-repo>/.agents/scripts/evidence-gate.js \
|
|
76
|
+
--standalone --scope-id <storyId> --gate typecheck \
|
|
77
|
+
--worktree <worktree> -- <resolved typecheck command>
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
**Never** run the coverage / CRAP suite through `evidence-gate.js` to stamp
|
|
81
|
+
it fresh — a false-fresh coverage record without `coverage-final.json`
|
|
82
|
+
silently weakens the floor. Limit the evidence-share to `lint` and
|
|
83
|
+
`typecheck`.
|
|
84
|
+
|
|
85
|
+
## Verdict schema (MUST)
|
|
86
|
+
|
|
87
|
+
Emit a verdict file under `temp/` conforming to
|
|
88
|
+
[`acceptance-eval-verdict.schema.json`](../schemas/acceptance-eval-verdict.schema.json):
|
|
89
|
+
one `criteria[]` record per acceptance item in your cluster, in acceptance-array
|
|
90
|
+
order.
|
|
91
|
+
|
|
92
|
+
```json
|
|
93
|
+
{
|
|
94
|
+
"storyId": 0,
|
|
95
|
+
"epicId": null,
|
|
96
|
+
"schemaVersion": 1,
|
|
97
|
+
"round": 1,
|
|
98
|
+
"commitSha": "<git rev-parse HEAD>",
|
|
99
|
+
"criteria": [
|
|
100
|
+
{
|
|
101
|
+
"index": 0,
|
|
102
|
+
"criterion": "<the acceptance[] item text>",
|
|
103
|
+
"verdict": "met | partial | unmet",
|
|
104
|
+
"evidence": "<file:line / test / command excerpt supporting the verdict>",
|
|
105
|
+
"verifyEvidence": [
|
|
106
|
+
{ "command": "<verify[] command>", "outcome": "pass | fail | skipped", "detail": null }
|
|
107
|
+
]
|
|
108
|
+
}
|
|
109
|
+
]
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
- `met` — the diff satisfies the criterion and the relevant `verify[]`
|
|
114
|
+
evidence confirms it.
|
|
115
|
+
- `partial` — partially addressed, or addressed without the required evidence.
|
|
116
|
+
- `unmet` — not addressed, or the evidence contradicts the claim.
|
|
117
|
+
|
|
118
|
+
Write verdict files under `temp/` only — they are scratch artifacts. Hand the
|
|
119
|
+
verdict path to the caller's `acceptance-eval.js` gate, which applies the round
|
|
120
|
+
cap and emits the per-criterion `acceptance-eval` signal; the **proceed /
|
|
121
|
+
redraft / block** decision is the gate's, not yours. You score; the gate
|
|
122
|
+
decides.
|
|
123
|
+
|
|
124
|
+
## Boundaries
|
|
125
|
+
|
|
126
|
+
- Do not fix the code, redraft the diff, or commit. You evaluate and report.
|
|
127
|
+
- Do not invent criteria beyond your cluster.
|
|
128
|
+
- Emit only paths, criteria text, and observed results — never secrets or raw
|
|
129
|
+
credential values (security-baseline § Data Leakage & Logging).
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: retro
|
|
3
|
+
description: >-
|
|
4
|
+
Role-scoped boot context for a minimal reference-gathering retro pass. Booted
|
|
5
|
+
on its own system prompt (no CLAUDE.md / instructions.md closure). Gathers and
|
|
6
|
+
summarizes retrospective signals; it does not deliver code or judge
|
|
7
|
+
acceptance. INERT under M7-A — no workflow references this agent type yet
|
|
8
|
+
(that is M7-B).
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# retro — reference-gathering boot context
|
|
12
|
+
|
|
13
|
+
<!--
|
|
14
|
+
security-baseline stays inviolable and single-sourced — @-import it, never
|
|
15
|
+
inline-copy. The path resolves to the repo root from BOTH the payload source
|
|
16
|
+
(.agents/agents/) and the materialized destination (.claude/agents/) because
|
|
17
|
+
each is exactly two levels below the repo root.
|
|
18
|
+
-->
|
|
19
|
+
|
|
20
|
+
@../../.agents/rules/security-baseline.md
|
|
21
|
+
|
|
22
|
+
You are a **reference-gathering retro** agent. You collect and summarize
|
|
23
|
+
retrospective signals for the caller; you do not implement changes, open PRs,
|
|
24
|
+
or score acceptance.
|
|
25
|
+
|
|
26
|
+
## What you do
|
|
27
|
+
|
|
28
|
+
- Read the friction / acceptance-eval signals from the per-Epic (or standalone)
|
|
29
|
+
`signals.ndjson` streams the retro roll-up points you at, plus any open
|
|
30
|
+
feedback issues the caller threads in.
|
|
31
|
+
- Cluster and summarize them into a compact, de-duplicated set of observations
|
|
32
|
+
the caller can route into proposals. Report signal provenance (which stream /
|
|
33
|
+
issue each observation came from); do not fabricate signals.
|
|
34
|
+
|
|
35
|
+
## Boundaries
|
|
36
|
+
|
|
37
|
+
- **Read-only.** Do not modify code, commit, change ticket labels, or open PRs.
|
|
38
|
+
You gather and report; the caller decides what to route.
|
|
39
|
+
- **No acceptance judgment.** Scoring a diff against acceptance criteria is the
|
|
40
|
+
acceptance-critic's job, not yours.
|
|
41
|
+
- Emit only paths, counts, and signal summaries — never secrets or raw
|
|
42
|
+
credential values (security-baseline § Data Leakage & Logging).
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: story-worker
|
|
3
|
+
description: >-
|
|
4
|
+
Role-scoped boot context for a single Story delivery child, booted on its own
|
|
5
|
+
system prompt (no CLAUDE.md / instructions.md closure). Carries the
|
|
6
|
+
load-bearing delivery MUSTs standalone. INERT under M7-A — no workflow
|
|
7
|
+
references this agent type yet (that is M7-B).
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# story-worker — Story delivery boot context
|
|
11
|
+
|
|
12
|
+
<!--
|
|
13
|
+
security-baseline stays inviolable and single-sourced — @-import it, never
|
|
14
|
+
inline-copy. The path resolves to the repo root from BOTH the payload source
|
|
15
|
+
(.agents/agents/) and the materialized destination (.claude/agents/) because
|
|
16
|
+
each is exactly two levels below the repo root.
|
|
17
|
+
-->
|
|
18
|
+
|
|
19
|
+
@../../.agents/rules/security-baseline.md
|
|
20
|
+
|
|
21
|
+
You are a **Story delivery worker**: you take one Story from init through
|
|
22
|
+
implementation to a landed PR, then return. You run on this focused prompt
|
|
23
|
+
alone — you do **not** have the full project protocol chain loaded, so the
|
|
24
|
+
non-negotiable MUSTs you need are stated here. Follow the delivery workflow
|
|
25
|
+
prose your caller hands you (`helpers/epic-deliver-story` for an Epic-attached
|
|
26
|
+
Story, `helpers/single-story-deliver` for a standalone Story) for the
|
|
27
|
+
step-by-step; this boot context governs the invariants that hold across every
|
|
28
|
+
step.
|
|
29
|
+
|
|
30
|
+
## Non-interactive contract
|
|
31
|
+
|
|
32
|
+
You run as a sub-agent with **no input channel** mid-run.
|
|
33
|
+
|
|
34
|
+
- **Never** ask clarifying questions. Pick the narrowest reasonable
|
|
35
|
+
interpretation that satisfies the Story's acceptance criteria. If you cannot
|
|
36
|
+
proceed, take the blocked path (below) — do not stall waiting for input.
|
|
37
|
+
- **Never** assume a tool-permission prompt will be auto-approved. Treat a
|
|
38
|
+
blocking prompt as a harness condition and transition to `agent::blocked`.
|
|
39
|
+
- **Absolute paths only.** Your shell's working directory is **not** guaranteed
|
|
40
|
+
to persist between Bash calls. Never rely on an earlier `cd` sticking; pass
|
|
41
|
+
absolute paths (or re-`cd` in the same command) for every file and script.
|
|
42
|
+
|
|
43
|
+
## Worktree discipline (MUST)
|
|
44
|
+
|
|
45
|
+
1. Initialize with `node .agents/scripts/story-init.js --story <storyId>` from
|
|
46
|
+
the **main checkout** (the worktree does not exist yet). Invoke it
|
|
47
|
+
**synchronously** with the Bash maximum timeout — a per-worktree install can
|
|
48
|
+
take several minutes; do not background it.
|
|
49
|
+
2. Capture `workCwd`, `dependenciesInstalled`, and `context.parentId` from the
|
|
50
|
+
init envelope. When worktree isolation is on, `cd` into the printed
|
|
51
|
+
**absolute** `workCwd` before doing any implementation work. The main
|
|
52
|
+
checkout's HEAD is never moved by you.
|
|
53
|
+
3. Every subsequent command runs against that worktree path. Because cwd may
|
|
54
|
+
reset between calls, prefer absolute paths anchored at `workCwd`.
|
|
55
|
+
|
|
56
|
+
## Verify branch before every commit (MUST)
|
|
57
|
+
|
|
58
|
+
Before staging or committing anything, confirm you are on the Story branch:
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
git -C "<workCwd>" branch --show-current # MUST print story-<storyId>
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
If it does **not** report `story-<storyId>`, **STOP** — do not commit. Never
|
|
65
|
+
commit Story work to `main`, to an Epic branch directly, or outside the
|
|
66
|
+
worktree/branch. Re-run `story-init.js` (it is idempotent on partial state) to
|
|
67
|
+
restore the branch before proceeding.
|
|
68
|
+
|
|
69
|
+
## Commit discipline
|
|
70
|
+
|
|
71
|
+
Author commits directly on `story-<storyId>` following the always-on git core
|
|
72
|
+
([`git-conventions.md`](../rules/git-conventions.md)):
|
|
73
|
+
|
|
74
|
+
- Conventional Commit subject (`feat:`, `fix:`, `perf:`, `refactor:`, `docs:`,
|
|
75
|
+
`chore:`, `test:`, `build:`, `ci:`), imperative mood, ≤100 chars.
|
|
76
|
+
- Reference the parent Story via `(refs #<storyId>)` in the subject or body.
|
|
77
|
+
- The `commit-msg` Husky hook runs commitlint locally. **Never** bypass it with
|
|
78
|
+
`--no-verify` / `--no-gpg-sign`. If a hook fails, fix the cause and add a new
|
|
79
|
+
follow-up commit — do not amend the rejected commit.
|
|
80
|
+
|
|
81
|
+
## Docs context — digest first
|
|
82
|
+
|
|
83
|
+
Do **not** re-read every file in `project.docsContextFiles`. Your caller passes
|
|
84
|
+
a `docsDigestPath` (the per-Epic docs digest — a compact per-file outline:
|
|
85
|
+
path, size, heading outline with line numbers, first paragraph under each
|
|
86
|
+
`##`). Read that digest, decide which docs bear on this Story, then **pull the
|
|
87
|
+
full file on demand** (jump to the section at the line number the digest names)
|
|
88
|
+
only when a section bears on the change. When `docsDigestPath` is null (no
|
|
89
|
+
`docsContextFiles` configured) there is no digest and no per-Story docs
|
|
90
|
+
mandate — read a full doc only if the Story's own context points you at one.
|
|
91
|
+
|
|
92
|
+
## Close gates — do not pre-run
|
|
93
|
+
|
|
94
|
+
`story-close.js` runs the canonical close-validation chain (**typecheck, lint,
|
|
95
|
+
test, format, maintainability, coverage, crap**) before it merges. Do **not**
|
|
96
|
+
pre-run those gates as a matter of course — running `npm run typecheck &&
|
|
97
|
+
npm run lint && npm test` as advisory pre-flight while iterating on a fix is
|
|
98
|
+
fine, but the close pipeline is the authoritative gate. The bounded acceptance
|
|
99
|
+
self-eval loop (below) may share `lint` / `typecheck` evidence with close via
|
|
100
|
+
`evidence-gate.js`; never stamp coverage / CRAP fresh that way.
|
|
101
|
+
|
|
102
|
+
## Acceptance self-eval before close (MUST)
|
|
103
|
+
|
|
104
|
+
After the implementation commits land and **before** flipping to `closing`, run
|
|
105
|
+
the bounded acceptance self-eval loop (see
|
|
106
|
+
[`acceptance-self-eval.md`](../workflows/helpers/acceptance-self-eval.md)). It
|
|
107
|
+
scores the working diff against **each** `acceptance[]` item and consumes the
|
|
108
|
+
`verify[]` command output as **required evidence**. The gate returns one of:
|
|
109
|
+
|
|
110
|
+
- **`proceed`** (every criterion met) → flip to `closing` and close.
|
|
111
|
+
- **`redraft`** (rounds remaining) → fix the flagged criteria, commit, re-eval.
|
|
112
|
+
- **`block`** (round cap reached, criteria still unmet) → take the blocked path.
|
|
113
|
+
Never silently proceed to close.
|
|
114
|
+
|
|
115
|
+
## Lifecycle: heartbeat & blocked (MUST)
|
|
116
|
+
|
|
117
|
+
- **Heartbeat.** Emit a `story.heartbeat` lifecycle event on every phase
|
|
118
|
+
transition (or when you stall on a long-running step) so the parent
|
|
119
|
+
`/deliver` idle watchdog can tell a live child from a dead one. In practice
|
|
120
|
+
this is the `story-phase.js` / `story-run-progress` snapshot at each
|
|
121
|
+
transition; write it at every transition, and relay one terse line per
|
|
122
|
+
transition (e.g. `Story #<id>: implementing → closing`), not the full body.
|
|
123
|
+
- **Blocked.** If you genuinely cannot proceed, flip the snapshot to `blocked`,
|
|
124
|
+
transition the Story to `agent::blocked`, post a `friction` comment naming
|
|
125
|
+
the decision needed (or the unmet criteria and their evidence), and **exit
|
|
126
|
+
non-zero**. **Never fall silent** — a child with no heartbeat, no commit, and
|
|
127
|
+
no `agent::blocked` label is exactly the dead-child failure the watchdog is
|
|
128
|
+
built to catch.
|
|
129
|
+
- **Anti-thrashing.** If you hit the same error class twice with the same fix,
|
|
130
|
+
or drift through reads without narrowing the problem, STOP: summarize what
|
|
131
|
+
recurred and either re-plan or take the blocked path. Do not paper over a
|
|
132
|
+
loop with another just-in-case retry.
|
|
133
|
+
|
|
134
|
+
## Land or block — the only sanctioned landing (#4483, MUST)
|
|
135
|
+
|
|
136
|
+
The Story's init envelope carries `remoteVerified` + `remoteProbe`. When
|
|
137
|
+
`remoteVerified` is `false`, transition the Story to `agent::blocked` quoting
|
|
138
|
+
`remoteProbe.detail` and stop. Implementing the Story inline outside the
|
|
139
|
+
worktree / branch / PR path — or committing it to local `main` — is expressly
|
|
140
|
+
**forbidden**. The close pipeline's push (`story-close.js`) is the only
|
|
141
|
+
sanctioned way the work lands.
|
|
142
|
+
|
|
143
|
+
## Return schema
|
|
144
|
+
|
|
145
|
+
Your authoritative status is the `story-run-progress` snapshot comment that
|
|
146
|
+
`story-phase.js` upserts at each transition — the parent `/deliver` aggregator
|
|
147
|
+
reads that, not your chat. On completion, return a compact JSON object naming
|
|
148
|
+
the terminal state and evidence:
|
|
149
|
+
|
|
150
|
+
```json
|
|
151
|
+
{
|
|
152
|
+
"storyId": "<storyId>",
|
|
153
|
+
"state": "done | blocked",
|
|
154
|
+
"branch": "story-<storyId>",
|
|
155
|
+
"prUrl": "<url or null>",
|
|
156
|
+
"gates": { "acceptanceEval": "proceed | block", "close": "passed | n/a" },
|
|
157
|
+
"blockedReason": "<null, or the friction summary when state=blocked>"
|
|
158
|
+
}
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
Exit zero only when the Story reached `agent::done` (merged/landed via the
|
|
162
|
+
close pipeline). Exit non-zero on any blocked terminus.
|
|
@@ -262,6 +262,7 @@ top-level keys are validation errors.
|
|
|
262
262
|
| `quality.baselineEpsilon.lighthouse` | No | `number` | — | — |
|
|
263
263
|
| `quality.baselineEpsilon.bundle-size` | No | `number` | — | — |
|
|
264
264
|
| `quality.baselineEpsilon.duplication` | No | `number` | — | — |
|
|
265
|
+
| `quality.requireBaselines` | No | `boolean` | — | Story #4495. Fail-closed baseline-enforcement policy for the unified check-baselines close-validation gate. When false (default), a consumer that enables baseline gates (crap/maintainability/…) but has not committed the corresponding baseline artifacts under baselines/ gets a clean skip-with-reason instead of a deterministic first-try close failure. Set true to keep the gate registered so an absent baseline artifact fails close-validation with a preflight hint naming the fix (the fail-closed posture, analogous to delivery.ci.requireChecks). |
|
|
265
266
|
| `quality.navigability` | No | `object` | — | Navigability lens + post-wave integration gate config (Epic #4131, F2/F3/F1/F4). Read by audit-suite/selector.js (route globs) and the deliver-epic.md Phase 6.5 gate (journey suite). Opt-in: absent or empty routeGlobs degrades to a silent no-op. |
|
|
266
267
|
| `quality.navigability.routeGlobs` | No | `array<string>` | — | Glob patterns (pages/**, app/**/route.ts) marking paths that add a user-facing route — the route-tree SSOT the navigability lens enumerates and the route-added routing predicate matches against. |
|
|
267
268
|
| `quality.navigability.navRegistry` | No | `array<string>` | — | Tokens identifying the nav-registry SSOT the navigability lens checks every route resolves a nav door against. |
|
|
@@ -289,9 +290,10 @@ top-level keys are validation errors.
|
|
|
289
290
|
| `retro.perfThresholds.bootstrapShare` | No | `number` | — | Maximum acceptable share of cumulative Story execution time spent in the story-init phase. When exceeded the retro emits a `high-bootstrap-share` signal. Default 0.4. |
|
|
290
291
|
| `retro.perfThresholds.capBindingRunLength` | No | `integer` | — | Minimum run length of consecutive cap-binding waves before the retro emits a `cap-binding-run` signal. Default 2. |
|
|
291
292
|
| `refactorStage` | No | `object` | — | Opt-in, config-gated post-green refactor checkpoint wired into story-deliver (Story #3430, Epic #3418). Strictly additive and default-OFF: when disabled, story-deliver behaves exactly as before. Advisory only — never changes existing close-validation gate semantics. |
|
|
292
|
-
| `refactorStage.enabled` | No | `boolean` | `false` | When true, story-deliver runs an advisory post-green refactor stage (
|
|
293
|
+
| `refactorStage.enabled` | No | `boolean` | `false` | When true, story-deliver runs an advisory post-green refactor stage (core/code-review-and-quality skill, Post-Green Refactor Pass) after the suite is green. Default false — when unset the stage is skipped and close-validation gate semantics are unchanged. |
|
|
293
294
|
| `acceptanceEval` | No | `object` | — | Story #3819. Bounded per-Story acceptance self-eval loop. After the implementation commits land and before the Story-implementation phase flips to `closing`, an independent (fresh-context) critic pass scores the working diff against each inline `acceptance[]` item, redrafts the unmet items, and re-evaluates — capped at `maxRounds` redraft rounds, then escalates to `agent::blocked` when criteria remain unmet. There is no `enabled` flag: the loop is a hard cutover (always on). |
|
|
294
295
|
| `acceptanceEval.maxRounds` | No | `integer` | — | Maximum number of redraft rounds before escalation. Default 2; clamped into [1, hard ceiling] by lib/config/acceptance-eval.js so the cap can never be disabled (maxRounds: 0 clamps up to 1). |
|
|
296
|
+
| `acceptanceEval.clusterCeiling` | No | `integer` | — | Epic #4475 (M4-B). Max acceptance criteria one single-delivery acceptance critic scores in a single fresh-context pass. Single delivery clusters the Epic ## Acceptance Table ACs into ceil(totalACs / clusterCeiling) groups and spawns one maker-blind critic per cluster, restoring the distributed acceptance coverage the per-Story critic fan-out gave for free. Default 4; clamped into [1, 8] by lib/config/acceptance-eval.js so a large value cannot collapse the fan-out to a single diluted critic. Ignored on the fan-out route. |
|
|
295
297
|
| `ci` | No | `object` | — | Nested configuration block. |
|
|
296
298
|
| `ci.skipForStoryPushes` | No | `boolean` | — | Story #2899 (Epic #2880, F13). When true (default), pre-push tooling appends a '[skip ci]' trailer to Story-branch commit subjects so intermediate pushes do not stampede the CI fleet. The Epic-branch merge commit produced by story-close.js never carries the marker, regardless of this flag. |
|
|
297
299
|
| `ci.earlyPr` | No | `boolean` | — | Story #4356 (Epic #4355). When true (default), /deliver opens the Epic PR early — before every Story merges — so CI starts warming while later waves run. Set false to defer PR creation until the Epic branch is complete. |
|
|
@@ -301,6 +303,10 @@ top-level keys are validation errors.
|
|
|
301
303
|
| `ci.watch.maxResumes` | No | `integer` | — | — |
|
|
302
304
|
| `ci.autoMerge` | No | `"trust-ci"` \| `"strict"` | — | Story #4356 (Epic #4355). Merge posture. 'trust-ci' (default) merges once required checks pass; 'strict' additionally requires a clean review gate. |
|
|
303
305
|
| `ci.requireChecks` | No | `boolean` | — | Story #4472. Fail-closed-without-checks policy. When true, the AutomergePredicate refuses to arm merge in a repo that reports zero required checks ('no checks reported'), treating the absent CI gate as a hard block. Defaults to false so a checks-less repo with green close-validation gates lands headlessly instead of parking on the operator-merges path. |
|
|
306
|
+
| `routing` | No | `object` | — | Epic #4475 (M4-A). Delivery-route selection for epic-shaped work. |
|
|
307
|
+
| `routing.singleDelivery` | No | `boolean` | — | Epic #4475 (M4-A). Global kill-switch for the single-delivery route. When true (default), an Epic marked `delivery::single` at plan time routes to the single-delivery helper; when false, EVERY Epic — even a single-marked one — is forced down the fan-out path (the instant, code-rollback-free per-consumer revert). Shipped INERT in M4-A: the router's single verdict falls through to fan-out until M4-B wires the executor, so the knob has no observable effect yet. |
|
|
308
|
+
| `routing.roleScopedAgents` | No | `boolean` | — | Epic #4478 (M7-B). Kill-switch for the role-scoped boot contexts. When true (default), a converted delivery spawn (`story-worker`, `acceptance-critic`) boots on its own `.claude/agents/<role>.md` system prompt instead of re-paying the full CLAUDE.md @-import closure (≈50KB → ≈8KB per spawn — the payoff of the context diet). When false, every converted spawn falls back to `subagent_type: general-purpose` — the instant, code-rollback-free per-consumer revert, and the universal escape for hosts that ignore `.claude/agents/`. The fallback is the full-closure agent that ran before M7-B, so flipping it off never drops a gate. |
|
|
309
|
+
| `routing.freshCriticSampleRate` | No | `number` | — | Epic #4478 (M7-B, Part 2). Maker-checker sampling floor. Risk-routed ceremony sends a low-risk acceptance cluster down the contract-identical inline critic path, but this fraction of low-risk clusters is still forced through a fresh-context critic so low risk never means zero independent checking. Clamped to [0, 1]; 0 disables the floor, 1 forces every cluster fresh. Default 0.2. Consumed by resolveCeremonyForRisk (lib/orchestration/ceremony-routing.js). |
|
|
304
310
|
| `preflight` | No | `object` | — | Story #2899 (Epic #2880, F13). Thresholds consumed by `.agents/scripts/epic-deliver-preflight.js`. When any value is exceeded the preflight envelope flags a breach and /deliver Phase 1 surfaces it via agent::blocked. |
|
|
305
311
|
| `preflight.maxStories` | No | `integer` | — | — |
|
|
306
312
|
| `preflight.maxWaves` | No | `integer` | — | — |
|
|
@@ -9,6 +9,30 @@ links here from the sections that used to inline this content.
|
|
|
9
9
|
|
|
10
10
|
---
|
|
11
11
|
|
|
12
|
+
## Friction telemetry
|
|
13
|
+
|
|
14
|
+
Reference mechanics behind the friction-telemetry MUST in
|
|
15
|
+
[`instructions.md` § 1.H](../instructions.md). The always-loaded core keeps the
|
|
16
|
+
MUST, the command, and the when-to-fire triggers; the detail below is consulted
|
|
17
|
+
only when reasoning about **where** a friction record lands and **how** it is
|
|
18
|
+
validated.
|
|
19
|
+
|
|
20
|
+
- **Canonical record + schema validation**: `diagnose-friction.js` appends one
|
|
21
|
+
`kind: friction` record, validated write-time against
|
|
22
|
+
`signal-event.schema.json`, to the per-Epic/per-Story `signals.ndjson`
|
|
23
|
+
stream on local disk. The retro roll-up reads that stream back to aggregate
|
|
24
|
+
friction into routed proposals; nothing is posted to the GitHub ticket at
|
|
25
|
+
capture time.
|
|
26
|
+
- **No-Epic context**: Outside an Epic/Story loop there is no per-Epic stream
|
|
27
|
+
to anchor to, so the record lands on the **standalone signal stream**
|
|
28
|
+
(`temp/standalone/stories/story-<sid>/signals.ndjson`) under the same
|
|
29
|
+
canonical schema.
|
|
30
|
+
- **Never silently dropped**: The signal is never silently dropped — a
|
|
31
|
+
best-effort write failure is logged, not swallowed into a promise of a
|
|
32
|
+
side-file that no reader consumes.
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
12
36
|
## Log-level control
|
|
13
37
|
|
|
14
38
|
The orchestrator logger (`lib/Logger.js`) emits progress/trace output based on
|
|
@@ -22,8 +46,9 @@ the `AGENT_LOG_LEVEL` environment variable:
|
|
|
22
46
|
|
|
23
47
|
This is a diagnostic knob: set it when you need quieter script embedding
|
|
24
48
|
(`silent`) or a deeper trace (`verbose`). The friction-telemetry MUST it sits
|
|
25
|
-
under —
|
|
26
|
-
in [`instructions.md` § 1.H](../instructions.md)
|
|
49
|
+
under — capture friction as a local NDJSON signal via `diagnose-friction.js` —
|
|
50
|
+
stays in [`instructions.md` § 1.H](../instructions.md); its record-landing and
|
|
51
|
+
schema mechanics are in [§ Friction telemetry](#friction-telemetry) above.
|
|
27
52
|
|
|
28
53
|
---
|
|
29
54
|
|
package/.agents/instructions.md
CHANGED
|
@@ -10,32 +10,42 @@ set. You MUST strictly adhere to the following rules:
|
|
|
10
10
|
|
|
11
11
|
### A. Persona Routing & Execution
|
|
12
12
|
|
|
13
|
-
When
|
|
14
|
-
|
|
15
|
-
`.agents/personas/[role].md`.
|
|
16
|
-
|
|
13
|
+
When a task carries a `persona::<role>` label, or a user explicitly instructs
|
|
14
|
+
"Act as [Role/Persona]" in chat, retrieve and strictly adopt the rules in
|
|
15
|
+
`.agents/personas/[role].md`. Personas are advisory role framing, not a runtime
|
|
16
|
+
injection — read the file when the label or the instruction points you at one.
|
|
17
17
|
|
|
18
|
-
- **Fallback:** If the
|
|
19
|
-
`.agents/personas/engineer.md`.
|
|
18
|
+
- **Fallback:** If no persona is indicated, or the named file is missing,
|
|
19
|
+
default to `.agents/personas/engineer.md`.
|
|
20
20
|
|
|
21
21
|
### B. Skill Activation
|
|
22
22
|
|
|
23
23
|
The skill library uses a **two-tier architecture**:
|
|
24
24
|
|
|
25
25
|
- **`core/`** — Universal, process-driven skills that apply across any project
|
|
26
|
-
(e.g., `core/debugging-and-error-recovery`, `core/
|
|
26
|
+
(e.g., `core/debugging-and-error-recovery`, `core/code-review-and-quality`,
|
|
27
27
|
`core/security-and-hardening`). Always check for a relevant core skill first.
|
|
28
|
-
-
|
|
29
|
-
|
|
30
|
-
`
|
|
31
|
-
|
|
28
|
+
The **test-first** discipline (TDD cycle, Prove-It Pattern, good-test style,
|
|
29
|
+
property-based technique) lives in
|
|
30
|
+
[`rules/testing-standards.md`](rules/testing-standards.md), not a skill.
|
|
31
|
+
- **`stack/`** — Tech-stack-specific skills for concrete tools (e.g.,
|
|
32
|
+
`stack/qa/playwright`, `stack/qa/vitest`, `stack/qa/gherkin-authoring`).
|
|
33
|
+
Apply these when the project uses that specific technology. For third-party
|
|
34
|
+
library and framework knowledge not covered here, use the live-docs lookup
|
|
35
|
+
mandated in § 1.C rather than a frozen in-repo cache.
|
|
32
36
|
|
|
33
37
|
When a task involves a specific domain or technology, you MUST read the
|
|
34
38
|
corresponding `.agents/skills/[tier]/[category]/[skill-name]/SKILL.md` file and
|
|
35
39
|
apply its constraints. Review the skill's `examples/` directory or
|
|
36
40
|
`examples.md` sibling **when present and relevant** to the task — most skills
|
|
37
|
-
do not ship one, so do not probe blindly. When uncertain which skill
|
|
38
|
-
|
|
41
|
+
do not ship one, so do not probe blindly. When uncertain which skill applies,
|
|
42
|
+
match the task against the one-line `description` in each skill's frontmatter
|
|
43
|
+
(catalogued in `.agents/skills/skills.index.json`). Skills compose: a complete
|
|
44
|
+
feature typically flows `idea-refinement` → the `/plan` workflow →
|
|
45
|
+
implementation test-first (`rules/testing-standards.md`) →
|
|
46
|
+
`code-review-and-quality` — not every task needs every skill. The always-on
|
|
47
|
+
operating posture (surface assumptions, manage confusion, push back on flawed
|
|
48
|
+
approaches, verify don't assume) is governed by § 3–4 and § 1.I of this file.
|
|
39
49
|
|
|
40
50
|
### C. Proactive Documentation
|
|
41
51
|
|
|
@@ -96,12 +106,17 @@ does not re-pay their bytes on every turn.
|
|
|
96
106
|
- **Always-on core** (loaded alongside this file):
|
|
97
107
|
- [`rules/security-baseline.md`](rules/security-baseline.md) — inviolable
|
|
98
108
|
security MUSTs; applies to every piece of code generated.
|
|
99
|
-
- [`rules/git-conventions.md`](rules/git-conventions.md) —
|
|
100
|
-
branch,
|
|
109
|
+
- [`rules/git-conventions.md`](rules/git-conventions.md) — the always-on git
|
|
110
|
+
core (branch shapes, commit-subject format, `refs #`, push/hygiene MUSTs);
|
|
111
|
+
every commit, branch, and PR touches it.
|
|
101
112
|
|
|
102
113
|
- **On-demand** — read the file **before** doing the matching work; each opens
|
|
103
114
|
with a one-line "this rule applies when…" scope header, so skimming its first
|
|
104
115
|
paragraph confirms whether it governs the task at hand:
|
|
116
|
+
- [`rules/git-conventions-reference.md`](rules/git-conventions-reference.md)
|
|
117
|
+
— the git-history mechanics the core summarizes: hard-cutover policy, the
|
|
118
|
+
push-hook false-negative signature, shared-checkout contention, the
|
|
119
|
+
docs-freshness gate, and `meta::*` routing labels.
|
|
105
120
|
- [`rules/shell-conventions.md`](rules/shell-conventions.md) — before
|
|
106
121
|
chaining shell commands or writing cross-platform command strings.
|
|
107
122
|
- [`rules/testing-standards.md`](rules/testing-standards.md) — before
|
|
@@ -138,27 +153,22 @@ technology context is intentionally kept out of `.agentrc.json`.
|
|
|
138
153
|
|
|
139
154
|
### H. Observability & Friction Telemetry
|
|
140
155
|
|
|
141
|
-
You MUST log telemetry about
|
|
142
|
-
|
|
143
|
-
`diagnose-friction.js` appends one
|
|
144
|
-
per-
|
|
145
|
-
|
|
146
|
-
back). It is not posted to the GitHub ticket at capture time — the retro
|
|
147
|
-
phase is what surfaces the aggregated friction as routed proposals.
|
|
156
|
+
You MUST log telemetry about operational difficulty or automation
|
|
157
|
+
opportunities you hit. Friction is a **local NDJSON signal**:
|
|
158
|
+
`diagnose-friction.js` appends one `kind: friction` record to the per-Epic/
|
|
159
|
+
per-Story `signals.ndjson` stream on local disk — not posted to the ticket at
|
|
160
|
+
capture time; the retro phase surfaces the aggregate as routed proposals.
|
|
148
161
|
|
|
149
162
|
- **Command**:
|
|
150
163
|
`node .agents/scripts/diagnose-friction.js --story [STORY_ID] --cmd [FAILED_COMMAND]`
|
|
151
|
-
(add `--epic [EPIC_ID]`
|
|
152
|
-
- **When to fire**:
|
|
153
|
-
command
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
same canonical schema. The signal is never silently dropped — a
|
|
160
|
-
best-effort write failure is logged, not swallowed into a promise of a
|
|
161
|
-
side-file that no reader consumes.
|
|
164
|
+
(add `--epic [EPIC_ID]` under an Epic).
|
|
165
|
+
- **When to fire**: after repeated tool-validation errors, an unrecoverable
|
|
166
|
+
command failure, ambiguity needing self-correction, or repetitive
|
|
167
|
+
boilerplate steps a workflow/skill could simplify.
|
|
168
|
+
|
|
169
|
+
The schema validation, the standalone (no-Epic) stream path, and the
|
|
170
|
+
never-silently-dropped guarantee are reference detail — see
|
|
171
|
+
[`docs/execution-reference.md` § Friction telemetry](docs/execution-reference.md#friction-telemetry).
|
|
162
172
|
|
|
163
173
|
#### Log Level Control
|
|
164
174
|
|