@event4u/agent-config 9.10.0 → 9.12.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 (142) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/CHANGELOG.md +111 -0
  3. package/README.md +20 -16
  4. package/agents/templates/.ai-council.yml.example +481 -0
  5. package/agents/templates/.ai-video.xml.example +247 -0
  6. package/dist/agent-src/commands/fix/ci.md +29 -0
  7. package/dist/agent-src/commands/pr/create.md +60 -0
  8. package/dist/agent-src/contexts/authority/kernel-rule-edits.md +18 -2
  9. package/dist/agent-src/rules/design-fidelity.md +2 -2
  10. package/dist/agent-src/skills/ai-code-blindspots/SKILL.md +1 -0
  11. package/dist/agent-src/skills/design-intelligence/SKILL.md +27 -1
  12. package/dist/agent-src/skills/design-intelligence/data/font-pairings-reference.csv +74 -74
  13. package/dist/agent-src/skills/design-intelligence/data/manifest.json +2 -0
  14. package/dist/agent-src/skills/design-tokens/scripts/tokens.ts +0 -7
  15. package/dist/agent-src/skills/existing-ui-audit/SKILL.md +15 -2
  16. package/dist/agent-src/skills/fe-design/SKILL.md +10 -0
  17. package/dist/agent-src/skills/typography-system/SKILL.md +55 -11
  18. package/dist/agent-src/skills/ui-apply-generic/SKILL.md +180 -0
  19. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  20. package/dist/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +34 -30
  21. package/dist/agent-src/templates/scripts/work_engine/directives/ui/design.ts +88 -33
  22. package/dist/agent-src/templates/scripts/work_engine/directives/ui/polish.ts +23 -0
  23. package/dist/agent-src/templates/scripts/work_engine/directives/ui/review.ts +24 -1
  24. package/dist/agent-src/templates/scripts/work_engine/directives/ui/stack_bundles.ts +332 -0
  25. package/dist/agent-src/templates/scripts/work_engine/stack/detect.ts +449 -11
  26. package/dist/agent-src/templates/scripts/work_engine/state.ts +21 -4
  27. package/dist/cli/initRouting.js +74 -11
  28. package/dist/cli/initRouting.js.map +1 -1
  29. package/dist/cli/main.js +14 -3
  30. package/dist/cli/main.js.map +1 -1
  31. package/dist/cli-delegate/chunk-523HCFYO.js +90 -0
  32. package/dist/cli-delegate/chunk-736JCWLM.js +1104 -0
  33. package/dist/cli-delegate/chunk-7HQ52DHU.js +74 -0
  34. package/dist/cli-delegate/chunk-A3HJ6NTI.js +1084 -0
  35. package/dist/cli-delegate/chunk-EJYIGZ3T.js +125 -0
  36. package/dist/cli-delegate/chunk-FTAISGDQ.js +117 -0
  37. package/dist/cli-delegate/chunk-GME3Q44L.js +82 -0
  38. package/dist/cli-delegate/chunk-GRRPEPRN.js +336 -0
  39. package/dist/cli-delegate/chunk-HJ6DAJHR.js +502 -0
  40. package/dist/cli-delegate/chunk-HYWSRNUX.js +179 -0
  41. package/dist/cli-delegate/chunk-J55WI3RR.js +47 -0
  42. package/dist/cli-delegate/chunk-MCJYCQPF.js +35 -0
  43. package/dist/cli-delegate/chunk-NDJLNC6Q.js +169 -0
  44. package/dist/cli-delegate/chunk-OMIVVCG2.js +26 -0
  45. package/dist/cli-delegate/chunk-OY53J6II.js +7336 -0
  46. package/dist/cli-delegate/chunk-QFKQLQ7X.js +10835 -0
  47. package/dist/cli-delegate/chunk-TEGJU2JX.js +6908 -0
  48. package/dist/cli-delegate/chunk-TJIAM5FW.js +133 -0
  49. package/dist/cli-delegate/chunk-XX6TOPD7.js +715 -0
  50. package/dist/cli-delegate/cmd_analyze_session.js +294 -0
  51. package/dist/cli-delegate/cmd_conformance.js +643 -0
  52. package/dist/cli-delegate/cmd_converge.js +326 -0
  53. package/dist/cli-delegate/cmd_doctor.js +142 -0
  54. package/dist/cli-delegate/cmd_explain.js +2576 -0
  55. package/dist/cli-delegate/cmd_export.js +298 -0
  56. package/dist/cli-delegate/cmd_fleet.js +333 -0
  57. package/dist/cli-delegate/cmd_memory_get.js +3878 -0
  58. package/dist/cli-delegate/cmd_migrate.js +11 -0
  59. package/dist/cli-delegate/cmd_preflight.js +153 -0
  60. package/dist/cli-delegate/cmd_prune.js +446 -0
  61. package/dist/cli-delegate/cmd_refresh.js +28 -0
  62. package/dist/cli-delegate/cmd_settings_check.js +574 -0
  63. package/dist/cli-delegate/cmd_settings_migrate.js +225 -0
  64. package/dist/cli-delegate/cmd_sync.js +266 -0
  65. package/dist/cli-delegate/cmd_uninstall.js +657 -0
  66. package/dist/cli-delegate/cmd_update.js +425 -0
  67. package/dist/cli-delegate/cmd_upgrade.js +444 -0
  68. package/dist/cli-delegate/cmd_validate.js +307 -0
  69. package/dist/cli-delegate/cmd_versions.js +370 -0
  70. package/dist/discovery/deprecation-report.md +1 -1
  71. package/dist/discovery/discovery-manifest.json +45 -16
  72. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  73. package/dist/discovery/discovery-manifest.summary.md +3 -3
  74. package/dist/discovery/orphan-report.md +1 -1
  75. package/dist/discovery/packs.json +13 -7
  76. package/dist/discovery/trust-report.md +2 -2
  77. package/dist/discovery/workspaces.json +6 -4
  78. package/dist/install/emit_host_rules_cli.js +2 -1
  79. package/dist/install/emit_host_rules_cli.js.map +1 -1
  80. package/dist/install/install.mjs +634 -409
  81. package/dist/install/ruleInScope.js +123 -0
  82. package/dist/install/ruleInScope.js.map +1 -0
  83. package/dist/install/rule_scope.js +7 -3
  84. package/dist/install/rule_scope.js.map +1 -1
  85. package/dist/install/toolDetection.js +40 -12
  86. package/dist/install/toolDetection.js.map +1 -1
  87. package/dist/install/wizard-plan.js +12 -3
  88. package/dist/install/wizard-plan.js.map +1 -1
  89. package/dist/mcp/registry-manifest.json +3 -3
  90. package/dist/mcp/server.json +2 -2
  91. package/dist/mcp/server.mjs +1553 -2728
  92. package/dist/router.json +1 -1
  93. package/dist/scripts/condense.js +6 -22
  94. package/dist/scripts/condense.js.map +1 -1
  95. package/docs/guidelines/design-fidelity-mechanics.md +14 -0
  96. package/package.json +4 -2
  97. package/src/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +34 -30
  98. package/src/agent-src/templates/scripts/work_engine/directives/ui/design.ts +88 -33
  99. package/src/agent-src/templates/scripts/work_engine/directives/ui/polish.ts +23 -0
  100. package/src/agent-src/templates/scripts/work_engine/directives/ui/review.ts +24 -1
  101. package/src/agent-src/templates/scripts/work_engine/directives/ui/stack_bundles.ts +332 -0
  102. package/src/agent-src/templates/scripts/work_engine/stack/detect.ts +449 -11
  103. package/src/agent-src/templates/scripts/work_engine/state.ts +21 -4
  104. package/src/config/discovery/packs.yml +7 -0
  105. package/src/config/evaluator-budgets.json +1 -1
  106. package/src/config/pack-size-budget.json +27 -0
  107. package/src/install/emit_host_rules_cli.ts +2 -1
  108. package/src/install/ruleInScope.ts +133 -0
  109. package/src/install/rule_scope.ts +7 -3
  110. package/src/install/toolDetection.ts +39 -8
  111. package/src/install/wizard-plan.ts +13 -3
  112. package/src/scripts/_cli/cmd_conformance.ts +2 -1
  113. package/src/scripts/_cli/cmd_converge.ts +2 -1
  114. package/src/scripts/_cli/cmd_doctor.ts +214 -13
  115. package/src/scripts/_cli/cmd_export.ts +2 -1
  116. package/src/scripts/_cli/cmd_fleet.ts +2 -1
  117. package/src/scripts/_cli/cmd_migrate.ts +2 -1
  118. package/src/scripts/_cli/cmd_preflight.ts +2 -1
  119. package/src/scripts/_cli/cmd_refresh.ts +2 -1
  120. package/src/scripts/_cli/cmd_update.ts +2 -1
  121. package/src/scripts/_cli/cmd_upgrade.ts +2 -1
  122. package/src/scripts/_cli/cmd_versions.ts +2 -1
  123. package/src/scripts/_cli/detection_report.ts +480 -0
  124. package/src/scripts/_dispatch.bash +52 -14
  125. package/src/scripts/_lib/changelog_eras.ts +103 -9
  126. package/src/scripts/_lib/environment_detector.ts +441 -0
  127. package/src/scripts/_lib/global_deploy_inventory.ts +38 -2
  128. package/src/scripts/_lib/package_root.ts +72 -0
  129. package/src/scripts/ai_council/config.ts +15 -7
  130. package/src/scripts/ai_council/modes.ts +68 -2
  131. package/src/scripts/ai_council/transport_resolver.ts +331 -0
  132. package/src/scripts/check_bundle_path_leakage.ts +10 -4
  133. package/src/scripts/check_dependency_floors.ts +153 -0
  134. package/src/scripts/check_installer_import_purity.ts +295 -0
  135. package/src/scripts/check_pack_size.ts +188 -0
  136. package/src/scripts/condense.ts +7 -28
  137. package/src/scripts/council_cli.ts +6 -2
  138. package/src/scripts/evaluator_umbrella.sh +34 -1
  139. package/src/scripts/install-hooks.sh +36 -4
  140. package/src/scripts/install.ts +210 -5
  141. package/src/scripts/lint_eval_fixture_citations.ts +113 -0
  142. package/src/scripts/lint_ui_stack_bundles.ts +201 -0
