@event4u/agent-config 9.11.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 +52 -0
- package/README.md +8 -1
- 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 +1 -1
- 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/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 +9 -5
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/polish.ts +9 -6
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/review.ts +9 -5
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/stack_bundles.ts +182 -29
- package/dist/agent-src/templates/scripts/work_engine/stack/detect.ts +311 -24
- package/dist/cli-delegate/chunk-523HCFYO.js +90 -0
- package/dist/cli-delegate/{chunk-IR7P7JWA.js → chunk-A3HJ6NTI.js} +271 -59
- package/dist/cli-delegate/chunk-EJYIGZ3T.js +125 -0
- package/dist/cli-delegate/{chunk-RDGRHAAB.js → chunk-HYWSRNUX.js} +6 -86
- package/dist/cli-delegate/{chunk-YMFO6FDN.js → chunk-QFKQLQ7X.js} +313 -81
- package/dist/cli-delegate/{chunk-4SV3XGFA.js → chunk-TEGJU2JX.js} +7 -9
- package/dist/cli-delegate/chunk-TJIAM5FW.js +133 -0
- package/dist/cli-delegate/cmd_conformance.js +4 -7
- package/dist/cli-delegate/cmd_doctor.js +3 -5
- package/dist/cli-delegate/cmd_explain.js +153 -85
- package/dist/cli-delegate/cmd_export.js +5 -3
- package/dist/cli-delegate/cmd_fleet.js +2 -1
- package/dist/cli-delegate/cmd_preflight.js +6 -123
- package/dist/cli-delegate/cmd_prune.js +5 -3
- package/dist/cli-delegate/cmd_settings_migrate.js +5 -3
- package/dist/cli-delegate/cmd_sync.js +5 -3
- package/dist/cli-delegate/cmd_uninstall.js +6 -5
- package/dist/cli-delegate/cmd_validate.js +5 -3
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +36 -14
- 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 +6 -5
- package/dist/discovery/trust-report.md +2 -2
- package/dist/discovery/workspaces.json +5 -4
- package/dist/install/install.mjs +605 -412
- package/dist/install/ruleInScope.js +123 -0
- package/dist/install/ruleInScope.js.map +1 -0
- package/dist/install/rule_scope.js +2 -2
- package/dist/install/rule_scope.js.map +1 -1
- package/dist/install/wizard-plan.js +10 -1
- 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 +405 -2429
- 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 +1 -1
- package/src/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +9 -5
- package/src/agent-src/templates/scripts/work_engine/directives/ui/polish.ts +9 -6
- package/src/agent-src/templates/scripts/work_engine/directives/ui/review.ts +9 -5
- package/src/agent-src/templates/scripts/work_engine/directives/ui/stack_bundles.ts +182 -29
- package/src/agent-src/templates/scripts/work_engine/stack/detect.ts +311 -24
- package/src/install/ruleInScope.ts +133 -0
- package/src/install/rule_scope.ts +2 -2
- package/src/install/wizard-plan.ts +11 -1
- package/src/scripts/_lib/global_deploy_inventory.ts +38 -2
- package/src/scripts/check_installer_import_purity.ts +295 -0
- package/src/scripts/condense.ts +7 -28
- package/src/scripts/install-hooks.sh +36 -4
- package/src/scripts/install.ts +210 -5
- package/src/scripts/lint_ui_stack_bundles.ts +31 -0
- package/dist/cli-delegate/chunk-7DSAMZFU.js +0 -356
- package/dist/cli-delegate/chunk-BJGXZNPM.js +0 -266
- package/dist/cli-delegate/chunk-TFG57JJM.js +0 -1969
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
},
|
|
7
7
|
"metadata": {
|
|
8
8
|
"description": "Bootstrap shim for the event4u agent-config suite. This plugin ships ONLY the dispatcher hooks plus one install-pointer skill — ALL content (skills, rules, commands) is installed via `npx -y @event4u/agent-config init`, which writes the file projection AND registers the same hooks in ~/.claude/settings.json. DEPRECATED as a content channel; kept so the marketplace listing stays discoverable and existing installs keep working hooks.",
|
|
9
|
-
"version": "9.
|
|
9
|
+
"version": "9.12.0",
|
|
10
10
|
"keywords": [
|
|
11
11
|
"agent-config",
|
|
12
12
|
"skills",
|
package/CHANGELOG.md
CHANGED
|
@@ -244,6 +244,58 @@ Entry-shape contract: [`docs/contracts/CHANGELOG-conventions.md`](docs/contracts
|
|
|
244
244
|
> that forces a new era split (`# Era: 9.11.x`, etc.) — see
|
|
245
245
|
> [`docs/contracts/CHANGELOG-conventions.md § Era splits`](docs/contracts/CHANGELOG-conventions.md).
|
|
246
246
|
|
|
247
|
+
## [9.12.0](https://github.com/event4u-app/agent-config/compare/9.11.0...9.12.0) (2026-08-01)
|
|
248
|
+
|
|
249
|
+
### Features
|
|
250
|
+
|
|
251
|
+
* **corpus:** ship the delivery route and the T7 conflict as data ([3f84502](https://github.com/event4u-app/agent-config/commit/3f8450281ded70ada9283ebaf2e72680a37aa21d))
|
|
252
|
+
* **typography:** branch on hosting mode instead of hard-wiring the import ([47385a1](https://github.com/event4u-app/agent-config/commit/47385a1acee8c9876c187b7ead27cdd23d77f025))
|
|
253
|
+
* **design:** make third-party asset delivery self-hosted by default ([dff1a4c](https://github.com/event4u-app/agent-config/commit/dff1a4c9a51f94fd01e186f98c0e9691378e109d))
|
|
254
|
+
* **work-engine:** overlay composition replaces lane choice ([aef95a6](https://github.com/event4u-app/agent-config/commit/aef95a6a397cb064876379d5cdee0895f981726c))
|
|
255
|
+
* **ci:** settle CI after a push, run preflight before one, confine the copy ([aec0115](https://github.com/event4u-app/agent-config/commit/aec011585ab89e7de2a1789cb3fbdfbb47430902))
|
|
256
|
+
* **skills:** ui-apply-generic — the default lane becomes a real executor ([0930705](https://github.com/event4u-app/agent-config/commit/0930705745fda7eae14dc32a271cb41b8177e381))
|
|
257
|
+
* **work-engine:** multi-axis stack detection ([36b33da](https://github.com/event4u-app/agent-config/commit/36b33dac8a67c627b8e6b863889202768fb23e3e))
|
|
258
|
+
* **ci:** fail the build when the installer can reach a module-level process.exit ([a52c2ad](https://github.com/event4u-app/agent-config/commit/a52c2ad087b0ad7b4dc0eed28a91f70174afc04f))
|
|
259
|
+
|
|
260
|
+
### Bug Fixes
|
|
261
|
+
|
|
262
|
+
* **roadmap:** drop an illegal status value from the archived local-ci-trust plan ([c60745e](https://github.com/event4u-app/agent-config/commit/c60745e9cc6e0012437e27849f9e64e5b6368556))
|
|
263
|
+
* **ci:** give release-drift its dependencies so the gate can run at all ([4262f34](https://github.com/event4u-app/agent-config/commit/4262f34df52a9fd092103bdb455b748efa2e5e00))
|
|
264
|
+
* **ci:** make the kernel-prefix gate able to fail, then re-anchor it ([154d366](https://github.com/event4u-app/agent-config/commit/154d36619cac7441c21001fa4c3c1387a54129ce))
|
|
265
|
+
* **design-tokens:** drop the host allow-list that silenced real findings ([4128875](https://github.com/event4u-app/agent-config/commit/4128875432da79e61cc00f7487af09a152c283aa))
|
|
266
|
+
* **skills:** ui-apply-generic ships a consumer-reachable invocation ([98ca19a](https://github.com/event4u-app/agent-config/commit/98ca19aa622582e4c4c85b2d9945030ce038d665))
|
|
267
|
+
* **hooks:** the roadmap gate names its real cause ([1a49867](https://github.com/event4u-app/agent-config/commit/1a49867b41b6eeaa70b45c3d8479a9d9b1ea2399))
|
|
268
|
+
* **install:** keep the projection CLI out of the consumer installer bundle ([802b8fd](https://github.com/event4u-app/agent-config/commit/802b8fd88f1b1fffddbb0e0040359be50d7f5fd2))
|
|
269
|
+
* **install:** scope rules on the CLI global path, not only in the wizard ([9535c57](https://github.com/event4u-app/agent-config/commit/9535c574be9b07801b0721e2625e1bff2cdb2bc2))
|
|
270
|
+
|
|
271
|
+
### Documentation
|
|
272
|
+
|
|
273
|
+
* **roadmap:** pre-registration covers the inputs, not only the scoring ([ca90448](https://github.com/event4u-app/agent-config/commit/ca904481823ceed9590f71b685e1621447edacec))
|
|
274
|
+
* **roadmap:** unblock the UI measurements — bench:ui as the port verify stage ([cf9fbf4](https://github.com/event4u-app/agent-config/commit/cf9fbf4ce708d19f679b427aa3856d738cb76bff))
|
|
275
|
+
* **adr:** record one owner for third-party webfont delivery ([dd20e14](https://github.com/event4u-app/agent-config/commit/dd20e148290ecbcad5ba5ac9915c1b5c927dfdce))
|
|
276
|
+
* **roadmap:** merge the coverage benchmark into the tier follow-up ([d08f464](https://github.com/event4u-app/agent-config/commit/d08f46499eeb26af423cd7ae8f34a07cf8a7e9f0))
|
|
277
|
+
* **roadmap:** artefact-count reproducibility as a draft candidate ([850e2c6](https://github.com/event4u-app/agent-config/commit/850e2c689579187b64a481feb2988c2a927d4130))
|
|
278
|
+
* **roadmap:** universal stack coverage — refusal is not coverage ([0bdc726](https://github.com/event4u-app/agent-config/commit/0bdc726ee1ba3a30ff9196e659c14ecce87e12b8))
|
|
279
|
+
* **roadmap:** close road-to-consistent-rule-scoping with its execution notes ([4ca0640](https://github.com/event4u-app/agent-config/commit/4ca0640b30dff0f3a4059083c577622fbb4bbc23))
|
|
280
|
+
|
|
281
|
+
### Tests
|
|
282
|
+
|
|
283
|
+
* **work-engine:** baseline the shapes the flat stack label cannot express ([337e4ff](https://github.com/event4u-app/agent-config/commit/337e4ff5eff91439b72a01095329770f6e85eb69))
|
|
284
|
+
* **install:** pin the CLI global deploy against the wizard plan ([5fa64a3](https://github.com/event4u-app/agent-config/commit/5fa64a363cd1d38976cd4ba6583ea1ce90b81238))
|
|
285
|
+
|
|
286
|
+
### Build
|
|
287
|
+
|
|
288
|
+
* **install:** refresh the tracked dist/install output for the wizard-plan change ([a2690f3](https://github.com/event4u-app/agent-config/commit/a2690f3f1b9b123f00f505c12f9c9a68d16d2d14))
|
|
289
|
+
|
|
290
|
+
### Chores
|
|
291
|
+
|
|
292
|
+
* **funding:** add the sponsor button and say plainly what it is ([a219af6](https://github.com/event4u-app/agent-config/commit/a219af6f68d0fa82291272a726ed81dd2331a7e5))
|
|
293
|
+
* **roadmaps:** archive road-to-webfont-delivery-ownership ([ebfa91d](https://github.com/event4u-app/agent-config/commit/ebfa91dffd260db55d187a71b7c8144eb574596c))
|
|
294
|
+
* **roadmaps:** regenerate the dashboard after the merge ([82c8a45](https://github.com/event4u-app/agent-config/commit/82c8a45b2b2a3f05da1feaf516b6a448ee73fcfe))
|
|
295
|
+
* **roadmaps:** archive the completed rule-scoping roadmap ([5bedc17](https://github.com/event4u-app/agent-config/commit/5bedc17826d26612d1b7db52ded5d5bd2dd694d5))
|
|
296
|
+
|
|
297
|
+
Tests: 9819 (+77 since 9.11.0)
|
|
298
|
+
|
|
247
299
|
## [9.11.0](https://github.com/event4u-app/agent-config/compare/9.10.0...9.11.0) (2026-07-31)
|
|
248
300
|
|
|
249
301
|
### Features
|
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
[](https://github.com/event4u-app/agent-config/actions/workflows/smoke.yml) [](https://github.com/event4u-app/agent-config/actions/workflows/smoke-public-install.yml) [](https://www.npmjs.com/package/@event4u/agent-config) [](https://glama.ai/mcp/servers/event4u-app/agent-config) [](https://mcptoplist.com/server/glama%2Fevent4u-app%2Fagent-config)
|
|
6
6
|
|
|
7
|
-
[](dist/agent-src/skills/) [](dist/agent-src/rules/) [](dist/agent-src/commands/) [](docs/guidelines/) [](dist/agent-src/personas/) [](dist/agent-src/personas/advisors/)
|
|
8
8
|
|
|
9
9
|
**Try it in 30 seconds** — drop one read-only subagent into any repo and watch it gate "done": `@production-validator check this branch is actually done`. No wizard, no lock-in, nothing else installed — the [30-second wedge ↓](#quickstart) is the whole first step. Start at the proof, not the catalog: **[event4u-app.github.io/agent-config/proof/](https://event4u-app.github.io/agent-config/proof/)**.
|
|
10
10
|
|
|
@@ -612,6 +612,13 @@ the file install. Porting the bash dispatcher to native Windows is
|
|
|
612
612
|
**demand-gated**: a named Windows adopter who cannot use WSL2 or the MCP
|
|
613
613
|
path reopens it (see `agents/roadmaps/` — road-to-credible-install Phase 3).
|
|
614
614
|
|
|
615
|
+
## Funding
|
|
616
|
+
|
|
617
|
+
The package is free, MIT, and stays that way — no paid tier, no dual
|
|
618
|
+
licensing. If it saves you time and you want to chip in, the GitHub Sponsor
|
|
619
|
+
button at the top of the repo is the whole mechanism. If you would rather not,
|
|
620
|
+
use it anyway; nothing here is gated on it.
|
|
621
|
+
|
|
615
622
|
## License
|
|
616
623
|
|
|
617
624
|
[MIT](LICENSE).
|
|
@@ -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
|
|
@@ -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
|
|