@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.
- package/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +111 -0
- package/README.md +20 -16
- package/agents/templates/.ai-council.yml.example +481 -0
- package/agents/templates/.ai-video.xml.example +247 -0
- package/dist/agent-src/commands/fix/ci.md +29 -0
- package/dist/agent-src/commands/pr/create.md +60 -0
- package/dist/agent-src/contexts/authority/kernel-rule-edits.md +18 -2
- package/dist/agent-src/rules/design-fidelity.md +2 -2
- package/dist/agent-src/skills/ai-code-blindspots/SKILL.md +1 -0
- package/dist/agent-src/skills/design-intelligence/SKILL.md +27 -1
- package/dist/agent-src/skills/design-intelligence/data/font-pairings-reference.csv +74 -74
- package/dist/agent-src/skills/design-intelligence/data/manifest.json +2 -0
- package/dist/agent-src/skills/design-tokens/scripts/tokens.ts +0 -7
- package/dist/agent-src/skills/existing-ui-audit/SKILL.md +15 -2
- package/dist/agent-src/skills/fe-design/SKILL.md +10 -0
- package/dist/agent-src/skills/typography-system/SKILL.md +55 -11
- package/dist/agent-src/skills/ui-apply-generic/SKILL.md +180 -0
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +34 -30
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/design.ts +88 -33
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/polish.ts +23 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/review.ts +24 -1
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/stack_bundles.ts +332 -0
- package/dist/agent-src/templates/scripts/work_engine/stack/detect.ts +449 -11
- package/dist/agent-src/templates/scripts/work_engine/state.ts +21 -4
- package/dist/cli/initRouting.js +74 -11
- package/dist/cli/initRouting.js.map +1 -1
- package/dist/cli/main.js +14 -3
- package/dist/cli/main.js.map +1 -1
- package/dist/cli-delegate/chunk-523HCFYO.js +90 -0
- package/dist/cli-delegate/chunk-736JCWLM.js +1104 -0
- package/dist/cli-delegate/chunk-7HQ52DHU.js +74 -0
- package/dist/cli-delegate/chunk-A3HJ6NTI.js +1084 -0
- package/dist/cli-delegate/chunk-EJYIGZ3T.js +125 -0
- package/dist/cli-delegate/chunk-FTAISGDQ.js +117 -0
- package/dist/cli-delegate/chunk-GME3Q44L.js +82 -0
- package/dist/cli-delegate/chunk-GRRPEPRN.js +336 -0
- package/dist/cli-delegate/chunk-HJ6DAJHR.js +502 -0
- package/dist/cli-delegate/chunk-HYWSRNUX.js +179 -0
- package/dist/cli-delegate/chunk-J55WI3RR.js +47 -0
- package/dist/cli-delegate/chunk-MCJYCQPF.js +35 -0
- package/dist/cli-delegate/chunk-NDJLNC6Q.js +169 -0
- package/dist/cli-delegate/chunk-OMIVVCG2.js +26 -0
- package/dist/cli-delegate/chunk-OY53J6II.js +7336 -0
- package/dist/cli-delegate/chunk-QFKQLQ7X.js +10835 -0
- package/dist/cli-delegate/chunk-TEGJU2JX.js +6908 -0
- package/dist/cli-delegate/chunk-TJIAM5FW.js +133 -0
- package/dist/cli-delegate/chunk-XX6TOPD7.js +715 -0
- package/dist/cli-delegate/cmd_analyze_session.js +294 -0
- package/dist/cli-delegate/cmd_conformance.js +643 -0
- package/dist/cli-delegate/cmd_converge.js +326 -0
- package/dist/cli-delegate/cmd_doctor.js +142 -0
- package/dist/cli-delegate/cmd_explain.js +2576 -0
- package/dist/cli-delegate/cmd_export.js +298 -0
- package/dist/cli-delegate/cmd_fleet.js +333 -0
- package/dist/cli-delegate/cmd_memory_get.js +3878 -0
- package/dist/cli-delegate/cmd_migrate.js +11 -0
- package/dist/cli-delegate/cmd_preflight.js +153 -0
- package/dist/cli-delegate/cmd_prune.js +446 -0
- package/dist/cli-delegate/cmd_refresh.js +28 -0
- package/dist/cli-delegate/cmd_settings_check.js +574 -0
- package/dist/cli-delegate/cmd_settings_migrate.js +225 -0
- package/dist/cli-delegate/cmd_sync.js +266 -0
- package/dist/cli-delegate/cmd_uninstall.js +657 -0
- package/dist/cli-delegate/cmd_update.js +425 -0
- package/dist/cli-delegate/cmd_upgrade.js +444 -0
- package/dist/cli-delegate/cmd_validate.js +307 -0
- package/dist/cli-delegate/cmd_versions.js +370 -0
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +45 -16
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +3 -3
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +13 -7
- package/dist/discovery/trust-report.md +2 -2
- package/dist/discovery/workspaces.json +6 -4
- package/dist/install/emit_host_rules_cli.js +2 -1
- package/dist/install/emit_host_rules_cli.js.map +1 -1
- package/dist/install/install.mjs +634 -409
- package/dist/install/ruleInScope.js +123 -0
- package/dist/install/ruleInScope.js.map +1 -0
- package/dist/install/rule_scope.js +7 -3
- package/dist/install/rule_scope.js.map +1 -1
- package/dist/install/toolDetection.js +40 -12
- package/dist/install/toolDetection.js.map +1 -1
- package/dist/install/wizard-plan.js +12 -3
- package/dist/install/wizard-plan.js.map +1 -1
- package/dist/mcp/registry-manifest.json +3 -3
- package/dist/mcp/server.json +2 -2
- package/dist/mcp/server.mjs +1553 -2728
- package/dist/router.json +1 -1
- package/dist/scripts/condense.js +6 -22
- package/dist/scripts/condense.js.map +1 -1
- package/docs/guidelines/design-fidelity-mechanics.md +14 -0
- package/package.json +4 -2
- package/src/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +34 -30
- package/src/agent-src/templates/scripts/work_engine/directives/ui/design.ts +88 -33
- package/src/agent-src/templates/scripts/work_engine/directives/ui/polish.ts +23 -0
- package/src/agent-src/templates/scripts/work_engine/directives/ui/review.ts +24 -1
- package/src/agent-src/templates/scripts/work_engine/directives/ui/stack_bundles.ts +332 -0
- package/src/agent-src/templates/scripts/work_engine/stack/detect.ts +449 -11
- package/src/agent-src/templates/scripts/work_engine/state.ts +21 -4
- package/src/config/discovery/packs.yml +7 -0
- package/src/config/evaluator-budgets.json +1 -1
- package/src/config/pack-size-budget.json +27 -0
- package/src/install/emit_host_rules_cli.ts +2 -1
- package/src/install/ruleInScope.ts +133 -0
- package/src/install/rule_scope.ts +7 -3
- package/src/install/toolDetection.ts +39 -8
- package/src/install/wizard-plan.ts +13 -3
- package/src/scripts/_cli/cmd_conformance.ts +2 -1
- package/src/scripts/_cli/cmd_converge.ts +2 -1
- package/src/scripts/_cli/cmd_doctor.ts +214 -13
- package/src/scripts/_cli/cmd_export.ts +2 -1
- package/src/scripts/_cli/cmd_fleet.ts +2 -1
- package/src/scripts/_cli/cmd_migrate.ts +2 -1
- package/src/scripts/_cli/cmd_preflight.ts +2 -1
- package/src/scripts/_cli/cmd_refresh.ts +2 -1
- package/src/scripts/_cli/cmd_update.ts +2 -1
- package/src/scripts/_cli/cmd_upgrade.ts +2 -1
- package/src/scripts/_cli/cmd_versions.ts +2 -1
- package/src/scripts/_cli/detection_report.ts +480 -0
- package/src/scripts/_dispatch.bash +52 -14
- package/src/scripts/_lib/changelog_eras.ts +103 -9
- package/src/scripts/_lib/environment_detector.ts +441 -0
- package/src/scripts/_lib/global_deploy_inventory.ts +38 -2
- package/src/scripts/_lib/package_root.ts +72 -0
- package/src/scripts/ai_council/config.ts +15 -7
- package/src/scripts/ai_council/modes.ts +68 -2
- package/src/scripts/ai_council/transport_resolver.ts +331 -0
- package/src/scripts/check_bundle_path_leakage.ts +10 -4
- package/src/scripts/check_dependency_floors.ts +153 -0
- package/src/scripts/check_installer_import_purity.ts +295 -0
- package/src/scripts/check_pack_size.ts +188 -0
- package/src/scripts/condense.ts +7 -28
- package/src/scripts/council_cli.ts +6 -2
- package/src/scripts/evaluator_umbrella.sh +34 -1
- package/src/scripts/install-hooks.sh +36 -4
- package/src/scripts/install.ts +210 -5
- package/src/scripts/lint_eval_fixture_citations.ts +113 -0
- 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
|
-
|
|
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.
|
|
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
|
|