@event4u/agent-config 9.26.0 → 9.28.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 (252) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/AGENTS.md +12 -11
  3. package/CHANGELOG.md +134 -207
  4. package/README.md +1 -1
  5. package/dist/agent-src/commands/analyze/conformance.md +43 -0
  6. package/dist/agent-src/commands/roadmap/next.md +65 -3
  7. package/dist/agent-src/contexts/execution/orchestration-telemetry.md +10 -3
  8. package/dist/agent-src/rules/active-remediation.md +2 -0
  9. package/dist/agent-src/rules/analysis-skill-routing.md +2 -0
  10. package/dist/agent-src/rules/architecture.md +2 -0
  11. package/dist/agent-src/rules/artifact-drafting-protocol.md +2 -0
  12. package/dist/agent-src/rules/artifact-engagement-recording.md +6 -1
  13. package/dist/agent-src/rules/augment-edit-discipline.md +2 -0
  14. package/dist/agent-src/rules/autonomous-execution.md +3 -1
  15. package/dist/agent-src/rules/brand-consistency.md +2 -0
  16. package/dist/agent-src/rules/brand-source-of-truth.md +35 -6
  17. package/dist/agent-src/rules/broken-access-control.md +2 -0
  18. package/dist/agent-src/rules/cli-output-handling.md +2 -0
  19. package/dist/agent-src/rules/code-comment-discipline.md +2 -0
  20. package/dist/agent-src/rules/code-provenance.md +2 -0
  21. package/dist/agent-src/rules/command-suggestion-policy.md +2 -0
  22. package/dist/agent-src/rules/commit-conventions.md +2 -0
  23. package/dist/agent-src/rules/communication-through-line.md +2 -0
  24. package/dist/agent-src/rules/content-quoting-floor.md +2 -0
  25. package/dist/agent-src/rules/context-hygiene.md +13 -1
  26. package/dist/agent-src/rules/copilot-routing.md +2 -0
  27. package/dist/agent-src/rules/council-availability.md +93 -0
  28. package/dist/agent-src/rules/cross-source-consistency.md +5 -0
  29. package/dist/agent-src/rules/decision-revisit-gate.md +2 -0
  30. package/dist/agent-src/rules/delegation-policy.md +31 -5
  31. package/dist/agent-src/rules/design-fidelity.md +5 -0
  32. package/dist/agent-src/rules/design-review-after-ui-write.md +4 -0
  33. package/dist/agent-src/rules/devcontainer-routing.md +2 -0
  34. package/dist/agent-src/rules/doc-screenshot-hygiene.md +2 -0
  35. package/dist/agent-src/rules/docker-commands.md +2 -0
  36. package/dist/agent-src/rules/domain-adoption-policy.md +2 -0
  37. package/dist/agent-src/rules/domain-safety-disclaimer.md +2 -0
  38. package/dist/agent-src/rules/domain-safety-pii.md +2 -0
  39. package/dist/agent-src/rules/domain-safety-retention.md +2 -0
  40. package/dist/agent-src/rules/downstream-changes.md +2 -0
  41. package/dist/agent-src/rules/engineering-safety-floor.md +2 -0
  42. package/dist/agent-src/rules/evaluator-independence.md +14 -3
  43. package/dist/agent-src/rules/external-code-graph-interop.md +4 -1
  44. package/dist/agent-src/rules/external-reference-deep-dive.md +2 -0
  45. package/dist/agent-src/rules/fast-path-marker-visibility.md +2 -0
  46. package/dist/agent-src/rules/finance-safety-floor.md +3 -1
  47. package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +2 -0
  48. package/dist/agent-src/rules/git-history-discipline.md +3 -1
  49. package/dist/agent-src/rules/guidelines.md +2 -0
  50. package/dist/agent-src/rules/history-discipline.md +5 -1
  51. package/dist/agent-src/rules/icon-consistency.md +2 -0
  52. package/dist/agent-src/rules/image-likeness-and-rights.md +2 -0
  53. package/dist/agent-src/rules/improve-before-implement.md +2 -0
  54. package/dist/agent-src/rules/invite-challenge.md +2 -0
  55. package/dist/agent-src/rules/laravel-routing.md +2 -0
  56. package/dist/agent-src/rules/laravel-translations.md +2 -0
  57. package/dist/agent-src/rules/legal-safety-floor.md +3 -1
  58. package/dist/agent-src/rules/lethal-trifecta-guard.md +2 -0
  59. package/dist/agent-src/rules/linked-projects-onboarding-gate.md +2 -0
  60. package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +2 -0
  61. package/dist/agent-src/rules/markdown-safe-codeblocks.md +2 -0
  62. package/dist/agent-src/rules/media-governance-routing.md +2 -0
  63. package/dist/agent-src/rules/media-sync-ground-truth.md +2 -0
  64. package/dist/agent-src/rules/minimal-safe-diff.md +2 -0
  65. package/dist/agent-src/rules/missing-tool-handling.md +2 -0
  66. package/dist/agent-src/rules/model-recommendation.md +2 -0
  67. package/dist/agent-src/rules/no-attribution-footers.md +2 -0
  68. package/dist/agent-src/rules/no-decorative-emojis-in-git-surfaces.md +2 -0
  69. package/dist/agent-src/rules/no-pr-progress-comments.md +5 -1
  70. package/dist/agent-src/rules/no-roadmap-references.md +2 -0
  71. package/dist/agent-src/rules/notes-first-reasoning.md +2 -0
  72. package/dist/agent-src/rules/onboarding-gate.md +5 -1
  73. package/dist/agent-src/rules/output-discipline.md +2 -0
  74. package/dist/agent-src/rules/package-ci-checks.md +2 -0
  75. package/dist/agent-src/rules/persona-governance.md +2 -0
  76. package/dist/agent-src/rules/php-coding.md +2 -0
  77. package/dist/agent-src/rules/prefer-enums-over-literals.md +2 -0
  78. package/dist/agent-src/rules/preservation-guard.md +2 -0
  79. package/dist/agent-src/rules/provider-lifecycle-discipline.md +2 -0
  80. package/dist/agent-src/rules/question-not-instruction.md +2 -0
  81. package/dist/agent-src/rules/reviewer-awareness.md +2 -0
  82. package/dist/agent-src/rules/roadmap-ci-steps-policy.md +6 -1
  83. package/dist/agent-src/rules/roadmap-progress-sync.md +2 -0
  84. package/dist/agent-src/rules/role-mode-adherence.md +3 -1
  85. package/dist/agent-src/rules/rule-type-governance.md +2 -0
  86. package/dist/agent-src/rules/runtime-safety.md +2 -0
  87. package/dist/agent-src/rules/scale-discipline.md +5 -1
  88. package/dist/agent-src/rules/secret-vcs-guard.md +2 -0
  89. package/dist/agent-src/rules/security-sensitive-stop.md +2 -0
  90. package/dist/agent-src/rules/self-repair-loop.md +103 -0
  91. package/dist/agent-src/rules/senior-engineering-discipline.md +2 -0
  92. package/dist/agent-src/rules/session-canary.md +62 -19
  93. package/dist/agent-src/rules/settings-ask-protocol.md +4 -0
  94. package/dist/agent-src/rules/size-enforcement.md +2 -0
  95. package/dist/agent-src/rules/skill-improvement-trigger.md +2 -0
  96. package/dist/agent-src/rules/skill-quality.md +2 -0
  97. package/dist/agent-src/rules/slash-command-routing-policy.md +2 -0
  98. package/dist/agent-src/rules/source-confidentiality.md +2 -0
  99. package/dist/agent-src/rules/source-discovery-gate.md +2 -0
  100. package/dist/agent-src/rules/source-of-truth.md +2 -0
  101. package/dist/agent-src/rules/spreadsheet-source-quality.md +2 -0
  102. package/dist/agent-src/rules/strategy-safety-floor.md +3 -1
  103. package/dist/agent-src/rules/symfony-routing.md +2 -0
  104. package/dist/agent-src/rules/think-before-action.md +2 -0
  105. package/dist/agent-src/rules/token-budget-discipline.md +5 -1
  106. package/dist/agent-src/rules/token-efficiency.md +2 -0
  107. package/dist/agent-src/rules/token-optimizer-maintenance.md +2 -0
  108. package/dist/agent-src/rules/tool-safety.md +7 -1
  109. package/dist/agent-src/rules/ui-audit-gate.md +4 -0
  110. package/dist/agent-src/rules/untrusted-input-defense.md +2 -0
  111. package/dist/agent-src/rules/upstream-proposal.md +2 -0
  112. package/dist/agent-src/rules/user-interaction.md +2 -0
  113. package/dist/agent-src/rules/user-interrupt-priority.md +2 -0
  114. package/dist/agent-src/skills/adversarial-review/SKILL.md +1 -1
  115. package/dist/agent-src/skills/analysis-autonomous-mode/SKILL.md +1 -1
  116. package/dist/agent-src/skills/performance-analysis/SKILL.md +1 -1
  117. package/dist/agent-src/skills/persona-improvement/SKILL.md +1 -1
  118. package/dist/agent-src/skills/project-analyzer/SKILL.md +1 -1
  119. package/dist/agent-src/skills/security-audit/SKILL.md +1 -1
  120. package/dist/agent-src/skills/sequential-thinking/SKILL.md +1 -1
  121. package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +1 -1
  122. package/dist/agent-src/skills/universal-project-analysis/SKILL.md +1 -1
  123. package/dist/agent-src/templates/AGENTS.md +6 -10
  124. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  125. package/dist/cli/registry.js +9 -0
  126. package/dist/cli/registry.js.map +1 -1
  127. package/dist/cli-delegate/chunk-22GCIJ2O.js +270 -0
  128. package/dist/cli-delegate/{chunk-BSLUHV2F.js → chunk-2BE5I2MN.js} +156 -141
  129. package/dist/cli-delegate/{chunk-AIIUU73N.js → chunk-7OMQCH4V.js} +1 -1
  130. package/dist/cli-delegate/{chunk-HJ6DAJHR.js → chunk-GB2FSUEE.js} +57 -7
  131. package/dist/cli-delegate/{chunk-WR6GTRHJ.js → chunk-JXARCGVN.js} +3 -3
  132. package/dist/cli-delegate/{chunk-SJQMJI7M.js → chunk-PQSAQKHW.js} +467 -305
  133. package/dist/cli-delegate/chunk-REKCMYOU.js +2991 -0
  134. package/dist/cli-delegate/cmd_analyze_session.js +1 -1
  135. package/dist/cli-delegate/cmd_brand_status.js +134 -0
  136. package/dist/cli-delegate/cmd_conformance.js +7 -7
  137. package/dist/cli-delegate/cmd_converge.js +3 -3
  138. package/dist/cli-delegate/cmd_doctor.js +4 -4
  139. package/dist/cli-delegate/cmd_explain.js +80 -330
  140. package/dist/cli-delegate/cmd_export.js +5 -5
  141. package/dist/cli-delegate/cmd_fleet.js +3 -3
  142. package/dist/cli-delegate/cmd_handoff.js +2 -2
  143. package/dist/cli-delegate/cmd_mcp_available.js +433 -0
  144. package/dist/cli-delegate/cmd_migrate.js +3 -3
  145. package/dist/cli-delegate/cmd_packs_active.js +153 -0
  146. package/dist/cli-delegate/cmd_preflight.js +1 -1
  147. package/dist/cli-delegate/cmd_prune.js +5 -5
  148. package/dist/cli-delegate/cmd_route_audit.js +8 -8
  149. package/dist/cli-delegate/cmd_route_explain.js +4 -4
  150. package/dist/cli-delegate/cmd_settings_get.js +272 -0
  151. package/dist/cli-delegate/cmd_settings_migrate.js +5 -5
  152. package/dist/cli-delegate/cmd_settings_set.js +7 -2967
  153. package/dist/cli-delegate/cmd_sync.js +5 -5
  154. package/dist/cli-delegate/cmd_uninstall.js +5 -5
  155. package/dist/cli-delegate/cmd_update.js +4 -4
  156. package/dist/cli-delegate/cmd_upgrade.js +4 -4
  157. package/dist/cli-delegate/cmd_validate.js +5 -5
  158. package/dist/cli-delegate/cmd_versions.js +4 -4
  159. package/dist/discovery/deprecation-report.md +1 -1
  160. package/dist/discovery/discovery-manifest.json +184 -124
  161. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  162. package/dist/discovery/discovery-manifest.summary.md +3 -3
  163. package/dist/discovery/orphan-report.md +1 -1
  164. package/dist/discovery/packs.json +7 -5
  165. package/dist/discovery/trust-report.md +11 -11
  166. package/dist/discovery/workspaces.json +6 -4
  167. package/dist/hooks/dispatch.js +9080 -5701
  168. package/dist/install/install.mjs +698 -508
  169. package/dist/mcp/registry-manifest.json +3 -3
  170. package/dist/mcp/server.json +2 -2
  171. package/dist/mcp/server.mjs +698 -437
  172. package/dist/router.json +1 -1
  173. package/dist/scripts/_lib/agent_settings.js +80 -15
  174. package/dist/scripts/_lib/agent_settings.js.map +1 -1
  175. package/dist/scripts/condense.js +33 -2
  176. package/dist/scripts/condense.js.map +1 -1
  177. package/dist/server/io/yamlIO.js +85 -0
  178. package/dist/server/io/yamlIO.js.map +1 -1
  179. package/dist/server/routes/settings.js +1 -12
  180. package/dist/server/routes/settings.js.map +1 -1
  181. package/dist/server/routes/wizard.js +52 -2
  182. package/dist/server/routes/wizard.js.map +1 -1
  183. package/dist/shared/settingsCarveOut.js +118 -0
  184. package/dist/shared/settingsCarveOut.js.map +1 -0
  185. package/dist/shared/settingsSurface.js +7 -1
  186. package/dist/shared/settingsSurface.js.map +1 -1
  187. package/dist/ui/assets/index-DmR0mbk4.js.map +1 -1
  188. package/docs/contracts/settings-classes.md +29 -8
  189. package/docs/guidelines/agent-infra/memory-access.md +14 -3
  190. package/package.json +1 -1
  191. package/src/agent-src/templates/AGENTS.md +6 -10
  192. package/src/config/budgets.yml +29 -0
  193. package/src/config/evaluator-budgets.json +4 -4
  194. package/src/config/gate-coverage.yml +26 -0
  195. package/src/scripts/_cli/cmd_brand_status.ts +174 -0
  196. package/src/scripts/_cli/cmd_doctor.ts +6 -21
  197. package/src/scripts/_cli/cmd_mcp_available.ts +266 -0
  198. package/src/scripts/_cli/cmd_packs_active.ts +225 -0
  199. package/src/scripts/_cli/cmd_settings_get.ts +324 -0
  200. package/src/scripts/_dispatch.bash +75 -0
  201. package/src/scripts/_lib/agent_settings.ts +82 -16
  202. package/src/scripts/_lib/carrier_divergence.ts +135 -0
  203. package/src/scripts/_lib/git_common_dir.ts +128 -0
  204. package/src/scripts/_lib/host_capability.ts +84 -1
  205. package/src/scripts/_lib/obligation_frequency.ts +391 -0
  206. package/src/scripts/_lib/prompt_shape.ts +88 -0
  207. package/src/scripts/_lib/review_skipped_record.ts +102 -0
  208. package/src/scripts/_lib/rule_layer_overlap.ts +254 -0
  209. package/src/scripts/_lib/self_repair.ts +342 -0
  210. package/src/scripts/_lib/self_repair_store.ts +100 -0
  211. package/src/scripts/_lib/session_register.ts +361 -0
  212. package/src/scripts/_lib/transcript_entry.ts +80 -0
  213. package/src/scripts/check_branch_freshness.ts +255 -0
  214. package/src/scripts/check_council_config_location.ts +125 -1
  215. package/src/scripts/check_enforcement_coverage.ts +192 -7
  216. package/src/scripts/check_rule_projection_integrity.ts +364 -0
  217. package/src/scripts/check_standing_rule_delivery.ts +314 -0
  218. package/src/scripts/condense.ts +36 -2
  219. package/src/scripts/config/profiles.ts +13 -3
  220. package/src/scripts/conformance_scan.ts +307 -24
  221. package/src/scripts/council_availability_hook.ts +188 -0
  222. package/src/scripts/council_cli.ts +126 -7
  223. package/src/scripts/generate_settings_reference.ts +232 -0
  224. package/src/scripts/hook_manifest.yaml +155 -33
  225. package/src/scripts/hooks/block_no_verify.ts +95 -3
  226. package/src/scripts/hooks/block_unauthorized_git.ts +217 -2
  227. package/src/scripts/hooks/concern_registry.ts +12 -0
  228. package/src/scripts/hooks/delegation_nudge_hook.ts +450 -0
  229. package/src/scripts/hooks/end_review_nudge_hook.ts +726 -0
  230. package/src/scripts/hooks/orchestration_record_hook.ts +342 -0
  231. package/src/scripts/install.ts +151 -0
  232. package/src/scripts/language_mirror_hook.ts +49 -6
  233. package/src/scripts/measure_scope_dedup.ts +19 -13
  234. package/src/scripts/onboarding_gate_hook.ts +40 -1
  235. package/src/scripts/orchestration_backfill.ts +354 -0
  236. package/src/scripts/orchestration_record.ts +4 -1
  237. package/src/scripts/preamble_byte_census.ts +9 -20
  238. package/src/scripts/release.ts +142 -36
  239. package/src/scripts/report_carrier_divergence.ts +364 -0
  240. package/src/scripts/report_skill_activation.ts +257 -0
  241. package/src/scripts/report_skill_obligation_violations.ts +579 -0
  242. package/src/scripts/routing_doctor.ts +77 -6
  243. package/src/scripts/schemas/rule.schema.json +5 -0
  244. package/src/scripts/self_repair_cli.ts +240 -0
  245. package/src/scripts/self_repair_hook.ts +241 -0
  246. package/src/scripts/session_canary_hook.ts +35 -3
  247. package/src/scripts/session_register_hook.ts +288 -0
  248. package/src/scripts/sessions_cli.ts +140 -0
  249. package/src/scripts/validate_frontmatter.ts +68 -0
  250. package/src/server/io/yamlIO.ts +87 -0
  251. package/src/shared/settingsCarveOut.ts +143 -0
  252. package/src/shared/settingsSurface.ts +7 -1
