yam-flow 0.1.8 → 0.1.9

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 CHANGED
@@ -2,6 +2,29 @@
2
2
 
3
3
  All notable changes to yam-flow are documented here.
4
4
 
5
+ ## v0.1.9 - 2026-06-18
6
+
7
+ ### Added
8
+
9
+ - Expanded `yam loop report --json` into a read-only handoff artifact with `fix_first_items`, `recommended_direction`, `implementation_notes`, `why_this_next`, `blocked_by`, and `owner_route`.
10
+ - Added loop report smoke coverage for the new handoff fields while keeping the existing minimal and blocked report paths.
11
+
12
+ ### Improved
13
+
14
+ - Updated `$quick`, `$deep`, `$mission`, and `$ueye` final response guidance so implementation work can include Study Note and handoff habits without forcing a CLI artifact for ordinary work.
15
+ - Updated `references/final-report.md`, README, COMMANDS, and manifest principles to treat Study Note and handoff direction as final-report practices.
16
+
17
+ ### Verification
18
+
19
+ - `npm run typecheck`
20
+ - `npm run build`
21
+ - `node ./dist/bin/yam.js loop report --json` with handoff fields
22
+ - `npm run cli-smoke`
23
+ - `npm run verify:self`
24
+ - `npm run forbidden-names:check`
25
+ - `npm run package-boundary:check`
26
+ - `npm run dist:freshness`
27
+
5
28
  ## v0.1.8 - 2026-06-16
6
29
 
7
30
  ### Added
package/COMMANDS.md CHANGED
@@ -148,7 +148,7 @@ yam tools doctor /path/to/project
148
148
  yam tools doctor /path/to/project --json
149
149
  yam context pressure /path/to/project --json
150
150
  yam cleanup scan /path/to/project --json
151
- yam loop report --route quick --intent "fix release readiness" --stage "inspect:passed:read release report" --evidence "typecheck passed" --issue-code "src/bin/yam.ts release report" --issue-role "summarizes release readiness without publishing" --issue-symptom "npm auth failure needs clearer next action" --changed-code "yam loop report" --changed-role "records loop evidence and learning note" --change-summary "added a read-only loop artifact" --why-important "it helps users learn what changed without overclaiming verification" --learning-note "fix blockers before claiming done" --json
151
+ yam loop report --route quick --intent "fix release readiness" --stage "inspect:passed:read release report" --evidence "typecheck passed" --fix-first-item "npm auth must be verified before publish" --remaining-task "rerun release report after auth refresh" --recommended-direction "fix npm auth first, then publish manually" --implementation-note "keep loop report read-only" --why-this-next "auth blocks public release claims" --blocked-by "npm whoami E401" --owner-route deep --issue-code "src/bin/yam.ts release report" --issue-role "summarizes release readiness without publishing" --issue-symptom "npm auth failure needs clearer next action" --changed-code "yam loop report" --changed-role "records loop evidence and learning note" --change-summary "added a read-only loop artifact" --why-important "it helps users learn what changed without overclaiming verification" --learning-note "fix blockers before claiming done" --json
152
152
  yam proof /path/to/project
153
153
  yam proof --route deep --truth verified --command "npm run build: pass"
154
154
  yam proof --route ueye --truth verified --visual "reference image only"
@@ -195,7 +195,7 @@ Supported report shapes:
195
195
 
196
196
  - Runtime evidence mini: command/process, observation, cleanup, truth status, next action.
197
197
  - Patch queue lite: mission lane status, changed files, verification hint, rollback hint, truth status.
198
- - Loop report: intent, stage outcomes, evidence, blockers, next action, remaining tasks, and study note.
198
+ - Loop report: intent, stage outcomes, evidence, blockers, next action, fix-first items, remaining tasks, recommended direction, blocked-by notes, owner route, and study note.
199
199
  - Study note: short non-specialist explanation of the failing code, its role, observed symptom, changed code, and why it matters.
200
200
  - Benchmark optimization loop lite: baseline, one change, rerun, keep/revert decision.
201
201
  - Structured diagnostic next action: severity, evidence, owner route, next action, truth status.
