@event4u/agent-config 9.33.0 → 9.34.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 (60) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/CHANGELOG.md +85 -167
  3. package/dist/agent-src/commands/agent-handoff.md +15 -3
  4. package/dist/agent-src/scripts/archive_completed_roadmaps.ts +35 -1
  5. package/dist/agent-src/skills/corpus-grounding/SKILL.md +21 -12
  6. package/dist/agent-src/skills/design-tokens/SKILL.md +15 -0
  7. package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +24 -0
  8. package/dist/agent-src/skills/rule-writing/SKILL.md +23 -0
  9. package/dist/agent-src/skills/skill-writing/SKILL.md +80 -2
  10. package/dist/agent-src/skills/systematic-debugging/SKILL.md +5 -3
  11. package/dist/agent-src/skills/tailwind-engineer/SKILL.md +24 -0
  12. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  13. package/dist/cli-delegate/{chunk-2WELHO3P.js → chunk-I5EAFRII.js} +35 -0
  14. package/dist/cli-delegate/{chunk-PMQ6Z3T3.js → chunk-REMEZSVP.js} +9 -2
  15. package/dist/cli-delegate/{chunk-3EWYC3YK.js → chunk-UEZ7D35A.js} +4 -3
  16. package/dist/cli-delegate/cmd_conformance.js +1 -1
  17. package/dist/cli-delegate/cmd_doctor.js +1 -1
  18. package/dist/cli-delegate/cmd_handoff.js +2 -2
  19. package/dist/cli-delegate/cmd_memory_get.js +1 -1
  20. package/dist/cli-delegate/cmd_route_audit.js +1 -1
  21. package/dist/cli-delegate/cmd_session_recycle.js +7 -2
  22. package/dist/discovery/deprecation-report.md +1 -1
  23. package/dist/discovery/discovery-manifest.json +11 -11
  24. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  25. package/dist/discovery/discovery-manifest.summary.md +2 -2
  26. package/dist/discovery/dormancy-report.md +17 -0
  27. package/dist/discovery/orphan-report.md +1 -1
  28. package/dist/discovery/packs.json +3 -3
  29. package/dist/discovery/trust-report.md +1 -1
  30. package/dist/discovery/workspaces.json +3 -3
  31. package/dist/hooks/dispatch.js +96 -7
  32. package/dist/mcp/registry-manifest.json +2 -2
  33. package/dist/mcp/server.json +2 -2
  34. package/dist/mcp/server.mjs +118 -10
  35. package/docs/guidelines/agent-infra/failure-signatures.md +47 -12
  36. package/package.json +2 -2
  37. package/src/agent-src/scripts/archive_completed_roadmaps.ts +35 -1
  38. package/src/config/quorum-attendance-budget.json +1 -1
  39. package/src/scripts/_cli/cmd_session_recycle.ts +6 -1
  40. package/src/scripts/_lib/env_kill_switch.ts +37 -0
  41. package/src/scripts/_lib/security_lint.ts +18 -4
  42. package/src/scripts/_lib/self_repair.ts +60 -0
  43. package/src/scripts/_lib/self_repair_store.ts +65 -5
  44. package/src/scripts/_lib/subagent_capsule.ts +78 -1
  45. package/src/scripts/ai_council/events_log.ts +2 -2
  46. package/src/scripts/ai_council/orchestrator.ts +38 -0
  47. package/src/scripts/ai_council/prompts.ts +165 -3
  48. package/src/scripts/ai_council/quorum.ts +10 -0
  49. package/src/scripts/ai_team/review_gate.ts +2 -2
  50. package/src/scripts/build_discovery_manifest.ts +165 -0
  51. package/src/scripts/check_claims.ts +51 -2
  52. package/src/scripts/ci_time_ratio.ts +3 -1
  53. package/src/scripts/discovery_graph.ts +201 -27
  54. package/src/scripts/dispatch_r2_reviewer.ts +102 -1
  55. package/src/scripts/lint_handoffs.ts +92 -2
  56. package/src/scripts/lint_hedge_words.ts +317 -0
  57. package/src/scripts/lint_mcp_config_security.ts +1 -1
  58. package/src/scripts/lint_skill_frontmatter_safety.ts +1 -1
  59. package/src/scripts/self_repair_cli.ts +26 -1
  60. package/src/scripts/skill_linter.ts +58 -2
