@event4u/agent-config 16.1.0 → 16.3.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 (467) hide show
  1. package/.augment-plugin/marketplace.json +3 -3
  2. package/.augment-plugin/plugin.json +1 -1
  3. package/.claude-plugin/marketplace.json +1 -1
  4. package/CHANGELOG.md +98 -257
  5. package/README.md +14 -12
  6. package/dist/agent-src/commands/analyze/inbox.md +1 -1
  7. package/dist/agent-src/commands/analyze/roadmap-repos.md +1 -1
  8. package/dist/agent-src/commands/bug/fix.md +17 -2
  9. package/dist/agent-src/commands/feature/plan.md +1 -1
  10. package/dist/agent-src/commands/feature/roadmap.md +1 -1
  11. package/dist/agent-src/commands/fix/ci.md +1 -1
  12. package/dist/agent-src/commands/implement-ticket.md +1 -1
  13. package/dist/agent-src/commands/jira-ticket.md +1 -1
  14. package/dist/agent-src/commands/roadmap/create.md +1 -1
  15. package/dist/agent-src/commands/roadmap/materialize.md +1 -1
  16. package/dist/agent-src/commands/roadmap/process-full.md +5 -5
  17. package/dist/agent-src/commands/roadmap/resolve-blockers.md +361 -0
  18. package/dist/agent-src/commands/roadmap/triage-parked.md +325 -0
  19. package/dist/agent-src/commands/roadmap.md +18 -4
  20. package/dist/agent-src/commands/tests/create.md +17 -3
  21. package/dist/agent-src/commands/tests/execute.md +22 -5
  22. package/dist/agent-src/commands/work.md +4 -0
  23. package/dist/agent-src/contexts/authority/decision-revisit-gate-enforcement.md +43 -0
  24. package/dist/agent-src/contexts/communication/rules-auto/design-fidelity-enforcement.md +24 -0
  25. package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +6 -6
  26. package/dist/agent-src/contexts/execution/autonomy-mechanics.md +4 -8
  27. package/dist/agent-src/contexts/execution/roadmap-process-loop.md +32 -2
  28. package/dist/agent-src/contexts/execution/session-canary-enforcement-history.md +67 -0
  29. package/dist/agent-src/contexts/execution/toolchain-resolver.md +101 -7
  30. package/dist/agent-src/rules/active-remediation.md +1 -1
  31. package/dist/agent-src/rules/autonomous-execution.md +1 -0
  32. package/dist/agent-src/rules/broken-access-control.md +1 -0
  33. package/dist/agent-src/rules/command-suggestion-policy.md +1 -0
  34. package/dist/agent-src/rules/context-hygiene.md +1 -1
  35. package/dist/agent-src/rules/decision-revisit-gate.md +16 -33
  36. package/dist/agent-src/rules/design-fidelity.md +13 -16
  37. package/dist/agent-src/rules/doc-screenshot-hygiene.md +1 -0
  38. package/dist/agent-src/rules/domain-safety-disclaimer.md +1 -0
  39. package/dist/agent-src/rules/domain-safety-pii.md +1 -0
  40. package/dist/agent-src/rules/domain-safety-retention.md +1 -0
  41. package/dist/agent-src/rules/engineering-safety-floor.md +1 -0
  42. package/dist/agent-src/rules/evaluator-independence.md +3 -2
  43. package/dist/agent-src/rules/fast-path-marker-visibility.md +1 -0
  44. package/dist/agent-src/rules/finance-safety-floor.md +1 -0
  45. package/dist/agent-src/rules/git-history-discipline.md +1 -0
  46. package/dist/agent-src/rules/image-likeness-and-rights.md +1 -0
  47. package/dist/agent-src/rules/legal-safety-floor.md +3 -2
  48. package/dist/agent-src/rules/lethal-trifecta-guard.md +1 -0
  49. package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +1 -0
  50. package/dist/agent-src/rules/media-governance-routing.md +14 -17
  51. package/dist/agent-src/rules/persona-governance.md +2 -2
  52. package/dist/agent-src/rules/provider-lifecycle-discipline.md +1 -1
  53. package/dist/agent-src/rules/question-not-instruction.md +1 -0
  54. package/dist/agent-src/rules/roadmap-progress-sync.md +1 -1
  55. package/dist/agent-src/rules/runtime-safety.md +1 -0
  56. package/dist/agent-src/rules/secret-vcs-guard.md +1 -0
  57. package/dist/agent-src/rules/security-sensitive-stop.md +3 -2
  58. package/dist/agent-src/rules/session-canary.md +8 -62
  59. package/dist/agent-src/rules/settings-ask-protocol.md +1 -0
  60. package/dist/agent-src/rules/source-confidentiality.md +1 -0
  61. package/dist/agent-src/rules/strategy-safety-floor.md +1 -0
  62. package/dist/agent-src/rules/tool-safety.md +1 -0
  63. package/dist/agent-src/rules/ui-audit-gate.md +1 -2
  64. package/dist/agent-src/rules/untrusted-input-defense.md +1 -0
  65. package/dist/agent-src/rules/user-interrupt-priority.md +1 -0
  66. package/dist/agent-src/scripts/archive_completed_roadmaps.ts +115 -20
  67. package/dist/agent-src/scripts/deferral_carry.ts +339 -0
  68. package/dist/agent-src/scripts/update_roadmap_progress.ts +4 -1
  69. package/dist/agent-src/skills/accessibility-auditor/data/aria-patterns.csv +1 -1
  70. package/dist/agent-src/skills/accessibility-auditor/data/manifest.json +2 -2
  71. package/dist/agent-src/skills/api-design/data/manifest.json +2 -2
  72. package/dist/agent-src/skills/api-testing/SKILL.md +17 -0
  73. package/dist/agent-src/skills/code-intelligence/SKILL.md +14 -2
  74. package/dist/agent-src/skills/design-review/SKILL.md +30 -4
  75. package/dist/agent-src/skills/design-review/references/verification-automation.md +32 -0
  76. package/dist/agent-src/skills/design-system-capture/references/import-procedure.md +1 -1
  77. package/dist/agent-src/skills/existing-ui-audit/SKILL.md +18 -3
  78. package/dist/agent-src/skills/existing-ui-audit/references/component-taxonomy-detection.md +56 -0
  79. package/dist/agent-src/skills/fe-design/SKILL.md +1 -1
  80. package/dist/agent-src/skills/iconography/SKILL.md +1 -1
  81. package/dist/agent-src/skills/js-library-packaging/SKILL.md +2 -2
  82. package/dist/agent-src/skills/markitdown/SKILL.md +4 -0
  83. package/dist/agent-src/skills/monorepo-workspace/SKILL.md +1 -1
  84. package/dist/agent-src/skills/playwright-testing/SKILL.md +30 -6
  85. package/dist/agent-src/skills/quality-tools/SKILL.md +11 -1
  86. package/dist/agent-src/skills/quality-tools/references/go-tools.md +76 -0
  87. package/dist/agent-src/skills/quality-tools/references/python-tools.md +104 -0
  88. package/dist/agent-src/skills/review-routing/SKILL.md +2 -2
  89. package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +1 -1
  90. package/dist/agent-src/skills/storybook-workshop/SKILL.md +3 -3
  91. package/dist/agent-src/skills/tailwind-engineer/SKILL.md +1 -1
  92. package/dist/agent-src/skills/test-case-discovery/SKILL.md +7 -0
  93. package/dist/agent-src/skills/test-driven-development/SKILL.md +17 -0
  94. package/dist/agent-src/skills/test-performance/SKILL.md +19 -1
  95. package/dist/agent-src/skills/ui-component-architect/SKILL.md +25 -2
  96. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  97. package/dist/agent-src/templates/roadmaps.md +30 -0
  98. package/dist/agent-src/templates/scripts/work_engine/directives/ui/app_spec.ts +10 -4
  99. package/dist/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +302 -21
  100. package/dist/agent-src/templates/scripts/work_engine/directives/ui/audit.ts +22 -3
  101. package/dist/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +6 -1
  102. package/dist/agent-src/templates/scripts/work_engine/stack/runner.ts +774 -109
  103. package/dist/agent-src/templates/scripts/work_engine/state.ts +57 -7
  104. package/dist/agent-src/templates/scripts/work_engine/taxonomy/detect.ts +500 -0
  105. package/dist/agent-src/templates/scripts/work_engine/taxonomy/place.ts +183 -0
  106. package/dist/cli/python/knowledge_ingest.js +1 -1
  107. package/dist/cli/python/workspace_drive.js +1 -1
  108. package/dist/cli/registry.js +1 -1
  109. package/dist/cli-delegate/archive_completed_roadmaps.js +92 -12
  110. package/dist/cli-delegate/check_update_banner.js +12 -1
  111. package/dist/cli-delegate/chunk-523HCFYO.js +90 -0
  112. package/dist/cli-delegate/{chunk-M2DPGFZ4.js → chunk-6V6TA25H.js} +22 -152
  113. package/dist/cli-delegate/chunk-7IQE3D5S.js +191 -0
  114. package/dist/cli-delegate/{chunk-6KFEC3G7.js → chunk-CQWX336L.js} +1 -1
  115. package/dist/cli-delegate/chunk-DEIV7XP7.js +108 -0
  116. package/dist/cli-delegate/chunk-EEHDXSYD.js +2040 -0
  117. package/dist/cli-delegate/{chunk-P6ZHP5W2.js → chunk-GKE7ZVFA.js} +4 -4
  118. package/dist/cli-delegate/chunk-JQOM7TTM.js +1201 -0
  119. package/dist/cli-delegate/{chunk-UNCRJBT3.js → chunk-JQVYKIZA.js} +41 -0
  120. package/dist/cli-delegate/{chunk-FC75PGJE.js → chunk-JY2I2DXV.js} +12 -1
  121. package/dist/cli-delegate/chunk-KB5FZ655.js +208 -0
  122. package/dist/cli-delegate/{chunk-YUM5KURG.js → chunk-KR6EM23A.js} +235 -1455
  123. package/dist/cli-delegate/{chunk-LTYVIY76.js → chunk-LIYTLH6O.js} +1 -1
  124. package/dist/cli-delegate/chunk-NQ7WT43P.js +2729 -0
  125. package/dist/cli-delegate/chunk-NXEILF2K.js +2160 -0
  126. package/dist/cli-delegate/{chunk-5R7HOLAF.js → chunk-NYX3L2PZ.js} +1 -1
  127. package/dist/cli-delegate/{chunk-4E2W63DA.js → chunk-OKJUIAPS.js} +62 -1
  128. package/dist/cli-delegate/{chunk-QAJS5YWY.js → chunk-PHD7OOLE.js} +2 -1
  129. package/dist/cli-delegate/{chunk-RGNIWTEA.js → chunk-QLDHIPWR.js} +1 -1
  130. package/dist/cli-delegate/{chunk-HDVVGPQW.js → chunk-RQNNW7IF.js} +1405 -567
  131. package/dist/cli-delegate/{chunk-S3VFXMTM.js → chunk-S4UMZNES.js} +1 -1
  132. package/dist/cli-delegate/{chunk-6KM6ORRY.js → chunk-S4YWNRKO.js} +24 -8
  133. package/dist/cli-delegate/{chunk-GJCBB2UG.js → chunk-TRI6DQZ6.js} +3054 -325
  134. package/dist/cli-delegate/chunk-ULQRUR23.js +208 -0
  135. package/dist/cli-delegate/{chunk-NUHLI2RX.js → chunk-YCU3TIXH.js} +2 -0
  136. package/dist/cli-delegate/chunk-ZBZV2G5R.js +210 -0
  137. package/dist/cli-delegate/{chunk-WGXTVKCQ.js → chunk-ZUZKZYCN.js} +5 -3
  138. package/dist/cli-delegate/cmd_analyze_session.js +1 -1
  139. package/dist/cli-delegate/cmd_brand_status.js +1 -1
  140. package/dist/cli-delegate/cmd_conformance.js +1862 -809
  141. package/dist/cli-delegate/cmd_doctor.js +13 -6
  142. package/dist/cli-delegate/cmd_doctor_neighbours.js +23 -0
  143. package/dist/cli-delegate/cmd_explain.js +5 -5
  144. package/dist/cli-delegate/cmd_export.js +11 -8
  145. package/dist/cli-delegate/cmd_fleet.js +3 -3
  146. package/dist/cli-delegate/cmd_handoff.js +10 -7
  147. package/dist/cli-delegate/cmd_mcp_available.js +1 -1
  148. package/dist/cli-delegate/cmd_memory_get.js +3 -1
  149. package/dist/cli-delegate/cmd_migrate.js +2 -2
  150. package/dist/cli-delegate/cmd_packs_active.js +3 -3
  151. package/dist/cli-delegate/cmd_preflight.js +6 -6
  152. package/dist/cli-delegate/cmd_prune.js +11 -8
  153. package/dist/cli-delegate/cmd_refresh.js +2 -1
  154. package/dist/cli-delegate/cmd_route_audit.js +8 -6
  155. package/dist/cli-delegate/cmd_route_explain.js +4 -4
  156. package/dist/cli-delegate/cmd_session_recycle.js +4 -3
  157. package/dist/cli-delegate/cmd_settings_get.js +1 -1
  158. package/dist/cli-delegate/cmd_settings_migrate.js +11 -8
  159. package/dist/cli-delegate/cmd_settings_set.js +4 -4
  160. package/dist/cli-delegate/cmd_sync.js +11 -8
  161. package/dist/cli-delegate/cmd_uninstall.js +11 -8
  162. package/dist/cli-delegate/cmd_update.js +1 -1
  163. package/dist/cli-delegate/cmd_upgrade.js +3 -2
  164. package/dist/cli-delegate/cmd_validate.js +11 -8
  165. package/dist/cli-delegate/cmd_versions.js +1 -1
  166. package/dist/cli-delegate/deferral_carry.js +16 -0
  167. package/dist/cli-delegate/gate_execute.js +2 -2
  168. package/dist/cli-delegate/roadmap_gates.js +5 -5
  169. package/dist/cli-delegate/update_roadmap_progress.js +1 -1
  170. package/dist/discovery/deprecation-report.md +1 -1
  171. package/dist/discovery/discovery-manifest.json +132 -80
  172. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  173. package/dist/discovery/discovery-manifest.summary.md +3 -3
  174. package/dist/discovery/dormancy-report.md +1 -1
  175. package/dist/discovery/orphan-report.md +1 -1
  176. package/dist/discovery/packs.json +7 -5
  177. package/dist/discovery/trust-report.md +2 -2
  178. package/dist/discovery/workspaces.json +6 -4
  179. package/dist/hooks/dispatch.js +7972 -5186
  180. package/dist/hooks/dispatch.sha256 +1 -0
  181. package/dist/install/claudePathsPlan.js +47 -6
  182. package/dist/install/claudeRuleRewrite.js +7 -0
  183. package/dist/install/emit_host_rules_cli.js +39 -36
  184. package/dist/install/globalRuleScope.js +87 -0
  185. package/dist/install/host_rule_ownership.js +160 -0
  186. package/dist/install/install.mjs +2226 -1055
  187. package/dist/install/installThinLayer.js +261 -0
  188. package/dist/install/installedRuleLinks.js +176 -0
  189. package/dist/install/wizard-plan.js +24 -0
  190. package/dist/mcp/registry-manifest.json +3 -3
  191. package/dist/mcp/server.json +2 -2
  192. package/dist/mcp/server.mjs +40913 -34865
  193. package/dist/scripts/_lib/agent_settings.js +11 -0
  194. package/dist/scripts/_lib/claude_settings_hooks.js +10 -8
  195. package/dist/scripts/_lib/installed_layer.js +378 -0
  196. package/dist/scripts/_lib/lean_projection_mode.js +218 -15
  197. package/dist/scripts/_lib/rule_consequence_class.js +45 -0
  198. package/dist/scripts/_lib/rule_injection.js +67 -10
  199. package/dist/scripts/_lib/rule_law_section.js +122 -0
  200. package/dist/scripts/_lib/thin_rules.js +458 -0
  201. package/dist/scripts/_lib/windsurf_render.js +60 -0
  202. package/dist/scripts/condense.js +14 -26
  203. package/dist/scripts/project_thin_rules.js +14 -294
  204. package/dist/server/schemas/settings.js +29 -0
  205. package/dist/shared/skillRanking.js +74 -13
  206. package/dist/ui/assets/index-Cwq4d0hX.js +23 -0
  207. package/dist/ui/assets/index-Cyjy8bWO.css +1 -0
  208. package/dist/ui/index.html +2 -2
  209. package/docs/contracts/settings-classes.md +10 -6
  210. package/package.json +4 -4
  211. package/src/agent-src/scripts/archive_completed_roadmaps.ts +115 -20
  212. package/src/agent-src/scripts/deferral_carry.ts +339 -0
  213. package/src/agent-src/scripts/update_roadmap_progress.ts +4 -1
  214. package/src/agent-src/templates/scripts/work_engine/directives/ui/app_spec.ts +10 -4
  215. package/src/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +302 -21
  216. package/src/agent-src/templates/scripts/work_engine/directives/ui/audit.ts +22 -3
  217. package/src/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +6 -1
  218. package/src/agent-src/templates/scripts/work_engine/stack/runner.ts +774 -109
  219. package/src/agent-src/templates/scripts/work_engine/state.ts +57 -7
  220. package/src/agent-src/templates/scripts/work_engine/taxonomy/detect.ts +500 -0
  221. package/src/agent-src/templates/scripts/work_engine/taxonomy/place.ts +183 -0
  222. package/src/config/agent-settings.template.yml +91 -22
  223. package/src/config/ci-local-parity.yml +18 -0
  224. package/src/config/continuity-surface.json +9 -2
  225. package/src/config/evaluator-budgets.json +4 -4
  226. package/src/config/gate-coverage.yml +327 -3
  227. package/src/config/gate-violation-baselines.json +21 -9
  228. package/src/config/hook-bundle-budget.json +25 -0
  229. package/src/config/hook-latency-budget.json +21 -0
  230. package/src/config/hook-token-budget.json +8 -3
  231. package/src/config/host-instruction-limits.json +33 -0
  232. package/src/config/metric-registry.yml +114 -0
  233. package/src/config/placeholder-drift-budget.json +10 -0
  234. package/src/config/routing-coverage-seed.json +38 -3
  235. package/src/config/rule-activation-census.json +7 -3
  236. package/src/config/rule-consequence-class.json +161 -0
  237. package/src/config/rule-law-ceilings.json +99 -0
  238. package/src/install/claudePathsPlan.ts +46 -4
  239. package/src/install/claudeRuleRewrite.ts +10 -1
  240. package/src/install/emit_host_rules_cli.ts +43 -34
  241. package/src/install/globalRuleScope.ts +109 -0
  242. package/src/install/host_rule_ownership.ts +170 -0
  243. package/src/install/installThinLayer.ts +312 -0
  244. package/src/install/installedRuleLinks.ts +220 -0
  245. package/src/install/wizard-plan.ts +24 -0
  246. package/src/scripts/_cli/cmd_doctor.ts +28 -90
  247. package/src/scripts/_cli/cmd_doctor_neighbours.ts +293 -0
  248. package/src/scripts/_cli/doctor_execution.ts +100 -17
  249. package/src/scripts/_cli/doctor_network_posture.ts +226 -0
  250. package/src/scripts/_dispatch.bash +16 -2
  251. package/src/scripts/_lib/agent_settings.ts +11 -0
  252. package/src/scripts/_lib/body_portable.ts +102 -0
  253. package/src/scripts/_lib/cc_transcript.ts +132 -1
  254. package/src/scripts/_lib/claude_settings_hooks.ts +10 -8
  255. package/src/scripts/_lib/concern_sla_window.ts +200 -0
  256. package/src/scripts/_lib/estate_offsets.ts +241 -0
  257. package/src/scripts/_lib/exemption_shape.ts +143 -0
  258. package/src/scripts/_lib/fnv.ts +23 -0
  259. package/src/scripts/_lib/foreign_scan.ts +106 -0
  260. package/src/scripts/_lib/forge_protection.ts +114 -0
  261. package/src/scripts/_lib/forge_reader.ts +558 -0
  262. package/src/scripts/_lib/gitignore_block.ts +314 -0
  263. package/src/scripts/_lib/global_deploy_inventory.ts +32 -0
  264. package/src/scripts/_lib/graph_feeder_record.ts +214 -0
  265. package/src/scripts/_lib/hook_settings.ts +73 -0
  266. package/src/scripts/_lib/host_capability.ts +40 -19
  267. package/src/scripts/_lib/host_env_write.ts +111 -0
  268. package/src/scripts/_lib/host_hook_merge.ts +165 -0
  269. package/src/scripts/_lib/installed_layer.ts +538 -0
  270. package/src/scripts/_lib/json_merge.ts +82 -0
  271. package/src/scripts/_lib/json_pointers.ts +93 -11
  272. package/src/scripts/_lib/lean_projection_mode.ts +275 -15
  273. package/src/scripts/_lib/llm_proposer_transport.ts +14 -4
  274. package/src/scripts/_lib/machine_wake.ts +16 -3
  275. package/src/scripts/_lib/neighbour_census.ts +760 -0
  276. package/src/scripts/_lib/neighbour_scan.ts +122 -0
  277. package/src/scripts/_lib/neighbour_tool_use.ts +189 -0
  278. package/src/scripts/_lib/obligations.ts +119 -8
  279. package/src/scripts/_lib/probe_inputs.ts +271 -0
  280. package/src/scripts/_lib/prompt_shape.ts +46 -0
  281. package/src/scripts/_lib/read_surface_scan.ts +322 -0
  282. package/src/scripts/_lib/release_highlights.ts +2 -1
  283. package/src/scripts/_lib/release_migration_gate.ts +19 -3
  284. package/src/scripts/_lib/reserved_name_sweep.ts +73 -0
  285. package/src/scripts/_lib/retrieval_sanitize.ts +77 -16
  286. package/src/scripts/_lib/review_coverage.ts +134 -0
  287. package/src/scripts/_lib/rule_consequence_class.ts +71 -0
  288. package/src/scripts/_lib/rule_injection.ts +130 -10
  289. package/src/scripts/_lib/rule_law_section.ts +147 -0
  290. package/src/scripts/_lib/rule_layer_overlap.ts +58 -0
  291. package/src/scripts/_lib/shell_write_shapes.ts +108 -0
  292. package/src/scripts/_lib/skill_origin.ts +254 -0
  293. package/src/scripts/_lib/structural_hiding.ts +622 -0
  294. package/src/scripts/_lib/structured_ask.ts +64 -21
  295. package/src/scripts/_lib/thin_rules.ts +540 -0
  296. package/src/scripts/_lib/touched_file_quality.ts +434 -0
  297. package/src/scripts/_lib/turn_end_refusals.ts +600 -4
  298. package/src/scripts/_lib/turn_end_transcript.ts +216 -0
  299. package/src/scripts/_lib/verification_command.ts +324 -0
  300. package/src/scripts/_lib/verification_evidence.ts +647 -0
  301. package/src/scripts/_lib/verify_clause.ts +280 -0
  302. package/src/scripts/_lib/windsurf_render.ts +63 -0
  303. package/src/scripts/ai_council/cli_call_budget.ts +13 -5
  304. package/src/scripts/ai_council/clients.ts +26 -57
  305. package/src/scripts/ai_council/config.ts +1 -1
  306. package/src/scripts/ai_council/vendor_defaults.ts +45 -0
  307. package/src/scripts/ai_team/team_dispatch.ts +4 -0
  308. package/src/scripts/audit_skill_overlap.ts +261 -0
  309. package/src/scripts/before_complete_hook.ts +573 -25
  310. package/src/scripts/bench_hook_latency.ts +412 -5
  311. package/src/scripts/bench_touched_file_quality.ts +238 -0
  312. package/src/scripts/cache_realization_report.ts +61 -1
  313. package/src/scripts/check_argument_hint.ts +287 -0
  314. package/src/scripts/check_claims.ts +125 -1
  315. package/src/scripts/check_enforcement_coverage.ts +38 -9
  316. package/src/scripts/check_enforcement_matrix.ts +621 -22
  317. package/src/scripts/check_estate_count.ts +130 -153
  318. package/src/scripts/check_finding_dispositions.ts +138 -7
  319. package/src/scripts/check_generator_sync.ts +71 -0
  320. package/src/scripts/check_hook_bundle_composition.ts +370 -0
  321. package/src/scripts/check_host_docs_digest.ts +786 -0
  322. package/src/scripts/check_host_format_column.ts +559 -0
  323. package/src/scripts/check_input_references.ts +228 -0
  324. package/src/scripts/check_inputs_parity.ts +235 -0
  325. package/src/scripts/check_kernel_edit_ratified.ts +89 -9
  326. package/src/scripts/check_kill_switch_table.ts +294 -0
  327. package/src/scripts/check_memory.ts +7 -1
  328. package/src/scripts/check_placeholder_drift.ts +221 -0
  329. package/src/scripts/check_read_surface_coverage.ts +515 -0
  330. package/src/scripts/check_release_highlights.ts +10 -0
  331. package/src/scripts/check_release_holds.ts +2 -1
  332. package/src/scripts/check_release_pr_shape.ts +38 -15
  333. package/src/scripts/check_routing_coverage.ts +378 -11
  334. package/src/scripts/check_standing_rule_delivery.ts +33 -13
  335. package/src/scripts/check_static_parity.ts +17 -0
  336. package/src/scripts/check_verify_expectation_delta.ts +521 -0
  337. package/src/scripts/ci_settle.ts +145 -19
  338. package/src/scripts/closure_scan.ts +115 -1
  339. package/src/scripts/code_graph/detect.ts +127 -7
  340. package/src/scripts/code_graph/foreign.ts +194 -0
  341. package/src/scripts/code_graph/query.ts +217 -4
  342. package/src/scripts/code_graph/types.ts +26 -2
  343. package/src/scripts/code_graph/validate.ts +3 -1
  344. package/src/scripts/code_graph/verbs.ts +103 -0
  345. package/src/scripts/compile_hook_manifest.ts +90 -14
  346. package/src/scripts/condense.ts +14 -27
  347. package/src/scripts/estate_exemption_shape.ts +202 -0
  348. package/src/scripts/external_sources_denylist.json +29 -4
  349. package/src/scripts/generate_host_cost_table.ts +1 -1
  350. package/src/scripts/hook_manifest.json +1 -1
  351. package/src/scripts/hook_manifest.yaml +192 -14
  352. package/src/scripts/hooks/block_config_weakening.ts +294 -4
  353. package/src/scripts/hooks/block_kernel_rule_writes.ts +9 -78
  354. package/src/scripts/hooks/block_plumbing_writes.ts +342 -0
  355. package/src/scripts/hooks/bundle_integrity.ts +291 -0
  356. package/src/scripts/hooks/chain_nudge_hook.ts +1 -2
  357. package/src/scripts/hooks/code_graph_context_hook.ts +253 -25
  358. package/src/scripts/hooks/comment_discipline_hook.ts +1 -3
  359. package/src/scripts/hooks/concern_failure_policy.ts +280 -0
  360. package/src/scripts/hooks/concern_registry.ts +2 -0
  361. package/src/scripts/hooks/concern_timings.ts +94 -0
  362. package/src/scripts/hooks/delegation_nudge_hook.ts +1 -2
  363. package/src/scripts/hooks/design_pass_hook.ts +100 -9
  364. package/src/scripts/hooks/design_slop_hook.ts +1 -2
  365. package/src/scripts/hooks/dispatch_hook.ts +77 -71
  366. package/src/scripts/hooks/edit_shape_hook.ts +1 -2
  367. package/src/scripts/hooks/end_review_nudge_hook.ts +1 -1
  368. package/src/scripts/hooks/evidence_independence.ts +1 -2
  369. package/src/scripts/hooks/exit_codes.ts +129 -0
  370. package/src/scripts/hooks/host_lowering.json +1 -0
  371. package/src/scripts/hooks/host_lowering.ts +146 -3
  372. package/src/scripts/hooks/host_lowering.yaml +262 -46
  373. package/src/scripts/hooks/host_semantics.ts +30 -2
  374. package/src/scripts/hooks/injection_budget.ts +9 -2
  375. package/src/scripts/hooks/interruption_ledger_hook.ts +1 -2
  376. package/src/scripts/hooks/journal_record_hook.ts +1 -2
  377. package/src/scripts/hooks/memory_recall_hook.ts +1 -2
  378. package/src/scripts/hooks/obligation_settle_hook.ts +151 -5
  379. package/src/scripts/hooks/one_question_per_ask_hook.ts +43 -6
  380. package/src/scripts/hooks/orchestration_record_hook.ts +1 -2
  381. package/src/scripts/hooks/payload_stub.ts +10 -1
  382. package/src/scripts/hooks/permission_gate.ts +1 -2
  383. package/src/scripts/hooks/push_settle_hook.ts +1 -3
  384. package/src/scripts/hooks/replay_hook.ts +2 -1
  385. package/src/scripts/hooks/reread_guard_hook.ts +1 -2
  386. package/src/scripts/hooks/review_baseline_hook.ts +1 -2
  387. package/src/scripts/hooks/rtk_wrap_hook.ts +1 -2
  388. package/src/scripts/hooks/rule_inject_hook.ts +765 -68
  389. package/src/scripts/hooks/run_continuation_hook.ts +13 -15
  390. package/src/scripts/hooks/skill_route_hook.ts +1 -2
  391. package/src/scripts/hooks/source_first_gate_hook.ts +1 -2
  392. package/src/scripts/hooks/spawn_guard_shadow_hook.ts +1 -2
  393. package/src/scripts/hooks/subagent_ledger_hook.ts +1 -2
  394. package/src/scripts/hooks/suggestion_capture_hook.ts +1 -1
  395. package/src/scripts/hooks/table_fingerprint.ts +70 -0
  396. package/src/scripts/hooks/telemetry_flush_hook.ts +1 -2
  397. package/src/scripts/hooks/telemetry_usage_hook.ts +65 -10
  398. package/src/scripts/hooks/tool_result_bytes_hook.ts +93 -9
  399. package/src/scripts/hooks/turn_end_gate_hook.ts +421 -324
  400. package/src/scripts/hooks/ui_route_nudge_hook.ts +1 -2
  401. package/src/scripts/hooks_status.ts +112 -0
  402. package/src/scripts/injection_scan_hook.ts +7 -0
  403. package/src/scripts/install.ts +75 -189
  404. package/src/scripts/installed_layer_report.ts +103 -0
  405. package/src/scripts/language_mirror_hook.ts +15 -6
  406. package/src/scripts/learning_sidecar.ts +119 -8
  407. package/src/scripts/lint_deny_text.ts +419 -0
  408. package/src/scripts/lint_exit_codes.ts +262 -0
  409. package/src/scripts/lint_hook_manifest.ts +108 -0
  410. package/src/scripts/lint_major_migration_sections.ts +156 -26
  411. package/src/scripts/lint_pack_boundaries.ts +63 -5
  412. package/src/scripts/lint_roadmap_blockers.ts +78 -12
  413. package/src/scripts/lint_rule_law_section.ts +517 -0
  414. package/src/scripts/lint_skill_descriptions.ts +1 -1
  415. package/src/scripts/lint_skill_scripts_readonly.ts +1 -1
  416. package/src/scripts/lint_workflow_security.ts +161 -5
  417. package/src/scripts/mcp_server/consumer_tool_catalog.json +53 -0
  418. package/src/scripts/mcp_server/graph_tools.ts +72 -3
  419. package/src/scripts/mcp_server/prompts.ts +142 -1
  420. package/src/scripts/measure_routing_signal.ts +54 -16
  421. package/src/scripts/measure_skill_ranker_baseline.ts +515 -53
  422. package/src/scripts/measure_turn_end_gate.ts +193 -0
  423. package/src/scripts/memory_learn_hook.ts +91 -6
  424. package/src/scripts/memory_lookup.ts +1 -1
  425. package/src/scripts/model_rule_injection.ts +52 -5
  426. package/src/scripts/prepack-check.mjs +53 -0
  427. package/src/scripts/project_thin_rules.ts +34 -327
  428. package/src/scripts/release_publication.ts +13 -1
  429. package/src/scripts/report_evidence_temperature.ts +657 -0
  430. package/src/scripts/report_installed_rule_links.ts +157 -0
  431. package/src/scripts/report_invocation_surface.ts +383 -0
  432. package/src/scripts/report_label_agreement.ts +233 -0
  433. package/src/scripts/report_obligation_carriers.ts +699 -0
  434. package/src/scripts/report_obligation_mechanism.ts +230 -0
  435. package/src/scripts/report_obligation_writer_split.ts +236 -0
  436. package/src/scripts/report_single_token_triggers.ts +277 -0
  437. package/src/scripts/report_skill_menu_census.ts +208 -0
  438. package/src/scripts/report_skill_ranker_confusion.ts +442 -0
  439. package/src/scripts/report_standing_payload_by_host.ts +188 -15
  440. package/src/scripts/report_verification_record_coverage.ts +306 -0
  441. package/src/scripts/roadmap_verify_share.ts +213 -0
  442. package/src/scripts/rule_activation_census.ts +5 -2
  443. package/src/scripts/rule_trigger_eval.ts +9 -9
  444. package/src/scripts/schemas/command.schema.json +44 -0
  445. package/src/scripts/schemas/review-findings.schema.json +7 -2
  446. package/src/scripts/schemas/rule.schema.json +5 -0
  447. package/src/scripts/schemas/skill.schema.json +44 -0
  448. package/src/scripts/self_review_gate.ts +421 -17
  449. package/src/scripts/semantic_parity_census.ts +314 -0
  450. package/src/scripts/session_eol_report.ts +54 -1
  451. package/src/scripts/skill_tools/score_skill_relevance.ts +290 -25
  452. package/src/scripts/sweep_dead_scan_roots.ts +1 -1
  453. package/src/scripts/sweep_skill_ranker_signals.ts +129 -0
  454. package/src/scripts/sync_gitignore.ts +29 -235
  455. package/src/scripts/trigger_eval_grandfather.json +0 -7
  456. package/src/scripts/trigger_eval_rotation.ts +122 -27
  457. package/src/scripts/ui_conformance_probe.ts +156 -4
  458. package/src/scripts/update_prices.ts +85 -3
  459. package/src/scripts/write_bundle_digest.mjs +74 -0
  460. package/src/server/schemas/settings.ts +41 -0
  461. package/src/shared/skillRanking.ts +117 -11
  462. package/src/templates/consumer-settings/ONBOARDING.md +1 -0
  463. package/dist/cli-delegate/chunk-FXYUYU4N.js +0 -4416
  464. package/dist/cli-delegate/chunk-QJWAUMJW.js +0 -1072
  465. package/dist/cli-delegate/chunk-YDPILCOL.js +0 -152
  466. package/dist/ui/assets/index-DH1xc62v.js +0 -29
  467. package/dist/ui/assets/index-jSfMW8_t.css +0 -1