package/README.md CHANGED
@@ -142,7 +142,7 @@ yam ueye report --reference ./reference.png --actual .yam/screens/home.png --pre
142
142
  yam proof --route ueye --truth verified --visual "implementation screenshot evidence recorded" --design-completion '{"completion_claim":"done","has_implementation_screenshot":true,"design_quality":"pass","states_checked":true,"mobile_checked":true,"contrast_checked":true,"cta_checked":true,"direction_locked":true,"truth_status":"verified"}'
143
143
  yam media proof --requested --attempted --output ./generated.png --wait-loop --json
144
144
  yam proof --route mission --mission-envelope '{"agent_id":"implementer","assigned_scope":"target component","changed_files":["src/file.ts"],"verification_hint":"npm run typecheck","truth_status":"partial"}'
145
- yam loop report --route quick --intent "fix release readiness" --stage "inspect:passed:read release report" --evidence "typecheck passed" --issue-code "src/bin/yam.ts release report" --issue-role "summarizes release readiness without publishing" --issue-symptom "npm auth failure needs clearer next action" --changed-code "yam loop report" --changed-role "records loop evidence and learning note" --change-summary "added a read-only loop artifact" --why-important "it helps users learn what changed without overclaiming verification" --learning-note "fix blockers before claiming done" --json
145
+ yam loop report --route quick --intent "fix release readiness" --stage "inspect:passed:read release report" --evidence "typecheck passed" --fix-first-item "npm auth must be verified before publish" --remaining-task "rerun release report after auth refresh" --recommended-direction "fix npm auth first, then publish manually" --implementation-note "keep loop report read-only" --why-this-next "auth blocks public release claims" --blocked-by "npm whoami E401" --owner-route deep --issue-code "src/bin/yam.ts release report" --issue-role "summarizes release readiness without publishing" --issue-symptom "npm auth failure needs clearer next action" --changed-code "yam loop report" --changed-role "records loop evidence and learning note" --change-summary "added a read-only loop artifact" --why-important "it helps users learn what changed without overclaiming verification" --learning-note "fix blockers before claiming done" --json
146
146
  yam release report --json
147
147
  yam safety "supabase db reset"
148
148
  yam detect /path/to/project
@@ -216,7 +216,7 @@ These shapes keep reports machine-readable without turning normal work into a he
216
216
  - Runtime evidence mini: compact route, command/process, observation, cleanup, truth status, and next action fields for `$deep` or `$mission` runtime claims.
217
217
  - Patch queue lite: `$mission` lane records with pending/applied/verified/reverted/blocked state, changed files, verification hint, rollback hint, truth status, and next action.
218
218
  - Release report JSON: `yam release report --json` summarizes typecheck, forbidden-name scan, package boundary, registry status, CLI smoke, dist freshness, diagnostics, and final truth status.
219
- - Loop report JSON: `yam loop report --json` records a read-only loop artifact: intent, stages, evidence, blockers, next action, remaining tasks, tool intent, truth status, and study note.
219
+ - Loop report JSON: `yam loop report --json` records a read-only handoff artifact: intent, stages, evidence, blockers, next action, fix-first items, remaining tasks, recommended direction, implementation notes, blocked-by notes, owner route, tool intent, truth status, and study note.
220
220
  - Study note: `yam.study-note.v1` keeps short non-specialist explanations for what code was failing, what role it plays, how the symptom showed up, what changed, and why it matters. Missing details stay in `limits` instead of being guessed.
221
221
  - Publish blocker evidence: release reports classify common npm auth, permission, OTP, immutable-version, cache, registry, and tarball failures into safe next actions.
222
222
  - Publish readiness evidence: release reports run read-only registry/auth/version probes, redact account/token details, and keep npm publish outside the report.