@@ -530,7 +530,7 @@ tool skill*, **never** a new skill per pitfall and never a generated grid (see
530
530
  [`size-enforcement`](../../rules/size-enforcement.md) § Per-tool pitfall
531
531
  content).
532
532
 
533
- ## Rationalizations-to-reject section (required, security-stop-routed skills)
533
+ ## Rationalizations-to-reject section (recommended pattern, security-stop-routed skills)
534
534
 
535
535
  A skill routed by `security-sensitive-stop` already carries a forbidden-moves or
536
536
  failure-mode list. Those describe **what is wrong**. They do not answer the
@@ -553,7 +553,7 @@ the skip actually happens.
553
553
  Keep it to the arguments that have really been made. An invented rationalization
554
554
  teaches nothing and dilutes the ones that recur.
555
555
 
556
- ## Non-negotiable-deliverable section (required, adjacent-technology clusters)
556
+ ## Non-negotiable-deliverable section (recommended pattern, adjacent-technology clusters)
557
557
 
558
558
  Some skills sit next to a technology that is a *tempting wrong answer* — close
559
559
  enough to look interchangeable, different enough that picking it silently loses
@@ -644,6 +644,84 @@ This duplicates the rules on purpose, and the duplication is the point: the
644
644
  rules are the enforcement, the section is what survives the artifact leaving
645
645
  their reach.
646
646
 
647
+ ## Mechanism-teaching section (optional pattern, skills whose subject has one)
648
+
649
+ A procedure tells the agent what to do in the cases you thought of. A
650
+ **mechanism** tells it why those steps work, which is the only thing that
651
+ transfers to the case you did not. Where a skill's subject has a mechanism worth
652
+ one screen — how the cascade resolves, why the queue drops the message, what the
653
+ scheduler actually orders — state it in a `## How it works` section, ahead of the
654
+ procedure that depends on it.
655
+
656
+ Keep it to one screen and to mechanisms only: no history, no alternatives-considered,
657
+ no restating the procedure in prose. If it takes more than a screen, the skill is
658
+ carrying a guideline's worth of material and should point at one instead.
659
+
660
+ The test for whether it earns its place: name a plausible situation the procedure
661
+ does not cover, and check whether this section is enough to answer it. If the
662
+ answer is still "read the source", the section is decoration.
663
+
664
+ Optional, and it gets no gate: "teaches a mechanism" is a prose judgement, and a
665
+ predicate over prose is the false-positive class this file's other patterns avoid.
666
+
667
+ ## Illustrative-not-verbatim marker (optional pattern, reference code)
668
+
669
+ A code block in a skill is read as copy-me by default. When a block is teaching a
670
+ *shape* — a signature to mirror, a structure to follow, pseudocode standing in for
671
+ the real call — say so on the line above it:
672
+
673
+ ```
674
+ <!-- illustrative: shape only, not a working snippet -->
675
+ ```
676
+
677
+ One line, immediately above the fence, in the skill's own words if you prefer.
678
+ What matters is that the reader can tell shape-teaching code from code that runs,
679
+ because the failure mode is silent: an agent pastes the illustration, it almost
680
+ works, and the debugging starts from the wrong premise.
681
+
682
+ The inverse deserves the same care — a block that IS meant to be run verbatim,
683
+ where a reader might assume otherwise, says so too. See also `### 4. Add
684
+ safe/unsafe example`, which governs a different axis: safe-vs-unsafe, not
685
+ runnable-vs-illustrative.
686
+
687
+ ## Headline metric + closing report (optional pattern, optimization skills)
688
+
689
+ A skill whose job is to make something better — smaller, faster, cheaper, quieter
690
+ — has to say **which single number it moves**. Without one, "optimized" is a
691
+ claim nobody can check and every run reports success.
692
+
693
+ So an optimization skill names, up front:
694
+
695
+ 1. **The headline metric.** One number, with its unit and how it is measured.
696
+ "Initial-context tokens, measured by `audit-tokens`" — not "context cost".
697
+ 2. **The closing report shape.** Before, after, delta, and the command that
698
+ produced both. The same command for both readings, or the delta is not a delta.
699
+
700
+ State what the metric does **not** capture, in one line. An optimization that
701
+ moves the headline number by degrading something it does not measure is the
702
+ failure this pattern exists to make visible, and only the author knows where that
703
+ edge is.
704
+
705
+ ## Contrastive-example slot (optional pattern, authoring and behaviour skills)
706
+
707
+ Where a skill's guidance is easy to agree with and hard to apply — tone, phrasing,
708
+ question shape, what counts as evidence — a wrong/right pair does what prose
709
+ cannot: it shows the near-miss. Six live corpora already carry them:
710
+ [`direct-answers-demos`](../../../docs/guidelines/agent-infra/direct-answers-demos.md),
711
+ [`asking-and-brevity-examples`](../../../docs/guidelines/agent-infra/asking-and-brevity-examples.md),
712
+ [`language-and-tone-examples`](../../../docs/guidelines/agent-infra/language-and-tone-examples.md),
713
+ and `autonomy-examples` / `interrupt-examples` / `cheap-question-mechanics` under
714
+ `src/agent-src/contexts/execution/`.
715
+
716
+ Follow one of those rather than inventing a format. The shape they share: the
717
+ **wrong** version first, in the form it actually gets written; the **right**
718
+ version second; and one line of **why** — which is the load-bearing part, because
719
+ a pair without it teaches the specific case and not the rule.
720
+
721
+ Put the corpus in a guideline or context file and point at it from the skill when
722
+ it outgrows a section. A near-miss corpus is reference material read on demand,
723
+ not always-loaded prose.
724
+
647
725
  ## Do NOT
