@event4u/agent-config 17.1.0 → 17.2.1

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 (73) 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 +92 -0
  5. package/README.md +2 -2
  6. package/dist/agent-src/commands/project/analyze.md +9 -6
  7. package/dist/agent-src/commands/project/map.md +58 -0
  8. package/dist/agent-src/commands/project.md +5 -3
  9. package/dist/agent-src/skills/code-intelligence/SKILL.md +6 -0
  10. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  11. package/dist/cli/registry.js +1 -1
  12. package/dist/cli-delegate/cmd_conformance.js +23 -39
  13. package/dist/discovery/deprecation-report.md +1 -1
  14. package/dist/discovery/discovery-manifest.json +39 -13
  15. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  16. package/dist/discovery/discovery-manifest.summary.md +3 -3
  17. package/dist/discovery/dormancy-report.md +1 -1
  18. package/dist/discovery/orphan-report.md +1 -1
  19. package/dist/discovery/packs.json +6 -5
  20. package/dist/discovery/trust-report.md +2 -2
  21. package/dist/discovery/workspaces.json +5 -4
  22. package/dist/hooks/dispatch.js +65 -74
  23. package/dist/hooks/dispatch.sha256 +1 -1
  24. package/dist/hooks/instructions_observer.chunk.cjs +301 -0
  25. package/dist/hooks/instructions_observer.chunk.cjs.sha256 +1 -0
  26. package/dist/mcp/registry-manifest.json +2 -2
  27. package/dist/mcp/server.json +2 -2
  28. package/dist/mcp/server.mjs +33058 -22930
  29. package/package.json +4 -1
  30. package/src/config/continuity-surface.json +7 -0
  31. package/src/config/evaluator-budgets.json +4 -4
  32. package/src/config/gate-violation-baselines.json +3 -3
  33. package/src/config/gitignore-block.txt +6 -0
  34. package/src/config/hook-bundle-budget.json +17 -2
  35. package/src/config/hook-token-budget.json +1 -1
  36. package/src/config/packed-binary-manifest.json +27 -0
  37. package/src/config/skill-body-budget.json +7 -1
  38. package/src/scripts/_lib/bench_ab_complexity.ts +14 -2
  39. package/src/scripts/_lib/collector_record.ts +1 -0
  40. package/src/scripts/_lib/runtime_journal.ts +7 -7
  41. package/src/scripts/code_graph/build.ts +210 -10
  42. package/src/scripts/code_graph/cli.ts +168 -46
  43. package/src/scripts/code_graph/detect.ts +5 -4
  44. package/src/scripts/code_graph/docs_layer.ts +57 -0
  45. package/src/scripts/code_graph/extract.ts +58 -13
  46. package/src/scripts/code_graph/extract_more.ts +314 -0
  47. package/src/scripts/code_graph/laravel_overlay.ts +454 -0
  48. package/src/scripts/code_graph/map.ts +846 -0
  49. package/src/scripts/code_graph/map_model.ts +977 -0
  50. package/src/scripts/code_graph/map_verify.ts +140 -0
  51. package/src/scripts/code_graph/map_viewer/viewer.css +278 -0
  52. package/src/scripts/code_graph/map_viewer/viewer.js +756 -0
  53. package/src/scripts/code_graph/scip_reader.ts +201 -0
  54. package/src/scripts/code_graph/sqlite_store.ts +8 -1
  55. package/src/scripts/code_graph/types.ts +81 -15
  56. package/src/scripts/code_graph/validate.ts +16 -26
  57. package/src/scripts/code_graph/verbs.ts +7 -0
  58. package/src/scripts/hook_chunks.mjs +7 -0
  59. package/src/scripts/hook_manifest.json +1 -1
  60. package/src/scripts/hook_manifest.yaml +20 -0
  61. package/src/scripts/hooks/dispatch_hook.ts +2 -2
  62. package/src/scripts/hooks/instructions_observer_hook.ts +25 -6
  63. package/src/scripts/hooks/lazy_concern.ts +4 -0
  64. package/src/scripts/install-hooks.sh +5 -0
  65. package/src/scripts/lint_agents_layout.ts +2 -0
  66. package/src/scripts/lint_hook_manifest.ts +1 -0
  67. package/src/scripts/mcp_server/consumer_tool_catalog.json +53 -6
  68. package/src/scripts/mcp_server/graph_tools.ts +73 -1
  69. package/src/scripts/mcp_server/tools.ts +19 -36
  70. package/src/vendor/grammars/README.md +10 -5
  71. package/src/vendor/grammars/tree-sitter-go.wasm +0 -0
  72. package/src/vendor/grammars/tree-sitter-java.wasm +0 -0
  73. package/src/vendor/grammars/tree-sitter-python.wasm +0 -0