@@ -0,0 +1,247 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!--
3
+ agents/.ai-video.xml.example
4
+ ============================
5
+
6
+ Operator-facing provider configuration for the /video:* command cluster.
7
+
8
+ Copy this file to `agents/.ai-video.xml` and fill in the API keys for the
9
+ providers you actually use. The real file is gitignored and MUST NEVER be
10
+ committed.
11
+
12
+ Loader: scripts/media/lib/load-config.sh
13
+ Redaction: scripts/media/lib/redact.sh
14
+ Docs: agents/reference/ai-video/README.md
15
+ -->
16
+ <ai-video version="1">
17
+
18
+ <!--
19
+ Defaults: pick which provider a /video:* run uses when the command
20
+ does not pass the image-provider / video-provider flags. Must match
21
+ a provider id="..." declared below.
22
+
23
+ Each provider carries a <lifecycle> tag — experimental | stable |
24
+ deprecated | community — per docs/contracts/provider-lifecycle.md.
25
+ Day-one shipped tiers are conservative: every adapter is
26
+ `experimental` until a maintainer captures a real-API smoke trace.
27
+ The agent refuses to *default* to a non-stable provider silently;
28
+ it surfaces the tier and asks before running.
29
+ -->
30
+ <default-image-provider>openai-images</default-image-provider>
31
+ <default-video-provider>gemini-veo</default-video-provider>
32
+
33
+ <!-- ============================================================ -->
34
+ <!-- Image providers -->
35
+ <!-- ============================================================ -->
36
+
37
+ <provider id="openai-images" kind="image">
38
+ <lifecycle>stable</lifecycle>
39
+ <api-key>sk-REPLACE-ME</api-key>
40
+ <endpoint>https://api.openai.com/v1</endpoint>
41
+ <default-model>gpt-image-1</default-model>
42
+ <dry-run>true</dry-run>
43
+ <tuning>
44
+ <aspect>16:9</aspect>
45
+ <quality>high</quality>
46
+ <best-of-n>4</best-of-n>
47
+ </tuning>
48
+ </provider>
49
+
50
+ <!-- ============================================================ -->
51
+ <!-- Video providers -->
52
+ <!-- ============================================================ -->
53
+
54
+ <provider id="higgsfield" kind="image+video">
55
+ <lifecycle>stable</lifecycle>
56
+ <api-key>hf-REPLACE-ME</api-key>
57
+ <endpoint>https://api.higgsfield.ai/v1</endpoint>
58
+ <default-model>higgsfield-soul</default-model>
59
+ <dry-run>true</dry-run>
60
+ <tuning>
61
+ <aspect>16:9</aspect>
62
+ <preset>cinematic</preset>
63
+ <max-duration>5</max-duration>
64
+ <best-of-n>2</best-of-n>
65
+ </tuning>
66
+ </provider>
67
+
68
+ <provider id="gemini-veo" kind="video">
69
+ <lifecycle>stable</lifecycle>
70
+ <api-key>AIza-REPLACE-ME</api-key>
71
+ <endpoint>https://generativelanguage.googleapis.com/v1beta</endpoint>
72
+ <default-model>veo-3.0-generate-001</default-model>
73
+ <dry-run>true</dry-run>
74
+ <tuning>
75
+ <aspect>16:9</aspect>
76
+ <fps>24</fps>
77
+ <max-duration>8</max-duration>
78
+ <audio-native>true</audio-native>
79
+ </tuning>
80
+ </provider>
81
+
82
+ <provider id="kling" kind="video">
83
+ <lifecycle>stable</lifecycle>
84
+ <access-key>kling-access-REPLACE-ME</access-key>
85
+ <secret-key>kling-secret-REPLACE-ME</secret-key>
86
+ <endpoint>https://api.klingai.com/v1</endpoint>
87
+ <default-model>kling-v2-master</default-model>
88
+ <dry-run>true</dry-run>
89
+ <tuning>
90
+ <aspect>16:9</aspect>
91
+ <fps>30</fps>
92
+ <max-duration>10</max-duration>
93
+ <audio-native>false</audio-native>
94
+ </tuning>
95
+ </provider>
96
+
97
+ <provider id="sora" kind="video">
98
+ <lifecycle>stable</lifecycle>
99
+ <api-key>sora-REPLACE-ME</api-key>
100
+ <endpoint>https://api.openai.com/v1</endpoint>
101
+ <default-model>sora-2</default-model>
102
+ <dry-run>true</dry-run>
103
+ <tuning>
104
+ <aspect>16:9</aspect>
105
+ <fps>30</fps>
106
+ <max-duration>20</max-duration>
107
+ <audio-native>true</audio-native>
108
+ </tuning>
109
+ </provider>
110
+
111
+ <!-- ============================================================ -->
112
+ <!-- Multiplexer providers — one adapter, many models -->
113
+ <!-- Model selection: top-level `model_id` stdin key overrides -->
114
+ <!-- <default-model>. Per-model capabilities: -->
115
+ <!-- scripts/ai-video/lib/model-capabilities/<id>.json -->
116
+ <!-- Kill-switch: <enabled>false</enabled> refuses every network -->
117
+ <!-- subcommand without editing procedures that name the provider.-->
118
+ <!-- ============================================================ -->
119
+
120
+ <provider id="fal" kind="video">
121
+ <lifecycle>stable</lifecycle>
122
+ <enabled>true</enabled>
123
+ <api-key>fal-REPLACE-ME</api-key>
124
+ <endpoint>https://queue.fal.run</endpoint>
125
+ <default-model>fal-ai/ltx-2/text-to-video</default-model>
126
+ <dry-run>true</dry-run>
127
+ <tuning>
128
+ <aspect>16:9</aspect>
129
+ <max-duration>10</max-duration>
130
+ <audio-native>false</audio-native>
131
+ </tuning>
132
+ </provider>
133
+
134
+ <provider id="replicate" kind="video">
135
+ <lifecycle>stable</lifecycle>
136
+ <enabled>true</enabled>
137
+ <api-key>r8_REPLACE-ME</api-key>
138
+ <endpoint>https://api.replicate.com/v1</endpoint>
139
+ <default-model>kwaivgi/kling-v2.1-master</default-model>
140
+ <dry-run>true</dry-run>
141
+ <tuning>
142
+ <aspect>16:9</aspect>
143
+ <max-duration>10</max-duration>
144
+ <audio-native>false</audio-native>
145
+ </tuning>
146
+ </provider>
147
+
148
+ <!--
149
+ Local ComfyUI (ADR-060 — container-primary sandbox). No api-key:
150
+ the adapter talks to YOUR ComfyUI. A loopback endpoint is assumed
151
+ to be the shipped container posture (read-only image, cap-drop ALL,
152
+ network-none at generation time — run line in the adapter header).
153
+ A NON-loopback endpoint is the remote escape hatch: isolation is
154
+ the operator's responsibility and the block must carry
155
+ <unsandboxed>accepted</unsandboxed> or the adapter refuses (exit 6).
156
+ Models: wan22-ti2v-5b (default, Apache-2.0) | ltx-2 (audio-sync).
157
+ Shipped workflow templates only — operator workflow JSONs are
158
+ rejected by design. macOS: no CUDA — container path is
159
+ reference-only; use the remote escape hatch.
160
+ -->
161
+ <provider id="comfyui" kind="video">
162
+ <lifecycle>experimental</lifecycle>
163
+ <enabled>true</enabled>
164
+ <endpoint>http://127.0.0.1:8188</endpoint>
165
+ <default-model>wan22-ti2v-5b</default-model>
166
+ <dry-run>true</dry-run>
167
+ <tuning>
168
+ <aspect>16:9</aspect>
169
+ <max-duration>5</max-duration>
170
+ <audio-native>false</audio-native>
171
+ </tuning>
172
+ </provider>
173
+
174
+ <!-- ============================================================ -->
175
+ <!-- Audio adapters (music-video orchestration) -->
176
+ <!-- Contract: scripts/ai-video/lib/audio-adapter-contract.md -->
177
+ <!-- local-cli adapters wrap an OPERATOR-installed tool (pip) — -->
178
+ <!-- no api-key element needed; <enabled>false</enabled> opts a -->
179
+ <!-- configured-but-unwanted adapter out (otherwise a missing CLI -->
180
+ <!-- is a loud config failure, never a silent probe fallback). -->
181
+ <!-- ============================================================ -->
182
+
183
+ <provider id="allin1" kind="audio-analysis">
184
+ <lifecycle>experimental</lifecycle>
185
+ <enabled>true</enabled>
186
+ <dry-run>true</dry-run>
187
+ </provider>
188
+
189
+ <provider id="whisperx" kind="lyrics">
190
+ <lifecycle>experimental</lifecycle>
191
+ <enabled>true</enabled>
192
+ <dry-run>true</dry-run>
193
+ </provider>
194
+
195
+ <!-- ============================================================ -->
196
+ <!-- Lip-sync post-process (v2 contract, kind="lipsync") -->
197
+ <!-- Sparse budget: lib/model-capabilities/syncso.json -->
198
+ <!-- ============================================================ -->
199
+
200
+ <!--
201
+ Local (MIT) lip-sync — offline alternative to syncso. Wraps an
202
+ OPERATOR-installed MuseTalk (github.com/TMElyralab/MuseTalk); the
203
+ wrapped entry point is configurable via the MUSETALK_CMD env var.
204
+ No api-key. Same sparse lipsync_budget discipline as syncso
205
+ (lib/model-capabilities/musetalk.json) — local renders are free but
206
+ the quality argument for sparseness is unchanged.
207
+ -->
208
+ <provider id="musetalk" kind="lipsync">
209
+ <lifecycle>experimental</lifecycle>
210
+ <enabled>true</enabled>
211
+ <dry-run>true</dry-run>
212
+ </provider>
213
+
214
+ <provider id="syncso" kind="lipsync">
215
+ <lifecycle>experimental</lifecycle>
216
+ <enabled>true</enabled>
217
+ <api-key>sk-REPLACE-ME</api-key>
218
+ <endpoint>https://api.sync.so</endpoint>
219
+ <default-model>lipsync-2</default-model>
220
+ <dry-run>true</dry-run>
221
+ </provider>
222
+
223
+ <!-- ============================================================ -->
224
+ <!-- Extra slot — future providers without schema bump -->
225
+ <!-- Use kind="image" | "video" | "image+video" | "audio-analysis"-->
226
+ <!-- | "lyrics" | "lipsync". -->
227
+ <!-- ============================================================ -->
228
+
229
+ <extra>
230
+ <!--
231
+ <provider id="my-future-backend" kind="video">
232
+ <lifecycle>experimental</lifecycle>
233
+ <api-key>REPLACE-ME</api-key>
234
+ <endpoint>https://example.invalid/v1</endpoint>
235
+ <default-model>example-1</default-model>
236
+ <dry-run>true</dry-run>
237
+ <tuning>
238
+ <aspect>16:9</aspect>
239
+ <fps>24</fps>
240
+ <max-duration>6</max-duration>
241
+ <audio-native>false</audio-native>
242
+ </tuning>
243
+ </provider>
244
+ -->
245
+ </extra>
246
+
247
+ </ai-video>
@@ -20,12 +20,41 @@ packs:
20
20
  # /fix ci