648
726
 
649
727
  * Write documentation-style, pointer-only, or too-broad skills ("Laravel skill", "Django skill")
@@ -222,10 +222,12 @@ right line beats five minutes of IDE breakpoints.
222
222
 
223
223
  **Known failure signature?** If the symptom has a recognisable shape — a
224
224
  tool/agent loop, HTTP 429, `ECONNREFUSED`, `ENOENT`, timeout/hang, OOM, flaky
225
- test, or works-locally-fails-in-CI — consult the symptom → cause → first-check
225
+ test, works-locally-fails-in-CI, or repeated attempts at a tool that is not
226
+ available — consult the symptom → cause → first-check
226
227
  lookup in [`failure-signatures`](../../../docs/guidelines/agent-infra/failure-signatures.md)
227
- to shortcut Phase 2 (Isolate) with the highest-probability first check. It
228
- supplements the loop; it does not replace it.
228
+ to shortcut Phase 2 (Isolate) with the highest-probability first check. Each row
229
+ carries a stable id you can cite, and a discrimination drill that produces its
230
+ documented symptom. It supplements the loop; it does not replace it.
229
231
 
230
232
  ## Condition-based waiting (intermittent bugs)
231
233
 
@@ -157,8 +157,32 @@ Risks: <arbitrary values, !important, dark-mode gaps>
157
157
 
158
158
  When `DESIGN.md` declares `## Taste Dials`, honour them: Variance → layout-family spread + asymmetry tolerance; Motion → animation budget + reduced-motion posture; Density → spacing scale + information-per-viewport. Absent → follow the design brief's inferred dials.
159
159
 
160
+ ## Security constraints
161
+
162
+ `scripts/tailwind_config_gen.ts` is the only shipped script.
163
+
164
+ - **What it may touch** — exactly one file: `--output PATH`, or
165
+ `tailwind.config.ts` / `.js` in the current working directory when no
166
+ `--output` is given. It reads nothing from the project.
167
+ - **What it must never do** — write anywhere other than that one path,
168
+ reach the network, or spawn a subprocess. It does none of these.
169
+ - **Default invocation** — **mutating**, and stated here because it is a
170
+ real exception rather than a comfortable one: a bare invocation writes
171
+ `tailwind.config.ts` into `cwd`, overwriting an existing config without
172
+ prompting. `--validate-only` is the read-only path — it prints the
173
+ generated config to stdout and writes nothing. Run `--validate-only`
174
+ first, and pass `--output` when the target is not the cwd default.
175
+ This default contradicts `skill-writing`'s "never mutate on a bare
176
+ invocation" line; it is recorded rather than silently tolerated, and
177
+ changing the script's default is a caller-visible behaviour change that
178
+ belongs in its own change, not here.
179
+ - **Outbound** — nothing. No network access.
180
+
160
181
  ## Do NOT