package/dist/bin/yam.js CHANGED
@@ -1970,16 +1970,16 @@ async function loop(args = []) {
1970
1970
  function loopUsage() {
1971
1971
  console.log(`yam loop
1972
1972
 
1973
- Read-only loop artifact helpers. A loop report records intent, stages, evidence, blockers, next action, and a short study note. It does not run agents, start processes, publish packages, or write files.
1973
+ Read-only loop artifact helpers. A loop report records intent, stages, evidence, blockers, next action, handoff fields, and a short study note. It does not run agents, start processes, publish packages, or write files.
1974
1974
 
1975
1975
  Usage:
1976
- yam loop report [--route route] [--intent text] [--loop-kind harness|release|ueye|scout|deep|mission] [--stage id:status:note] [--evidence text] [--blocked text] [--remaining-task text] [--truth status] [--intent-label read_only|write|destructive|runtime|visual|publish] [--issue-code text] [--issue-role text] [--issue-symptom text] [--changed-code text] [--changed-role text] [--change-summary text] [--why-important text] [--learning-note text] [--json]
1976
+ yam loop report [--route route] [--intent text] [--loop-kind harness|release|ueye|scout|deep|mission] [--stage id:status:note] [--evidence text] [--blocked text] [--fix-first-item text] [--remaining-task text] [--recommended-direction text] [--implementation-note text] [--why-this-next text] [--blocked-by text] [--owner-route route] [--truth status] [--intent-label read_only|write|destructive|runtime|visual|publish] [--issue-code text] [--issue-role text] [--issue-symptom text] [--changed-code text] [--changed-role text] [--change-summary text] [--why-important text] [--learning-note text] [--json]
1977
1977
  `);
1978
1978
  }
1979
1979
  async function loopReport(args = []) {
1980
1980
  if (args[0] === 'help' || args[0] === '--help' || args[0] === '-h')
1981
1981
  return loopUsage();
1982
- const flags = parseSimpleFlags(args, new Set(['route', 'intent', 'loop-kind', 'stage', 'evidence', 'blocked', 'blocker', 'next-action', 'remaining-task', 'truth', 'intent-label', 'tool-intent', 'issue-code', 'issue-role', 'issue-symptom', 'changed-code', 'changed-role', 'change-summary', 'why-important', 'learning-note', 'json']));
1982
+ const flags = parseSimpleFlags(args, new Set(['route', 'intent', 'loop-kind', 'stage', 'evidence', 'blocked', 'blocker', 'next-action', 'fix-first-item', 'remaining-task', 'recommended-direction', 'direction', 'implementation-note', 'why-this-next', 'blocked-by', 'owner-route', 'truth', 'intent-label', 'tool-intent', 'issue-code', 'issue-role', 'issue-symptom', 'changed-code', 'changed-role', 'change-summary', 'why-important', 'learning-note', 'json']));
1983
1983
  const blockers = [...arrayFlag(flags.blocked), ...arrayFlag(flags.blocker)];
1984
1984
  const report = buildLoopReport({
1985
1985
  route: normalizeRoute(flags.route) || String(flags.route || ''),
@@ -1991,7 +1991,13 @@ async function loopReport(args = []) {
1991
1991
  truth_status: isTruthStatus(flags.truth) ? flags.truth : undefined,
1992
1992
  intent_label: normalizeToolIntent(flags.intent_label || flags.tool_intent || 'read_only'),
1993
1993
  next_action: String(flags.next_action || ''),
1994
+ fix_first_items: arrayFlag(flags.fix_first_item),
1994
1995
  remaining_tasks: arrayFlag(flags.remaining_task),
1996
+ recommended_direction: String(flags.recommended_direction || flags.direction || ''),
1997
+ implementation_notes: arrayFlag(flags.implementation_note),
1998
+ why_this_next: String(flags.why_this_next || ''),
1999
+ blocked_by: arrayFlag(flags.blocked_by),
2000
+ owner_route: String(flags.owner_route || flags.route || ''),
1995
2001
  issue_code: String(flags.issue_code || ''),
1996
2002
  issue_role: String(flags.issue_role || ''),
1997
2003
  issue_symptom: String(flags.issue_symptom || ''),
@@ -161,7 +161,13 @@ export interface LoopReport {
161
161
  intent_label: ToolIntent;
162
162
  tool_intent: ToolIntent;
163
163
  next_action: string;
164
+ fix_first_items: string[];
164
165
  remaining_tasks: string[];
166
+ recommended_direction: string;
167
+ implementation_notes: string[];
168
+ why_this_next: string;
169
+ blocked_by: string[];
170
+ owner_route: string;
165
171
  study_note: StudyNote;
166
172
  }
167
173
  export interface UeyeRunReport {
@@ -259,7 +259,13 @@ export function buildLoopReport(input = {}) {
259
259
  intent_label: intentLabel,
260
260
  tool_intent: intentLabel,
261
261
  next_action: shortText(input.next_action || (blockers[0] ? 'resolve the blocker before claiming this loop complete' : 'record the next smallest useful action')),
262
+ fix_first_items: asList(input.fix_first_items || input.fix_first_item),
262
263
  remaining_tasks: asList(input.remaining_tasks || input.remaining_task),
264
+ recommended_direction: shortText(input.recommended_direction || input.direction),
265
+ implementation_notes: asList(input.implementation_notes || input.implementation_note),
266
+ why_this_next: shortText(input.why_this_next),
267
+ blocked_by: asList(input.blocked_by),
268
+ owner_route: normalizeOwnerRoute(input.owner_route || input.route),
263
269
  study_note: studyNote
264
270
  };
265
271
  }
@@ -388,6 +394,12 @@ function normalizeToolIntentLabel(value = '') {
388
394
  return text;
389
395
  return 'read_only';
390
396
  }
397
+ function normalizeOwnerRoute(value = '') {
398
+ const text = String(value || '').trim().replace(/^\$/, '').replace(/^yam-/, '');
399
+ if (['quick', 'ueye', 'question', 'scout', 'deep', 'mission'].includes(text))
400
+ return `$${text}`;
401
+ return text ? shortText(text, 80) : '';
402
+ }
391
403
  function shortText(value = '', limit = 240) {
392
404
  const text = String(value || '').trim().replace(/\s+/g, ' ');
393
405
  if (text.length <= limit)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "yam-flow",
3
- "version": "0.1.8",
3
+ "version": "0.1.9",
4
4
  "description": "Progressive proof-first agent flow: start fast, deepen deliberately, stay honest by design.",
5
5
  "type": "module",
6
6
  "author": "0kim0bos",
@@ -16,8 +16,10 @@ Include these when they are useful and keep them short:
16
16
  - Context pressure or cleanup findings when they could affect the next run.
17
17
  - Publish blocker evidence when npm/release work fails.
18
18
  - Structured diagnostic next action, when a check found a concrete next step.
19
+ - Study Note for implementation work: what code was wrong, what role it has, how the symptom showed up, what changed, and why it matters in short non-specialist language.
19
20
  - Remaining tasks.
20
21
  - Fix-first items before planned tasks.
22
+ - Recommended direction and why that next step matters when the handoff would otherwise be ambiguous.
21
23
 
22
24
  ## Anti-False-Completion Check
23
25
 
@@ -54,6 +56,30 @@ Examples:
54
56
  - Active hooks or instruction files that conflict with the route.
55
57
  - Warnings that keep obscuring real problems.
56
58
 
59
+ ## Study Note
60
+
61
+ Use this when implementation changed code or fixed an error and the user would benefit from learning:
62
+
63
+ - What code had the issue.
64
+ - What role that code plays.
65
+ - How the issue showed up.
66
+ - What changed.
67
+ - Why the change matters.
68
+
69
+ Keep it short. If the information is not known, say so instead of inventing it.
70
+
71
+ ## Handoff Direction
72
+
73
+ Use this when the next run needs a clear starting point:
74
+
75
+ - Fix-first items before planned work.
76
+ - Remaining tasks that still belong to the request or roadmap.
77
+ - Recommended direction.
78
+ - Why this next step matters.
79
+ - What is blocked, and by what.
80
+
81
+ `yam loop report` can record this as a handoff artifact with `fix_first_items`, `remaining_tasks`, `recommended_direction`, `implementation_notes`, `why_this_next`, `blocked_by`, and `owner_route`.
82
+
57
83
  ## Route Weight
58
84
 
59
85
  For `$quick`, one short paragraph or a compact verification matrix is enough.
@@ -70,8 +70,8 @@ Deep verification may include:
70
70
  Include:
71
71
 
72
72
  - What was changed or reviewed.
73
+ - Study Note for implementation work: what code was wrong, what role it has, how the symptom showed up, what changed, and why it matters in short non-specialist language.
73
74
  - Evidence gathered.
74
75
  - Truth status.
75
76
  - Blockers or remaining risk.
76
- - Remaining tasks.
77
- - Fix-first items before planned tasks.
77
+ - Handoff: fix-first items, remaining tasks, recommended direction, and why that next step matters.
@@ -102,8 +102,8 @@ Report:
102
102
 
103
103
  - What the mission changed.
104
104
  - Role/cross-verification summary.
105
+ - Study Note for implementation lanes: what code was wrong, what role it has, how the symptom showed up, what changed, and why it matters in short non-specialist language.
105
106
  - Evidence gathered.
106
107
  - Truth status.
107
108
  - Cleanup status.
108
- - Remaining tasks.
109
- - Fix-first items before planned tasks.
109
+ - Handoff: fix-first items, remaining tasks, recommended direction, and why that next step matters.
@@ -76,6 +76,7 @@ Use `references/token-budget-reporter.md` when a run needs measured budget feedb
76
76
  Keep it compact:
77
77
 
78
78
  - What changed or what the scan found.
79
+ - Study Note when useful: what code was wrong, what role it has, how the symptom showed up, what changed, and why it matters in short non-specialist language.
79
80
  - What was checked.
80
81
  - What was skipped, blocked, or still risky.
81
- - Remaining tasks and fix-first items, only when useful.
82
+ - Handoff when useful: fix-first items, remaining tasks, recommended direction, and why that next step matters.
@@ -170,5 +170,6 @@ Report:
170
170
  - Review continuity/comparison result when this continues a prior Ueye run.
171
171
  - P0-P3 issues or confirmation that no blockers were found.
172
172
  - States/viewports checked.
173
+ - Study Note when UI implementation changed code: what UI code changed, what role it has, how the visible symptom appeared, and why the change matters in short non-specialist language.
173
174
  - Truth status and visual verification cap.
174
- - Remaining tasks and fix-first items before planned tasks when useful.
175
+ - Handoff when useful: fix-first visual issues, remaining tasks, recommended direction, and why that next step matters.
package/src/bin/yam.ts CHANGED
@@ -1968,16 +1968,16 @@ async function loop(args = []) {
1968
1968
  function loopUsage() {
1969
1969
  console.log(`yam loop
1970
1970
 
1971
- Read-only loop artifact helpers. A loop report records intent, stages, evidence, blockers, next action, and a short study note. It does not run agents, start processes, publish packages, or write files.
1971
+ Read-only loop artifact helpers. A loop report records intent, stages, evidence, blockers, next action, handoff fields, and a short study note. It does not run agents, start processes, publish packages, or write files.
1972
1972
 
1973
1973
  Usage:
1974
- yam loop report [--route route] [--intent text] [--loop-kind harness|release|ueye|scout|deep|mission] [--stage id:status:note] [--evidence text] [--blocked text] [--remaining-task text] [--truth status] [--intent-label read_only|write|destructive|runtime|visual|publish] [--issue-code text] [--issue-role text] [--issue-symptom text] [--changed-code text] [--changed-role text] [--change-summary text] [--why-important text] [--learning-note text] [--json]
1974
+ yam loop report [--route route] [--intent text] [--loop-kind harness|release|ueye|scout|deep|mission] [--stage id:status:note] [--evidence text] [--blocked text] [--fix-first-item text] [--remaining-task text] [--recommended-direction text] [--implementation-note text] [--why-this-next text] [--blocked-by text] [--owner-route route] [--truth status] [--intent-label read_only|write|destructive|runtime|visual|publish] [--issue-code text] [--issue-role text] [--issue-symptom text] [--changed-code text] [--changed-role text] [--change-summary text] [--why-important text] [--learning-note text] [--json]
1975
1975
  `);
1976
1976
  }
1977
1977
 
1978
1978
  async function loopReport(args = []) {
1979
1979
  if (args[0] === 'help' || args[0] === '--help' || args[0] === '-h') return loopUsage();
1980
- const flags = parseSimpleFlags(args, new Set(['route', 'intent', 'loop-kind', 'stage', 'evidence', 'blocked', 'blocker', 'next-action', 'remaining-task', 'truth', 'intent-label', 'tool-intent', 'issue-code', 'issue-role', 'issue-symptom', 'changed-code', 'changed-role', 'change-summary', 'why-important', 'learning-note', 'json']));
1980
+ const flags = parseSimpleFlags(args, new Set(['route', 'intent', 'loop-kind', 'stage', 'evidence', 'blocked', 'blocker', 'next-action', 'fix-first-item', 'remaining-task', 'recommended-direction', 'direction', 'implementation-note', 'why-this-next', 'blocked-by', 'owner-route', 'truth', 'intent-label', 'tool-intent', 'issue-code', 'issue-role', 'issue-symptom', 'changed-code', 'changed-role', 'change-summary', 'why-important', 'learning-note', 'json']));
1981
1981
  const blockers = [...arrayFlag(flags.blocked), ...arrayFlag(flags.blocker)];
1982
1982
  const report = buildLoopReport({
1983
1983
  route: normalizeRoute(flags.route) || String(flags.route || ''),
@@ -1989,7 +1989,13 @@ async function loopReport(args = []) {
1989
1989
  truth_status: isTruthStatus(flags.truth) ? flags.truth : undefined,
1990
1990
  intent_label: normalizeToolIntent(flags.intent_label || flags.tool_intent || 'read_only'),
1991
1991
  next_action: String(flags.next_action || ''),
1992
+ fix_first_items: arrayFlag(flags.fix_first_item),
1992
1993
  remaining_tasks: arrayFlag(flags.remaining_task),
1994
+ recommended_direction: String(flags.recommended_direction || flags.direction || ''),
1995
+ implementation_notes: arrayFlag(flags.implementation_note),
1996
+ why_this_next: String(flags.why_this_next || ''),
1997
+ blocked_by: arrayFlag(flags.blocked_by),
1998
+ owner_route: String(flags.owner_route || flags.route || ''),
1993
1999
  issue_code: String(flags.issue_code || ''),
1994
2000
  issue_role: String(flags.issue_role || ''),
1995
2001
  issue_symptom: String(flags.issue_symptom || ''),
@@ -189,7 +189,13 @@ export interface LoopReport {
189
189
  intent_label: ToolIntent;
190
190
  tool_intent: ToolIntent;
191
191
  next_action: string;
192
+ fix_first_items: string[];
192
193
  remaining_tasks: string[];
194
+ recommended_direction: string;
195
+ implementation_notes: string[];
196
+ why_this_next: string;
197
+ blocked_by: string[];
198
+ owner_route: string;
193
199
  study_note: StudyNote;
194
200
  }
195
201
 
@@ -557,7 +563,13 @@ export function buildLoopReport(input: Partial<LoopReport> & Record<string, unkn
557
563
  intent_label: intentLabel,
558
564
  tool_intent: intentLabel,
559
565
  next_action: shortText(input.next_action || (blockers[0] ? 'resolve the blocker before claiming this loop complete' : 'record the next smallest useful action')),
566
+ fix_first_items: asList(input.fix_first_items || input.fix_first_item),
560
567
  remaining_tasks: asList(input.remaining_tasks || input.remaining_task),
568
+ recommended_direction: shortText(input.recommended_direction || input.direction),
569
+ implementation_notes: asList(input.implementation_notes || input.implementation_note),
570
+ why_this_next: shortText(input.why_this_next),
571
+ blocked_by: asList(input.blocked_by),
572
+ owner_route: normalizeOwnerRoute(input.owner_route || input.route),
561
573
  study_note: studyNote
562
574
  };
563
575
  }
@@ -676,6 +688,12 @@ function normalizeToolIntentLabel(value: unknown = ''): ToolIntent {
676
688
  return 'read_only';
677
689
  }
678
690
 
691
+ function normalizeOwnerRoute(value: unknown = ''): string {
692
+ const text = String(value || '').trim().replace(/^\$/, '').replace(/^yam-/, '');
693
+ if (['quick', 'ueye', 'question', 'scout', 'deep', 'mission'].includes(text)) return `$${text}`;
694
+ return text ? shortText(text, 80) : '';
695
+ }
696
+
679
697
  function shortText(value: unknown = '', limit = 240): string {
680
698
  const text = String(value || '').trim().replace(/\s+/g, ' ');
681
699
  if (text.length <= limit) return text;
package/yam.manifest.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "yam",
3
- "version": "0.1.8",
3
+ "version": "0.1.9",
4
4
  "principles": [
5
5
  "Direction before execution.",
6
6
  "Start fast.",
@@ -11,7 +11,8 @@
11
11
  "Token-aware by default.",
12
12
  "Context-reuse first.",
13
13
  "End with remaining tasks and fix-first items.",
14
- "Explain what failed, what changed, and why it matters in short non-specialist language when useful."
14
+ "Explain what failed, what changed, and why it matters in short non-specialist language when useful.",
15
+ "Use handoff notes for fix-first items, remaining tasks, and recommended next direction when useful."
15
16
  ],
16
17
  "defaultHooks": false,
17
18
  "routes": [