@event4u/agent-config 14.1.0 → 14.4.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 (120) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/CHANGELOG.md +291 -181
  3. package/agents/templates/.ai-council.yml.example +35 -0
  4. package/dist/agent-src/contexts/execution/roadmap-process-loop.md +83 -12
  5. package/dist/agent-src/rules/roadmap-progress-sync.md +48 -4
  6. package/dist/agent-src/scripts/resume_probe.ts +154 -9
  7. package/dist/agent-src/scripts/roadmap_gates.ts +210 -6
  8. package/dist/agent-src/skills/roadmap-management/SKILL.md +9 -4
  9. package/dist/agent-src/templates/agent-settings.md +70 -0
  10. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  11. package/dist/agent-src/templates/scripts/telemetry/remote.ts +571 -0
  12. package/dist/agent-src/templates/scripts/telemetry/settings.ts +222 -44
  13. package/dist/cli/python/workspace_drive.js +8 -3
  14. package/dist/cli/python/workspace_drive.js.map +1 -1
  15. package/dist/cli/python/workspace_hosts.js +16 -12
  16. package/dist/cli/python/workspace_hosts.js.map +1 -1
  17. package/dist/cli/registry.js +2 -0
  18. package/dist/cli/registry.js.map +1 -1
  19. package/dist/cli-delegate/{chunk-F3YUF7SA.js → chunk-3UCJWMMP.js} +1 -1
  20. package/dist/cli-delegate/chunk-F7DQWYR5.js +69 -0
  21. package/dist/cli-delegate/{chunk-7PZ4FSZB.js → chunk-FBKL6JWT.js} +61 -2
  22. package/dist/cli-delegate/{chunk-MNWRDMR5.js → chunk-PKOBQADP.js} +1 -1
  23. package/dist/cli-delegate/cmd_conformance.js +26 -11
  24. package/dist/cli-delegate/cmd_doctor.js +2 -2
  25. package/dist/cli-delegate/cmd_handoff.js +3 -3
  26. package/dist/cli-delegate/cmd_route_audit.js +2 -2
  27. package/dist/cli-delegate/cmd_settings_set.js +17 -3
  28. package/dist/discovery/deprecation-report.md +1 -1
  29. package/dist/discovery/discovery-manifest.json +4 -4
  30. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  31. package/dist/discovery/discovery-manifest.summary.md +1 -1
  32. package/dist/discovery/dormancy-report.md +1 -1
  33. package/dist/discovery/orphan-report.md +1 -1
  34. package/dist/discovery/packs.json +2 -2
  35. package/dist/discovery/trust-report.md +1 -1
  36. package/dist/discovery/workspaces.json +2 -2
  37. package/dist/hooks/dispatch.js +3773 -1731
  38. package/dist/mcp/registry-manifest.json +2 -2
  39. package/dist/mcp/server.json +2 -2
  40. package/dist/mcp/server.mjs +1070 -408
  41. package/dist/scripts/_lib/host_launch.js +66 -0
  42. package/dist/scripts/_lib/host_launch.js.map +1 -0
  43. package/dist/server/io/yamlIO.js +175 -3
  44. package/dist/server/io/yamlIO.js.map +1 -1
  45. package/dist/server/routes/wizard.js +20 -1
  46. package/dist/server/routes/wizard.js.map +1 -1
  47. package/dist/shared/settingsConsent.js +25 -0
  48. package/dist/shared/settingsConsent.js.map +1 -1
  49. package/docs/contracts/settings-classes.md +11 -0
  50. package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +2 -1
  51. package/package.json +1 -1
  52. package/src/agent-src/scripts/resume_probe.ts +154 -9
  53. package/src/agent-src/scripts/roadmap_gates.ts +210 -6
  54. package/src/agent-src/templates/scripts/telemetry/remote.ts +571 -0
  55. package/src/agent-src/templates/scripts/telemetry/settings.ts +222 -44
  56. package/src/config/estate-count-budget.json +120 -0
  57. package/src/config/evaluator-budgets.json +4 -4
  58. package/src/config/gate-coverage.yml +32 -4
  59. package/src/config/gate-violation-baselines.json +63 -63
  60. package/src/config/gitignore-block.txt +5 -0
  61. package/src/config/hook-latency-budget.json +40 -1
  62. package/src/config/hook-token-budget.json +22 -0
  63. package/src/config/rule-stub-ceilings.json +11 -3
  64. package/src/scripts/_dispatch.bash +42 -1
  65. package/src/scripts/_lib/council_fallback_posture.ts +81 -0
  66. package/src/scripts/_lib/council_fallback_wiring.ts +126 -0
  67. package/src/scripts/_lib/council_settings_block.ts +152 -0
  68. package/src/scripts/_lib/headless_invocation.ts +285 -0
  69. package/src/scripts/_lib/host_launch.ts +72 -0
  70. package/src/scripts/_lib/map_to_object.ts +16 -0
  71. package/src/scripts/_lib/roadmap_checkboxes.ts +88 -0
  72. package/src/scripts/_lib/run_checkpoint.ts +409 -0
  73. package/src/scripts/_lib/session_register.ts +32 -1
  74. package/src/scripts/_lib/skill_catalogue_series.ts +91 -0
  75. package/src/scripts/_lib/stdin.ts +35 -1
  76. package/src/scripts/_lib/turn_end_refusals.ts +12 -4
  77. package/src/scripts/_lib/unattended_guard.ts +371 -0
  78. package/src/scripts/ai_council/config.ts +27 -1
  79. package/src/scripts/ai_council/events_log.ts +12 -1
  80. package/src/scripts/ai_council/fallback_config.ts +114 -0
  81. package/src/scripts/ai_council/mid_flight_fallback.ts +295 -0
  82. package/src/scripts/ai_council/orchestrator.ts +251 -292
  83. package/src/scripts/ai_council/py_parity.ts +139 -0
  84. package/src/scripts/ai_council/response_render.ts +99 -0
  85. package/src/scripts/ai_council/spend_gate.ts +123 -0
  86. package/src/scripts/ai_council/transport_resolver.ts +81 -13
  87. package/src/scripts/bench_hook_injection.ts +100 -6
  88. package/src/scripts/bench_hook_latency.ts +442 -16
  89. package/src/scripts/check_estate_count.ts +924 -0
  90. package/src/scripts/compile_hook_manifest.ts +67 -0
  91. package/src/scripts/council_cli.ts +100 -125
  92. package/src/scripts/decision_memo.ts +325 -0
  93. package/src/scripts/dispatch_r2_reviewer.ts +169 -15
  94. package/src/scripts/hook_manifest.json +1 -0
  95. package/src/scripts/hook_manifest.yaml +172 -25
  96. package/src/scripts/hooks/concern_registry.ts +6 -0
  97. package/src/scripts/hooks/dispatch_hook.ts +183 -10
  98. package/src/scripts/hooks/dispatch_issues.ts +26 -0
  99. package/src/scripts/hooks/end_review_nudge_hook.ts +97 -24
  100. package/src/scripts/hooks/hook_stdin.ts +111 -5
  101. package/src/scripts/hooks/injection_budget.ts +595 -0
  102. package/src/scripts/hooks/payload_stub.ts +446 -0
  103. package/src/scripts/hooks/run_continuation_hook.ts +627 -0
  104. package/src/scripts/hooks/session_eol_hook.ts +52 -0
  105. package/src/scripts/hooks/skill_route_hook.ts +172 -11
  106. package/src/scripts/hooks/telemetry_usage_hook.ts +339 -0
  107. package/src/scripts/hooks/tool_result_bytes_hook.ts +27 -0
  108. package/src/scripts/hooks/turn_end_gate_hook.ts +45 -7
  109. package/src/scripts/hooks_doctor.ts +16 -2
  110. package/src/scripts/install-hooks.sh +26 -0
  111. package/src/scripts/interruption_report.ts +330 -13
  112. package/src/scripts/lint_hook_manifest.ts +167 -0
  113. package/src/scripts/roadmap_progress_hook.ts +254 -46
  114. package/src/scripts/run_supervise.ts +623 -0
  115. package/src/scripts/session_register_hook.ts +108 -8
  116. package/src/scripts/sessions_cli.ts +18 -6
  117. package/src/scripts/telemetry_disclosure_hook.ts +244 -0
  118. package/src/server/io/yamlIO.ts +167 -3
  119. package/src/shared/settingsConsent.ts +49 -2
  120. package/dist/cli-delegate/chunk-MMJL4TIX.js +0 -18