@@ -42,17 +42,47 @@ git fetch origin --prune
42
42
  git ls-tree --name-only origin/main agents/roadmaps/ # still active?
43
43
  git ls-tree --name-only origin/main agents/roadmaps/archive/ # already closed?
44
44
  gh pr list --state open --json number,title,headRefName # in flight?
45
+ agent-config sessions:list --json # claimed right now?
45
46
  ```
46
47
 
47
48
  Excluded from the candidate set: `template.md`, `archive/`,
48
49
  `skipped/`, `later/`, anything with `status: draft` whose promotion
49
- trigger has not fired, and any roadmap whose slug matches an **open
50
- PR's** branch — that one is taken.
50
+ trigger has not fired, and:
51
+
52
+ | Exclusion | Source | What it means | Recovery |
53
+ |---|---|---|---|
54
+ | **taken by an open PR** | `gh pr list` — a roadmap slug matching an open PR's branch | The work is done or nearly done and is waiting on review | Review or merge that PR; the roadmap archives inside it |
55
+ | **claimed by a live session** | `sessions:list` — a live record whose `roadmap_slug` matches | Another session is working on it *right now*, before any PR exists | Nothing to do — it releases on that session's end, or by TTL |
56
+
57
+ Keep the two distinguishable in the reported screen. They are different
58
+ states with different recovery, and collapsing them into "unavailable"
59
+ loses the only information that tells the user whether to wait for a
60
+ review or simply pick something else.
51
61
 
52
62
  A roadmap completes by an archive move **inside its merging PR**, so a
53
63
  local checkout can show a closed roadmap as open. That is why this step
54
64
  precedes the screen instead of following it.
55
65
 
66
+ The session read closes a window the PR check cannot. Measured over the 14
67
+ most recent merged feature PRs, the gap between a branch's first commit and
68
+ its PR is a median of **18.5 minutes** and a maximum of **67** — and that is a
69
+ *lower bound*, since the clock starts at roadmap selection, strictly earlier
70
+ than the first commit. For that whole interval the PR check reports the
71
+ roadmap as free. Measurement:
72
+ `agents/evidence/analysis/parallel-session-register-phase1.md`.
73
+
74
+ ```
75
+ THE REGISTER *WRITE* IS HOOK-CARRIED AND DETERMINISTIC.
76
+ THIS *READ* IS NOT. THE TWO MUST NOT LOOK ALIKE.
77
+ ```
78
+
79
+ This screen runs because the model read this instruction — there is no gate
80
+ that fires it, and none that notices when it is skipped. It is a
81
+ model-carried obligation in exactly the shape the `enforced_by: none` rules
82
+ declare, and it is stated here rather than left as prose that reads like a
83
+ guarantee. What IS deterministic: the heartbeat that writes the register, the
84
+ TTL expiry, and `sessions:list` itself once invoked.
85
+
56
86
  ### 2. Screen the survivors — five disqualifiers
57
87
 
58
88
  For each candidate read its frontmatter, its open-step count, and every
@@ -108,6 +138,31 @@ GOODHART MOVE THIS PACKAGE'S OWN DISCIPLINE FORBIDS.
108
138
  [`/roadmap:create`](create.md) or a blocker the user can clear. Do
109
139
  not manufacture a pick.
110
140
 
141
+ ### 3b. Claim the pick, so the next session's screen sees it
142
+
143
+ ```bash
144
+ agent-config sessions:claim <roadmap-slug>
145
+ ```
146
+
147
+ Immediately after the pick, before any branch or commit. This writes the slug
148
+ into `agents/runtime/state/roadmap-claim.json`; the next heartbeat lifts it into
149
+ this session's register record, so another session's step 1 excludes it **within
150
+ one turn** and long before a PR exists.
151
+
152
+ Routing the claim through a state file rather than having this command write the
153
+ register directly is deliberate: the roadmap is picked mid-session by the model,
154
+ a hook is a script and cannot know what was picked, and this way the model never
155
+ needs to know the register's path or format. The cost is that the claim lands at
156
+ most one turn late.
157
+
158
+ Same honesty boundary as the screen above: **this write is model-carried.** The
159
+ verb is deterministic once invoked, and nothing forces the invocation. A skipped
160
+ claim degrades to today's behaviour — the PR check still catches the roadmap once
161
+ a PR exists — so the failure mode is a re-opened window, not a wrong result.
162
+
163
+ `agent-config sessions:claim --release` drops the claim if the run is abandoned
164
+ before the session ends; otherwise `session_end` clears the whole record.
165
+
111
166
  ### 4. Workspace — branch by default, worktree on request
112
167
 
113
168
  Default: a feature branch in the current checkout, named
@@ -176,7 +231,13 @@ AT THE MOMENT OF THE CLAIM IS AN UNVERIFIED CLAIM.
176
231
  - **One roadmap per invocation.** Never chain a second pick after the
177
232
  first closes — the user re-invokes.
178
233
  - **The screen is reported, not just used.** State which candidates were
179
- disqualified and on what, so the pick is auditable.
234
+ disqualified and on what, so the pick is auditable — and keep
235
+ "taken by open PR" and "claimed by a live session" distinguishable.
236
+ - **A live foreign claim is not a merge conflict to resolve.** It excludes the
237
+ roadmap from *this* pick and nothing more. Never override it, and never treat
238
+ the register as a lock: it is advisory, two sessions can claim in the same
239
+ millisecond, and an idle session disappears from it although its user returns
240
+ ([`parallel-sessions`](../../../../docs/guides/parallel-sessions.md)).
180
241
  - **A judgement-call blocker goes to the council, not to the user.**
181
242
  A human-ACTION blocker goes to neither — it disqualifies.
182
243
  - **No merge, ever.** The PR is opened for review; merging is
@@ -192,3 +253,4 @@ AT THE MOMENT OF THE CLAIM IS AN UNVERIFIED CLAIM.
192
253
  - [`/worktree:create`](../../worktree/create.md) — the `--worktree` path
193
254
  - [`/create-pr`](../../git/pr/create.md) — delivery + the CI wait contract
194
255
  - [`roadmap-process-loop`](../../contexts/execution/roadmap-process-loop.md) — canonical mechanics
256
+ - [`parallel-sessions`](../../../../docs/guides/parallel-sessions.md) — what the session register does, its TTLs, and the two limits it does not hide
@@ -150,9 +150,16 @@ conformant audit-log-v1 line from the counts you already have:
150
150
  [--first-pass-success true|false] [--escalated true|false]
151
151
  ```