21
21
  ## Instructions
22
22
 
23
+ ### 0. Wait for the run to settle first
24
+
25
+ A run still in progress has no verdict to fix. Do NOT read a partial run and
26
+ start guessing — and do NOT end the turn reporting "CI is running".
27
+
28
+ ```bash
29
+ until [ "$(gh pr checks <n> --json state \
30
+ --jq '[.[] | select(.state=="IN_PROGRESS" or .state=="QUEUED" or .state=="PENDING")] | length')" = "0" ]
31
+ do sleep 45; done
32
+ ```
33
+
34
+ Run that in the BACKGROUND so the turn resumes when the verdict lands; a
35
+ foreground sleep-poll chain is blocked and per-minute re-polling is the tool
36
+ loop `token-efficiency` forbids. If the waiter exits because `gh` itself failed
37
+ (network down), it has observed nothing — say so rather than treating it as a
38
+ pass.
39
+
40
+ Note `gh run view --log-failed` returns *"run is still in progress; logs will be
41
+ available when it is complete"* until the WHOLE run finishes, which is the other
42
+ reason to settle first.
43
+
23
44
  ### 1. Identify the failing CI run
24
45
 
25
46
  - Get the current branch name from `git branch --show-current`.
26
47
  - Fetch the latest CI run for this branch via GitHub API:
27
48
  - `GET /repos/{owner}/{repo}/actions/runs?branch={branch}&per_page=5`
28
49
  - Find the most recent failed run.
50
+ - **Before fixing, establish whose failure it is.** Re-run the same gate against
51
+ `origin/main`, and check whether any of your changed files appear in its
52
+ inputs (`git diff origin/main --stat -- <path>`). A pre-existing trunk failure
53
+ is reported, not adopted — and not ignored.
54
+ - **A local repro can differ from CI.** A developer checkout carries settings and
55
+ generated trees a clean runner never has, so a gate can fail locally for an
56
+ unrelated reason (or pass locally while CI fails). When they disagree, CI is
57
+ authoritative; name the difference instead of assuming one cause.
29
58
 
30
59
  ### 2. Get the failure details
31
60
 
@@ -318,6 +318,66 @@ This is the [`direct-answers` Iron Law 2](../rules/direct-answers.md)
318
318
  live-state clause applied to the PR surface: git/PR/CI state decays
319
319
  silently and is NEVER reported from memory or inference.
320
320
 
321
+ #### 4d. Settle CI before the turn ends (MANDATORY)
322
+
323
+ ```
324
+ A PUSH TO AN OPEN PR IS NOT DONE UNTIL CI IS SETTLED.
325
+ NEVER END THE TURN ON "CI IS RUNNING" — WAIT FOR THE VERDICT.
326
+ RED → DIAGNOSE AND FIX IN THE WORKING TREE. NEVER LEAVE A KNOWN FAILURE UNREAD.
327
+ ```
328
+
329
+ §4c makes the REPORT honest. This makes the turn honest: a truthful
330
+ "checks are pending" is still an unfinished job, and reporting it as the
331
+ closing line hands the user a PR whose outcome nobody has looked at.
332
+ Pending is a reason to wait, never a reason to stop.
333
+
334
+ **Settled** means every check has reached a terminal state:
335
+
336
+ ```bash
337
+ until [ "$(gh pr checks <n> --json state \
338
+ --jq '[.[] | select(.state=="IN_PROGRESS" or .state=="QUEUED" or .state=="PENDING")] | length')" = "0" ]
339
+ do sleep 45; done
340
+ gh pr checks <n> --json name,state,link \
341
+ --jq '.[] | select(.state!="SUCCESS" and .state!="SKIPPED") | "\(.state) \(.name) \(.link)"'
342
+ ```
343
+
344
+ Run the wait as a BACKGROUND command so the turn resumes on its own when
345
+ the verdict lands. A foreground sleep-poll chain is blocked, and burning
346
+ turns on `gh pr checks` every minute is the tool-loop
347
+ [`token-efficiency`](../rules/token-efficiency.md) forbids.
348
+
349
+ **On red:**
350
+
351
+ 1. **Verify it is yours before fixing it.** Check `origin/main` for the same
352
+ failure and whether any of your files appear in the failing gate's inputs
353
+ (`git diff origin/main --stat -- <path>`). A pre-existing trunk failure is
354
+ reported, not silently adopted — and not silently ignored either.
355
+ 2. **Get the real log, do not infer.** `gh run view --job <id> --log-failed`.
356
+ Logs are unavailable until the whole run completes; a local repro is often
357
+ faster but can differ from CI (a developer checkout carries settings and
358
+ generated trees a clean runner does not — see the `SCOPE_GUARD_BYPASS` and
359
+ untracked-`dist/` cases). When local and CI disagree, CI is authoritative.
360
+ 3. **Fix, then re-verify locally** with the narrowest command that proves the
361
+ target green.
362
+ 4. **Bounded at N=3 per failing target** ([`autonomous-execution`](../rules/autonomous-execution.md)).
363
+ Same failure signature twice → the hypothesis is wrong; change approach
364
+ rather than spending the third attempt on a near-identical retry.
365
+ 5. **The push stays gated.** `git push` is a Hard Floor
366
+ ([`non-destructive-by-default`](../rules/non-destructive-by-default.md)) and a
367
+ one-off authorization is spent on the push it was given for
368
+ ([`commit-policy`](../rules/commit-policy.md)). Fix in the working tree and
369
+ push only under a fresh or still-standing instruction. A CI-fix loop that
370
+ re-pushes on its own authority is not on the table.
371
+
372
+ **When the verdict cannot be reached** — network down, `gh` failing, the run
373
+ never registering — say so plainly and name what is unverified. A background
374
+ waiter that exits because `gh` errored has NOT observed a green run; treat its
375
+ output as absent, not as a pass.
376
+
377
+ **Not gated by this:** posting the status anywhere. Progress narration belongs
378
+ in the chat reply, never as a PR comment
379
+ ([`no-pr-progress-comments`](../rules/no-pr-progress-comments.md)).
380
+
321
381
  #### 4d. Jira transition (only when transitioned)