@@ -437,7 +437,13 @@ var _VALID_ACTIONS = /* @__PURE__ */ new Set([
437
437
  "proceed",
438
438
  "skip_necessity",
439
439
  "block_quota",
440
- "quorum_result"
440
+ "quorum_result",
441
+ // A seat lost its cli transport mid-pass and was retried on the metered
442
+ // api rung. Without this action, attendance analysis cannot tell a seat
443
+ // SAVED by the fallback from a seat that was natively api all along — the
444
+ // two are indistinguishable in the response set, and only one of them
445
+ // costs money that the operator did not plan.
446
+ "transport_fallback"
441
447
  ]);
442
448
  var _KILL_SWITCH_ENV = "AGENT_CONFIG_NO_EVENTS_LOG";
443
449
  var _HERE = fileURLToPath(import.meta.url);
@@ -2571,6 +2577,42 @@ var import_yaml = __toESM(require_dist(), 1);
2571
2577
  import * as fs4 from "node:fs";
2572
2578
  import * as os2 from "node:os";
2573
2579
  import * as path4 from "node:path";
2580
+
2581
+ // src/scripts/ai_council/fallback_config.ts
2582
+ var SECOND_MODEL_PROVIDERS = /* @__PURE__ */ new Set([
2583
+ "anthropic",
2584
+ "openai",
2585
+ "gemini"
2586
+ ]);
2587
+ function buildFallback(raw, d) {
2588
+ if (!d.isDict(raw)) return { api_on_quota: false };
2589
+ const v = raw["api_on_quota"];
2590
+ if (v === void 0) return { api_on_quota: false };
2591
+ if (!d.isBool(v)) {
2592
+ throw d.error(
2593
+ `\`fallback.api_on_quota\`=${d.repr(v)} must be a boolean (got ${d.typeName(v)}).`
2594
+ );
2595
+ }
2596
+ return { api_on_quota: v };
2597
+ }
2598
+ function buildSecondModel(entry, cls, locked, d) {
2599
+ if (!("second_model" in entry)) return null;
2600
+ if (locked.has(cls)) {
2601
+ throw d.error(
2602
+ `decision_resolution.classes.${cls}.second_model=${d.repr(entry["second_model"])}: a second-model rung is not configurable for high-impact / user-required decisions \u2014 those classes are LOCKED to \`user\` (Iron Law) and never resolve on a model of any kind.`
2603
+ );
2604
+ }
2605
+ const raw = entry["second_model"];
2606
+ if (raw === null) return null;
2607
+ if (!(d.isStr(raw) && SECOND_MODEL_PROVIDERS.has(raw))) {
2608
+ throw d.error(
2609
+ `decision_resolution.classes.${cls}.second_model=${d.repr(raw)} not in ${d.sortedListRepr(SECOND_MODEL_PROVIDERS)} \u2014 the rung must be a provider whose local CLI runs under subscription auth, so a resolution can never become metered USD spend.`
2610
+ );
2611
+ }
2612
+ return raw;
2613
+ }
2614
+
2615
+ // src/scripts/ai_council/config.ts
2574
2616
  var _VALID_PROVIDERS = /* @__PURE__ */ new Set([
2575
2617
  "anthropic",
2576
2618
  "openai",
@@ -2578,6 +2620,15 @@ var _VALID_PROVIDERS = /* @__PURE__ */ new Set([
2578
2620
  "xai",
2579
2621
  "perplexity"
2580
2622
  ]);
2623
+ var _FALLBACK_DEPS = {
2624
+ isDict: _isDict,
2625
+ isBool: _isBool,
2626
+ isStr: _isStr,
2627
+ repr: _pyRepr3,
2628
+ typeName: _pyTypeName,
2629
+ sortedListRepr: _sortedListRepr,
2630
+ error: (msg) => new CouncilConfigError(msg)
2631
+ };
2581
2632
  var _RAW_KEY_PREFIXES = [
2582
2633
  "sk-",
2583
2634
  "sk-ant-",
@@ -2898,6 +2949,7 @@ function _build_config(raw, source_path) {
2898
2949
  const quorum_min_present = _build_quorum_min_present(
2899
2950
  _get(raw, "quorum_min_present", SOLO_FLOOR_MIN_PRESENT)
2900
2951
  );
2952
+ const fallback = buildFallback(_get(raw, "fallback", {}), _FALLBACK_DEPS);
2901
2953
  const necessity_classifier = _build_necessity_classifier(
2902
2954
  _asDict(_getOr(raw, "necessity_classifier", {}))
2903
2955
  );
@@ -2947,6 +2999,7 @@ function _build_config(raw, source_path) {
2947
2999
  cli_call_budget,
2948
3000
  quorum,
2949
3001
  quorum_min_present,
3002
+ fallback,
2950
3003
  necessity_classifier,
2951
3004
  model_downgrade,
2952
3005
  debate,
@@ -3237,7 +3290,13 @@ function _build_decision_resolution(d) {
3237
3290
  `decision_resolution.classes.${cls}.confidence_threshold must be in [0.0, 1.0] (got ${_pyRepr3(_f(threshold))}).`
3238
3291
  );
3239
3292
  }
3240
- classes.set(cls, { mode, confidence_threshold: threshold });
3293
+ const second_model = buildSecondModel(
3294
+ entry_raw,
3295
+ cls,
3296
+ _LOCKED_IMPACT_CLASSES,
3297
+ _FALLBACK_DEPS
3298
+ );
3299
+ classes.set(cls, { mode, confidence_threshold: threshold, second_model });
3241
3300
  }
3242
3301
  const fast_path_raw = _getOr(d, "fast_path", {});
3243
3302
  if (!_isDict(fast_path_raw)) {
@@ -1,7 +1,7 @@
1
1
  import { createRequire as __acCreateRequire } from 'node:module'; const require = globalThis.require ?? __acCreateRequire(import.meta.url);
2
2
  import {
3
3
  readHookStdin
4
- } from "./chunk-MMJL4TIX.js";
4
+ } from "./chunk-F7DQWYR5.js";
5
5
  import {
6
6
  load_agent_settings
7
7
  } from "./chunk-NLP54U3J.js";
@@ -1,7 +1,7 @@
1
1
  import { createRequire as __acCreateRequire } from 'node:module'; const require = globalThis.require ?? __acCreateRequire(import.meta.url);
2
2
  import {
3
3
  readHookStdin
4
- } from "./chunk-MMJL4TIX.js";
4
+ } from "./chunk-F7DQWYR5.js";
5
5
  import {
6
6
  validateAssumption
7
7
  } from "./chunk-ZPSXJTLI.js";
@@ -22,7 +22,7 @@ import {
22
22
  frontmatterPaths,
23
23
  proseEqual,
24
24
  splitFrontmatter
25
- } from "./chunk-F3YUF7SA.js";
25
+ } from "./chunk-3UCJWMMP.js";
26
26
  import "./chunk-FTAISGDQ.js";
27
27
  import {
28
28
  atomic_write_json,
@@ -33,7 +33,7 @@ import "./chunk-Q26HT4QT.js";
33
33
  import {
34
34
  projectStoreSlug,
35
35
  resolveSessionRole
36
- } from "./chunk-7PZ4FSZB.js";
36
+ } from "./chunk-FBKL6JWT.js";
37
37
  import "./chunk-PZWRPRWP.js";
38
38
  import "./chunk-M2DPGFZ4.js";
39
39
  import {
@@ -1620,14 +1620,26 @@ function untrackedNonDocFiles(cwd) {
1620
1620
  return [];
1621
1621
  }
1622
1622
  }
1623
+ var BINARY_PROBE_BYTES = 8e3;
1624
+ var UNTRACKED_FILE_READ_CAP_BYTES = 8 * 1024 * 1024;
1623
1625
  function untrackedFileLineCount(cwd, relPath) {
1624
1626
  try {
1625
- const r = spawnSync("git", ["diff", "--numstat", "--no-index", "/dev/null", relPath], {
1626
- cwd,
1627
- encoding: "utf8",
1628
- maxBuffer: 16 * 1024 * 1024
1629
- });
1630
- return parseNumstat(r.stdout ?? "").reduce((sum, row) => sum + row.added + row.deleted, 0);
1627
+ const abs = path5.resolve(cwd, relPath);
1628
+ const size = fs5.statSync(abs).size;
1629
+ if (size === 0) return 0;
1630
+ if (size > UNTRACKED_FILE_READ_CAP_BYTES) {
1631
+ return MUTATION_LINE_THRESHOLD + 1;
1632
+ }
1633
+ const buf = fs5.readFileSync(abs);
1634
+ if (buf.length === 0) return 0;
1635
+ const probe = buf.subarray(0, Math.min(buf.length, BINARY_PROBE_BYTES));
1636
+ if (probe.includes(0)) return 0;
1637
+ let lines = 0;
1638
+ for (const byte of buf) {
1639
+ if (byte === 10) lines += 1;
1640
+ }
1641
+ if (buf[buf.length - 1] !== 10) lines += 1;
1642
+ return lines;
1631
1643
  } catch {
1632
1644
  return 0;
1633
1645
  }
@@ -2728,8 +2740,11 @@ function main7() {
2728
2740
  dispatchOpen ? null : detectPromissory(lastAssistant),
2729
2741
  detectLanguage(lastAssistant, readLanguagePin(workspaceRoot)),
2730
2742
  detectUnverifiedEdit(toolCalls),
2731
- // Round 7 § Phase 1 — detector D, in the same unconditional list as the
2732
- // other three. It shipped with its own settings flag one commit earlier
2743
+ // Round 7 § Phase 1 — detector D. It is NOT unconditional, and this
2744
+ // comment said it was while sitting one line above the `dispatchOpen`
2745
+ // ternary that conditions it: A and D are both excused by an open
2746
+ // dispatch, per the note at the top of this loop. Corrected 2026-08-18.
2747
+ // It shipped with its own settings flag one commit earlier
2733
2748
  // and that flag is gone: `hooks.turn_end_gate.*` was deleted on
2734
2749
  // 2026-08-12 because a default-off safety gate is an absent one. Its
2735
2750
  // gating is where the comment above says gating belongs — inside the
@@ -66,11 +66,11 @@ import {
66
66
  _wizard_state_path,
67
67
  main,
68
68
  shutilWhich
69
- } from "./chunk-F3YUF7SA.js";
69
+ } from "./chunk-3UCJWMMP.js";
70
70
  import "./chunk-FTAISGDQ.js";
71
71
  import "./chunk-EJITJBJX.js";
72
72
  import "./chunk-Q26HT4QT.js";
73
- import "./chunk-7PZ4FSZB.js";
73
+ import "./chunk-FBKL6JWT.js";
74
74
  import "./chunk-PZWRPRWP.js";
75
75
  import "./chunk-M2DPGFZ4.js";
76
76
  import "./chunk-63WSP6YZ.js";
@@ -4,7 +4,7 @@ import {
4
4
  derive_session_tag,
5
5
  list_sessions,
6
6
  read_entries
7
- } from "./chunk-MNWRDMR5.js";
7
+ } from "./chunk-PKOBQADP.js";
8
8
  import {
9
9
  RECYCLE_CONSUMED_REL,
10
10
  RECYCLE_ENVELOPE_REL,
@@ -15,7 +15,7 @@ import {
15
15
  import "./chunk-UEZ7D35A.js";
16
16
  import {
17
17
  readHookStdin
18
- } from "./chunk-MMJL4TIX.js";
18
+ } from "./chunk-F7DQWYR5.js";
19
19
  import {
20
20
  hasBoundaryMarker,
21
21
  scanEnvelopeDirectives,
@@ -26,7 +26,7 @@ import {
26
26
  _RAW_KEY_PREFIXES,
27
27
  hardenedSpawnEnv,
28
28
  projectStoreSlug
29
- } from "./chunk-7PZ4FSZB.js";
29
+ } from "./chunk-FBKL6JWT.js";
30
30
  import "./chunk-PZWRPRWP.js";
31
31
  import "./chunk-NLP54U3J.js";
32
32
  import "./chunk-NDJLNC6Q.js";
@@ -2,9 +2,9 @@
2
2
  import { createRequire as __acCreateRequire } from 'node:module'; const require = globalThis.require ?? __acCreateRequire(import.meta.url);
3
3
  import {
4
4
  read_entries
5
- } from "./chunk-MNWRDMR5.js";
5
+ } from "./chunk-PKOBQADP.js";
6
6
  import "./chunk-UEZ7D35A.js";
7
- import "./chunk-MMJL4TIX.js";
7
+ import "./chunk-F7DQWYR5.js";
8
8
  import {
9
9
  match_prompt
10
10
  } from "./chunk-LF2KKJ4Q.js";
@@ -47,8 +47,9 @@ function replaceScalar(template, dottedPath, value) {
47
47
  if (dottedPath.length === 0) return template;
48
48
  const sections = dottedPath.slice(0, -1);
49
49
  const key = dottedPath[dottedPath.length - 1];
50
- const targetIndent = " ".repeat(sections.length);
51
50
  const lines = template.split("\n");
51
+ const width = detectIndentWidth(lines);
52
+ const targetIndent = " ".repeat(width * sections.length);
52
53
  const currentPath = new Array(sections.length).fill(null);
53
54
  const formatted = formatScalar(value);
54
55
  for (let i = 0; i < lines.length; i++) {
@@ -57,8 +58,8 @@ function replaceScalar(template, dottedPath, value) {
57
58
  const stripped = line.trim();
58
59
  if (stripped === "" || stripped.startsWith("#")) continue;
59
60
  const indentLen = line.length - line.trimStart().length;
60
- if (indentLen % 2 !== 0) continue;
61
- const level = indentLen / 2;
61
+ if (indentLen % width !== 0) continue;
62
+ const level = indentLen / width;
62
63
  if (level > sections.length) continue;
63
64
  const m = /^([A-Za-z_][A-Za-z0-9_]*)\s*:/.exec(stripped);
64
65
  if (!m) continue;
@@ -81,6 +82,19 @@ function replaceScalar(template, dottedPath, value) {
81
82
  }
82
83
  return template;
83
84
  }
85
+ function detectIndentWidth(lines) {
86
+ let min = 0;
87
+ for (const line of lines) {
88
+ const trimmed = line.trim();
89
+ if (trimmed === "" || trimmed.startsWith("#") || trimmed.startsWith("-")) continue;
90
+ if (line.startsWith(" ")) continue;
91
+ const indentLen = line.length - line.trimStart().length;
92
+ if (indentLen === 0) continue;
93
+ if (!/^[A-Za-z_][\w.-]*\s*:/.test(trimmed)) continue;
94
+ if (min === 0 || indentLen < min) min = indentLen;
95
+ }
96
+ return min === 0 ? 2 : min;
97
+ }
84
98
  function mergeIntoTemplate(templateBody, newValues) {
85
99
  let body = templateBody;
86
100
  const appended = [];
@@ -1,6 +1,6 @@
1
1
  # Discovery — Deprecation Report
2
2
 
3
- - Generated: `2026-08-18T12:03:29Z`
3
+ - Generated: `2026-08-19T14:19:48Z`
4
4
  - Deprecated artefacts: **0**
5
5
 
6
6
  _None. Tree is clean._
@@ -7247,7 +7247,7 @@
7247
7247
  },
7248
7248
  {
7249
7249
  "category": "rule",
7250
- "checksum": "sha256:a164024a846cae8c64753ea72d92dc96bcb7c3aae5a57b1e980a37f18a5a6b4a",
7250
+ "checksum": "sha256:eb7b748bf10ecbf3db0ad99d967d800dccf0d92bd25849f0133043b2dd9c5d3a",
7251
7251
  "install": {
7252
7252
  "default": true,
7253
7253
  "removable": false
@@ -13075,7 +13075,7 @@
13075
13075
  },
13076
13076
  {
13077
13077
  "category": "skill",
13078
- "checksum": "sha256:60fd5e474d910bb639359f3d51f1393deafdf749ba960a11e6d3746ce03a1776",
13078
+ "checksum": "sha256:c3931817f7dad3dcca3dd97971181dd42bbfa104783d2186f091bc7d9fc21794",
13079
13079
  "install": {
13080
13080
  "default": true,
13081
13081
  "removable": false
@@ -14434,7 +14434,7 @@
14434
14434
  "workspaces": []
14435
14435
  }
14436
14436
  ],
14437
- "checksum": "sha256:3d01d440e67f335028a06d9a4609a7e6f885f829cec1eff42914a3e1690cfdeb",
14437
+ "checksum": "sha256:ebb8ea9f229d02a7600a7b9d4da6b9bc6d4025af3e92fb900ef1d369e978ffba",
14438
14438
  "deprecations": [
14439
14439
  {
14440
14440
  "key": "tier",
@@ -14578,7 +14578,7 @@
14578
14578
  "reason": "scaffold template for ticket-bundle tickets (ADR-101); carries no runtime frontmatter — emit-tickets fills it in per ticket"
14579
14579
  }
14580
14580
  ],
14581
- "generated_at": "2026-08-18T12:03:29Z",
14581
+ "generated_at": "2026-08-19T14:19:48Z",
14582
14582
  "packs": [
14583
14583
  {
14584
14584
  "artefact_count": 118,
@@ -1 +1 @@
1
- c20518e62eeec14688645cf600074ae569563d32a4188ce8ce00d9d022a4631d discovery-manifest.json
1
+ ab7bba118ad6f38ec502bf10341186cb287c991cbb8347e7f06aaea864f6542e discovery-manifest.json
@@ -1,6 +1,6 @@
1
1
  # Discovery Manifest — Summary
2
2
 
3
- - Generated: `2026-08-18T12:03:29Z`
3
+ - Generated: `2026-08-19T14:19:48Z`
4
4
  - Scanner: `de0a22b4ac4c`
5
5
  - Artefacts: **609**
6
6
  - Unassigned: **0**
@@ -1,6 +1,6 @@
1
1
  # Discovery — Dormancy Report
2
2
 
3
- - Generated: `2026-08-18T12:03:29Z`
3
+ - Generated: `2026-08-19T14:19:48Z`
4
4
  - Window: **6 months** without a commit
5
5
 
6
6
  > Dormancy triggers **review, never auto-deprecation**
@@ -1,6 +1,6 @@
1
1
  # Discovery — Orphan Report
2
2
 
3
- - Generated: `2026-08-18T12:03:29Z`
3
+ - Generated: `2026-08-19T14:19:48Z`
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:3d01d440e67f335028a06d9a4609a7e6f885f829cec1eff42914a3e1690cfdeb",
3
- "generated_at": "2026-08-18T12:03:29Z",
2
+ "checksum": "sha256:ebb8ea9f229d02a7600a7b9d4da6b9bc6d4025af3e92fb900ef1d369e978ffba",
3
+ "generated_at": "2026-08-19T14:19:48Z",
4
4
  "packs": [
5
5
  {
6
6
  "always_on": false,
@@ -1,6 +1,6 @@
1
1
  # Discovery — Trust Report
2
2
 
3
- - Generated: `2026-08-18T12:03:29Z`
3
+ - Generated: `2026-08-19T14:19:48Z`
4
4
  - Workspaces tracked: **10**
5
5
  - Human-review-required artefacts: **3**
6
6
 
@@ -1,6 +1,6 @@
1
1
  {
2
- "checksum": "sha256:3d01d440e67f335028a06d9a4609a7e6f885f829cec1eff42914a3e1690cfdeb",
3
- "generated_at": "2026-08-18T12:03:29Z",
2
+ "checksum": "sha256:ebb8ea9f229d02a7600a7b9d4da6b9bc6d4025af3e92fb900ef1d369e978ffba",
3
+ "generated_at": "2026-08-19T14:19:48Z",
4
4
  "scanner_version": "de0a22b4ac4c",
5
5
  "workspaces": [
6
6
  {