152
152
 
153
- A capture **hook** is the wrong tool here: the PostToolUse payload carries no
154
- subagent token usage — only the orchestrator sees it (via the run result) — and
155
- a hook would reverse the 2026-06-30 no-hook decision. Reader:
153
+ A capture **hook** is now the primary path where the host has a
154
+ `post_tool_use` slot: the 2026-08-07 transcript backfill measured that
155
+ SYNCHRONOUS dispatch results DO carry `resolvedModel` / `totalTokens` /
156
+ `usage` — the 2026-06-30 "payload carries no usage" premise held only for
157
+ async dispatches, which stay metrics-absent. The `orchestration-record`
158
+ concern (`src/scripts/hooks/orchestration_record_hook.ts`, registered in
159
+ `hook_manifest.yaml`) emits the line deterministically on every Agent/Task
160
+ completion; measured model-carried capture before it existed was 1 of 370
161
+ dispatches (0.27 %). The CLI above stays for hosts without the slot and for
162
+ orchestrator-side records the hook cannot see. Reader:
156
163
  `src/scripts/orchestration_savings_report.ts`.
157
164
 
158
165
  **`token_delta` sourcing priority:**
@@ -18,6 +18,8 @@ workspaces: [engineering]
18
18
  packs: [engineering-base]
19
19
  collision_ok:
20
20
  "refactor": "an explicit clean-up/refactor ask is the remediation ladder's own trigger"
21
+ # obligation: line 51
22
+ obligation_frequency: "per-edit"
21
23
  ---
22
24
 
23
25
  # Active Remediation
@@ -10,6 +10,8 @@ routes_to:
10
10
  - "skill:analysis-skill-router"
11
11
  workspaces: [agent-config-maintainer, engineering]
12
12
  packs: [meta]
13
+ # obligation: line 19
14
+ obligation_frequency: "none"
13
15
  ---
14
16
 
15
17
  # Analysis Skill Routing
@@ -13,6 +13,8 @@ workspaces: [agent-config-maintainer, engineering]
13
13
  packs: [meta]
14
14
  collision_ok:
15
15
  "controller": "thin-handler floor on controller work"
16
+ # obligation: line 26
17
+ obligation_frequency: "per-edit"
16
18
  ---
17
19
 
18
20
  # Architecture Rules
@@ -14,6 +14,8 @@ routes_to:
14
14
  - "guideline:agent-infra/artifact-drafting-protocol-mechanics"
15
15
  workspaces: [agent-config-maintainer, engineering]
16
16
  packs: [meta]
17
+ # obligation: line 41
18
+ obligation_frequency: "per-task"
17
19
  ---