322
382
 
323
383
  Linked ticket + `routine_confirmations: true` → ask `1. Yes / 2. No`.
@@ -21,15 +21,31 @@ diagnosis.
21
21
 
22
22
  ## Trigger
23
23
 
24
- A PR is a "kernel-rule edit" iff it modifies any file in
25
- `.agent-src.uncondensed/rules/` that is in the locked kernel set
24
+ A PR is a "kernel-rule edit" iff it modifies any file in `src/rules/`
25
+ that is in the locked kernel set
26
26
  (see [`docs/contracts/kernel-membership.md`](../../../docs/contracts/kernel-membership.md)).
27
+ (Until 2026-07-31 this named the pre-ADR-051 authoring tree, which no
28
+ longer exists — so the trigger could not match a live file.)
27
29
 
28
30
  The CI guard (Phase 4.2 of the always-budget-relief roadmap) fails
29
31
  any PR that touches **> 1** kernel rule in the same diff. Override is
30
32
  a single PR label: `bundled-always-rules-acknowledged` — the maintainer
31
33
  records why the bundle is necessary in the PR body.
32
34
 
35
+ ## Re-anchor the cache prefix in the same PR
36
+
37
+ The kernel bodies are the KV-cache prefix of every request, so editing
38
+ one invalidates that cache for every consumer. `check_kernel_prefix_stability`
39
+ (Rule Backstops workflow) fails until the edit is recorded:
40
+
41
+ ```bash
42
+ ./scripts-run src/scripts/check_kernel_prefix_stability --update-baseline
43
+ ```
44
+
45
+ Commit the resulting `internal/bench/reports/kernel-prefix.json` **in the
46
+ same PR** — that is what makes a cache-invalidating change explicit in the
47
+ diff instead of a silent 10× cost event.
48
+
33
49
  ## Out of scope
