@event4u/agent-config 9.20.0 → 9.22.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 (239) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/CHANGELOG.md +86 -0
  3. package/dist/agent-src/commands/worktree/cleanup.md +17 -0
  4. package/dist/agent-src/commands/worktree/status.md +6 -0
  5. package/dist/agent-src/skills/worktree-lifecycle/SKILL.md +22 -0
  6. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  7. package/dist/cli-delegate/{chunk-XGA2NTU4.js → chunk-3EWYC3YK.js} +40 -0
  8. package/dist/cli-delegate/cmd_handoff.js +1 -1
  9. package/dist/cli-delegate/cmd_memory_get.js +1 -1
  10. package/dist/cli-delegate/cmd_route_audit.js +1 -1
  11. package/dist/discovery/deprecation-report.md +1 -1
  12. package/dist/discovery/discovery-manifest.json +5 -5
  13. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  14. package/dist/discovery/discovery-manifest.summary.md +1 -1
  15. package/dist/discovery/orphan-report.md +1 -1
  16. package/dist/discovery/packs.json +2 -2
  17. package/dist/discovery/trust-report.md +1 -1
  18. package/dist/discovery/workspaces.json +2 -2
  19. package/dist/hooks/dispatch.js +58 -2
  20. package/dist/mcp/registry-manifest.json +2 -2
  21. package/dist/mcp/server.json +2 -2
  22. package/dist/mcp/server.mjs +47 -29
  23. package/package.json +1 -1
  24. package/src/config/gate-coverage.yml +22 -4
  25. package/src/config/gate-violation-baselines.json +3 -8
  26. package/src/scripts/_lib/bench_ab_activation.ts +368 -0
  27. package/src/scripts/_lib/gate_population.ts +70 -0
  28. package/src/scripts/_lib/roadmap_granularity.ts +157 -0
  29. package/src/scripts/_lib/scan_scope.ts +44 -0
  30. package/src/scripts/_lib/stdin.ts +82 -0
  31. package/src/scripts/audit_adr_coverage.ts +38 -0
  32. package/src/scripts/audit_auto_rules.ts +17 -3
  33. package/src/scripts/audit_command_surface.ts +51 -0
  34. package/src/scripts/audit_initial_context.ts +39 -3
  35. package/src/scripts/audit_mcp_tools.ts +25 -0
  36. package/src/scripts/audit_overlap.ts +24 -1
  37. package/src/scripts/audit_skill_descriptions.ts +19 -0
  38. package/src/scripts/{verify_before_complete_hook.ts → before_complete_hook.ts} +16 -3
  39. package/src/scripts/bench_ab_task_runner.ts +18 -0
  40. package/src/scripts/bench_ab_v2_run.ts +147 -6
  41. package/src/scripts/bench_ab_v2_stats.ts +74 -2
  42. package/src/scripts/check_adr_frontmatter.ts +23 -3
  43. package/src/scripts/check_always_budget.ts +24 -0
  44. package/src/scripts/check_artefact_checksums.ts +24 -1
  45. package/src/scripts/check_artefact_count_messaging.ts +20 -0
  46. package/src/scripts/check_augmentignore.ts +22 -15
  47. package/src/scripts/check_backstop_debt.ts +22 -0
  48. package/src/scripts/check_beta_review_markers.ts +22 -1
  49. package/src/scripts/check_bridge_derivation.ts +22 -1
  50. package/src/scripts/check_bundle_path_leakage.ts +26 -0
  51. package/src/scripts/check_ci_strict_superset.ts +21 -3
  52. package/src/scripts/check_claims.ts +22 -0
  53. package/src/scripts/check_cli_registry_budget_sync.ts +33 -4
  54. package/src/scripts/check_cluster_patterns.ts +26 -4
  55. package/src/scripts/check_command_count_messaging.ts +20 -4
  56. package/src/scripts/check_comparison.ts +18 -0
  57. package/src/scripts/check_condensed_paths.ts +23 -2
  58. package/src/scripts/check_consumer_scope_flip.ts +21 -2
  59. package/src/scripts/check_council_config_location.ts +20 -0
  60. package/src/scripts/check_council_layout.ts +22 -2
  61. package/src/scripts/check_council_references.ts +23 -1
  62. package/src/scripts/check_dependency_floors.ts +19 -3
  63. package/src/scripts/check_discovery_determinism.ts +26 -0
  64. package/src/scripts/check_enforcement_coverage.ts +20 -0
  65. package/src/scripts/check_evaluator_budgets.ts +23 -0
  66. package/src/scripts/check_finding_dispositions.ts +29 -0
  67. package/src/scripts/check_gate_coverage.ts +63 -22
  68. package/src/scripts/check_gate_paths.ts +30 -5
  69. package/src/scripts/check_generated_artefact_headers.ts +21 -0
  70. package/src/scripts/check_generator_output_coverage.ts +23 -0
  71. package/src/scripts/check_gitignore_freshness.ts +23 -0
  72. package/src/scripts/check_host_loadability.ts +34 -8
  73. package/src/scripts/check_installer_import_purity.ts +22 -8
  74. package/src/scripts/check_kernel_prefix_stability.ts +19 -1
  75. package/src/scripts/check_kernel_rule_bundle.ts +23 -0
  76. package/src/scripts/check_knowledge_cards.ts +13 -0
  77. package/src/scripts/check_knowledge_pages.ts +23 -0
  78. package/src/scripts/check_knowledge_sharing.ts +27 -0
  79. package/src/scripts/check_md_language.ts +24 -0
  80. package/src/scripts/check_media_deps.ts +23 -0
  81. package/src/scripts/check_memory.ts +26 -1
  82. package/src/scripts/check_memory_contradiction.ts +16 -1
  83. package/src/scripts/check_memory_proposal.ts +15 -0
  84. package/src/scripts/check_memory_similarity.ts +16 -0
  85. package/src/scripts/check_module_management_neutral.ts +19 -11
  86. package/src/scripts/check_no_conflict_markers.ts +22 -1
  87. package/src/scripts/check_no_external_sources.ts +26 -1
  88. package/src/scripts/check_no_local_settings_committed.ts +37 -10
  89. package/src/scripts/check_no_new_legacy_path.ts +30 -1
  90. package/src/scripts/check_one_off_location.ts +43 -0
  91. package/src/scripts/check_originality_freshness.ts +25 -1
  92. package/src/scripts/check_overlay_cascade_subdirs.ts +21 -0
  93. package/src/scripts/check_pack_size.ts +22 -0
  94. package/src/scripts/check_preamble_payload_budget.ts +35 -5
  95. package/src/scripts/check_proposal.ts +24 -1
  96. package/src/scripts/check_public_catalog_links.ts +27 -0
  97. package/src/scripts/check_public_links.ts +19 -0
  98. package/src/scripts/check_quality_regression.ts +19 -0
  99. package/src/scripts/check_reach_channels.ts +44 -0
  100. package/src/scripts/check_reach_staleness.ts +27 -0
  101. package/src/scripts/check_release_adjacent_health.ts +28 -0
  102. package/src/scripts/check_release_highlights.ts +34 -0
  103. package/src/scripts/check_release_includes_discovery.ts +25 -6
  104. package/src/scripts/check_release_pr_shape.ts +18 -1
  105. package/src/scripts/check_release_published.ts +21 -0
  106. package/src/scripts/check_release_surface_equality.ts +22 -0
  107. package/src/scripts/check_release_trunk_sync.ts +19 -0
  108. package/src/scripts/check_reply_consistency.ts +22 -0
  109. package/src/scripts/check_roadmap_trackable.ts +20 -0
  110. package/src/scripts/check_role_doc_links.ts +23 -0
  111. package/src/scripts/check_rule_invariants.ts +14 -0
  112. package/src/scripts/check_secret_leak.ts +47 -0
  113. package/src/scripts/check_skill_gaps.ts +32 -0
  114. package/src/scripts/check_skill_requires.ts +19 -0
  115. package/src/scripts/check_source_pointer_freshness.ts +20 -0
  116. package/src/scripts/check_structural_breaking.ts +29 -2
  117. package/src/scripts/check_surface_tiers.ts +34 -0
  118. package/src/scripts/check_template_pin_drift.ts +23 -1
  119. package/src/scripts/check_test_coverage_diff.ts +17 -1
  120. package/src/scripts/check_token_optimizer_freshness.ts +18 -3
  121. package/src/scripts/check_token_quality_golden.ts +21 -0
  122. package/src/scripts/check_token_regression.ts +25 -0
  123. package/src/scripts/check_tracked_but_ignored.ts +26 -0
  124. package/src/scripts/check_trigger_eval_presence.ts +23 -1
  125. package/src/scripts/check_trigger_evals.ts +36 -0
  126. package/src/scripts/check_trunk_drift.ts +23 -0
  127. package/src/scripts/check_update_banner.ts +24 -0
  128. package/src/scripts/gate_scope_classify.ts +513 -0
  129. package/src/scripts/hook_manifest.yaml +1 -1
  130. package/src/scripts/hooks/block_kernel_rule_writes.ts +1 -1
  131. package/src/scripts/hooks/concern_registry.ts +2 -2
  132. package/src/scripts/lint_agent_security.ts +19 -0
  133. package/src/scripts/lint_agent_skill_names.ts +30 -0
  134. package/src/scripts/lint_agents_layout.ts +20 -0
  135. package/src/scripts/lint_agents_md.ts +20 -0
  136. package/src/scripts/lint_archived_skills.ts +24 -3
  137. package/src/scripts/lint_behavioural_eval_freshness.ts +29 -3
  138. package/src/scripts/lint_bench_ab.ts +25 -0
  139. package/src/scripts/lint_bench_corpus.ts +20 -4
  140. package/src/scripts/lint_breaking_changes_index.ts +24 -0
  141. package/src/scripts/lint_budget_ownership.ts +20 -3
  142. package/src/scripts/lint_changelog_rollback.ts +24 -0
  143. package/src/scripts/lint_command_flow_coverage.ts +22 -0
  144. package/src/scripts/lint_command_tiers.ts +29 -5
  145. package/src/scripts/lint_commit_subjects.ts +15 -0
  146. package/src/scripts/lint_confusables.ts +24 -0
  147. package/src/scripts/lint_consumer_internal_refs.ts +24 -0
  148. package/src/scripts/lint_design_quality.ts +22 -0
  149. package/src/scripts/lint_design_slop.ts +23 -0
  150. package/src/scripts/lint_discovery_manifest.ts +23 -0
  151. package/src/scripts/lint_discovery_vocabulary.ts +19 -0
  152. package/src/scripts/lint_documented_commands.ts +23 -0
  153. package/src/scripts/lint_empty_roadmaps.ts +23 -0
  154. package/src/scripts/lint_eval_fixture_citations.ts +19 -0
  155. package/src/scripts/lint_eval_freshness.ts +35 -0
  156. package/src/scripts/lint_examples.ts +18 -3
  157. package/src/scripts/lint_explain_trace.ts +23 -0
  158. package/src/scripts/lint_featured_skills.ts +26 -1
  159. package/src/scripts/lint_flows.ts +19 -0
  160. package/src/scripts/lint_frontmatter_boilerplate.ts +20 -0
  161. package/src/scripts/lint_ghostwriter_source.ts +26 -6
  162. package/src/scripts/lint_glama_drift.ts +24 -0
  163. package/src/scripts/lint_global_paths.ts +24 -0
  164. package/src/scripts/lint_governed_writes.ts +20 -0
  165. package/src/scripts/lint_hidden_unicode.ts +25 -0
  166. package/src/scripts/lint_hook_concern_budget.ts +39 -6
  167. package/src/scripts/lint_hook_manifest.ts +22 -0
  168. package/src/scripts/lint_instruction_smuggling.ts +23 -0
  169. package/src/scripts/lint_knowledge_scale.ts +32 -2
  170. package/src/scripts/lint_legal_pack.ts +31 -0
  171. package/src/scripts/lint_marketplace.ts +26 -0
  172. package/src/scripts/lint_marketplace_install_completeness.ts +23 -0
  173. package/src/scripts/lint_mcp_config_security.ts +24 -0
  174. package/src/scripts/lint_mcp_registry_manifest.ts +22 -1
  175. package/src/scripts/lint_memory_tripwire.ts +35 -0
  176. package/src/scripts/lint_missions.ts +23 -7
  177. package/src/scripts/lint_model_tier_coverage.ts +18 -0
  178. package/src/scripts/lint_namespace_collisions.ts +19 -0
  179. package/src/scripts/lint_no_new_atomic_commands.ts +33 -0
  180. package/src/scripts/lint_no_python_twin_rationale.ts +18 -0
  181. package/src/scripts/lint_one_off_age.ts +38 -2
  182. package/src/scripts/lint_orchestration_dsl.ts +23 -3
  183. package/src/scripts/lint_orchestrator_auto_detect.ts +19 -12
  184. package/src/scripts/lint_originality.ts +22 -4
  185. package/src/scripts/lint_originality_shingles.ts +28 -3
  186. package/src/scripts/lint_output_slop.ts +19 -0
  187. package/src/scripts/lint_override_kernel_guard.ts +30 -0
  188. package/src/scripts/lint_pack_first_win.ts +23 -0
  189. package/src/scripts/lint_pack_risk_class.ts +19 -3
  190. package/src/scripts/lint_persistence.ts +19 -0
  191. package/src/scripts/lint_persona_governance.ts +18 -3
  192. package/src/scripts/lint_positioning.ts +23 -0
  193. package/src/scripts/lint_pre_migration_refs.ts +24 -0
  194. package/src/scripts/lint_profile_overlay_set_only.ts +24 -0
  195. package/src/scripts/lint_provenance.ts +21 -0
  196. package/src/scripts/lint_provenance_vocabulary.ts +24 -1
  197. package/src/scripts/lint_readme_jargon.ts +21 -3
  198. package/src/scripts/lint_readme_serial_comma.ts +21 -3
  199. package/src/scripts/lint_readme_size.ts +21 -3
  200. package/src/scripts/lint_regression.ts +28 -0
  201. package/src/scripts/lint_roadmap_blockers.ts +43 -0
  202. package/src/scripts/lint_roadmap_ci_steps.ts +45 -0
  203. package/src/scripts/lint_roadmap_complexity.ts +47 -0
  204. package/src/scripts/lint_roadmap_later_disposition.ts +23 -0
  205. package/src/scripts/lint_rule_interactions.ts +16 -2
  206. package/src/scripts/lint_rule_tiers.ts +19 -6
  207. package/src/scripts/lint_showcase_sessions.ts +19 -3
  208. package/src/scripts/lint_skill_descriptions.ts +19 -0
  209. package/src/scripts/lint_skill_frontmatter_safety.ts +24 -0
  210. package/src/scripts/lint_skill_originality.ts +18 -3
  211. package/src/scripts/lint_skill_scripts_readonly.ts +20 -0
  212. package/src/scripts/lint_skill_tools.ts +84 -145
  213. package/src/scripts/lint_spawn_payload.ts +27 -1
  214. package/src/scripts/lint_store_boundary.ts +19 -0
  215. package/src/scripts/lint_subagent_determinism.ts +23 -1
  216. package/src/scripts/lint_supported_tools_matrix.ts +18 -0
  217. package/src/scripts/lint_surface_matrix.ts +19 -3
  218. package/src/scripts/lint_ticket_buildable.ts +23 -0
  219. package/src/scripts/lint_topics_yaml.ts +19 -12
  220. package/src/scripts/lint_trigger_precision.ts +27 -0
  221. package/src/scripts/lint_trust_coherence.ts +21 -0
  222. package/src/scripts/lint_ui_stack_bundles.ts +17 -3
  223. package/src/scripts/lint_value_dashboard.ts +19 -3
  224. package/src/scripts/lint_versioned_cache.ts +19 -1
  225. package/src/scripts/lint_workflow_security.ts +22 -14
  226. package/src/scripts/pr_url_reminder_hook.ts +1 -1
  227. package/src/scripts/skill_collision_clusters.ts +37 -3
  228. package/src/scripts/skill_discovery.ts +20 -0
  229. package/src/scripts/skill_eval_coverage.ts +22 -0
  230. package/src/scripts/skill_overlap.ts +32 -6
  231. package/src/scripts/skill_preview.ts +31 -0
  232. package/src/scripts/skill_trigger_eval.ts +18 -0
  233. package/src/scripts/skill_usage_collect.ts +21 -0
  234. package/src/scripts/skill_usage_report.ts +21 -0
  235. package/src/scripts/sweep_dead_scan_roots.ts +11 -3
  236. package/src/scripts/verify_physical_move.ts +24 -0
  237. package/src/scripts/worktree_cleanup_check.ts +319 -4
  238. package/src/scripts/check_bite_sized_granularity.ts +0 -116
  239. package/src/scripts/lint_workspace_boundary.ts +0 -267