18
20
 
19
21
  # Artifact Drafting Protocol
@@ -13,6 +13,8 @@ load_context:
13
13
  - "../contexts/contracts/artifact-engagement-flow.md"
14
14
  workspaces: [agent-config-maintainer, engineering]
15
15
  packs: [meta]
16
+ # obligation: line 22
17
+ obligation_frequency: "per-task"
16
18
  ---
17
19
 
18
20
  <!-- cloud_safe: noop -->
@@ -21,7 +23,10 @@ packs: [meta]
21
23
 
22
24
  **Iron Law.** After a `/implement-ticket` or `/work` phase-step, emit one
23
25
  `telemetry:record` call with consulted + applied ids when telemetry is
24
- enabled. Default-off; opt-in via `.agent-settings.yml`. Zero overhead when
26
+ enabled. Default-off; opt-in via `.agent-settings.yml` — which is the **project
27
+ layer of a cascade that starts user-global**, so never read a value or its
28
+ absence from that file alone; `agent-config settings:get <key>` reports the
29
+ value and the file it actually came from. Zero overhead when
25
30
  disabled. Recording contract + privacy floor:
26
31
  [`contexts/contracts/artifact-engagement-flow.md`](../contexts/contracts/artifact-engagement-flow.md).
27
32
 
@@ -19,6 +19,8 @@ workspaces: [agent-config-maintainer]
19
19
  packs: [meta]
20
20
  collision_ok:
21
21
  ".augment/": "portability + sync floors for the .augment tree"
22
+ # obligation: line 28
23
+ obligation_frequency: "per-edit"
22
24
  ---
23
25
 
24
26
  # Augment Edit Discipline
@@ -13,6 +13,8 @@ triggers:
13
13
  self_contained: true
14
14
  workspaces: [agent-config-maintainer, construction, engineering, finance, founder, gtm, legal-review-prep, ops, product, small-business]
15
15
  packs: [meta]
16
+ # obligation: line 4
17
+ obligation_frequency: "per-turn"
16
18
  ---
17
19
 
18
20
  # Autonomous Execution
@@ -65,7 +67,7 @@ ALLOWLIST > 20 ENTRIES IN ONE SESSION = THE LINTER IS WRONG.
65
67
  STOP. PROPOSE LINTER REDESIGN OR REMOVAL. DO NOT EXPAND THE ALLOWLIST FURTHER.
66
68
  ```
67
69
 
68
- Crossing 20 entries counts as the 3rd validation-target failure — fix the tool shape, not the list. Enforced at tool-call time by the `block-config-weakening` PreToolUse guard (`src/scripts/hooks/block_config_weakening.ts`): it counts allowlist entries added per session, warns from 5, and blocks past 20. Baselines and budget thresholds warn only — a rising count there may be a legitimate ratchet reset, which the edit alone cannot distinguish. Verify with the narrowest tool that proves the target green (a single `curl` / Playwright spec for HTTP/UI, the test runner with a `--filter`, an `xdebug` step-through) — never a meta-pipeline as per-iteration probe. Failed-attempt detail, suppression-sweep equivalents, probe-efficiency detail, and adaptive effort & stop (RDP): [`autonomy-mechanics § Validation-loop budget`](../contexts/execution/autonomy-mechanics.md).
70
+ Crossing 20 entries counts as the 3rd validation-target failure — fix the tool shape, not the list. Enforced at tool-call time by the `block-config-weakening` PreToolUse guard (`src/scripts/hooks/block_config_weakening.ts`) **on the three hosts that have a `pre_tool_use` slot at all** — augment, claude, cowork: it counts allowlist entries added per session, warns from 5, and blocks past 20. On cursor, cline, windsurf, gemini and copilot the guard has nowhere to bind, so there the cap is model-carried and "enforced at tool-call time" is not a claim this rule can make. Run `agent-config hooks:status` to see which slots are bound on the host you are actually on — the sibling rules `git-history-discipline` and `evaluator-independence` qualify the identical slot, and an unqualified claim here would read as a guarantee the manifest does not give. Baselines and budget thresholds warn only — a rising count there may be a legitimate ratchet reset, which the edit alone cannot distinguish. Verify with the narrowest tool that proves the target green (a single `curl` / Playwright spec for HTTP/UI, the test runner with a `--filter`, an `xdebug` step-through) — never a meta-pipeline as per-iteration probe. Failed-attempt detail, suppression-sweep equivalents, probe-efficiency detail, and adaptive effort & stop (RDP): [`autonomy-mechanics § Validation-loop budget`](../contexts/execution/autonomy-mechanics.md).
69
71
 
70
72
  Body migrated to `contexts/execution/autonomy-mechanics.md` (per P4 of `road-to-kernel-and-router.md`) — opt-in detection summary, task-scope shapes table, N=3 mechanics, allowlist-antipattern detail, probe efficiency, adaptive effort (RDP).
71
73
  Trigger-set above activates this routing on demand, independent of the discipline profile (ADR-110).
@@ -10,6 +10,8 @@ applies_to_user_types:
10
10
  self_contained: true
11
11
  workspaces: [engineering]
12
12
  packs: [brand]
13
+ # obligation: line 20
14
+ obligation_frequency: "none"
13
15
  ---
14
16
 
15
17
  # Brand Consistency
@@ -20,6 +20,8 @@ applies_to_user_types:
20
20
  self_contained: true
21
21
  workspaces: [engineering]
22
22
  packs: [brand]
23
+ # obligation: line 51
24
+ obligation_frequency: "per-edit"
23
25
  ---
24
26
 
25
27
  # Brand Source of Truth
@@ -27,7 +29,7 @@ packs: [brand]
27
29
  A precedence rule plus its validation gate (merged from the former
28
30
  `brand-consistency` rule, 2026-08-04 — the pair shared triggers and one
29
31
  subject). When a consumer already has a brand — registered tokens
30
- (`.tokens.json`), a voice profile, a brand guide — that brand is authoritative
32
+ (`tokens.json`), a voice profile, a brand guide — that brand is authoritative
31
33
  for the run. The curated `brand` corpus (archetypes, colour psychology, type
32
34
  principles) is a **gap-filler**, never an override.
33
35
 
@@ -53,10 +55,32 @@ OR A VOICE RULE. A VALUE THAT TRACES TO NEITHER IS OFF-BRAND.
53
55
  NEVER SHIP AN ASSET THE ACTIVE BRAND CANNOT ACCOUNT FOR.
54
56
  ```
55
57
 