34
50
 
35
51
  - Auto-tier rules. Auto rules load on demand; the soak rationale does
@@ -20,7 +20,7 @@ applies_to_user_types:
20
20
  routes_to:
21
21
  - "guideline:design-fidelity-mechanics"
22
22
  workspaces: [engineering]
23
- packs: [frontend-design]
23
+ packs: [engineering-base, frontend-design]
24
24
  ---
25
25
 
26
26
  # Design Fidelity
@@ -73,7 +73,7 @@ porting, or modifying UI to match it.
73
73
  - The user explicitly invites exploration ("show me options", "redesign this", "improve the layout") — that authorises deviation for that turn.
74
74
  - Non-UI surfaces (scripts, CLI, backend).
75
75
 
76
- Body migrated to [`guideline:design-fidelity-mechanics`](../docs/guidelines/design-fidelity-mechanics.md) (per P4 of `road-to-kernel-and-router.md`) — surgical visual edits (targeted-edit vs redesign-trigger discipline, stable anchors), asset & imagery discipline (owned-asset path, real-imagery-as-proof, iconography floor, no unrequested filler), deviation-surfacing shape, failure-mode catalog, `daf-*` fixtures.
76
+ Body migrated to [`guideline:design-fidelity-mechanics`](../docs/guidelines/design-fidelity-mechanics.md) (per P4 of `road-to-kernel-and-router.md`) — surgical visual edits (targeted-edit vs redesign-trigger discipline, stable anchors), asset & imagery discipline (owned-asset path, third-party delivery is self-hosted by default, real-imagery-as-proof, iconography floor, no unrequested filler), deviation-surfacing shape, failure-mode catalog, `daf-*` fixtures.
77
77
  Trigger-set above activates this routing on demand, independent of the discipline profile (ADR-110).