@@ -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.20.0",
9
+ "version": "9.22.0",
10
10
  "keywords": [
11
11
  "agent-config",
12
12
  "skills",
package/CHANGELOG.md CHANGED
@@ -294,6 +294,92 @@ Entry-shape contract: [`docs/contracts/CHANGELOG-conventions.md`](docs/contracts
294
294
  > that forces a new era split (`# Era: 9.19.x`, etc.) — see
295
295
  > [`docs/contracts/CHANGELOG-conventions.md § Era splits`](docs/contracts/CHANGELOG-conventions.md).
296
296
 
297
+ ## [9.22.0](https://github.com/event4u-app/agent-config/compare/9.21.0...9.22.0) (2026-08-05)
298
+
299
+ ### Release highlights
300
+
301
+ <!-- Curated head: fill before merge, keep it under 10 lines, and leave `_none_` where it is genuinely the answer. The generated log below is unchanged. -->
302
+ - **Behaviour changes:** _none_
303
+ - **Default changes + migration:** _none_
304
+ - **Security and correctness:** _none_
305
+ - **Honest nulls:** _none_
306
+ - **Known limitations:** _none_
307
+
308
+ ### Features
309
+
310
+ * **worktree:** classify every worktree safe/review/live in one pass ([ac42fa6](https://github.com/event4u-app/agent-config/commit/ac42fa6c041db0343b6363472541a2fdf3815c3c))
311
+ * **bench:** report which arm the dropped pairs came from ([9230102](https://github.com/event4u-app/agent-config/commit/9230102868bd25a20aa2e30e35a9e57d45c0051c))
312
+ * **bench:** fail the sweep on an unproven arm, a swapped model, or an overrun ([490a5e5](https://github.com/event4u-app/agent-config/commit/490a5e5995db3e2f49676d7df5a0db41bf8e3926))
313
+ * **bench:** record which model actually answered each run ([5ea6b60](https://github.com/event4u-app/agent-config/commit/5ea6b60cb850e10299fe66c4c9e8aa0fd612772f))
314
+ * **bench:** the activation audit the invalid-nulls incident needed ([2630c48](https://github.com/event4u-app/agent-config/commit/2630c481b834b192c974cf828b72b2b3a3304b81))
315
+
316
+ ### Bug Fixes
317
+
318
+ * **bench:** validate the sweep cap before probing for the host CLI ([4aee1d8](https://github.com/event4u-app/agent-config/commit/4aee1d8aa02598db80d0cad819fe85618558dc53))
319
+
320
+ ### Documentation
321
+
322
+ * **roadmap:** promote worktree hygiene on the fired disk trigger, record the baseline ([78d5b7a](https://github.com/event4u-app/agent-config/commit/78d5b7ab2691b7cb75e094fa724e5a3eaa5d2f06))
323
+ * **worktree:** route whole-checkout sweeps through the inventory mode ([3ba4c55](https://github.com/event4u-app/agent-config/commit/3ba4c556a7eee4256be3378bd67aa962b884dede))
324
+ * **roadmap:** name why Measurement A cannot run, and correct my own scope ruling ([460dfb0](https://github.com/event4u-app/agent-config/commit/460dfb0c5e2d96e8deb831638684f501522661d2))
325
+ * **bench:** withdraw the interactions degradation rule — measured, then falsified ([56d3fe3](https://github.com/event4u-app/agent-config/commit/56d3fe3b1433c69419a7d118c567ea2581a0a0d2))
326
+ * **roadmap:** close the UI-track prerequisites and name the real blocker ([e8fa469](https://github.com/event4u-app/agent-config/commit/e8fa46953df5afacfb402a6d8468b44b72155191))
327
+ * **bench:** pre-register the UI-track tier and lane measurements ([3a8b601](https://github.com/event4u-app/agent-config/commit/3a8b6017965bc9eed189c1971f28a6212b9dc3d3))
328
+ * **roadmap:** record prerequisite work that moves no checkbox ([ad3bd4e](https://github.com/event4u-app/agent-config/commit/ad3bd4e9903e81ef38e647a6cbddacbd95f4f282))
329
+
330
+ Tests: 11091 (+57 since 9.21.0)
331
+
332
+ ## [9.21.0](https://github.com/event4u-app/agent-config/compare/9.20.0...9.21.0) (2026-08-05)
333
+
334
+ ### Release highlights
335
+
336
+ <!-- Curated head: fill before merge, keep it under 10 lines, and leave `_none_` where it is genuinely the answer. The generated log below is unchanged. -->
337
+ - **Behaviour changes:** _none_
338
+ - **Default changes + migration:** _none_
339
+ - **Security and correctness:** _none_
340
+ - **Honest nulls:** _none_
341
+ - **Known limitations:** _none_
342
+
343
+ ### Features
344
+
345
+ * **gates:** take the unhardened-gate count to 0 and delete the ratchet entry ([e31690c](https://github.com/event4u-app/agent-config/commit/e31690c7330bb90ed813cc25ead2268da2971ea1))
346
+ * **gates:** repoint lint_skill_tools at the .ts corpus and harden it ([694a729](https://github.com/event4u-app/agent-config/commit/694a729359e674953881a996af6079123e91a98d))
347
+ * **gates:** fold bite-sized granularity into lint_roadmap_complexity ([08d9075](https://github.com/event4u-app/agent-config/commit/08d9075c978a6a76a250a74fe6377ad3b2c2d8a2))
348
+ * **gates:** assert the scan scope of the last 57 gates — 61 → 4 ([5244b21](https://github.com/event4u-app/agent-config/commit/5244b21ea664db73a3a07c8ce717a2b43c4ba157))
349
+ * **gates:** assert the scan scope of 54 more gates — 115 → 61 ([835fd54](https://github.com/event4u-app/agent-config/commit/835fd545649287574c9d74e3280302ca429b8d20))
350
+ * **gates:** assert the scan scope of 48 tree-walking gates ([9cc51a2](https://github.com/event4u-app/agent-config/commit/9cc51a20c8d3d3c9f133d0bb8a94a322b90ee235))
351
+ * **gates:** assert the scan scope of 28 more corpus gates ([f4e79e4](https://github.com/event4u-app/agent-config/commit/f4e79e4a8f7c90e27353693f42d27c1a70bbdac4))
352
+ * **gates:** classify the corpusless gates by what they read ([c7a851b](https://github.com/event4u-app/agent-config/commit/c7a851becd7a77ff85c7c443c59ca45b91bc7ef3))
353
+ * **gates:** assert the scan scope of five corpus gates ([7433f72](https://github.com/event4u-app/agent-config/commit/7433f72482c639bf88d01e58e093d7c57a608960))
354
+ * **gates:** derive the conversion work-list instead of reading 189 gates ([b845e4d](https://github.com/event4u-app/agent-config/commit/b845e4df66e90b1d43a42f9fa55bb41457b4a1b5))
355
+ * **scan-scope:** pair the scope assertion with the published count ([b8b2840](https://github.com/event4u-app/agent-config/commit/b8b2840d17466f0be5047fbaa98ed67751a93a70))
356
+
357
+ ### Bug Fixes
358
+
359
+ * **gates:** read piped stdin whole — a gate that only broke on big diffs ([0e3e9cd](https://github.com/event4u-app/agent-config/commit/0e3e9cd4ca91c01c00d8c611a96db72b936952d8))
360
+ * **gates:** clear the two preflight blockers the repairs introduced ([2683395](https://github.com/event4u-app/agent-config/commit/268339595ca2dd34b14a1a63abd6362fde7868fb))
361
+ * **gates:** repair two dead scan roots the widened population revealed ([5b41c55](https://github.com/event4u-app/agent-config/commit/5b41c556bc245c4eb9da7506b4de449a3cde07b0))
362
+ * **gates:** one definition of "a gate", and an honest denominator ([9f65efe](https://github.com/event4u-app/agent-config/commit/9f65efea7882d4c79f2e5f4c8fcefb0b521bcdde))
363
+ * **gate-coverage:** an unenforced `scanned:` line hardens nothing ([2873c91](https://github.com/event4u-app/agent-config/commit/2873c919d0245ca76a18f2315c768b9a9cb1e1ca))
364
+
365
+ ### Documentation
366
+
367
+ * **roadmap:** close and archive road-to-gate-hardening-adoption ([d1497c5](https://github.com/event4u-app/agent-config/commit/d1497c5fc12f5475b683f27b42953cf2f448def8))
368
+ * **roadmap:** file the four-gate blocker where the dashboard reads it ([7e0c8e9](https://github.com/event4u-app/agent-config/commit/7e0c8e9e369c29a7574c99f1ec453835e1ae44e9))
369
+ * **roadmap:** close Phase 1 — the mechanically-safe conversions ([877859a](https://github.com/event4u-app/agent-config/commit/877859ac99e70a79630b201a025a474df156fe55))
370
+ * **roadmap:** record the assert-first conversion contract ([613d478](https://github.com/event4u-app/agent-config/commit/613d47878252edfe8c5d225d73c1bed3fe6fb753))
371
+
372
+ ### Refactoring
373
+
374
+ * **gates:** re-home the ADR-095 workspace boundary to ESLint ([2bc2483](https://github.com/event4u-app/agent-config/commit/2bc24833149cff33573a84c9dfbc973b5b3b5fe3))
375
+ * **hooks:** rename verify_before_complete_hook off the gate prefix ([f57d969](https://github.com/event4u-app/agent-config/commit/f57d969c6c54e591060054f217a12d816d121116))
376
+
377
+ ### Chores
378
+
379
+ * **tests:** drop a dead helper the lint scope only now reaches ([9b49d24](https://github.com/event4u-app/agent-config/commit/9b49d240140c9b6af28969c752f4757bf5580d98))
380
+
381
+ Tests: 11034 (+39 since 9.20.0)
382
+
297
383
  ## [9.20.0](https://github.com/event4u-app/agent-config/compare/9.19.0...9.20.0) (2026-08-04)
298
384
 
299
385
  ### Release highlights
@@ -31,6 +31,23 @@ never force-removes.
31
31
  `git worktree list --porcelain` — target the worktree(s) named by the
32
32
  user, or every non-main worktree when asked to "clean up".
33
33
 
34
+ For a whole-checkout sweep, get the classified set in one pass instead of
35
+ running the per-worktree gate by hand:
36
+
37
+ ```bash
38
+ ./scripts-run src/scripts/worktree_cleanup_check inventory # counts + review reasons
39
+ ./scripts-run src/scripts/worktree_cleanup_check inventory --plan # commands for the safe set
40
+ ```
41
+
42
+ `safe` = on a branch, merged into the trunk, clean, in a conventional
43
+ worktree root, and no git activity for 48 h. `review` carries its
44
+ disqualifying reason; `live` means another session may hold it. The mode
45
+ reports only — running the plan is a bulk deletion needing the user's
46
+ explicit this-turn approval per
47
+ [`non-destructive-by-default`](../../../rules/non-destructive-by-default.md).
48
+ Present the safe set as a list and wait; a bulk sweep never inherits a
49
+ single earlier approval.
50
+
34
51
  ### 2. Per candidate, run the gates IN ORDER
35
52
 
36
53
  Run the deterministic gate helper (edge-case-tested: detached HEAD,
@@ -29,6 +29,12 @@ git worktree list --porcelain
29
29
  ```
30
30
 
31
31
  One report block per worktree (skip the main working tree unless asked).
32
+ Above roughly a dozen worktrees a per-worktree block stops being readable —
33
+ lead with the aggregate instead, then block only what the user asks about:
34
+
35
+ ```bash
36
+ ./scripts-run src/scripts/worktree_cleanup_check inventory
37
+ ```
32
38
 
33
39
  ### 2. Per worktree, gather
34
40
 
@@ -128,6 +128,28 @@ step (`scope-control`); never force-delete (`-D`) as part of cleanup.
128
128
  Cross-worktree scope-lock overlaps are scanned via
129
129
  `worktree_cleanup_check scope-overlap` (surfaced by `/worktree status`).
130
130
 
131
+ **Whole-checkout sweeps.** Worktrees accumulate one per branch and are never
132
+ removed on merge; `git worktree prune` only clears registrations whose
133
+ directory is already gone, so it does nothing for the live ones. Classify the
134
+ whole set in one pass rather than gate-checking by hand:
135
+
136
+ ```bash
137
+ npx tsx node_modules/@event4u/agent-config/src/scripts/worktree_cleanup_check.ts inventory [repo] [--json|--plan]
138
+ ```
139
+
140
+ `safe` requires all of: on a branch, merged into the trunk, clean, inside a
141
+ conventional worktree root (`.claude/worktrees/` or `.worktrees/`), and no git
142
+ activity for 48 h. `review` keeps its disqualifying reason so the next sweep
143
+ starts from a shorter list; `live` means another session may hold it. A
144
+ worktree outside the conventional roots is never `safe` — sitting beside the
145
+ repo it can be mistaken for a sibling package, so its removal stays a
146
+ judgement call.
147
+
148
+ The mode reports only. `--plan` prints `git worktree remove` plus
149
+ `git branch -d` (never `-D`) for the safe set; **running it is a bulk deletion
150
+ needing the user's explicit this-turn approval**
151
+ (`non-destructive-by-default`), which a single earlier approval never covers.
152
+
131
153
  ## Host-native mapping
132
154
 
133
155
  | Host capability | Use |
@@ -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.20.0"
42
+ agent_config_version: "9.22.0"
43
43
 
44
44
  # --- Project identity ---
45
45
  project:
@@ -457,6 +457,29 @@ function _pyJsonScalarAscii(value) {
457
457
  return _pyJsonScalar(value);
458
458
  }
459
459
 
460
+ // src/scripts/_lib/scan_scope.ts
461
+ var DeadScopeError = class extends Error {
462
+ gate;
463
+ constructor(gate, message) {
464
+ super(message);
465
+ this.name = "DeadScopeError";
466
+ this.gate = gate;
467
+ }
468
+ };
469
+ function assertScanned(opts) {
470
+ if (opts.scanned > 0) {
471
+ return;
472
+ }
473
+ if (opts.allowEmpty !== void 0 && opts.allowEmpty.trim() !== "") {
474
+ return;
475
+ }
476
+ const roots = opts.roots.length > 0 ? opts.roots.join(", ") : "(no root declared)";
477
+ throw new DeadScopeError(
478
+ opts.gate,
479
+ `${opts.gate}: scanned 0 ${opts.units} under ${roots} \u2014 the scan scope is dead or the root moved. A gate that read nothing has not passed. Repoint the root (prefer the shared resolver in _lib/agent_src.ts), or declare a justified \`allowEmpty\` reason if an empty corpus is genuinely expected.`
480
+ );
481
+ }
482
+
460
483
  // src/scripts/lint_hidden_unicode.ts
461
484
  var CHECK = "hidden-unicode";
462
485
  var _BIDI = /* @__PURE__ */ new Set([
@@ -872,7 +895,9 @@ function main(argv = null) {
872
895
  const args = parse_args(argv ?? process.argv.slice(2));
873
896
  const findings = [];
874
897
  const flagged = /* @__PURE__ */ new Set();
898
+ let corpusFiles = 0;
875
899
  for (const sf of iter_corpus()) {
900
+ corpusFiles += 1;
876
901
  const hits = _scan(sf);
877
902
  for (const h of hits) {
878
903
  findings.push(h);
@@ -881,6 +906,21 @@ function main(argv = null) {
881
906
  flagged.add(sf.path);
882
907
  }
883
908
  }
909
+ try {
910
+ assertScanned({
911
+ gate: "lint_hidden_unicode",
912
+ scanned: corpusFiles,
913
+ units: "corpus file(s)",
914
+ roots: DEFAULT_SCAN_ROOTS
915
+ });
916
+ } catch (exc) {
917
+ if (exc instanceof DeadScopeError) {
918
+ process.stderr.write(`\u274C ${exc.message}
919
+ `);
920
+ return 1;
921
+ }
922
+ throw exc;
923
+ }
884
924
  const sourceFiles = _eligibleSourceFiles();
885
925
  for (const h of _scanSourceControlBytes(sourceFiles)) {
886
926
  findings.push(h);
@@ -6,7 +6,7 @@ import {
6
6
  readHookStdin,
7
7
  read_entries
8
8
  } from "./chunk-AIIUU73N.js";
9
- import "./chunk-XGA2NTU4.js";
9
+ import "./chunk-3EWYC3YK.js";
10
10
  import {
11
11
  _RAW_KEY_PREFIXES,
12
12
  hardenedSpawnEnv
@@ -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-XGA2NTU4.js";
5
+ } from "./chunk-3EWYC3YK.js";
6
6
  import "./chunk-OY53J6II.js";
7
7
  import "./chunk-J55WI3RR.js";
8
8
 
@@ -6,7 +6,7 @@ import {
6
6
  import {
7
7
  read_entries
8
8
  } from "./chunk-AIIUU73N.js";
9
- import "./chunk-XGA2NTU4.js";
9
+ import "./chunk-3EWYC3YK.js";
10
10
  import {
11
11
  load_agent_settings
12
12
  } from "./chunk-HJ6DAJHR.js";
@@ -1,6 +1,6 @@
1
1
  # Discovery — Deprecation Report
2
2
 
3
- - Generated: `2026-08-04T21:41:44Z`
3
+ - Generated: `2026-08-05T05:32:20Z`
4
4
  - Deprecated artefacts: **0**
5
5
 
6
6
  _None. Tree is clean._
@@ -1977,7 +1977,7 @@
1977
1977
  },
1978
1978
  {
1979
1979
  "category": "command",
1980
- "checksum": "sha256:6efc669962a6f31d36731708ef37977505c8eaf29d4c9a6ef488037eed42ec1a",
1980
+ "checksum": "sha256:e0e438bb85349bc013a609e6def8d70e7b749dcd97adff313d5db535987f7e95",
1981
1981
  "install": {
1982
1982
  "default": true,
1983
1983
  "removable": false
@@ -2055,7 +2055,7 @@
2055
2055
  },
2056
2056
  {
2057
2057
  "category": "command",
2058
- "checksum": "sha256:0e0fcdddceaa2fe3c2ef63f8a6557182f310da33a04cfb53199fb20cebed0f26",
2058
+ "checksum": "sha256:68e5e30c2c90957615582840f804ce957bf1708319029b378ea97e384d05a1e8",
2059
2059
  "install": {
2060
2060
  "default": true,
2061
2061
  "removable": false
@@ -14220,7 +14220,7 @@
14220
14220
  },
14221
14221
  {
14222
14222
  "category": "skill",
14223
- "checksum": "sha256:66795187ffedce5896afb29d5c2794d7de0d55c7e2849b5bb001722bb0ba6975",
14223
+ "checksum": "sha256:6031d5e7109a96a5a105ac91ea80c0df66d9934594a11d0c3efcf8b596cc48cf",
14224
14224
  "install": {
14225
14225
  "default": true,
14226
14226
  "removable": false
@@ -14259,7 +14259,7 @@
14259
14259
  "workspaces": []
14260
14260
  }
14261
14261
  ],
14262
- "checksum": "sha256:d766f7f17140ce6b648e68821c9403c0bf478609a1ea925e85501c5994002a05",
14262
+ "checksum": "sha256:acdebb0b72b50f8026c14b11df8706155fb82ba5c44cff7fa47b6e019052d156",
14263
14263
  "deprecations": [
14264
14264
  {
14265
14265
  "key": "tier",
@@ -14402,7 +14402,7 @@
14402
14402
  "reason": "scaffold template for ticket-bundle tickets (ADR-101); carries no runtime frontmatter — emit-tickets fills it in per ticket"
14403
14403
  }
14404
14404
  ],
14405
- "generated_at": "2026-08-04T21:41:44Z",
14405
+ "generated_at": "2026-08-05T05:32:20Z",
14406
14406
  "packs": [
14407
14407
  {
14408
14408
  "artefact_count": 117,
@@ -1 +1 @@
1
- 759c2227292efbd65092bc4a57aa783cb714db0e6d93a1a53f6f35ba940d32aa discovery-manifest.json
1
+ afd8d19ae939ff4cc011583591c8ae9f88601d301d808874f41cfb43f0d1122a discovery-manifest.json
@@ -1,6 +1,6 @@
1
1
  # Discovery Manifest — Summary
2
2
 
3
- - Generated: `2026-08-04T21:41:44Z`
3
+ - Generated: `2026-08-05T05:32:20Z`
4
4
  - Scanner: `c24312e116f8`
5
5
  - Artefacts: **594**
6
6
  - Unassigned: **0**
@@ -1,6 +1,6 @@
1
1
  # Discovery — Orphan Report
2
2
 
3
- - Generated: `2026-08-04T21:41:44Z`
3
+ - Generated: `2026-08-05T05:32:20Z`
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:d766f7f17140ce6b648e68821c9403c0bf478609a1ea925e85501c5994002a05",
3
- "generated_at": "2026-08-04T21:41:44Z",
2
+ "checksum": "sha256:acdebb0b72b50f8026c14b11df8706155fb82ba5c44cff7fa47b6e019052d156",
3
+ "generated_at": "2026-08-05T05:32:20Z",
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-04T21:41:44Z`
3
+ - Generated: `2026-08-05T05:32:20Z`
4
4
  - Workspaces tracked: **10**
5
5
  - Human-review-required artefacts: **3**
6
6
 
@@ -1,6 +1,6 @@
1
1
  {
2
- "checksum": "sha256:d766f7f17140ce6b648e68821c9403c0bf478609a1ea925e85501c5994002a05",
3
- "generated_at": "2026-08-04T21:41:44Z",
2
+ "checksum": "sha256:acdebb0b72b50f8026c14b11df8706155fb82ba5c44cff7fa47b6e019052d156",
3
+ "generated_at": "2026-08-05T05:32:20Z",
4
4
  "scanner_version": "c24312e116f8",
5
5
  "workspaces": [
6
6
  {
@@ -8170,6 +8170,29 @@ function _pyJsonScalarAscii(value) {
8170
8170
  return _pyJsonScalar(value);
8171
8171
  }
8172
8172
 
8173
+ // src/scripts/_lib/scan_scope.ts
8174
+ var DeadScopeError = class extends Error {
8175
+ gate;
8176
+ constructor(gate, message) {
8177
+ super(message);
8178
+ this.name = "DeadScopeError";
8179
+ this.gate = gate;
8180
+ }
8181
+ };
8182
+ function assertScanned(opts) {
8183
+ if (opts.scanned > 0) {
8184
+ return;
8185
+ }
8186
+ if (opts.allowEmpty !== void 0 && opts.allowEmpty.trim() !== "") {
8187
+ return;
8188
+ }
8189
+ const roots = opts.roots.length > 0 ? opts.roots.join(", ") : "(no root declared)";
8190
+ throw new DeadScopeError(
8191
+ opts.gate,
8192
+ `${opts.gate}: scanned 0 ${opts.units} under ${roots} \u2014 the scan scope is dead or the root moved. A gate that read nothing has not passed. Repoint the root (prefer the shared resolver in _lib/agent_src.ts), or declare a justified \`allowEmpty\` reason if an empty corpus is genuinely expected.`
8193
+ );
8194
+ }
8195
+
8173
8196
  // src/scripts/lint_hidden_unicode.ts
8174
8197
  var CHECK = "hidden-unicode";
8175
8198
  var _BIDI = /* @__PURE__ */ new Set([
@@ -8585,7 +8608,9 @@ function main(argv = null) {
8585
8608
  const args = parse_args(argv ?? process.argv.slice(2));
8586
8609
  const findings = [];
8587
8610
  const flagged = /* @__PURE__ */ new Set();
8611
+ let corpusFiles = 0;
8588
8612
  for (const sf of iter_corpus()) {
8613
+ corpusFiles += 1;
8589
8614
  const hits = _scan(sf);
8590
8615
  for (const h of hits) {
8591
8616
  findings.push(h);
@@ -8594,6 +8619,21 @@ function main(argv = null) {
8594
8619
  flagged.add(sf.path);
8595
8620
  }
8596
8621
  }
8622
+ try {
8623
+ assertScanned({
8624
+ gate: "lint_hidden_unicode",
8625
+ scanned: corpusFiles,
8626
+ units: "corpus file(s)",
8627
+ roots: DEFAULT_SCAN_ROOTS
8628
+ });
8629
+ } catch (exc) {
8630
+ if (exc instanceof DeadScopeError) {
8631
+ process.stderr.write(`\u274C ${exc.message}
8632
+ `);
8633
+ return 1;
8634
+ }
8635
+ throw exc;
8636
+ }
8597
8637
  const sourceFiles = _eligibleSourceFiles();
8598
8638
  for (const h of _scanSourceControlBytes(sourceFiles)) {
8599
8639
  findings.push(h);
@@ -14983,7 +15023,7 @@ if (isCliEntry3) {
14983
15023
  process.exit(main11(process.argv.slice(2)));
14984
15024
  }
14985
15025
 
14986
- // src/scripts/verify_before_complete_hook.ts
15026
+ // src/scripts/before_complete_hook.ts
14987
15027
  import fs19 from "node:fs";
14988
15028
  import path18 from "node:path";
14989
15029
  import { fileURLToPath as fileURLToPath13, pathToFileURL as pathToFileURL9 } from "node:url";
@@ -19005,6 +19045,22 @@ function main27() {
19005
19045
  for (const f of walkDir(scanDir, /\.(html|htm|css|scss|sass|less|vue|svelte|astro|jsx|tsx|md|mdx)$/i)) {
19006
19046
  if (!ignoreGlobs.some((g) => f.includes(g.replace("**", "")))) files.push(f);
19007
19047
  }
19048
+ try {
19049
+ assertScanned({
19050
+ gate: "lint_design_slop",
19051
+ scanned: files.length,
19052
+ units: "design source file(s)",
19053
+ // Absolute: --dir may point outside the cwd (or outside any repo).
19054
+ roots: [scanDir]
19055
+ });
19056
+ } catch (exc) {
19057
+ if (exc instanceof DeadScopeError) {
19058
+ process.stderr.write(`\u274C ${exc.message}
19059
+ `);
19060
+ process.exit(1);
19061
+ }
19062
+ throw exc;
19063
+ }
19008
19064
  const findings = [];
19009
19065
  for (const fp of files) {
19010
19066
  const rel = path37.relative(process.cwd(), fp);
@@ -19461,7 +19517,7 @@ var CONCERN_REGISTRY = {
19461
19517
  "src/scripts/roadmap_progress_hook.ts": main9,
19462
19518
  "src/scripts/onboarding_gate_hook.ts": main10,
19463
19519
  "src/scripts/context_hygiene_hook.ts": main11,
19464
- "src/scripts/verify_before_complete_hook.ts": main12,
19520
+ "src/scripts/before_complete_hook.ts": main12,
19465
19521
  "src/scripts/minimal_safe_diff_hook.ts": main13,
19466
19522
  "src/scripts/injection_scan_hook.ts": main14,
19467
19523
  "src/scripts/memory_learn_hook.ts": main15,
@@ -3,13 +3,13 @@
3
3
  "artefact_count": 594,
4
4
  "scanner_version": "c24312e116f8"
5
5
  },
6
- "generated_at": "2026-08-04",
6
+ "generated_at": "2026-08-05",
7
7
  "package": {
8
8
  "description": "Governed skills, rules and commands for AI coding tools (Claude Code, Cursor, Windsurf, Copilot) \u2014 every claim machine-checked, including \"zero runtime daemon\".",
9
9
  "homepage": "https://event4u-app.github.io/agent-config",
10
10
  "name": "@event4u/agent-config",
11
11
  "repository": "https://github.com/event4u-app/agent-config",
12
- "version": "9.20.0"
12
+ "version": "9.22.0"
13
13
  },
14
14
  "registries": [
15
15
  {
@@ -9,12 +9,12 @@
9
9
  "transport": {
10
10
  "type": "stdio"
11
11
  },
12
- "version": "9.20.0"
12
+ "version": "9.22.0"
13
13
  }
14
14
  ],
15
15
  "repository": {
16
16
  "source": "github",
17
17
  "url": "https://github.com/event4u-app/agent-config"
18
18
  },
19
- "version": "9.20.0"
19
+ "version": "9.22.0"
20
20
  }
@@ -9362,6 +9362,35 @@ var init_security_lint = __esm({
9362
9362
  }
9363
9363
  });
9364
9364
 
9365
+ // src/scripts/_lib/scan_scope.ts
9366
+ function assertScanned(opts) {
9367
+ if (opts.scanned > 0) {
9368
+ return;
9369
+ }
9370
+ if (opts.allowEmpty !== void 0 && opts.allowEmpty.trim() !== "") {
9371
+ return;
9372
+ }
9373
+ const roots = opts.roots.length > 0 ? opts.roots.join(", ") : "(no root declared)";
9374
+ throw new DeadScopeError(
9375
+ opts.gate,
9376
+ `${opts.gate}: scanned 0 ${opts.units} under ${roots} \u2014 the scan scope is dead or the root moved. A gate that read nothing has not passed. Repoint the root (prefer the shared resolver in _lib/agent_src.ts), or declare a justified \`allowEmpty\` reason if an empty corpus is genuinely expected.`
9377
+ );
9378
+ }
9379
+ var DeadScopeError;
9380
+ var init_scan_scope = __esm({
9381
+ "src/scripts/_lib/scan_scope.ts"() {
9382
+ "use strict";
9383
+ DeadScopeError = class extends Error {
9384
+ gate;
9385
+ constructor(gate, message) {
9386
+ super(message);
9387
+ this.name = "DeadScopeError";
9388
+ this.gate = gate;
9389
+ }
9390
+ };
9391
+ }
9392
+ });
9393
+
9365
9394
  // src/scripts/lint_hidden_unicode.ts
9366
9395
  import * as fs7 from "node:fs";
9367
9396
  import * as path7 from "node:path";
@@ -9549,7 +9578,9 @@ function main(argv = null) {
9549
9578
  const args = parse_args(argv ?? process.argv.slice(2));
9550
9579
  const findings = [];
9551
9580
  const flagged = /* @__PURE__ */ new Set();
9581
+ let corpusFiles = 0;
9552
9582
  for (const sf of iter_corpus()) {
9583
+ corpusFiles += 1;
9553
9584
  const hits = _scan(sf);
9554
9585
  for (const h of hits) {
9555
9586
  findings.push(h);
@@ -9558,6 +9589,21 @@ function main(argv = null) {
9558
9589
  flagged.add(sf.path);
9559
9590
  }
9560
9591
  }
9592
+ try {
9593
+ assertScanned({
9594
+ gate: "lint_hidden_unicode",
9595
+ scanned: corpusFiles,
9596
+ units: "corpus file(s)",
9597
+ roots: DEFAULT_SCAN_ROOTS
9598
+ });
9599
+ } catch (exc) {
9600
+ if (exc instanceof DeadScopeError) {
9601
+ process.stderr.write(`\u274C ${exc.message}
9602
+ `);
9603
+ return 1;
9604
+ }
9605
+ throw exc;
9606
+ }
9561
9607
  const sourceFiles = _eligibleSourceFiles();
9562
9608
  for (const h of _scanSourceControlBytes(sourceFiles)) {
9563
9609
  findings.push(h);
@@ -9608,6 +9654,7 @@ var init_lint_hidden_unicode = __esm({
9608
9654
  "src/scripts/lint_hidden_unicode.ts"() {
9609
9655
  "use strict";
9610
9656
  init_security_lint();
9657
+ init_scan_scope();
9611
9658
  CHECK = "hidden-unicode";
9612
9659
  _BIDI = /* @__PURE__ */ new Set([
9613
9660
  8234,
@@ -14000,35 +14047,6 @@ var init_release_scope = __esm({
14000
14047
  }
14001
14048
  });
14002
14049
 
14003
- // src/scripts/_lib/scan_scope.ts
14004
- function assertScanned(opts) {
14005
- if (opts.scanned > 0) {
14006
- return;
14007
- }
14008
- if (opts.allowEmpty !== void 0 && opts.allowEmpty.trim() !== "") {
14009
- return;
14010
- }
14011
- const roots = opts.roots.length > 0 ? opts.roots.join(", ") : "(no root declared)";
14012
- throw new DeadScopeError(
14013
- opts.gate,
14014
- `${opts.gate}: scanned 0 ${opts.units} under ${roots} \u2014 the scan scope is dead or the root moved. A gate that read nothing has not passed. Repoint the root (prefer the shared resolver in _lib/agent_src.ts), or declare a justified \`allowEmpty\` reason if an empty corpus is genuinely expected.`
14015
- );
14016
- }
14017
- var DeadScopeError;
14018
- var init_scan_scope = __esm({
14019
- "src/scripts/_lib/scan_scope.ts"() {
14020
- "use strict";
14021
- DeadScopeError = class extends Error {
14022
- gate;
14023
- constructor(gate, message) {
14024
- super(message);
14025
- this.name = "DeadScopeError";
14026
- this.gate = gate;
14027
- }
14028
- };
14029
- }
14030
- });
14031
-
14032
14050
  // src/scripts/skill_linter.ts
14033
14051
  var skill_linter_exports = {};
14034
14052
  __export(skill_linter_exports, {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@event4u/agent-config",
3
3
  "mcpName": "io.github.event4u-app/agent-config",
4
- "version": "9.20.0",
4
+ "version": "9.22.0",
5
5
  "description": "Governed skills, rules and commands for AI coding tools (Claude Code, Cursor, Windsurf, Copilot) — every claim machine-checked, including \"zero runtime daemon\".",
6
6
  "license": "MIT",
7
7
  "private": false,