58
+ ## Where the brand actually lives — and how to check
59
+
60
+ ```
61
+ NEVER INFER BRAND PRESENCE FROM A FILENAME. RUN `agent-config brand:status`.
62
+ THE FILE IS `tokens.json`, NEVER `.tokens.json` — A DOT-PREFIXED FILE IS READ BY NOTHING.
63
+ ```
64
+
65
+ The resolver searches exactly four paths under the project root, in this order,
66
+ first hit wins (`BRAND_TOKEN_PATHS`, the UI scaffold directive):
67
+
68
+ 1. `tokens.json`
69
+ 2. `assets/tokens.json`
70
+ 3. `resources/tokens.json`
71
+ 4. `agents/settings/brand/tokens.json` <!-- ref-ignore -->
72
+
73
+ `agent-config brand:status` reports which one holds a file, or that none does —
74
+ and separately flags a dot-prefixed `.tokens.json`, which is the file a reader
75
+ of this rule's earlier wording would plausibly have created and which nothing
76
+ reads. Absent is a real answer: it means the greenfield branch below, not a
77
+ misconfiguration.
78
+
56
79
  ## Precedence order
57
80
 
58
- 1. **Consumer brand profile** — registered `.tokens.json`, voice profile, brand
59
- guide, or a confirmed `brand-strategy` / `brand-identity` constraint set.
81
+ 1. **Consumer brand profile** — a registered `tokens.json` at one of the four
82
+ paths above, a voice profile, a brand guide, or a confirmed `brand-strategy`
83
+ / `brand-identity` constraint set.
60
84
  2. **This run's confirmed decisions** — selections the human signed off this session.
61
85
  3. **The brand corpus** — archetype / colour / type / messaging defaults, used
62
86
  only where 1 and 2 are silent, and always surfaced as corpus-sourced.
@@ -64,7 +88,7 @@ NEVER SHIP AN ASSET THE ACTIVE BRAND CANNOT ACCOUNT FOR.
64
88
  ## What the gate covers
65
89
 
66
90
  - **Colour / type / spacing** in generated UI or assets that is not one of the