78
78
 
79
79
  ## See also
@@ -48,6 +48,7 @@ Run the row(s) for what you touched. The grep is a fast authoring-time backstop
48
48
  | **DB query / ORM** | parameterized, never string-built; tenant predicate present; no `SELECT *` across a serialization boundary; N+1 avoided (eager load) | `source-discovery`, `security` |
49
49
  | **Migration** | reversible (`down`); expand-contract for drop/rename (never a bare `DROP COLUMN` before code stops reading it); transaction; index on new FK/filter column | `engineering-safety-floor`, `migration-architect` |
50
50
  | **User-controlled render (FE)** | output-encoded; no `dangerouslySetInnerHTML`/`v-html`/`innerHTML`/`eval` on non-constant input; no secret/token in client code; token not in `localStorage` | `frontend-render-security` |
51
+ | **Third-party asset in shipped markup / CSS** | delivery is self-hosted through the project's own route (framework font/asset primitive, bundled package, or locally-served file) — a font/icon/stylesheet CDN link transmits the **visitor's IP** to that third party on every page view; a hotlink only on a stated consumer opt-in; `integrity` + `crossorigin` if a CDN link stays | `design-fidelity-mechanics` § Asset & imagery discipline (owner), `typography-system` |
51
52
  | **File / outbound fetch** | path confined to an allowed base; SSRF allow-list + private-IP block on user-supplied URLs; size limit; **explicit timeout** (no unbounded/default-infinite wait); server-side validation (never client-only) | `security`, `defense-in-depth` |