161
182
 
183
+ - Do NOT run `tailwind_config_gen` bare in a project that already has a
184
+ `tailwind.config.*` — it overwrites without asking. Use
185
+ `--validate-only` first, then `--output` at the intended path.
162
186
  - Do NOT add `!important` to win a specificity fight; restructure
163
187
  the cascade or extract the conflicting style.
164
188
  - Do NOT introduce a new colour outside `tailwind.config` without
@@ -39,7 +39,7 @@ schema_version: 1
39
39
  # CI guard: a release bump of `package.json` must update this value
40
40
  # in lockstep — see scripts/check_template_pin_drift.ts (road-to-
41
41
  # portable-runtime-and-update-check P3.3).
42
- agent_config_version: "9.33.0"
42
+ agent_config_version: "9.34.0"
43
43
 
44
44
  # --- Project identity ---
45
45
  project:
@@ -449,6 +449,38 @@ function hasBoundaryMarker(block) {
449
449
  // outside the datamarking while still riding in the same block.
450
450
  block.trimEnd().endsWith(ENVELOPE_BOUNDARY_CLOSE);
451
451
  }
452
+ var DECISION_REVERSIBILITY_TAGS = ["reversible", "irreversible"];
453
+ function decisionTagErrors(decisions) {
454
+ if (!Array.isArray(decisions)) {
455
+ return [];
456
+ }
457
+ const errors = [];
458
+ for (const line of decisions) {
459
+ if (typeof line !== "string") {
460
+ continue;
461
+ }
462
+ const m = /\[([^\]]*)\]\s*$/.exec(line.trimEnd());
463
+ if (m === null) {
464
+ continue;
465
+ }
466
+ const inner = (m[1] ?? "").trim();
467
+ const lowered = inner.toLowerCase();
468
+ if (DECISION_REVERSIBILITY_TAGS.includes(lowered)) {
469
+ if (inner !== lowered) {
470
+ errors.push(
471
+ `decisions: reversibility tag must be lower-case \u2014 got \`[${inner}]\`, expected \`[${lowered}]\``
472
+ );
473
+ }
474
+ continue;
475
+ }
476
+ if (/^i?rr?ever[a-z]*[^a-z]*$/i.test(lowered)) {
477
+ errors.push(
478
+ `decisions: \`[${inner}]\` is not a reversibility tag \u2014 use exactly ` + DECISION_REVERSIBILITY_TAGS.map((t) => `\`[${t}]\``).join(" or ") + ", or drop the bracket"
479
+ );
480
+ }
481
+ }
482
+ return errors;
483
+ }
452
484
  var RECYCLE_ENVELOPE_KEYS = /* @__PURE__ */ new Set([
453
485
  "capsule_version",
454
486
  "variant",
@@ -461,6 +493,7 @@ var RECYCLE_ENVELOPE_KEYS = /* @__PURE__ */ new Set([
461
493
  "not_carried_forward",
462
494
  "decisions",
463
495
  "constraints",
496
+ "do_not_touch",
464
497
  "open_worker_envelopes",
465
498
  "artifact_paths",
466
499
  "assumptions",
@@ -513,7 +546,9 @@ function validateRecycleEnvelope(input) {
513
546
  checkList(errors, "remaining", e["remaining"], MAX_LINE_CHARS, true);
514
547
  checkList(errors, "not_carried_forward", e["not_carried_forward"], MAX_LINE_CHARS, true);
515
548
  checkList(errors, "decisions", e["decisions"], MAX_LINE_CHARS, false);
549
+ errors.push(...decisionTagErrors(e["decisions"]));
516
550
  checkList(errors, "constraints", e["constraints"], MAX_LINE_CHARS, false);
551
+ checkList(errors, "do_not_touch", e["do_not_touch"], MAX_REF_CHARS, false);
517
552
  checkList(errors, "open_worker_envelopes", e["open_worker_envelopes"], MAX_REF_CHARS, false);
518
553
  checkList(errors, "artifact_paths", e["artifact_paths"], MAX_REF_CHARS, false);
519
554
  checkList(errors, "suggested_skills", e["suggested_skills"], MAX_REF_CHARS, false);
@@ -1622,6 +1622,14 @@ import * as crypto from "node:crypto";
1622
1622
  import * as fs7 from "node:fs";
1623
1623
  import * as path10 from "node:path";
1624
1624
  import { fileURLToPath as fileURLToPath5 } from "node:url";
1625
+
1626
+ // src/scripts/_lib/env_kill_switch.ts
1627
+ var _OFF_VALUES = /* @__PURE__ */ new Set(["", "0", "false", "False"]);
1628
+ function isEnvKillSwitchActive(name) {
1629
+ return !_OFF_VALUES.has(process.env[name] ?? "");
1630
+ }
1631
+
1632
+ // src/scripts/ai_council/events_log.ts
1625
1633
  var SCHEMA_VERSION = 2;
1626
1634
  var _VALID_ACTIONS = /* @__PURE__ */ new Set([
1627
1635
  "proceed",
@@ -1690,8 +1698,7 @@ function _utf8Bytes(cp) {
1690
1698
  );
1691
1699
  }
1692
1700
  function _kill_switch_active() {
1693
- const value = process.env[_KILL_SWITCH_ENV] ?? "";
1694
- return !(value === "" || value === "0" || value === "false" || value === "False");
1701
+ return isEnvKillSwitchActive(_KILL_SWITCH_ENV);
1695
1702
  }
1696
1703
  function appendEvent(event, opts = {}) {
1697
1704
  if (_kill_switch_active()) {
@@ -271,7 +271,7 @@ function* iter_corpus(roots = DEFAULT_SCAN_ROOTS, exts = [".md"]) {
271
271
  function report(findings, opts) {
272
272
  const check_label = opts.check_label;
273
273
  if (findings.length === 0) {
274
- process.stdout.write(`\u2705 ${check_label}: clean (${_corpus_note()}).
274
+ process.stdout.write(`\u2705 ${check_label}: clean (${_corpus_note(opts.scanned_roots)}).
275
275
  `);
276
276
  return 0;
277
277
  }
@@ -311,8 +311,9 @@ function _pyG(n) {
311
311
  }
312
312
  return s;
313
313
  }
314
- function _corpus_note() {
315
- return "scanned " + DEFAULT_SCAN_ROOTS.join(", ");
314
+ function _corpus_note(scanned_roots) {
315
+ const roots = scanned_roots && scanned_roots.length > 0 ? scanned_roots : DEFAULT_SCAN_ROOTS;
316
+ return "scanned " + roots.join(", ");
316
317
  }
317
318
  var PyFloat = class {
318
319
  constructor(value) {
@@ -19,7 +19,7 @@ import {
19
19
  frontmatterPaths,
20
20
  proseEqual,
21
21
  splitFrontmatter
22
- } from "./chunk-PMQ6Z3T3.js";
22
+ } from "./chunk-REMEZSVP.js";
23
23
  import "./chunk-FTAISGDQ.js";
24
24
  import {
25
25
  atomic_write_json,
@@ -66,7 +66,7 @@ import {
66
66
  _wizard_state_path,
67
67
  main,
68
68
  shutilWhich
69
- } from "./chunk-PMQ6Z3T3.js";
69
+ } from "./chunk-REMEZSVP.js";
70
70
  import "./chunk-FTAISGDQ.js";
71
71
  import "./chunk-EJITJBJX.js";
72
72
  import "./chunk-Q26HT4QT.js";
@@ -15,8 +15,8 @@ import {
15
15
  scanEnvelopeDirectives,
16
16
  validateRecycleEnvelope,
17
17
  wrapAsPriorSessionData
18
- } from "./chunk-2WELHO3P.js";
19
- import "./chunk-3EWYC3YK.js";
18
+ } from "./chunk-I5EAFRII.js";
19
+ import "./chunk-UEZ7D35A.js";
20
20
  import {
21
21
  readHookStdin
22
22
  } from "./chunk-MMJL4TIX.js";
@@ -2,7 +2,7 @@
2
2
  import { createRequire as __acCreateRequire } from 'node:module'; const require = globalThis.require ?? __acCreateRequire(import.meta.url);
3
3
  import {
4
4
  memory_get_v1
5
- } from "./chunk-3EWYC3YK.js";
5
+ } from "./chunk-UEZ7D35A.js";
6
6
  import "./chunk-OY53J6II.js";
7
7
  import "./chunk-J55WI3RR.js";
8
8
 
@@ -3,7 +3,7 @@ import { createRequire as __acCreateRequire } from 'node:module'; const require
3
3
  import {
4
4
  read_entries
5
5
  } from "./chunk-QEEB4LHO.js";
6
- import "./chunk-3EWYC3YK.js";
6
+ import "./chunk-UEZ7D35A.js";
7
7
  import "./chunk-MMJL4TIX.js";
8
8
  import {
9
9
  match_prompt
@@ -5,7 +5,7 @@ import {
5
5
  RECYCLE_ENVELOPE_REL,
6
6
  collectGrounding,
7
7
  validateRecycleEnvelope
8
- } from "./chunk-2WELHO3P.js";
8
+ } from "./chunk-I5EAFRII.js";
9
9
  import {
10
10
  atomic_write_json
11
11
  } from "./chunk-EJITJBJX.js";
@@ -30,8 +30,13 @@ function templateEnvelope() {
30
30
  acceptance_criteria: ["<what done means, one line each>"],
31
31
  remaining: ["<open work, one line each>"],
32
32
  not_carried_forward: ["<what the successor must re-derive from source>"],
33
- decisions: ["<decision \u2014 one-line rationale>"],
33
+ decisions: ["<decision \u2014 one-line rationale> [reversible]"],
34
34
  constraints: ["<binding constraint>"],
35
+ // Ships EMPTY, unlike the prose lists above: the entries are path refs,
36
+ // and a `<placeholder>` left in by a hurried writer would be a fake path
37
+ // rather than obvious filler. An empty list is also the honest default —
38
+ // nothing off limits is the common case.
39
+ do_not_touch: [],
35
40
  open_worker_envelopes: [],
36
41
  artifact_paths: ["<path to a deliverable / note / evidence file>"],
37
42
  assumptions: [],
@@ -1,6 +1,6 @@
1
1
  # Discovery — Deprecation Report
2
2
 
3
- - Generated: `2026-08-11T05:16:25Z`
3
+ - Generated: `2026-08-11T20:26:09Z`
4
4
  - Deprecated artefacts: **0**
5
5
 
6
6
  _None. Tree is clean._
@@ -2573,7 +2573,7 @@
2573
2573
  },
2574
2574
  {
2575
2575
  "category": "command",
2576
- "checksum": "sha256:b718faefe3c50937e0b4851d26086d9aa8a9573c74e3e9fd371d2d0935acaa02",
2576
+ "checksum": "sha256:0181143b6ba9ee8ed18fc3069d175e1702a5a8b36bf9694fa4a07f7c98f52ca5",
2577
2577
  "install": {
2578
2578
  "default": true,
2579
2579
  "removable": false
@@ -9271,7 +9271,7 @@
9271
9271
  },
9272
9272
  {
9273
9273
  "category": "skill",
9274
- "checksum": "sha256:bae8a558172e50ef861a1e8e0132d24e2c52c4ac136b3c7562735b92c4d6d04d",
9274
+ "checksum": "sha256:f7a67c0b8382e292ed0e98d36e683644c66b8291f404f75d321a89aed7574ae3",
9275
9275
  "install": {
9276
9276
  "default": true,
9277
9277
  "removable": true
@@ -9645,7 +9645,7 @@
9645
9645
  },
9646
9646
  {
9647
9647
  "category": "skill",
9648
- "checksum": "sha256:169fed9cc69e866501e9f8e4423aa7226cb92c0c0380a20a6f4d5a4f32ec6925",
9648
+ "checksum": "sha256:7d2f4b3b162943305cf64778e2e63b67331f7861bf0e2eec392293e9579445d8",
9649
9649
  "install": {
9650
9650
  "default": true,
9651
9651
  "removable": true
@@ -12775,7 +12775,7 @@
12775
12775
  },
12776
12776
  {
12777
12777
  "category": "skill",
12778
- "checksum": "sha256:085ad155c77608b45ad63c5ebcfb3e08b2d7d6e69bd0d938860fe2f19eb245f0",
12778
+ "checksum": "sha256:d547a77483a8022c0a61d7efcb254e287e966ff4bf942e0155ca41824859a130",
12779
12779
  "install": {
12780
12780
  "default": false,
12781
12781
  "removable": true
@@ -13237,7 +13237,7 @@
13237
13237
  },
13238
13238
  {
13239
13239
  "category": "skill",
13240
- "checksum": "sha256:671eb67f32df15e5a7a8e937ca694da71fd325a62e1303b57fdcc05899458514",
13240
+ "checksum": "sha256:e0d38b712e69fa5f9bb8fe0ec9d8ba1020c2a45e0502e32a915259091e612a82",
13241
13241
  "install": {
13242
13242
  "default": true,
13243
13243
  "removable": false
@@ -13589,7 +13589,7 @@
13589
13589
  },
13590
13590
  {
13591
13591
  "category": "skill",
13592
- "checksum": "sha256:b2e8847e0acb03cad8c71f095d29d311ee76b4a11760ab9b21c5b07797b955df",
13592
+ "checksum": "sha256:1a3c1965abf5ebfbeac3b17142c0bc84a955156ea8fa2928c048aeb540ce8ff1",
13593
13593
  "install": {
13594
13594
  "default": true,
13595
13595
  "removable": false
@@ -13809,7 +13809,7 @@
13809
13809
  },
13810
13810
  {
13811
13811
  "category": "skill",
13812
- "checksum": "sha256:c8b5af3f19e2c2de1b88a7ce140aa681f09006a2f44290303f709eb7bc1ba9cc",
13812
+ "checksum": "sha256:1d7259677165ad794e4f16d652830d937ce21f56dbfc0aa440869163f3259792",
13813
13813
  "install": {
13814
13814
  "default": true,
13815
13815
  "removable": false
@@ -13831,7 +13831,7 @@
13831
13831
  },
13832
13832
  {
13833
13833
  "category": "skill",
13834
- "checksum": "sha256:47ca9fbe052b2046cc1897cf20cd52352de7ad557f7f1eed4d842f9291c53963",
13834
+ "checksum": "sha256:89e099d1d527ed2000dd3bbe43dddac623487b6f75b08f4fb0a6b9c3ec39dfb8",
13835
13835
  "install": {
13836
13836
  "default": true,
13837
13837
  "removable": false
@@ -14486,7 +14486,7 @@
14486
14486
  "workspaces": []
14487
14487
  }
14488
14488
  ],
14489
- "checksum": "sha256:1a5894344548cfa9a3a79726d9063c47af89da73892e847856ca4748dad6550f",
14489
+ "checksum": "sha256:578a1ff7f0b187812c772bce1b731880d7bca27d0f84a864a00b493e857fa21e",
14490
14490
  "deprecations": [
14491
14491
  {
14492
14492
  "key": "tier",
@@ -14629,7 +14629,7 @@
14629
14629
  "reason": "scaffold template for ticket-bundle tickets (ADR-101); carries no runtime frontmatter — emit-tickets fills it in per ticket"
14630
14630
  }
14631
14631
  ],
14632
- "generated_at": "2026-08-11T05:16:25Z",
14632
+ "generated_at": "2026-08-11T20:26:09Z",
14633
14633
  "packs": [
14634
14634
  {
14635
14635
  "artefact_count": 118,
@@ -15482,7 +15482,7 @@
15482
15482
  ]
15483
15483
  }
15484
15484
  ],
15485
- "scanner_version": "c24312e116f8",
15485
+ "scanner_version": "1eaf68b6e9c9",
15486
15486
  "stats": {
15487
15487
  "by_category": {
15488
15488
  "command": 196,
@@ -1 +1 @@
1
- efd249af793682a1fa9969433c123c923e08e1eee8394865bb93a7c875c7cbec discovery-manifest.json
1
+ 82fbc2b79bb7b97c663111542bbfdd08c3c798e17c6f992e19689a71c4d7403c discovery-manifest.json
@@ -1,7 +1,7 @@
1
1
  # Discovery Manifest — Summary
2
2
 
3
- - Generated: `2026-08-11T05:16:25Z`
4
- - Scanner: `c24312e116f8`
3
+ - Generated: `2026-08-11T20:26:09Z`
4
+ - Scanner: `1eaf68b6e9c9`
5
5
  - Artefacts: **603**
6
6
  - Unassigned: **0**
7
7
 
@@ -0,0 +1,17 @@
1
+ # Discovery — Dormancy Report
2
+
3
+ - Generated: `2026-08-11T20:26:09Z`
4
+ - Window: **6 months** without a commit
5
+
6
+ > Dormancy triggers **review, never auto-deprecation**
7
+ > (`docs/governance.md` § Skill lifecycle policy). A finished artefact and an
8
+ > abandoned one look identical from commit dates, so this is a prompt to ask
9
+ > "still earning its slot?" — never a removal list, and never a gate.
10
+
11
+ ## Signal unavailable
12
+
13
+ **No dormancy list is published**: shallow clone — a truncated history is indistinguishable from a dormant artefact. Re-run after `git fetch --unshallow`.
14
+
15
+ An empty section here would read as "nothing is dormant", which is a
16
+ different claim from "the signal could not be computed".
17
+
@@ -1,6 +1,6 @@
1
1
  # Discovery — Orphan Report
2
2
 
3
- - Generated: `2026-08-11T05:16:25Z`
3
+ - Generated: `2026-08-11T20:26:09Z`
4
4
  - Orphan artefacts: **0**
5
5
 
6
6
  > An orphan is an artefact whose declared pack has no other members.
@@ -1,6 +1,6 @@
1
1
  {
2
- "checksum": "sha256:1a5894344548cfa9a3a79726d9063c47af89da73892e847856ca4748dad6550f",
3
- "generated_at": "2026-08-11T05:16:25Z",
2
+ "checksum": "sha256:578a1ff7f0b187812c772bce1b731880d7bca27d0f84a864a00b493e857fa21e",
3
+ "generated_at": "2026-08-11T20:26:09Z",
4
4
  "packs": [
5
5
  {
6
6
  "always_on": false,
@@ -1814,5 +1814,5 @@
1814
1814
  ]
1815
1815
  }
1816
1816
  ],
1817
- "scanner_version": "c24312e116f8"
1817
+ "scanner_version": "1eaf68b6e9c9"
1818
1818
  }
@@ -1,6 +1,6 @@
1
1
  # Discovery — Trust Report
2
2
 
3
- - Generated: `2026-08-11T05:16:25Z`
3
+ - Generated: `2026-08-11T20:26:09Z`
4
4
  - Workspaces tracked: **10**
5
5
  - Human-review-required artefacts: **3**
6
6
 
@@ -1,7 +1,7 @@
1
1
  {
2
- "checksum": "sha256:1a5894344548cfa9a3a79726d9063c47af89da73892e847856ca4748dad6550f",
3
- "generated_at": "2026-08-11T05:16:25Z",
4
- "scanner_version": "c24312e116f8",
2
+ "checksum": "sha256:578a1ff7f0b187812c772bce1b731880d7bca27d0f84a864a00b493e857fa21e",
3
+ "generated_at": "2026-08-11T20:26:09Z",
4
+ "scanner_version": "1eaf68b6e9c9",
5
5
  "workspaces": [
6
6
  {
7
7
  "artefact_count": 202,