@@ -0,0 +1,220 @@
1
+ /**
2
+ * Do the links inside an installed rule file resolve from where the install
3
+ * puts it?
4
+ *
5
+ * A rule body is authored in `src/rules/` and projected to
6
+ * `dist/agent-src/rules/`, where `](../guidelines/x.md)` resolves because the
7
+ * sibling directory is right there. The installer then copies a SUBSET of
8
+ * those sibling directories into the host's rule directory, so the same link
9
+ * resolves or does not depending on a list in `install.ts` that the rule
10
+ * author never sees. Nothing checked the two against each other.
11
+ *
12
+ * This module answers one question per link — resolved, or why not — against a
13
+ * deploy plan rather than against a materialised tree, so the audit costs a
14
+ * `statSync` per distinct target instead of a copy of 299 skills.
15
+ *
16
+ * Side-effect-free, no CLI entry, no `process.exit`.
17
+ */
18
+ import * as fs from 'node:fs';
19
+ import * as path from 'node:path';
20
+
21
+ /** Why a link does not resolve from the installed file's own directory. */
22
+ export type LinkVerdict =
23
+ /** The target file is present in the installed tree. */
24
+ | 'resolved'
25
+ /** The link climbs above the install root — a repo-tree path, never shipped. */
26
+ | 'outside-install-root'
27
+ /** The first segment names a directory the deploy plan does not write. */
28
+ | 'directory-not-deployed'
29
+ /** The directory IS deployed, but the file is not in it. */
30
+ | 'file-missing';
31
+
32
+ export interface LinkAudit {
33
+ /** Rule file the link was written in, as a bare id (no directory, no `.md`). */
34
+ rule: string;
35
+ /** The link target exactly as the markdown carries it, anchor included. */
36
+ target: string;
37
+ /** Install-root-relative path the target resolves to, or null when it escapes. */
38
+ resolved_to: string | null;
39
+ verdict: LinkVerdict;
40
+ }
41
+
42
+ export interface LinkAuditReport {
43
+ audits: LinkAudit[];
44
+ /** Count per verdict, every verdict present even at zero. */
45
+ counts: Record<LinkVerdict, number>;
46
+ /** Unresolved links grouped by the first path segment, highest first. */
47
+ by_directory: { directory: string; count: number; verdict: LinkVerdict }[];
48
+ }
49
+
50
+ /**
51
+ * A deploy plan: installed directory name -> the package directory copied into
52
+ * it. Exactly the shape of one `GLOBAL_DEPLOY_SOURCES` entry, inverted, so a
53
+ * caller can hand this module the real plan rather than a restatement of it.
54
+ */
55
+ export type DeployPlan = Map<string, string>;
56
+
57
+ /**
58
+ * Build a plan from `GLOBAL_DEPLOY_SOURCES`-shaped pairs.
59
+ *
60
+ * The empty destination (`cline` maps rules to the root) is deliberately kept:
61
+ * a rule installed at the root resolves `../x` differently, and silently
62
+ * dropping the entry would make this module answer a question about a layout
63
+ * that is not the one being installed.
64
+ */
65
+ export function deployPlanFrom(pairs: ReadonlyArray<readonly [string, string]>): DeployPlan {
66
+ const plan: DeployPlan = new Map();
67
+ for (const [source, dest] of pairs) plan.set(dest, source);
68
+ return plan;
69
+ }
70
+
71
+ /** Markdown inline links, minus the ones that are not a path into the tree. */
72
+ export function relativeLinkTargets(markdown: string): string[] {
73
+ const out: string[] = [];
74
+ for (const m of markdown.matchAll(/\]\(([^)\s]+)\)/g)) {
75
+ const target = m[1] as string;
76
+ if (/^[a-z][a-z0-9+.-]*:/i.test(target)) continue; // http:, mailto:, etc.
77
+ if (target.startsWith('#')) continue; // same-file anchor
78
+ if (target.startsWith('/')) continue; // absolute — not ours to resolve
79
+ out.push(target);
80
+ }
81
+ return out;
82
+ }
83
+
84
+ /** Strip a trailing `#anchor`; a bare directory link keeps its trailing slash. */
85
+ function withoutAnchor(target: string): string {
86
+ const hash = target.indexOf('#');
87
+ return hash === -1 ? target : target.slice(0, hash);
88
+ }
89
+
90
+ /**
91
+ * Audit one link written in a rule that the install places at
92
+ * `<install-root>/<rulesDest>/<rule>.md`.
93
+ */
94
+ export function auditLink(
95
+ rule: string,
96
+ target: string,
97
+ rulesDest: string,
98
+ plan: DeployPlan,
99
+ packageRoot: string,
100
+ ): LinkAudit {
101
+ const bare = withoutAnchor(target);
102
+ // Resolve the link the way a reader does: from the installed file's own
103
+ // DIRECTORY — `rulesDest` is that directory, not the file — as a POSIX
104
+ // path relative to the install root. A sibling link (`[x](other.md)`, no
105
+ // `../`) therefore stays inside the rules directory, which is where the
106
+ // installer puts its sibling.
107
+ const fromDir = rulesDest === '' ? '.' : rulesDest;
108
+ const resolved = path.posix.normalize(path.posix.join(fromDir, bare));
109
+
110
+ if (resolved.startsWith('..')) {
111
+ return { rule, target, resolved_to: null, verdict: 'outside-install-root' };
112
+ }
113
+
114
+ const segments = resolved.split('/');
115
+ // Which deployed directory does this land in? Normally the first segment
116
+ // names it. When rules install at the install ROOT (`cline` maps them to
117
+ // `''`), there is no such segment: a sibling link like `](scope-control.md)`
118
+ // resolves to `scope-control.md`, whose first segment is a FILE NAME. Read
119
+ // literally that is `directory-not-deployed` for a file the install writes
120
+ // right beside the rule — 275 of cline's 523 links, every one of them fine.
121
+ // The `''` key exists in the plan precisely for this and could never be
122
+ // reached by a first-segment lookup.
123
+ const rootSource = plan.get('');
124
+ // The root entry answers for a BARE filename only. A link with a directory
125
+ // segment the plan does not carry is `directory-not-deployed`, the same as
126
+ // anywhere else — resolving it against the rules source would probe a path
127
+ // the install never writes and report `file-missing`, whose documented
128
+ // meaning ("the directory IS deployed") would then be false.
129
+ const useRoot = rootSource !== undefined && segments.length === 1;
130
+ const source = useRoot ? rootSource : plan.get(segments[0] as string);
131
+ const rest = useRoot ? segments : segments.slice(1);
132
+ if (source === undefined) {
133
+ return { rule, target, resolved_to: resolved, verdict: 'directory-not-deployed' };
134
+ }
135
+
136
+ // An empty `rest` means the link points at the deployed directory itself.
137
+ const onDisk = path.join(packageRoot, source, ...rest);
138
+ const exists = fs.existsSync(onDisk);
139
+ return {
140
+ rule,
141
+ target,
142
+ resolved_to: resolved,
143
+ verdict: exists ? 'resolved' : 'file-missing',
144
+ };
145
+ }
146
+
147
+ const EMPTY_COUNTS = (): Record<LinkVerdict, number> => ({
148
+ resolved: 0,
149
+ 'outside-install-root': 0,
150
+ 'directory-not-deployed': 0,
151
+ 'file-missing': 0,
152
+ });
153
+
154
+ /**
155
+ * Audit every link in every rule the plan installs.
156
+ *
157
+ * `packageRoot` is the package checkout the installer copies FROM; the rule
158
+ * bodies are read from the plan's own rules source, so the audit cannot drift
159
+ * from what is shipped.
160
+ */
161
+ export function auditInstalledRuleLinks(plan: DeployPlan, packageRoot: string): LinkAuditReport {
162
+ const audits: LinkAudit[] = [];
163
+ for (const [dest, source] of plan) {
164
+ if (!source.endsWith('/rules')) continue;
165
+ const dir = path.join(packageRoot, source);
166
+ if (!fs.existsSync(dir)) continue;
167
+ const files = fs
168
+ .readdirSync(dir, { withFileTypes: true })
169
+ .filter((e) => !e.isDirectory() && e.name.endsWith('.md'))
170
+ .map((e) => e.name)
171
+ .sort();
172
+ for (const file of files) {
173
+ const rule = file.replace(/\.md$/, '');
174
+ const body = fs.readFileSync(path.join(dir, file), 'utf8');
175
+ for (const target of relativeLinkTargets(body)) {
176
+ audits.push(auditLink(rule, target, dest, plan, packageRoot));
177
+ }
178
+ }
179
+ }
180
+
181
+ const counts = EMPTY_COUNTS();
182
+ for (const a of audits) counts[a.verdict] += 1;
183
+
184
+ const grouped = new Map<string, { count: number; verdict: LinkVerdict }>();
185
+ for (const a of audits) {
186
+ if (a.verdict === 'resolved') continue;
187
+ const key = a.resolved_to === null ? a.target.replace(/[^/]*$/, '') : (a.resolved_to.split('/')[0] as string);
188
+ const row = grouped.get(key);
189
+ if (row) row.count += 1;
190
+ else grouped.set(key, { count: 1, verdict: a.verdict });
191
+ }
192
+ const by_directory = [...grouped.entries()]
193
+ .map(([directory, v]) => ({ directory, count: v.count, verdict: v.verdict }))
194
+ .sort((a, b) => b.count - a.count || a.directory.localeCompare(b.directory));
195
+
196
+ return { audits, counts, by_directory };
197
+ }
198
+
199
+ /**
200
+ * Standing-text cost of the rewrite option, in characters.
201
+ *
202
+ * Option A of this roadmap's step 1.2: leave the install plan alone and
203
+ * rewrite every link to an absolute package path. Each unresolved link then
204
+ * grows by the absolute prefix minus the `../` it replaces — and it grows
205
+ * INSIDE a rule body, which is the text the host loads as instructions.
206
+ *
207
+ * `prefixChars` is the installed package root's own length, which is a
208
+ * property of the machine, so the caller supplies it and the report says which
209
+ * value it used.
210
+ */
211
+ export function rewriteOptionCost(report: LinkAuditReport, prefixChars: number): number {
212
+ const unresolved = report.audits.filter((a) => a.verdict !== 'resolved');
213
+ let total = 0;
214
+ for (const a of unresolved) {
215
+ // `../x` and `../../x` both become `<abs>/x`: the climb is replaced.
216
+ const climb = (a.target.match(/\.\.\//g) ?? []).length * 3;
217
+ total += prefixChars + 1 - climb;
218
+ }
219
+ return total;
220
+ }
@@ -64,6 +64,30 @@ export const USER_SCOPE_PATHS: Readonly<Record<string, string>> = {
64
64
  /**
65
65
  * Universal Anthropic-shaped skill bundle deployed to markdown-skills
66
66
  * tools. Mirrors `_CLAUDE_SKILL_BUNDLE` in the retired Python installer (ADR-200).
67
+ *
68
+ * NOT deploying `contexts/` and `guidelines/` here is a held decision, not an
69
+ * oversight — see the `rule-link-targets-change-the-frozen-install-abi` blocker
70
+ * on `road-to-rule-triggers-and-links-that-hold`.
71
+ *
72
+ * A rule is authored against the package tree and projected verbatim, so
73
+ * `](../guidelines/x.md)` resolves in `dist/agent-src/rules/` and then does
74
+ * not resolve in the install, because this table does not carry those two
75
+ * directories. Measured by `report_installed_rule_links` on 2026-10-03: 136 of
76
+ * 523 links in an installed Claude rule directory point nowhere, 112 of them
77
+ * into exactly those two. Adding them is the cheaper of the two repairs on the
78
+ * budget that is scarce — 0 standing characters against **5,152** for rewriting
79
+ * those same 112 links to absolute package paths, at a 48-character install
80
+ * prefix (the report prints the prefix it used; the figure scales with it).
81
+ *
82
+ * The totals were 160 of 550 when this was first measured and 158 of 545 on
83
+ * 2026-10-02; what fell since is the OTHER population — repo-tree link forms no
84
+ * install ever held — so the 112 this paragraph is about has not moved.
85
+ *
86
+ * It is held because this table is part of the FROZEN install ABI
87
+ * (`docs/contracts/install-layout.md`), and any change to it owes an
88
+ * `install_layout_version` bump plus a deprecation window: old and new shape
89
+ * side by side for a minor cycle, with in-place migration. That is a release
90
+ * commitment, not an implementation detail, so it is the owner's to make.
67
91
  */
68
92
  const CLAUDE_SKILL_BUNDLE: ReadonlyArray<readonly [string, string]> = [
69
93
  ['dist/agent-src/rules', 'rules'],
@@ -114,7 +114,8 @@ import {
114
114
  resolve_project_root,
115
115
  type TraceRecord,
116
116
  } from '../_lib/agent_settings.js';
117
- import { executionJson, forgeProtectionJson, UNREAD_FORGE } from './doctor_execution.js';
117
+ import { executionJson, forgeProtectionJsonFor } from './doctor_execution.js';
118
+ import { checkOfflineReadiness, trafficEnvironmentJson } from './doctor_network_posture.js';
118
119
  import * as ai_council_clients from '../ai_council/clients.js';
119
120
  import * as ai_council_config from '../ai_council/config.js';
120
121
  import {
@@ -133,6 +134,8 @@ import {
133
134
  } from './detection_report.js';
134
135
  import { review_gate_doctor_signal } from '../ai_team/review_gate.js';
135
136
  import { resolvePackageRoot } from '../_lib/package_root.js';
137
+ import { rglob as _rglob_raw, scanForeign } from '../_lib/foreign_scan.js';
138
+ import { runCensus, summaryLine } from './cmd_doctor_neighbours.js';
136
139
  import {
137
140
  LEGACY_ALL,
138
141
  excludedRuleBasenames,
@@ -616,77 +619,17 @@ function _collect_manifest_entries(
616
619
  return [records, known];
617
620
  }
618
621
 
619
- /**
620
- * Walk every declared deploy root and surface unclaimed files. Only regular
621
- * files under `deploy_roots` count; bookkeeping is on the resolved final path.
622
- */
623
- function _scan_foreign(
624
- project_root: string,
625
- manifest: Dict,
626
- known: Set<string>,
627
- ): string[] {
628
- const roots =
629
- (manifest['deploy_roots'] as unknown[] | undefined) ||
630
- Array.from(installed_tools.DEFAULT_DEPLOY_ROOTS);
631
- const foreign: string[] = [];
632
- const seen = new Set<string>();
633
- for (const root_rel of roots) {
634
- const root = _resolve_path(project_root, String(root_rel));
635
- if (!pathExists(root) || !isDir(root)) {
636
- continue;
637
- }
638
- for (const child of rglob(root)) {
639
- if (!isFile(child)) {
640
- continue;
641
- }
642
- let resolved: string;
643
- try {
644
- resolved = resolvePath(child);
645
- } catch {
646
- resolved = child;
647
- }
648
- if (known.has(resolved) || seen.has(resolved)) {
649
- continue;
650
- }
651
- seen.add(resolved);
652
- foreign.push(child);
653
- }
654
- }
655
- foreign.sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));
656
- return foreign;
657
- }
658
-
659
- /**
660
- * `Path.rglob("*")` — every descendant path (dirs + files), recursively.
661
- * Order is not relied upon by callers (they sort the matched set), but the
662
- * walk is deterministic (sorted per directory) to keep behaviour stable.
663
- */
664
- function rglob(root: string): string[] {
665
- const out: string[] = [];
666
- const walk = (dir: string): void => {
667
- let entries: fs.Dirent[];
668
- try {
669
- entries = fs.readdirSync(dir, { withFileTypes: true });
670
- } catch {
671
- return;
672
- }
673
- entries.sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));
674
- for (const ent of entries) {
675
- const full = path.join(dir, ent.name);
676
- out.push(full);
677
- let dirLike = ent.isDirectory();
678
- if (ent.isSymbolicLink()) {
679
- // pathlib rglob follows into symlinked dirs.
680
- dirLike = isDir(full);
681
- }
682
- if (dirLike) {
683
- walk(full);
684
- }
685
- }
686
- };
687
- walk(root);
688
- return out;
689
- }
622
+ const rglob = (root: string): string[] => _rglob_raw(root, isDir, path.join);
623
+ const _scan_foreign = (project_root: string, manifest: Dict, known: Set<string>): string[] =>
624
+ scanForeign(project_root, manifest, known, {
625
+ pathExists,
626
+ isDir,
627
+ isFile,
628
+ resolvePath,
629
+ join: path.join,
630
+ resolveRoot: _resolve_path,
631
+ defaultRoots: installed_tools.DEFAULT_DEPLOY_ROOTS,
632
+ });
690
633
 
691
634
  /**
692
635
  * Split manifest records into missing / modified / tag-drift lists.
@@ -1450,23 +1393,7 @@ function _check_mcp_mode(project_root: string): Dict {
1450
1393
  };
1451
1394
  }
1452
1395
 
1453
- function _check_offline_readiness(): Dict {
1454
- const script = path.join(_package_root(), 'src', 'scripts', 'hermetic-install.sh');
1455
- if (!pathExists(script)) {
1456
- return {
1457
- id: 'offline-readiness',
1458
- status: 'warn',
1459
- message: 'src/scripts/hermetic-install.sh not found in package',
1460
- remedy: 'reinstall @event4u/agent-config or pull missing files',
1461
- };
1462
- }
1463
- return {
1464
- id: 'offline-readiness',
1465
- status: 'ok',
1466
- message: 'verified-offline install entrypoint present',
1467
- remedy: '',
1468
- };
1469
- }
1396
+ const _check_offline_readiness = (): Dict => checkOfflineReadiness(_package_root());
1470
1397
 
1471
1398
  function _check_stale_orphans(): Dict {
1472
1399
  const gdi = global_deploy_inventory;
@@ -3043,6 +2970,11 @@ function _run_no_manifest(
3043
2970
  _emit_checks_text(checks);
3044
2971
  _emit_detection_text(project_root, checks);
3045
2972
  }
2973
+ // Also on the no-manifest branch: a consumer with no project lockfile
2974
+ // still has neighbours, and a census that appeared only once a lockfile
2975
+ // existed would be missing on exactly the install shape most likely to
2976
+ // have other packages in it.
2977
+ if (opts.check === null && !opts.json) print(summaryLine(runCensus(project_root, _package_root())));
3046
2978
 
3047
2979
  if (opts.check !== null) {
3048
2980
  if (skipped_requested) {
@@ -3077,7 +3009,8 @@ function _emit_json(
3077
3009
  };
3078
3010
  if (origin !== null) payload['project_root_origin'] = origin;
3079
3011
  payload['execution'] = executionJson(() => iter_setting_overrides({ cwd: project_root }));
3080
- payload['forge_protection'] = forgeProtectionJson(UNREAD_FORGE); // 3.2
3012
+ payload['forge_protection'] = forgeProtectionJsonFor(String(project_root)); // 3.2 · AC-5
3013
+ payload['traffic_environment'] = trafficEnvironmentJson(process.env);
3081
3014
  if (checks !== null) {
3082
3015
  payload['checks'] = checks;
3083
3016
  const drift = missing.length + modified.length + foreign.length + tag_drift.length;
@@ -3466,6 +3399,11 @@ function main(argv: string[] | null = null): number {
3466
3399
  _emit_detection_text(project_root, checks);
3467
3400
  if (opts.check === null) {
3468
3401
  _emit_text(project_root, missing, modified, foreign, tag_drift);
3402
+ // One line, counts only — the `foreign` listing above stays as it
3403
+ // is and nothing is removed from it. That listing walks THIS
3404
+ // package's deploy roots; the census walks where the hosts keep
3405
+ // things, which is a strictly larger question with its own verb.
3406
+ print(summaryLine(runCensus(project_root, _package_root())));
3469
3407
  }
3470
3408
  }
3471
3409