52
53
  | **Infra / IaC** | least-privilege (no `Action:*`/`Resource:*`); encryption at rest; no `0.0.0.0/0` to mgmt/DB ports; no hardcoded creds; scanner-verified, not `plan`-verified | `engineering-safety-floor`, `terraform`, `secrets-management` |
53
54
  | **New dependency** | package exists on the real registry (not hallucinated); not typo-adjacent to a popular one; pinned + lockfile committed; CVE-scanned | `supply-chain-intake`, `dependency-upgrade` |
@@ -204,6 +204,23 @@ corpus. Canon is a gap-filler, never an override of a registered brand value.
204
204
  4. On `design_confirmed: true` the directive engine advances; revisions
205
205
  loop back here.
206
206
 
207
+ ### Font delivery columns — which one is the answer
208
+
209
+ `font-pairings-reference.csv` carries three delivery-adjacent columns and they
210
+ are **not** interchangeable. This is the arbitration between them, so the file
211
+ and its sibling `data/stacks/nextjs.csv` (row 22: a font-CDN `<link>` sits in
212
+ that row's **Don't** column) no longer read as opposite instructions:
213
+
214
+ | Column | What it answers | Status |
215
+ |---|---|---|
216
+ | `Google Fonts URL` | *where do I find / verify this font?* | discovery + availability check |
217
+ | `Self-Hosted Route` | *how does it get onto the page?* | **the default answer** — `@fontsource/*` package ids derived from the row's own Google-Fonts families; two rows name a foundry file instead (Fontshare pairs with a Google alternative) |
218
+ | `CSS Import` | the third-party CDN `@import` | **opt-in only** — emitting it transmits the visitor's IP to the third party; policy owner is [`design-fidelity-mechanics`](../../../docs/guidelines/design-fidelity-mechanics.md) § Asset & imagery discipline ([`ADR-205`](../../../docs/decisions/ADR-205-webfont-delivery-ownership.md)) |
219
+
220
+ Per-stack route resolution (Next / bundler / asset-pipeline / plain) lives in
221
+ [`typography-system`](../typography-system/SKILL.md) § Delivery — one table, not
222
+ two.
223
+
207
224
  ### Font fallback (no google-fonts index — by design)
208
225
 
209
226
  The 745 KB Google-Fonts index was rejected (ADR-061 §8): it duplicates a
@@ -332,7 +349,16 @@ Before finalizing any design brief, cross-check against
332
349
  [`docs/guidelines/design-antipatterns.md`](../../../docs/guidelines/design-antipatterns.md)
333
350
  — especially the Color (C1–C5), Typography (T7–T8), and Layout (L1–L2) sections.
334
351
  If the grounded corpus selection lands on a pattern in the catalog, either invoke
335
- the override condition or adjust the selection. Run the AI-slop originality
352
+ the override condition or adjust the selection.
353
+ For typography this is **a field, not a memory test**: a
354
+ `font-pairings-reference.csv` row whose heading or body font is a T7 overused-AI
355
+ default carries it in its `AI-Default Flag` column (`T7:<font>`; 15 of 73 rows) —
356
+ read the field. An empty flag means the row carries no T7 font, so a pairing is
357
+ never "flagged by association" (Poppins + Open Sans, the example most often
358
+ cited as flagged, carries none). T8 (single typeface for everything) needs no
359
+ column: it is `Heading Font == Body Font` on the row. A flag is a visible
360
+ conflict to resolve, never a ban — the catalog's override condition still
361
+ applies. Run the AI-slop originality
336
362
  self-test (catalog § "The AI-slop originality self-test") on the chosen aesthetic
337
363
  direction before emitting `design_confirmed`.
338
364