67
- active brand tokens (from `state.ui_design` or the consumer's `.tokens.json`).
91
+ active brand tokens (from `state.ui_design` or the consumer's `tokens.json`).
68
92
  A raw hex / font / px value with no token behind it is off-brand.
69
93
  - **Copy and microcopy** whose register contradicts the active voice profile
70
94
  (e.g. playful copy under an authoritative `Ruler` voice).
@@ -77,7 +101,7 @@ NEVER SHIP AN ASSET THE ACTIVE BRAND CANNOT ACCOUNT FOR.
77
101
  - **Precedence half:** any brand decision while a consumer brand profile is
78
102
  present — to keep the corpus from quietly replacing a value the brand already
79
103
  defines.
80
- - **Gate half:** a brand layer is active for the run (a `.tokens.json` /
104
+ - **Gate half:** a brand layer is active for the run (a `tokens.json` /
81
105
  `state.ui_design` brand profile or a confirmed `brand-strategy` /
82
106
  `brand-identity` constraint set) AND a UI / copy / asset is being emitted or
83
107
  reviewed.
@@ -112,6 +136,11 @@ for the full Brand-mode vs Product-mode discriminator.
112
136
  - [`brand-consistency`](brand-consistency.md) — pointer stub; its body lives here since the 2026-08-04 merge.
113
137
  - [`brand`](../skills/brand/SKILL.md) — the gap-fill corpus this rule subordinates to consumer brand.
114
138
  - [`brand-identity`](../skills/brand-identity/SKILL.md) — defines the tokens the gate validates against.
115
- - [`brand-to-tokens`](../skills/brand-to-tokens/SKILL.md) — emits the DTCG `.tokens.json` source of truth.
139
+ - [`brand-to-tokens`](../skills/brand-to-tokens/SKILL.md) — emits the DTCG token
140
+ source of truth. **Known contradiction, recorded not resolved:** that skill's
141
+ prose says to author `.tokens.json` while the only resolver in the tree reads
142
+ `tokens.json`, so a consumer following it literally produces a file nothing
143
+ loads. The authoring name is a consumer-visible decision and is not changed
144
+ here; `brand:status` surfaces the mismatch at the moment it matters.
116
145
  - [`design-intelligence`](../skills/design-intelligence/SKILL.md) — the "audit findings outrank corpus" precedent the gate mirrors.
117
146
  - [`docs/guidelines/design-modes.md`](../docs/guidelines/design-modes.md) — brand vs product register discriminator and routing.
@@ -23,6 +23,8 @@ collision_ok:
23
23
  "controller": "controllers return user data — the ownership/tenant check floor"
24
24
  "endpoint": "every data-returning endpoint needs the three negative tests"
25
25
  "tenant": "cross-tenant isolation is this rule's core subject"
26
+ # obligation: line 55
27
+ obligation_frequency: "per-edit"
26
28
  ---
27
29
 
28
30
  # Broken Access Control
@@ -35,6 +35,8 @@ collision_ok:
35
35
  "composer": "composer output is verbose — rtk wrap applies"
36
36
  "docker": "docker output is verbose — rtk wrap applies"
37
37
  "rector": "rector output is verbose — rtk wrap applies"
38
+ # obligation: line 42
39
+ obligation_frequency: "per-edit"
38
40
  ---
39
41
 
40
42
  # Cli Output Handling
@@ -20,6 +20,8 @@ packs: [engineering-base]
20
20
  collision_ok:
21
21
  "refactor": "refactors churn comments — the keep/drop discipline applies"
22
22
  "implement": "fresh implementation is where over-commenting lands"
23
+ # obligation: line 5
24
+ obligation_frequency: "per-edit"
23
25
  ---
24
26
 
25
27
  # Code Comment Discipline
@@ -21,6 +21,8 @@ packs: [engineering-base]
21
21
  roles: [developer, reviewer, tester, po, incident, planner]
22
22
  enforced_by:
23
23
  - "none"
24
+ # obligation: line 38
25
+ obligation_frequency: "per-edit"
24
26
  ---
25
27
 
26
28
  # Code Provenance
@@ -11,6 +11,8 @@ load_context:
11
11
  - "../contexts/contracts/command-suggestion-flow.md"
12
12
  workspaces: [agent-config-maintainer, construction, engineering, finance, founder, gtm, legal-review-prep, ops, product, small-business]
13
13
  packs: [meta]
14
+ # obligation: line 18
15
+ obligation_frequency: "per-turn"
14
16
  ---
15
17
 
16
18
  # Command Suggestion Policy
@@ -12,6 +12,8 @@ workspaces: [engineering]
12
12
  packs: [engineering-base]
13
13
  collision_ok:
14
14
  "commit": "format floor for every commit message"
15
+ # obligation: line 19
16
+ obligation_frequency: "per-commit"
15
17
  ---
16
18
 
17
19
  # Commit Conventions
@@ -8,6 +8,8 @@ workspaces: [agent-config-maintainer, construction, engineering, finance, founde
8
8
  packs: [meta]
9
9
  triggers:
10
10
  - phrase: "reporting progress"
11
+ # obligation: line 20
12
+ obligation_frequency: "per-turn"
11
13
  ---
12
14
 
13
15
  # Communication Through-Line
@@ -9,6 +9,8 @@ triggers:
9
9
  self_contained: true
10
10
  workspaces: [agent-config-maintainer, construction, engineering, finance, founder, gtm, legal-review-prep, ops, product, small-business]
11
11
  packs: [meta]
12
+ # obligation: line 19
13
+ obligation_frequency: "per-event"
12
14
  ---
13
15
 
14
16
  # Content Quoting Floor
@@ -12,15 +12,27 @@ workspaces: [agent-config-maintainer, construction, engineering, finance, founde
12
12
  packs: [meta]
13
13
  enforced_by:
14
14
  - "hook:context-hygiene"
15
+ # obligation: line 67
16
+ obligation_frequency: "per-turn"
15
17
  ---
16
18
 
17
19
  # Context Hygiene
18
20
 
19
21
  > **Enforced by:** [`scripts/context_hygiene_hook.ts`](../../scripts/context_hygiene_hook.ts)
20
- > on Augment + Claude Code (`PostToolUse`). The hook maintains
22
+ > on Augment + Claude Code (`PostToolUse`). Run `agent-config hooks:status` to
23
+ > see whether that slot is actually bound on the host you are on — this line is
24
+ > a statement about the manifest, not about your install. The hook maintains
21
25
  > `agents/state/context-hygiene.json` (tool-call count, loop signal,
22
26
  > freshness milestones at 20/40/60); the prose below is the spec the
23
27
  > hook implements and the agent-side fallback.
28
+ >
29
+ > **What the slot cannot reach.** The carrier fires per *tool call*; the
30
+ > read-loop law below is per *turn*. A turn that makes no tool call fires it
31
+ > zero times — and a reply with no tool call is exactly the shape the read-loop
32
+ > counter is trying to notice. So the counters are hook-carried and the
33
+ > every-turn obligation is model-carried, on every host. Named here because the
34
+ > frequency join in `check_enforcement_coverage.ts` reports it, and a rule whose
35
+ > header says "enforced by" without that sentence reads as a guarantee it is not.
24
36
 
25
37
  ## Conversation Freshness
26
38
 
@@ -10,6 +10,8 @@ routes_to:
10
10
  - "skill:copilot-config"
11
11
  workspaces: [agent-config-maintainer, engineering]
12
12
  packs: [meta]
13
+ # obligation: line 19
14
+ obligation_frequency: "none"
13
15
  ---
14
16
 
15
17
  # Copilot Routing
@@ -0,0 +1,93 @@
1
+ ---
2
+ type: "auto"
3
+ tier: "2a"
4
+ description: "Council availability is decided by the CLI resolver, never by the project tree — .agent-settings.yml is not the council config"
5
+ triggers:
6
+ - keyword: "council"
7
+ - keyword: "ai council"
8
+ - keyword: "ai-council"
9
+ - keyword: "council:status"
10
+ - keyword: "second opinion"
11
+ - phrase: "cross-check with another model"
12
+ self_contained: true
13
+ workspaces: [agent-config-maintainer, construction, engineering, finance, founder, gtm, legal-review-prep, ops, product, small-business]
14
+ packs: [meta]
15
+ enforced_by:
16
+ - "none"
17
+ # obligation: line 27
18
+ obligation_frequency: "per-task"
19
+ ---
20
+
21
+ # Council Availability Is CLI-Decided
22
+
23
+ The council config is user-global (ADR-104): configured once per developer, live
24
+ in every project, worktree and CWD — including consumer repos carrying none of
25
+ this package's internals. Nothing in the project tree switches it on or off.
26
+
27
+ ## The Iron Law
28
+
29
+ ```
30
+ COUNCIL AVAILABILITY IS DECIDED BY THE CLI RESOLVER — NEVER BY THE PROJECT TREE.
31
+ RUN THE FREE `council:status` PROBE BEFORE CLAIMING THE COUNCIL IS UNAVAILABLE.
32
+ NEVER INFER "NOT CONFIGURED" FROM A MISSING `.agent-settings.yml`, A MISSING
33
+ `scripts/ai_council`, OR A MISSING PROJECT-LOCAL COUNCIL FILE — NONE OF THEM
34
+ CARRY COUNCIL ENABLEMENT.
35
+ NEVER COPY THE USER-GLOBAL CONFIG INTO THE PROJECT TREE TO "MAKE IT WORK".
36
+ NEVER PRESENT A SUBAGENT FAN-OUT AS A COUNCIL.
37
+ ```
38
+
39
+ ## The probe
40
+
41
+ ```bash
42
+ agent-config council:status # no API call, no spend, any directory
43
+ ```
44
+
45
+ Prints `CONFIGURED` / `NOT CONFIGURED`, the resolved path, the layer that
46
+ resolved it, and the member count. In this package's own checkout:
47
+ `./scripts-run src/scripts/council_cli status`.
48
+
49
+ ## What says nothing about availability
50
+
51
+ A missing `.agent-settings.yml` (it never carried enablement — the block was
52
+ removed in ADR-093), a missing `scripts/ai_council/` (package-internal, absent
53
+ from every consumer), a missing project-local council file (the resolver ignores
54
+ `project_root` entirely), and invisible API keys (they live under
55
+ `~/.event4u/agent-config/`). The one real location is
56
+ `~/.event4u/agent-config/settings/.ai-council.yml`; the only escape is
57
+ `$AI_COUNCIL_CONFIG`, an explicit absolute path — still not a project search.
58
+
59
+ ## Why this rule exists
60
+
61
+ The council switch is **not** in `.agent-settings.yml`, though roughly twenty
62
+ rules train the reflex of reading that file to learn whether a feature is on.
63
+ The exception lived only in [`ai-council`](../skills/ai-council/SKILL.md),
64
+ a skill body that reaches context only on activation, so five consumer sessions
65
+ inspected the tree, announced "council not configured", and substituted a
66
+ subagent fan-out while two members were configured the whole time. One copied
67
+ the user-global config into the repo to "make it work".
68
+
69
+ ## If the probe really says unavailable
70
+
71
+ State the resolver's own message and stop. A subagent fan-out is a legitimate
72
+ substitute **only when named as such** — never as "the council". Same honesty
73
+ boundary as [`evaluator-independence`](evaluator-independence.md).
74
+
75
+ ## When NOT to fire
76
+
77
+ Availability is already settled this session, or the question is about council
78
+ *content* (findings, synthesis) rather than availability.
79
+
80
+ ## Enforcement
81
+
82
+ `enforced_by: none` — no gate reads a chat claim. Deterministic instead:
83
+ `check_council_config_location` fails the build when a council surface ties the
84
+ config to `.agent-settings.yml`, which never carried it, or to a project-tree
85
+ path, and its §4 fails when no always-loaded rule carries this fact at all.
86
+
87
+ ## See also
88
+
89
+ - [`ai-council`](../skills/ai-council/SKILL.md) — the full invocation procedure.
90
+ - [`direct-answers`](direct-answers.md) Iron Law 2 — a live-state fact is never
91
+ asserted from inspection when an authoritative resolver exists.
92
+ - [`self-repair-loop`](self-repair-loop.md) — catches the claim when it is made
93
+ anyway.
@@ -26,6 +26,8 @@ packs: [engineering-base, product-basic]
26
26
  collision_ok:
27
27
  "mockup": "a mockup is a second source — discrepancy check against the ticket text"
28
28
  "screenshot": "a screenshot is a second source — discrepancy check"
29
+ # obligation: line 71
30
+ obligation_frequency: "per-task"
29
31
  ---
30
32
 
31
33
  # Cross-Source Consistency
@@ -59,6 +61,9 @@ OBVIOUS-TO-THE-AGENT ≠ IN-SCOPE.
59
61
  a ticket/spec that carries a second source (an attachment, a code reality, or an
60
62
  internal contradiction), gated by `consistency.cross_source` in
61
63
  `.agent-settings.yml` (`on` default · `auto` = high-confidence only · `off` = inert).
64
+ That file is the project layer of a cascade that starts user-global — never read
65
+ the setting or its absence from it alone; `agent-config settings:get
66
+ consistency.cross_source` reports the value and the file it came from.
62
67
 
63
68
  **Does NOT fire** on a single clear source with no second source to compare
64
69
  against (that is plain vagueness — it belongs to `ask-when-uncertain`), on
@@ -16,6 +16,8 @@ workspaces: [agent-config-maintainer, engineering]
16
16
  packs: [meta]
17
17
  collision_ok:
18
18
  "honest null": "this rule asks whether a recorded null may be REVISITED; evaluator-independence asks how one was PRODUCED — different decision points on the same artefact"
19
+ # obligation: line 31
20
+ obligation_frequency: "per-task"
19
21
  ---
20
22
 
21
23
  # Decision Revisit Gate
@@ -20,6 +20,8 @@ routes_to:
20
20
  - "skill:subagent-orchestration"
21
21
  workspaces: [engineering]
22
22
  packs: [engineering-base]
23
+ # obligation: line 35
24
+ obligation_frequency: "per-task"
23
25
  ---
24
26
 
25
27
  # Delegation Policy
@@ -75,11 +77,35 @@ primitive → run in-session (clean no-op).
75
77
  ordered slice never dispatches before its declared parent's return is
76
78
  verified. Both per
77
79
  [`subagent-steering`](../contexts/execution/subagent-steering.md).
78
- 6. **Record** telemetry after each dispatch — run `orchestration_record`
79
- (one validated line: spawn_count, token_delta + provenance, tier, task_class)
80
- per [`orchestration-telemetry`](../contexts/execution/orchestration-telemetry.md)
81
- § Emit. This is the agent-behavioral capture the savings report reads;
82
- skipping it leaves the value-of-orchestration question unmeasured.
80
+ 6. **Record** telemetry after each dispatch — on hook-capable hosts the
81
+ `orchestration-record` concern (`post_tool_use`) emits the line
82
+ deterministically for every Agent/Task completion; on hosts without the
83
+ slot, run `orchestration_record` yourself (one validated line: spawn_count,
84
+ token_delta + provenance, tier, task_class) per
85
+ [`orchestration-telemetry`](../contexts/execution/orchestration-telemetry.md)
86
+ § Emit. Measured before the hook existed: 1 of 370 dispatches captured —
87
+ the model-carried path alone leaves the value question unmeasured.
88
+
89
+ ## Carriers — how this rule reaches a session (and what stays model-carried)
90
+
91
+ No host runs the tier-2 rule router, so this file's triggers alone never load
92
+ it. The obligation travels on three carriers instead: the always-loaded
93
+ AGENTS.md line (delegate-by-default + end-review), the `delegation-nudge`
94
+ concern on `user_prompt_submit` (runs `classifyTask` on cheap prompt signals
95
+ and injects a one-line verdict ONLY when the classifier says
96
+ `do-in-parallel`/`do-in-steps` — silence otherwise; delivery on
97
+ `user_prompt_submit` is end-to-end verified), and the `end-review-nudge`
98
+ concern on `stop` (ONE `review_skipped` telemetry line per mutating
99
+ no-review session — verified; its advisory line reaches the dispatcher
100
+ output, but host-side forwarding of stop-slot context to the model is
101
+ unverified, so the model-facing end-review carrier is the AGENTS.md line
102
+ plus this telemetry). The
103
+ capability gate itself resolves from the committed host registry in
104
+ `src/scripts/_lib/host_capability.ts` (settings override wins). What stays
105
+ model-carried, honestly: the decomposition itself, the per-return
106
+ verification, and every dispatch on hosts without hook slots. The nudges are
107
+ advisory by design — whether they change behaviour is measured by the
108
+ telemetry, not assumed.
83
109
 
84
110
  ## Scope — does NOT
85
111
 
@@ -36,6 +36,8 @@ workspaces: [engineering]
36
36
  packs: [engineering-base, frontend-design]
37
37
  collision_ok:
38
38
  "mockup": "a provided mockup is the spec — 1:1 fidelity floor"
39
+ # obligation: line 58
40
+ obligation_frequency: "per-edit"
39
41
  ---
40
42
 
41
43
  # Design Fidelity
@@ -70,6 +72,9 @@ decisions already made — treat it like brand tokens, not like inspiration.
70
72
  ## Strictness — set by `design.fidelity_mode`
71
73
 
72
74
  Read `design.fidelity_mode` from `.agent-settings.yml`. Missing → `strict`.
75
+ That file is the project layer of a cascade that starts user-global, so "missing"
76
+ means missing from **every** layer — `agent-config settings:get
77
+ design.fidelity_mode` reports the value and the file it came from.
73
78
 
74
79
  | Mode | Behaviour |
75
80
  |---|---|
@@ -13,11 +13,15 @@ routes_to:
13
13
  - "skill:accessibility-auditor"
14
14
  workspaces: [agent-config-maintainer, engineering]
15
15
  packs: [frontend-design]
16
+ enforced_by:
17
+ - "none"
16
18
  collision_ok:
17
19
  "component": "a written component is reviewed before it is called done — the write-side half"
18
20
  "design token": "same surface, opposite side: ui-audit-gate inventories tokens before the write, this reviews what the write emitted"
19
21
  "resources/views/": "both halves of one UI loop fire on the same path — audit before, review after; neither substitutes for the other"
20
22
  "resources/js/": "both halves of one UI loop fire on the same path — audit before, review after; neither substitutes for the other"
23
+ # obligation: line 39
24
+ obligation_frequency: "per-edit"
21
25
  ---
22
26
 
23
27
  # Design Review After UI Write