@@ -1,20 +1,20 @@
1
1
  {
2
2
  "name": "event4u-agent-config",
3
3
  "description": "Governed agent system — skills, rules, commands, and guidelines for AI-assisted development.",
4
- "version": "17.1.0",
4
+ "version": "17.2.1",
5
5
  "owner": {
6
6
  "name": "event4u",
7
7
  "email": "dev@event4u.app"
8
8
  },
9
9
  "metadata": {
10
10
  "description": "A policy-driven execution system that enforces quality, consistency, and developer-like behavior for AI agents.",
11
- "version": "17.1.0"
11
+ "version": "17.2.1"
12
12
  },
13
13
  "plugins": [
14
14
  {
15
15
  "name": "agent-config",
16
16
  "description": "Full governed agent system — rules, skills, commands, guidelines, and runtime tooling.",
17
- "version": "17.1.0",
17
+ "version": "17.2.1",
18
18
  "source": ".",
19
19
  "category": "governance",
20
20
  "tags": [
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "agent-config",
3
3
  "description": "A governed skill framework for AI agents — runtime execution, tooling, observability, feedback, and lifecycle management with policy-driven quality enforcement.",
4
- "version": "17.1.0",
4
+ "version": "17.2.1",
5
5
  "author": {
6
6
  "name": "event4u",
7
7
  "email": "dev@event4u.app"
@@ -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. Its hooks run only alongside a global npm install of the package (`npx -y @event4u/agent-config init` or `npm i -g`); a project-local install is never used. On a plugin-only install no dispatcher is reachable, no hook runs, and the fail_closed guards (block-no-verify, block-kernel-rule-writes, block-plumbing-writes) are OFF — only the session start says so.",
9
- "version": "17.1.0",
9
+ "version": "17.2.1",
10
10
  "keywords": [
11
11
  "agent-config",
12
12
  "skills",
package/CHANGELOG.md CHANGED
@@ -403,6 +403,98 @@ An entry belongs under a dated release section, not here — see
403
403
  > that forces a new era split (`# Era: 17.2.x`, etc.) — see
404
404
  > [`docs/contracts/CHANGELOG-conventions.md § Era splits`](docs/contracts/CHANGELOG-conventions.md).
405
405
 
406
+ ## [17.2.1](https://github.com/event4u-app/agent-config/compare/17.2.0...17.2.1) (2026-10-23)
407
+
408
+ ### Release highlights
409
+
410
+ - **Behaviour changes:** _none_
411
+ - **Default changes + migration:** Breaking, pending in `BREAKING_CHANGES.md` and shipped by this release: **Three `fail_closed` hook guards run where they were silent.** The installed claude hook command now reaches a dispatcher staged under `~/.event4u/agent-config/runtime/` after a project-local install and before `PATH` ([`3f8c98e`](https://github.com/event4u-app/agent-config/commit/3f8c98e74), #2455). On machines installed through `npx`, or hosts launched with a bare `PATH`, every hook command used to end in a silent `exit 0`; there `block-no-verify` (refuses `git … --no-verify` and `core.hooksPath` overrides), `block-kernel-rule-writes` and `block-plumbing-writes` (refuse agent writes to this package's kernel rules and hook plumbing) now run and may refuse a tool call for the first time. Classed breaking by the AI council, 2026-10-19 (`agents/evidence/council/hook-carrier-release-note-class-20261019.md`). **`uninstall --global --purge` stops being a recursive delete of the host anchor.** Old scope: `fs.rmSync(anchor, { recursive: true })` on whole host configuration roots — `~/.claude/`, `~/.codex/`, `~/.config/zed/` — so everything under them went, whoever wrote it. New scope: only the anchor-relative paths this package's own deploy inventory recorded writing; the anchor itself is never removed, directories are pruned only when left empty, a recorded symlink is unlinked rather than followed, and a purge with no readable inventory for that anchor exits 1 having deleted nothing. A second change in the same area: a plain `uninstall --global` now keeps the lockfile while recorded content is still on disk, where it used to delete it.
412
+ - **Security and correctness:** _none_
413
+ - **Honest nulls:** _none_
414
+ - **Known limitations:** _none_
415
+
416
+ > **Governance mix:** governance-only 1 vs consumer-only 0 (mixed 0, maintenance 1; taxonomy 1.1.0; range 4e79c57090c8..36c8616ea2f4).
417
+
418
+ ### Documentation
419
+
420
+ * **ci:** record the shipped cloud-release rate-limit fix ([b3d4b2f](https://github.com/event4u-app/agent-config/commit/b3d4b2f6d7334d8c78ee48bdb098efb30808703f))
421
+
422
+ ### CI
423
+
424
+ * **cloud-release:** pace the asset upload and skip what is already attached ([91d4b73](https://github.com/event4u-app/agent-config/commit/91d4b73ebab6b68a53581092354803014dbf0c0c))
425
+
426
+ Tests: 32297 (+0 since 17.2.0)
427
+
428
+ ## [17.2.0](https://github.com/event4u-app/agent-config/compare/17.1.0...17.2.0) (2026-10-23)
429
+
430
+ ### Release highlights
431
+
432
+ - **Behaviour changes:** _none_
433
+ - **Default changes + migration:** Breaking, pending in `BREAKING_CHANGES.md` and shipped by this release: **Three `fail_closed` hook guards run where they were silent.** The installed claude hook command now reaches a dispatcher staged under `~/.event4u/agent-config/runtime/` after a project-local install and before `PATH` ([`3f8c98e`](https://github.com/event4u-app/agent-config/commit/3f8c98e74), #2455). On machines installed through `npx`, or hosts launched with a bare `PATH`, every hook command used to end in a silent `exit 0`; there `block-no-verify` (refuses `git … --no-verify` and `core.hooksPath` overrides), `block-kernel-rule-writes` and `block-plumbing-writes` (refuse agent writes to this package's kernel rules and hook plumbing) now run and may refuse a tool call for the first time. Classed breaking by the AI council, 2026-10-19 (`agents/evidence/council/hook-carrier-release-note-class-20261019.md`). **`uninstall --global --purge` stops being a recursive delete of the host anchor.** Old scope: `fs.rmSync(anchor, { recursive: true })` on whole host configuration roots — `~/.claude/`, `~/.codex/`, `~/.config/zed/` — so everything under them went, whoever wrote it. New scope: only the anchor-relative paths this package's own deploy inventory recorded writing; the anchor itself is never removed, directories are pruned only when left empty, a recorded symlink is unlinked rather than followed, and a purge with no readable inventory for that anchor exits 1 having deleted nothing. A second change in the same area: a plain `uninstall --global` now keeps the lockfile while recorded content is still on disk, where it used to delete it.
434
+ - **Security and correctness:** keep the binding inside the size ratchet and the built-path test unskipped (4201565); land the nightly evaluator record through a pull request (75dae15); name the map's render result map-render.json, clear of the design-sync artefact name (9868be2); fit the two map tools into the kernel payload band and dispose of their state (4f362af); keep Playwright out of the bundles and regenerate what the map moved (dc896f4); close the independent review's findings on the map (8956a5b); +2 more.
435
+ - **Honest nulls:** _none_
436
+ - **Known limitations:** _none_
437
+
438
+ > **Governance mix:** governance-only 10 vs consumer-only 7 (mixed 19, maintenance 2; taxonomy 1.1.0; range 81949b9dba26..ffe878edc5db).
439
+
440
+ ### Features
441
+
442
+ * **hooks:** bind the InstructionsLoaded observer on claude ([8bb7fe6](https://github.com/event4u-app/agent-config/commit/8bb7fe6dce33e743d112eb3faba1d6d5cebd0b74))
443
+ * **code-graph:** the map remembers, compares and flags merge risks ([77bf99c](https://github.com/event4u-app/agent-config/commit/77bf99c53ca7c4e761ffc472cc3ebef60660f621))
444
+ * **code-graph:** draw this repository's artefact layer on its own map ([9f2c328](https://github.com/event4u-app/agent-config/commit/9f2c328edffbb550aa7425df522d4d88875a03f6))
445
+ * **code-graph:** link documents to the files they name ([153ddef](https://github.com/event4u-app/agent-config/commit/153ddef9e1e03652e676e8fb0f203e44feab68af))
446
+ * **code-graph:** read a project's SCIP index into the graph ([f80d8ce](https://github.com/event4u-app/agent-config/commit/f80d8cea56d4b13642fad0f5af7b7cda66675853))
447
+ * **code-graph:** index Python, Go, Java and Vue ([2ff8f31](https://github.com/event4u-app/agent-config/commit/2ff8f3159c29e145455b0c7b10cb909faa739d93))
448
+ * **code-graph:** keep the map fresh, readable over MCP, and diffable ([936cad9](https://github.com/event4u-app/agent-config/commit/936cad9e938117a67e701f29356ee2e00d18d732))
449
+ * **code-graph:** read Laravel's conventions into the graph ([e69e6e5](https://github.com/event4u-app/agent-config/commit/e69e6e5c2290c9d73174d5800057cc33ffa446e0))
450
+ * **code-graph:** draw the project map into agents/map/ ([213a10c](https://github.com/event4u-app/agent-config/commit/213a10c043785ea3af947a35f94b90d8f0d4f62f))
451
+
452
+ ### Bug Fixes
453
+
454
+ * **ci:** keep the binding inside the size ratchet and the built-path test unskipped ([4201565](https://github.com/event4u-app/agent-config/commit/4201565a647fe075d69646c42ff39d07af70176f))
455
+ * **ci:** land the nightly evaluator record through a pull request ([75dae15](https://github.com/event4u-app/agent-config/commit/75dae15a18edde57fcfbdb8fcb23c2d536bf855c))
456
+ * **code-graph:** name the map's render result map-render.json, clear of the design-sync artefact name ([9868be2](https://github.com/event4u-app/agent-config/commit/9868be25d59ce85c5f5814b20c6bb63ae1b48292))
457
+ * **ci:** fit the two map tools into the kernel payload band and dispose of their state ([4f362af](https://github.com/event4u-app/agent-config/commit/4f362af254c9d39bd8869499b3e5b88848b39050))
458
+ * **ci:** record the map's runtime dependencies and tighten its verify clauses ([9705541](https://github.com/event4u-app/agent-config/commit/97055419e6447ed882e00a8b9d4e6bda53baf273))
459
+ * **ci:** keep Playwright out of the bundles and regenerate what the map moved ([dc896f4](https://github.com/event4u-app/agent-config/commit/dc896f4749f07eea8bcd159e8cf25cb1857402eb))
460
+ * **code-graph:** close the independent review's findings on the map ([8956a5b](https://github.com/event4u-app/agent-config/commit/8956a5b970b55fe22957918f1fb9c422757c326f))
461
+ * **project-map:** use the lite model tier, the schema's lowest band ([c4833a9](https://github.com/event4u-app/agent-config/commit/c4833a9c6989a52a952b310e9707bf8725dbfeaa))
462
+ * **code-graph:** keep the hook bundle under its ceiling ([2356031](https://github.com/event4u-app/agent-config/commit/2356031a2f56b87a3f53717bc5b49db51096e0de))
463
+ * **code-graph:** index the consumer project and actually write its index ([e15e45c](https://github.com/event4u-app/agent-config/commit/e15e45c7ce13de2cda7c486652d546cbca972e7e))
464
+
465
+ ### Documentation
466
+
467
+ * **roadmap:** name unopim and larasend as the code-graph benchmark subjects ([eb4599e](https://github.com/event4u-app/agent-config/commit/eb4599e460609ab0437ec0afb9bf4a9074972e73))
468
+ * **evidence:** re-ratify the binding after the CI-fix delta (round 5) ([12cbfa6](https://github.com/event4u-app/agent-config/commit/12cbfa68d33b0a293e0772b266c924c0b0ea3835))
469
+ * **roadmap:** claim the observer's concern in the estate and type the council prompts ([ae8d5a9](https://github.com/event4u-app/agent-config/commit/ae8d5a993b9324bdf47e0c2fe9944e973f0049d7))
470
+ * **evidence:** ratification record for the InstructionsLoaded binding ([ae1162c](https://github.com/event4u-app/agent-config/commit/ae1162c0e43cac457f666afe4cc98f641c45399e))
471
+ * **roadmap:** close step 1.1 and its ratification-quorum blocker ([bc66921](https://github.com/event4u-app/agent-config/commit/bc66921a44fa6a74312a4d5938442431e1524404))
472
+ * **roadmaps:** archive road-to-a-map-that-draws-itself — every step and criterion closed ([d40e797](https://github.com/event4u-app/agent-config/commit/d40e797f990afadf94b79a243ce0b83108718c55))
473
+ * **adr:** register agents/map/ for derived views and correct the stale graph claim ([66f75c5](https://github.com/event4u-app/agent-config/commit/66f75c5cd02d4506afbd60c7c92685d70572283b))
474
+ * **roadmaps:** plan a project map the code-graph engine draws itself ([06f332a](https://github.com/event4u-app/agent-config/commit/06f332a2550a1797b050d046d43f9a1dd6a7e7cf))
475
+
476
+ ### CI
477
+
478
+ * **tests:** bound the FFmpeg install and let a stall skip the stitch cases ([1d0f01b](https://github.com/event4u-app/agent-config/commit/1d0f01b4cb3f0940a226d0a96a94ebeb2948e954))
479
+
480
+ ### Chores
481
+
482
+ * **hooks:** record the admission of the instructions-observer concern ([a5ee675](https://github.com/event4u-app/agent-config/commit/a5ee675245df43e7279ee0ef485c98867ab5d99b))
483
+ * **plugin:** regenerate hooks/hooks.json in matrix order ([339b306](https://github.com/event4u-app/agent-config/commit/339b3062cc73ef2995f2b493d5ea627c850c3d27))
484
+ * **ci:** regenerate the ADR index and lower the source-size ratchet to the live total ([7c11522](https://github.com/event4u-app/agent-config/commit/7c11522b49c1dac1199e142ed17c8b6e9fa06f22))
485
+ * **adr:** regenerate the evidence census for ADR-297's provenance kind ([18b7d11](https://github.com/event4u-app/agent-config/commit/18b7d113e811f17c1115010676e49c6d0c8e9849))
486
+ * **tokens:** trim the map's surfaces, then re-anchor the two that still grew ([5d61dab](https://github.com/event4u-app/agent-config/commit/5d61dab35e0540492109a4b9233b198e9df6bc3c))
487
+ * **index:** regenerate the catalog for project map ([1522e30](https://github.com/event4u-app/agent-config/commit/1522e30103815b03c1a777cb4a24c234e3995f7e))
488
+ * **proof:** regenerate after the merge with main ([c4d0a11](https://github.com/event4u-app/agent-config/commit/c4d0a1133339e081f738a2f3df353d649110449c))
489
+ * **sync:** project the map command, the code-intelligence step and the analyze changes ([5651955](https://github.com/event4u-app/agent-config/commit/5651955b72866023bde89afc1e85a0001a944a93))
490
+
491
+ ### Other
492
+
493
+ * **code-graph:** record the map's costs and the orientation benchmark ([84c2421](https://github.com/event4u-app/agent-config/commit/84c24216f474eab896d4f8979b2353b37f81e4b6))
494
+ * **code-graph:** pre-register the orientation benchmark and add the map cost probe ([1fdc013](https://github.com/event4u-app/agent-config/commit/1fdc013f9038ee50495bfe1ab0c3e75ecd90b3b3))
495
+
496
+ Tests: 32297 (+82 since 17.1.0)
497
+
406
498
  ## [17.1.0](https://github.com/event4u-app/agent-config/compare/17.0.0...17.1.0) (2026-10-23)
407
499
 
408
500
  ### Release highlights
package/README.md CHANGED
@@ -4,10 +4,10 @@
4
4
 
5
5
  [![Smoke](https://github.com/event4u-app/agent-config/actions/workflows/smoke.yml/badge.svg)](https://github.com/event4u-app/agent-config/actions/workflows/smoke.yml) [![Public install smoke (3 OS × 2 Node)](https://github.com/event4u-app/agent-config/actions/workflows/smoke-public-install.yml/badge.svg)](https://github.com/event4u-app/agent-config/actions/workflows/smoke-public-install.yml) [![npm](https://img.shields.io/npm/v/@event4u/agent-config?style=flat-square&label=npm&color=orange)](https://www.npmjs.com/package/@event4u/agent-config) [![agent-config MCP server](https://glama.ai/mcp/servers/event4u-app/agent-config/badges/score.svg)](https://glama.ai/mcp/servers/event4u-app/agent-config) [![MCP Toplist](https://mcptoplist.com/badge/glama%2Fevent4u-app%2Fagent-config.svg)](https://mcptoplist.com/server/glama%2Fevent4u-app%2Fagent-config)
6
6
 
7
- [![Skills](https://img.shields.io/badge/Skills-301-orange?style=flat-square)](dist/agent-src/skills/) [![Rules](https://img.shields.io/badge/Rules-122-orange?style=flat-square)](dist/agent-src/rules/) [![Commands](https://img.shields.io/badge/Commands-209-orange?style=flat-square)](dist/agent-src/commands/) [![Guidelines](https://img.shields.io/badge/Guidelines-121-orange?style=flat-square)](docs/guidelines/) [![Personas](https://img.shields.io/badge/Personas-29-orange?style=flat-square)](dist/agent-src/personas/) [![Advisors](https://img.shields.io/badge/Advisors-5-orange?style=flat-square)](dist/agent-src/personas/advisors/) <!-- claim:published-artifact-counts -->
7
+ [![Skills](https://img.shields.io/badge/Skills-301-orange?style=flat-square)](dist/agent-src/skills/) [![Rules](https://img.shields.io/badge/Rules-122-orange?style=flat-square)](dist/agent-src/rules/) [![Commands](https://img.shields.io/badge/Commands-210-orange?style=flat-square)](dist/agent-src/commands/) [![Guidelines](https://img.shields.io/badge/Guidelines-121-orange?style=flat-square)](docs/guidelines/) [![Personas](https://img.shields.io/badge/Personas-29-orange?style=flat-square)](dist/agent-src/personas/) [![Advisors](https://img.shields.io/badge/Advisors-5-orange?style=flat-square)](dist/agent-src/personas/advisors/) <!-- claim:published-artifact-counts -->
8
8
  [![downloads](https://img.shields.io/npm/dm/@event4u/agent-config?style=flat-square&label=downloads%2Fmonth&color=orange)](https://www.npmjs.com/package/@event4u/agent-config)
9
9
 
10
- <sub>**How these are counted** — one canonical counter, `agent-config` → `update_counts --check`, re-derives all six from the tree and fails CI when one is off by one. Two bases are not what the linked directory shows, so they are stated here rather than left to be inferred: **Commands 209** counts every command file **recursively** (the linked directory holds 62 at its top level) and **Rules 122** counts the **source** rules while the linked projection holds 121 — one rule is dormant and is not projected. **Personas 29** excludes the directory README. Counts are of files and directories: none of them measures quality, activation or adoption. <!-- claim:published-artifact-counts --></sub>
10
+ <sub>**How these are counted** — one canonical counter, `agent-config` → `update_counts --check`, re-derives all six from the tree and fails CI when one is off by one. Two bases are not what the linked directory shows, so they are stated here rather than left to be inferred: **Commands 210** counts every command file **recursively** (the linked directory holds 62 at its top level) and **Rules 122** counts the **source** rules while the linked projection holds 121 — one rule is dormant and is not projected. **Personas 29** excludes the directory README. Counts are of files and directories: none of them measures quality, activation or adoption. <!-- claim:published-artifact-counts --></sub>
11
11
 
12
12
  **Try it in 30 seconds** — drop one read-only subagent into any repo and watch it check "done": `@production-validator check this branch is actually done`. No wizard, no lock-in, nothing else installed — the [30-second wedge ↓](#quickstart) is the whole first step. Start at the proof, not the catalog: **[event4u-app.github.io/agent-config/proof/](https://event4u-app.github.io/agent-config/proof/)**.
13
13
 
@@ -31,7 +31,9 @@ Gather in parallel:
31
31
  - Check for: `artisan`, `Makefile`, `Taskfile.yml`, `docker-compose.yml`
32
32
  - Check for: `phpstan.neon`, `ecs.php`, `rector.php`, `config-dev/`
33
33
  - Check for: `.github/workflows/`, `CODEOWNERS`, `.editorconfig`
34
- - Check for module roots (resolve via `scripts/_lib/agent_settings.ts::enumerate_modules()`; Laravel shape: `app/Modules/`), multi-tenant indicators (`customer_database`)
34
+ - Check for module roots (resolve via `scripts/_lib/agent_settings.ts::enumerate_modules()`; Laravel shape: `app/Modules/`)
35
+ - Probe the database connections the project declares (`config/database.php` `connections`, `DB_CONNECTION*` keys in `.env.example`, `$connection` properties on models); more than one connection used by models is a multi-database / multi-tenant indicator — name the connections as found, never assume their names
36
+ - Build or refresh the code map: `agent-config code-graph map`. Structure (areas, hubs, cycles, request paths) is read from `agents/map/MAP.md` below, not re-derived by hand <!-- ref-ignore -->
35
37
  - Read: `AGENTS.md`, `.github/copilot-instructions.md` (if exist)
36
38
 
37
39
  **Assurance dimensions — do NOT hand-detect these.** Run
@@ -137,6 +139,7 @@ full pass, so "continue" is dominant and asking is a routine confirmation.
137
139
  Analyze the directory structure:
138
140
 
139
141
  - Map top-level directories with file counts
142
+ - Read `agents/map/MAP.md` first: its areas, infrastructure files, cycles and request paths ARE the structure section — link to it rather than restating it <!-- ref-ignore -->
140
143
  - Identify pattern: MVC, modules, services, repositories, DTOs
141
144
  - Count: Models, Controllers, Services, Jobs, Commands, Events, Policies
142
145
  - Detect: multi-tenancy, API versioning, queue usage
@@ -150,13 +153,14 @@ ARCHITECTURE:
150
153
 
151
154
  Pattern: {Modular MVC + Service Layer + Repository}
152
155
  API: {Versioned REST (/api/v1/, /api/v2/)}
153
- Multi-Tenant: {✅ Dual-DB (api_database + customer_database) | ❌}
156
+ Databases: {connections the models use, as probed — e.g. "2 (mysql, tenant)" | 1}
157
+ Map: agents/map/MAP.md ({n} areas · largest {name})
154
158
 
155
159
  ───────────────────────────────────────────────
156
160
  CODE INVENTORY:
157
161
  ───────────────────────────────────────────────
158
162
 
159
- Models: {count} (api_database: {n}, customer_database: {n})
163
+ Models: {count} (per connection, when more than one is in use)
160
164
  Controllers: {count}
161
165
  Services: {count}
162
166
  Repositories: {count}
@@ -288,9 +292,8 @@ Write all remaining analysis files that haven't been created yet:
288
292
  - `agents/evidence/analysis/architecture/database.md` — schema, connections, multi-tenancy
289
293
  - `agents/evidence/analysis/architecture/api.md` — versioning, routes, middleware, auth
290
294
  - `agents/evidence/analysis/architecture/infrastructure.md` — Docker, CI/CD, deployment
291
- - `agents/evidence/analysis/architecture/patterns.md` — design patterns used
292
- - `agents/evidence/analysis/models/api-database.md` — all api_database models
293
- - `agents/evidence/analysis/models/customer-database.md` — all customer_database models
295
+ - `agents/evidence/analysis/architecture/patterns.md` — design patterns used; for module and area structure, link `agents/map/MAP.md` instead of restating it <!-- ref-ignore -->
296
+ - `agents/evidence/analysis/models/<connection>.md` — one per database connection the probe found, all models on it
294
297
  - `agents/evidence/analysis/modules/{module}.md` — one per module
295
298
  - `agents/evidence/analysis/testing/test-map.md` — test suites, coverage, strategy
296
299
 
@@ -0,0 +1,58 @@
1
+ ---
2
+ model_tier: lite
3
+ name: project-map
4
+ pack: engineering-base
5
+ visibility: internal
6
+ sub: map
7
+ cluster: project
8
+ skills: [code-intelligence]
9
+ description: Draw the code map into agents/map/
10
+ suggestion:
11
+ eligible: false
12
+ rationale: "Cluster sub-command — reached via its cluster head's routing or its explicit /cluster:sub name; not independently suggested (surface-consolidation)."
13
+ workspaces:
14
+ - agent-config-maintainer
15
+ packs:
16
+ - meta
17
+ ---
18
+
19
+ # project-map
20
+
21
+ ## Instructions
22
+
23
+ Build the map of the project the user is standing in, then point at it. The map is
24
+ deterministic and local: no model call, no network, nothing committed by default
25
+ (`agents/map/` is gitignored, ADR-297). <!-- ref-ignore -->
26
+
27
+ ### 1. Build
28
+
29
+ ```bash
30
+ agent-config code-graph map
31
+ ```
32
+
33
+ It builds or updates the code graph first when it is absent or behind, then writes
34
+ `agents/map/index.html`, `agents/map/MAP.md`, one `agents/map/areas/<id>.md` per <!-- ref-ignore -->
35
+ area of five or more files, and `agents/map/map.json`. With Playwright present it <!-- ref-ignore -->
36
+ also renders the page at three widths and reports the render check; without it the
37
+ check reads `unverified`, which is not a pass.
38
+
39
+ `--root <path>` maps another checkout; `--open` opens the page; `--no-verify`
40
+ skips the render check.
41
+
42
+ ### 2. Report
43
+
44
+ Quote the command's summary lines (files, areas, largest area, graph state, render
45
+ check) and give the path to `agents/map/index.html`. Do not paraphrase the counts. <!-- ref-ignore -->
46
+
47
+ ### 3. Answer from the map, when the user asked a question
48
+
49
+ Read `agents/map/MAP.md` first, then the page of the area in question. Say which <!-- ref-ignore -->
50
+ answers came from the map and which from a follow-up `code-graph query` or a file
51
+ read — the map groups files by coupling, it does not explain what they do.
52
+
53
+ ## Rules
54
+
55
+ - **Never edit `agents/map/` by hand.** Every file there is regenerated. <!-- ref-ignore -->
56
+ - **A `behind:N` or `edited` graph state is part of the answer.** Say it.
57
+ - **"Isolated" is not "dead".** A file reached by reflection, a string path or a
58
+ framework convention the engine does not read is isolated too.
@@ -2,10 +2,10 @@
2
2
  model_tier: medium
3
3
  name: project
4
4
  disable-model-invocation: true
5
- argument-hint: "[analyze|health]"
5
+ argument-hint: "[analyze|health|map]"
6
6
  pack: engineering-base
7
- intent: "Project dispatcher — full analysis or quick health check"
8
- routes_to: [project-analyze, project-health]
7
+ intent: "Project dispatcher — full analysis, quick health check, or the project map"
8
+ routes_to: [project-analyze, project-health, project-map]
9
9
  replaces: []
10
10
  visibility: internal
11
11
  description: Project orchestrator — routes to analyze (full audit) and health (read-only status check)
@@ -35,6 +35,7 @@ Top-level orchestrator for the `/project` family — project-wide inspection.
35
35
  |---|---|---|
36
36
  | `/project analyze` | `commands/project/analyze.md` | Full project analysis — detect stack, inventory modules, audit docs, create missing contexts |
37
37
  | `/project health` | `commands/project/health.md` | Quick health check — status of docs, modules, contexts, roadmaps; creates nothing |
38
+ | `/project map` | `commands/project/map.md` | Draw the code map into `agents/map/` — areas, files, links; offline, gitignored |
38
39
 
39
40
  Sub-command names match the locked contract in
40
41
  [`docs/contracts/command-clusters.md`](../docs/contracts/command-clusters.md).
@@ -50,6 +51,7 @@ Sub-command names match the locked contract in
50
51
 
51
52
  > 1. analyze — full project audit (writes missing contexts)
52
53
  > 2. health — read-only status check (creates nothing)
54
+ > 3. map — draw the code map into `agents/map/`
53
55
 
54
56
  ## Rules
55
57
 
@@ -38,6 +38,10 @@ code-graph and no appetite to build one — plain `grep`/read is right there.
38
38
 
39
39
  ## Procedure
40
40
 
41
+ 0. **Orient first, when the question is "where does X live" rather than "who
42
+ calls X".** If `agents/map/MAP.md` exists, read it: it names the project's <!-- ref-ignore -->
43
+ areas (files grouped by coupling), its infrastructure files and its cycles.
44
+ No map yet? `agent-config code-graph map` builds one in seconds. Then query.
41
45
  1. **Detect the source.** `agent-config code-graph detect` — is a fresh consumer
42
46
  `graph.json` or native cache present? (A consumer-shipped fresh index wins;
43
47
  the native engine covers stale-or-absent — ADR-124 § 2.)
@@ -246,6 +250,8 @@ paragraph claiming "the same five answers" directly after a list of four:
246
250
  | `graph_query` | `query` |
247
251
  | `graph_path` | `path` |
248
252
  | `graph_node` | no CLI verb — one symbol's location, in-edges, out-edges and degree |
253
+ | `graph_map_status` | whether `agents/map/` exists, its counts and freshness | <!-- ref-ignore -->
254
+ | `graph_area` | one area of the map: files, hubs, what it depends on |
249
255
 
250
256
  `untested` has no tool of its own; it is a flag on `graph_impact`, because the
251
257
  two answer the same question over the same diff and a separate tool would have
@@ -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: "17.1.0"
42
+ agent_config_version: "17.2.1"
43
43
 
44
44
  # --- Project identity ---
45
45
  project:
@@ -77,7 +77,7 @@ export const REGISTRY = [
77
77
  { name: 'affected', disposition: 'delegate', synopsis: 'Artefacts related to <artefact> via the discovery relation-graph (BFS).' },
78
78
  { name: 'graph-explain', disposition: 'delegate', synopsis: 'Seed on a <concept>, expand 2 hops over the discovery relation-graph with a node budget.' },
79
79
  { name: 'benchmark', disposition: 'delegate', synopsis: 'Report context-token reduction vs the full always-loaded projection.' },
80
- { name: 'code-graph', disposition: 'delegate', synopsis: 'Deterministic code-graph engine: build|detect|refresh|validate|query|affected|path|explain, plus the gate verbs impact|tests-for|untested|dead.' },
80
+ { name: 'code-graph', disposition: 'delegate', synopsis: 'Deterministic code-graph engine: build|detect|refresh|validate|query|affected|path|explain|map, plus the gate verbs impact|tests-for|untested|dead.' },
81
81
  { name: 'hooks:install', disposition: 'delegate', synopsis: 'Install the combined pre-commit hook.' },
82
82
  { name: 'hooks:status', disposition: 'delegate', synopsis: 'Print the runtime hook matrix (per-platform install + bindings).' },
83
83
  { name: 'hooks:doctor', disposition: 'delegate', synopsis: 'Diagnose hook health: concerns, posture, missing trampolines (read-only).' },
@@ -2364,19 +2364,11 @@ import * as fs4 from "node:fs";
2364
2364
  import * as path4 from "node:path";
2365
2365
 
2366
2366
  // src/scripts/code_graph/types.ts
2367
- var GUESS_RESOLVED_VIA = /* @__PURE__ */ new Set([
2368
- "name-lookup",
2369
- "dynamic",
2370
- // The accepted-edge filter is a DENYLIST, so a new value is accepted by
2371
- // default — which is exactly backwards for this one. `foreign` must be
2372
- // listed here or a consumer's graph would silently answer the gate verbs
2373
- // as if this package had resolved its edges.
2374
- "foreign"
2375
- ]);
2367
+ var GUESS_RESOLVED_VIA = /* @__PURE__ */ new Set(["name-lookup", "dynamic", "foreign"]);
2376
2368
  function isStatedResolution(resolved_via) {
2377
2369
  return !GUESS_RESOLVED_VIA.has(resolved_via);
2378
2370
  }
2379
- var SCHEMA_VERSION = 4;
2371
+ var SCHEMA_VERSION = 5;
2380
2372
  var EXT_LANG = {
2381
2373
  ".php": "php",
2382
2374
  ".ts": "typescript",
@@ -2386,37 +2378,24 @@ var EXT_LANG = {
2386
2378
  ".js": "javascript",
2387
2379
  ".jsx": "javascript",
2388
2380
  ".mjs": "javascript",
2389
- ".cjs": "javascript"
2381
+ ".cjs": "javascript",
2382
+ ".py": "python",
2383
+ ".go": "go",
2384
+ ".java": "java",
2385
+ ".vue": "typescript"
2390
2386
  };
2391
2387
 
2392
2388
  // src/scripts/code_graph/validate.ts
2393
- var RELATIONS = /* @__PURE__ */ new Set(["calls", "imports", "uses", "inherits", "member", "tests"]);
2389
+ var words = (s) => new Set(s.split(" "));
2390
+ var RELATIONS = words(
2391
+ "calls imports uses inherits member tests routes-to renders includes reads migrates persists relates documents"
2392
+ );
2394
2393
  var CONFIDENCES = /* @__PURE__ */ new Set(["EXTRACTED", "INFERRED", "AMBIGUOUS"]);
2395
- var RESOLVED_VIA = /* @__PURE__ */ new Set([
2396
- "same-file",
2397
- "import-specifier",
2398
- "path-alias",
2399
- "psr4",
2400
- "route-table",
2401
- "test-import",
2402
- "name-lookup",
2403
- "dynamic",
2404
- // Adapted from a consumer's own graph file; see `foreign.ts`.
2405
- "foreign"
2406
- ]);
2407
- var PROVIDERS = /* @__PURE__ */ new Set(["native", "foreign"]);
2408
- var KINDS = /* @__PURE__ */ new Set([
2409
- "file",
2410
- "class",
2411
- "interface",
2412
- "trait",
2413
- "function",
2414
- "method",
2415
- "constant",
2416
- "type",
2417
- "enum",
2418
- "skipped"
2419
- ]);
2394
+ var RESOLVED_VIA = words(
2395
+ "same-file import-specifier path-alias psr4 route-table directive-scan schema-call eloquent-relation compiler-index test-import name-lookup dynamic foreign"
2396
+ );
2397
+ var PROVIDERS = /* @__PURE__ */ new Set(["native", "foreign", "scip"]);
2398
+ var KINDS = words("file class interface trait function method constant type enum skipped route table");
2420
2399
  function validateGraph(g) {
2421
2400
  const errors = [];
2422
2401
  const push = (m) => {
@@ -2435,6 +2414,7 @@ function validateGraph(g) {
2435
2414
  if (typeof n !== "object" || n === null) return push(`node[${i}] not an object`);
2436
2415
  const nn = n;
2437
2416
  if (typeof nn["id"] !== "string") push(`node[${i}].id must be a string`);
2417
+ else if (ids.has(nn["id"])) push(`node[${i}].id is a duplicate: ${nn["id"]}`);
2438
2418
  else ids.add(nn["id"]);
2439
2419
  if (!KINDS.has(nn["kind"])) push(`node[${i}].kind invalid: ${String(nn["kind"])}`);
2440
2420
  if (typeof nn["source_file"] !== "string") push(`node[${i}].source_file must be a string`);
@@ -2546,7 +2526,7 @@ function detectSources(root, nativeCache) {
2546
2526
  } catch {
2547
2527
  }
2548
2528
  const scip = scipCandidates.find((p) => fs4.existsSync(p));
2549
- if (scip) out.push({ kind: "scip", path: scip, present: true, note: "SCIP detected \u2014 peer tooling required (no owned reader)" });
2529
+ if (scip) out.push({ kind: "scip", path: scip, present: true, note: "SCIP \u2014 index.scip merges into the build" });
2550
2530
  if (fs4.existsSync(nativeCache)) out.push({ kind: "native", path: nativeCache, present: true, ...freshness(abs, nativeCache, null) });
2551
2531
  return out;
2552
2532
  }
@@ -2628,6 +2608,7 @@ function emitSqliteTwin(graph, serialized, jsonPath) {
2628
2608
  db.exec(
2629
2609
  "CREATE TABLE meta (key TEXT PRIMARY KEY, value TEXT NOT NULL);CREATE TABLE nodes (id TEXT PRIMARY KEY, label TEXT NOT NULL, kind TEXT, source_file TEXT, l0 INTEGER, l1 INTEGER, l2 INTEGER, l3 INTEGER);CREATE TABLE edges (source TEXT NOT NULL, target TEXT NOT NULL, relation TEXT NOT NULL, confidence TEXT NOT NULL, candidates TEXT, ambiguity_reason TEXT, resolved_via TEXT, provider TEXT);CREATE INDEX edges_source ON edges(source);CREATE INDEX edges_target ON edges(target);CREATE INDEX nodes_label ON nodes(label);CREATE INDEX nodes_source_file ON nodes(source_file);"
2630
2610
  );
2611
+ db.exec("BEGIN");
2631
2612
  const meta = db.prepare("INSERT INTO meta (key, value) VALUES (?, ?)");
2632
2613
  meta.run("source_checksum", graph.source_checksum);
2633
2614
  meta.run("json_size", String(stat.size));
@@ -2666,14 +2647,17 @@ function emitSqliteTwin(graph, serialized, jsonPath) {
2666
2647
  e.provider
2667
2648
  );
2668
2649
  }
2650
+ db.exec("COMMIT");
2669
2651
  stampUserVersion(db, GRAPH_STORE_VERSION);
2670
2652
  } finally {
2671
2653
  db.close();
2672
2654
  }
2673
2655
  fs5.renameSync(tmp, twin);
2674
2656
  return true;
2675
- } catch {
2657
+ } catch (e) {
2676
2658
  fs5.rmSync(tmp, { force: true });
2659
+ process.stderr.write(`code-graph: index not written: ${e.message}
2660
+ `);
2677
2661
  return false;
2678
2662
  }
2679
2663
  }
@@ -1,6 +1,6 @@
1
1
  # Discovery — Deprecation Report
2
2
 
3
- - Generated: `2026-10-23T06:28:42Z`
3
+ - Generated: `2026-10-23T14:16:10Z`
4
4
  - Deprecated artefacts: **0**
5
5
 
6
6
  _None. Tree is clean._
@@ -1747,7 +1747,7 @@
1747
1747
  },
1748
1748
  {
1749
1749
  "category": "command",
1750
- "checksum": "sha256:8bba107cef996a7ab75233a7c018c6294add3784f42ca7a4812f14adf5383dc7",
1750
+ "checksum": "sha256:affd55963df4d3e9ba7e8281f8123dd1043a04ba5c1b33b6871f72290b19000b",
1751
1751
  "install": {
1752
1752
  "default": true,
1753
1753
  "removable": false
@@ -1772,12 +1772,12 @@
1772
1772
  },
1773
1773
  {
1774
1774
  "category": "command",
1775
- "checksum": "sha256:eee6f3f9303011d7fd27d1d3770c1c0a99f4fbe9cf52d2c43d693b0c32f10621",
1775
+ "checksum": "sha256:1514c6d09bee3cbbc1996d9d0e7ee1c9dd38829ef293ded1e0e8f1eabed1f7bd",
1776
1776
  "install": {
1777
1777
  "default": true,
1778
1778
  "removable": false
1779
1779
  },
1780
- "intent": "Project dispatcher — full analysis or quick health check",
1780
+ "intent": "Project dispatcher — full analysis, quick health check, or the project map",
1781
1781
  "lifecycle": "active",
1782
1782
  "name": "project",
1783
1783
  "pack": "engineering-base",
@@ -1788,7 +1788,8 @@
1788
1788
  "replaces": [],
1789
1789
  "routes_to": [
1790
1790
  "project-analyze",
1791
- "project-health"
1791
+ "project-health",
1792
+ "project-map"
1792
1793
  ],
1793
1794
  "slug": "project",
1794
1795
  "trust": {
@@ -1826,6 +1827,31 @@
1826
1827
  "agent-config-maintainer"
1827
1828
  ]
1828
1829
  },
1830
+ {
1831
+ "category": "command",
1832
+ "checksum": "sha256:3a29995588969e6a591002e4ff5dade2ef9fac6c77edcd648f55da4559c4e8f9",
1833
+ "install": {
1834
+ "default": true,
1835
+ "removable": false
1836
+ },
1837
+ "lifecycle": "active",
1838
+ "name": "project-map",
1839
+ "pack": "engineering-base",
1840
+ "packs": [
1841
+ "meta"
1842
+ ],
1843
+ "path": "src/domains/engineering-base/project/map/command.md",
1844
+ "slug": "project-map",
1845
+ "trust": {
1846
+ "confidence": "high",
1847
+ "human_review_required": false,
1848
+ "level": "core"
1849
+ },
1850
+ "visibility": "internal",
1851
+ "workspaces": [
1852
+ "agent-config-maintainer"
1853
+ ]
1854
+ },
1829
1855
  {
1830
1856
  "category": "command",
1831
1857
  "checksum": "sha256:4317113046ac890122c413921e5acf353f8b6e45006fde6d35159a35d5f529a9",
@@ -9180,7 +9206,7 @@
9180
9206
  },
9181
9207
  {
9182
9208
  "category": "skill",
9183
- "checksum": "sha256:f2f711982f79425c130bc2b3df13e7737dc3c21613592b68f198b08aa13d210c",
9209
+ "checksum": "sha256:cda3a959dd75ff8af2c300111f194ce3c1cc074f7b091769670ab39458534b63",
9184
9210
  "install": {
9185
9211
  "default": true,
9186
9212
  "removable": false
@@ -15094,7 +15120,7 @@
15094
15120
  "workspaces": []
15095
15121
  }
15096
15122
  ],
15097
- "checksum": "sha256:bd2c2d43c509910e8aefc47e34982aa12079b4cc772d9f1380226df82bb2b0e7",
15123
+ "checksum": "sha256:78594c2e14f67a1cb0b14a85d62c2ccdc967977ab6bf4bf0f1a869d1a91d4e35",
15098
15124
  "deprecations": [
15099
15125
  {
15100
15126
  "key": "tier",
@@ -15243,7 +15269,7 @@
15243
15269
  "reason": "scaffold template for ticket-bundle tickets (ADR-101); carries no runtime frontmatter — emit-tickets fills it in per ticket"
15244
15270
  }
15245
15271
  ],
15246
- "generated_at": "2026-10-23T06:28:42Z",
15272
+ "generated_at": "2026-10-23T14:16:10Z",
15247
15273
  "packs": [
15248
15274
  {
15249
15275
  "artefact_count": 130,
@@ -16009,7 +16035,7 @@
16009
16035
  },
16010
16036
  {
16011
16037
  "always_on": true,
16012
- "artefact_count": 307,
16038
+ "artefact_count": 308,
16013
16039
  "description": "Artefacts that maintain this package (agent-config itself).",
16014
16040
  "domain": "meta",
16015
16041
  "human_review_required": 0,
@@ -16025,7 +16051,7 @@
16025
16051
  "trust_level_default": "core",
16026
16052
  "trust_summary": {
16027
16053
  "advisory": 0,
16028
- "core": 305,
16054
+ "core": 306,
16029
16055
  "experimental": 2,
16030
16056
  "professional": 0,
16031
16057
  "restricted": 0
@@ -16116,27 +16142,27 @@
16116
16142
  "scanner_version": "de0a22b4ac4c",
16117
16143
  "stats": {
16118
16144
  "by_category": {
16119
- "command": 209,
16145
+ "command": 210,
16120
16146
  "rule": 122,
16121
16147
  "skill": 301,
16122
16148
  "subagent": 3,
16123
16149
  "template": 1
16124
16150
  },
16125
16151
  "by_lifecycle": {
16126
- "active": 618,
16152
+ "active": 619,
16127
16153
  "archived": 0,
16128
16154
  "deprecated": 0,
16129
16155
  "experimental": 18
16130
16156
  },
16131
16157
  "by_trust_level": {
16132
16158
  "advisory": 8,
16133
- "core": 501,
16159
+ "core": 502,
16134
16160
  "experimental": 24,
16135
16161
  "professional": 103,
16136
16162
  "restricted": 0
16137
16163
  },
16138
16164
  "documented_unassigned_count": 27,
16139
- "total_artefacts": 636,
16165
+ "total_artefacts": 637,
16140
16166
  "unassigned_count": 0
16141
16167
  },
16142
16168
  "unassigned": [],
@@ -1 +1 @@
1
- 49a3f57527f2284ac399784ab42ecbe4559adbd118178d1da7ffe0c0e1dfe6b8 discovery-manifest.json
1
+ ae24bd45782c87fa0948de3cc5148ae565fc362b8b1e0997fbd6f155be39e922 discovery-manifest.json