---
feat: API catalog surface, protocol v2 tooling, MCP expansion, on+re update
## Summary
Session 2026-03-23. Closes the loop between handler code and discoverability
across all three surfaces (browser, CLI, MCP agent) via compile-time inventory
registration. Adds protocol v2 update tooling, extends MCP from 21 to 29 tools,
and brings the self-description up to date.
## API Catalog Surface (#[onto_api] proc-macro)
- crates/ontoref-derive: new proc-macro crate; `#[onto_api(method, path,
description, auth, actors, params, tags)]` emits `inventory::submit!(ApiRouteEntry{...})`
at link time
- crates/ontoref-daemon/src/api_catalog.rs: `catalog()` — pure fn over
`inventory::iter::<ApiRouteEntry>()`, zero runtime allocation
- GET /api/catalog: returns full annotated HTTP surface as JSON
- templates/pages/api_catalog.html: new page with client-side filtering by
method, auth, path/description; detail panel per route (params table,
feature flag); linked from dashboard card and nav
- UI nav: "API" link (</> icon) added to mobile dropdown and desktop bar
- inventory = "0.3" added to workspace.dependencies (MIT, zero transitive deps)
## Protocol Update Mode
- reflection/modes/update_ontoref.ncl: 9-step DAG (5 detect parallel, 2 update
idempotent, 2 validate, 1 report) — brings any project from protocol v1 to v2
by adding manifest.ncl and connections.ncl if absent, scanning ADRs for
deprecated check_hint, validating with nickel export
- reflection/templates/update-ontology-prompt.md: 8-phase reusable prompt for
agent-driven ontology enrichment (infrastructure → audit → core.ncl →
state.ncl → manifest.ncl → connections.ncl → ADR migration → validation)
## CLI — describe group extensions
- reflection/bin/ontoref.nu: `describe diff [--fmt] [--file]` and
`describe api [--actor] [--tag] [--auth] [--fmt]` registered as canonical
subcommands with log-action; aliases `df` and `da` added; QUICK REFERENCE
and ALIASES sections updated
## MCP — two new tools (21 → 29 total)
- ontoref_api_catalog: filters catalog() output by actor/tag/auth; returns
{ routes, total } — no HTTP roundtrip, calls inventory directly
- ontoref_file_versions: reads ProjectContext.file_versions DashMap per slug;
returns BTreeMap<filename, u64> reload counters
- insert_mcp_ctx: audited and updated from 15 to 28 entries in 6 groups
- HelpTool JSON: 8 new entries (validate_adrs, validate, impact, guides,
bookmark_list, bookmark_add, api_catalog, file_versions)
- ServerHandler::get_info instructions updated to mention new tools
## Web UI — dashboard additions
- Dashboard: "API Catalog" card (9th); "Ontology File Versions" section showing
per-file reload counters from file_versions DashMap
- dashboard_mp: builds BTreeMap<String, u64> from ctx.file_versions and injects
into Tera context
## on+re update
- .ontology/core.ncl: describe-query-layer and adopt-ontoref-tooling descriptions
updated; ontoref-daemon updated ("11 pages", "29 tools", API catalog,
per-file versioning, #[onto_api]); new node api-catalog-surface (Yang/Practice)
with 3 edges; artifact_paths extended across 3 nodes
- .ontology/state.ncl: protocol-maturity blocker updated (protocol v2 complete);
self-description-coverage catalyst updated with session 2026-03-23 additions
- ADR-007: "API Surface Discoverability via #[onto_api] Proc-Macro" — Accepted
## Documentation
- README.md: crates table updated (11 pages, 29 MCP tools, ontoref-derive row);
MCP representative table expanded; API Catalog, Semantic Diff, Per-File
Versioning paragraphs added; update_ontoref onboarding section added
- CHANGELOG.md: [Unreleased] section with 4 change groups
- assets/web/src/index.html: tool counts 19→29 (EN+ES), page counts 12→11
(EN+ES), daemon description paragraph updated with API catalog + #[onto_api]
2026-03-23 00:58:27 +01:00
|
|
|
let content = import "content.ncl" in
|
|
|
|
|
|
2026-03-13 00:21:04 +00:00
|
|
|
let repo_kind_type = [|
|
|
|
|
|
'DevWorkspace,
|
|
|
|
|
'PublishedCrate,
|
|
|
|
|
'Service,
|
|
|
|
|
'Library,
|
|
|
|
|
'AgentResource,
|
|
|
|
|
'Mixed,
|
2026-03-16 01:48:17 +00:00
|
|
|
'PersonalOntology,
|
2026-03-13 00:21:04 +00:00
|
|
|
|] in
|
|
|
|
|
|
|
|
|
|
let consumer_type = [|
|
|
|
|
|
'Developer,
|
|
|
|
|
'Agent,
|
|
|
|
|
'EndUser,
|
|
|
|
|
'CI,
|
|
|
|
|
'Downstream,
|
|
|
|
|
|] in
|
|
|
|
|
|
|
|
|
|
let artifact_kind_type = [|
|
|
|
|
|
'RustDoc,
|
|
|
|
|
'JsonSchema,
|
|
|
|
|
'ContainerImage,
|
|
|
|
|
'CratePackage,
|
|
|
|
|
'StaticSite,
|
|
|
|
|
'NuPlugin,
|
|
|
|
|
'OntologyExport,
|
|
|
|
|
|] in
|
|
|
|
|
|
|
|
|
|
let audit_level_type = [|
|
|
|
|
|
'Quick,
|
|
|
|
|
'Standard,
|
|
|
|
|
'Strict,
|
|
|
|
|
|] in
|
|
|
|
|
|
|
|
|
|
# ── Operational layers ──────────────────────────────────────────────────────
|
|
|
|
|
# A layer is a named region of the repo with visibility rules per mode.
|
|
|
|
|
# The `committed` flag distinguishes product (true) from process (false).
|
|
|
|
|
|
|
|
|
|
let layer_type = {
|
|
|
|
|
id | String,
|
|
|
|
|
paths | Array String,
|
|
|
|
|
committed | Bool,
|
|
|
|
|
description | String | default = "",
|
|
|
|
|
} in
|
|
|
|
|
|
|
|
|
|
# ── Operational modes ───────────────────────────────────────────────────────
|
|
|
|
|
# A mode is an active perspective the developer/agent switches into.
|
|
|
|
|
# It determines which layers are visible and what audit level applies.
|
|
|
|
|
|
|
|
|
|
let op_mode_type = {
|
|
|
|
|
id | String,
|
|
|
|
|
description | String | default = "",
|
|
|
|
|
visible_layers | Array String,
|
|
|
|
|
audit_level | audit_level_type | default = 'Standard,
|
|
|
|
|
pre_activate | Array String | default = [],
|
|
|
|
|
post_activate | Array String | default = [],
|
|
|
|
|
} in
|
|
|
|
|
|
|
|
|
|
# ── Publication service ─────────────────────────────────────────────────────
|
|
|
|
|
# Where artifacts go and what operations surround the publish action.
|
|
|
|
|
|
|
|
|
|
let auth_method_type = [|
|
|
|
|
|
'SSH,
|
|
|
|
|
'Token,
|
|
|
|
|
'OIDC,
|
|
|
|
|
'None,
|
|
|
|
|
|] in
|
|
|
|
|
|
|
|
|
|
let service_scope_type = [|
|
|
|
|
|
'Public,
|
|
|
|
|
'PrivateNetwork,
|
|
|
|
|
'LocalRegistry,
|
|
|
|
|
'SelfHosted,
|
|
|
|
|
|] in
|
|
|
|
|
|
|
|
|
|
let publication_service_type = {
|
|
|
|
|
id | String,
|
|
|
|
|
artifact | artifact_kind_type,
|
|
|
|
|
scope | service_scope_type,
|
|
|
|
|
registry_url | String | default = "",
|
|
|
|
|
auth_method | auth_method_type | default = 'None,
|
|
|
|
|
pre_publish | Array String | default = [],
|
|
|
|
|
post_publish | Array String | default = [],
|
|
|
|
|
condition | String | default = "",
|
|
|
|
|
trigger | String,
|
|
|
|
|
} in
|
|
|
|
|
|
|
|
|
|
# ── Consumption modes (who consumes, what they need) ────────────────────────
|
|
|
|
|
|
|
|
|
|
let consumption_mode_type = {
|
|
|
|
|
consumer | consumer_type,
|
|
|
|
|
needs | Array artifact_kind_type,
|
|
|
|
|
audit_level | audit_level_type | default = 'Standard,
|
|
|
|
|
description | String | default = "",
|
|
|
|
|
} in
|
|
|
|
|
|
|
|
|
|
# ── Tool requirements ─────────────────────────────────────────────────────
|
|
|
|
|
# Declares what tools the project needs. install-tools.nu and sync audit
|
|
|
|
|
# consume this to verify availability or trigger installation.
|
|
|
|
|
|
|
|
|
|
let install_method_type = [|
|
|
|
|
|
'Builtin,
|
|
|
|
|
'Cargo,
|
|
|
|
|
'Npm,
|
|
|
|
|
'Brew,
|
|
|
|
|
'Pip,
|
|
|
|
|
'Manual,
|
|
|
|
|
|] in
|
|
|
|
|
|
|
|
|
|
let tool_requirement_type = {
|
|
|
|
|
name | String,
|
|
|
|
|
install_method | install_method_type | default = 'Builtin,
|
|
|
|
|
version | String | default = "",
|
|
|
|
|
required | Bool | default = true,
|
|
|
|
|
} in
|
|
|
|
|
|
|
|
|
|
# ── Justfile convention ──────────────────────────────────────────────────
|
|
|
|
|
# Declares expected justfile structure so sync audit can verify completeness.
|
|
|
|
|
|
|
|
|
|
let justfile_system_type = [| 'Import, 'Mod, 'Hybrid, 'Flat, 'None |] in
|
|
|
|
|
|
|
|
|
|
let justfile_convention_type = {
|
|
|
|
|
system | justfile_system_type | default = 'Mod,
|
|
|
|
|
required_modules | Array String | default = ["build", "test", "dev", "ci"],
|
|
|
|
|
required_recipes | Array String | default = ["default", "help"],
|
|
|
|
|
} in
|
|
|
|
|
|
|
|
|
|
# ── Claude baseline ─────────────────────────────────────────────────────
|
|
|
|
|
# Declares expected .claude/ structure per project.
|
|
|
|
|
|
|
|
|
|
let claude_baseline_type = {
|
|
|
|
|
guidelines | Array String | default = ["bash", "nushell"],
|
|
|
|
|
session_hook | Bool | default = true,
|
|
|
|
|
stratum_commands | Bool | default = true,
|
|
|
|
|
} in
|
|
|
|
|
|
|
|
|
|
# ── Root manifest ───────────────────────────────────────────────────────────
|
|
|
|
|
|
|
|
|
|
let manifest_type = {
|
|
|
|
|
project | String,
|
|
|
|
|
repo_kind | repo_kind_type,
|
|
|
|
|
layers | Array layer_type | default = [],
|
|
|
|
|
operational_modes | Array op_mode_type | default = [],
|
|
|
|
|
consumption_modes | Array consumption_mode_type,
|
|
|
|
|
publication_services | Array publication_service_type | default = [],
|
|
|
|
|
tools | Array tool_requirement_type | default = [],
|
|
|
|
|
justfile | justfile_convention_type | default = {},
|
|
|
|
|
claude | claude_baseline_type | default = {},
|
|
|
|
|
default_audit | audit_level_type | default = 'Standard,
|
|
|
|
|
default_mode | String | default = "dev",
|
2026-03-16 01:48:17 +00:00
|
|
|
# Node ID this project maps to in the ontology DAG.
|
|
|
|
|
# Used by portfolio tooling to cross-reference publication cards.
|
|
|
|
|
ontology_node | String | default = "",
|
---
feat: API catalog surface, protocol v2 tooling, MCP expansion, on+re update
## Summary
Session 2026-03-23. Closes the loop between handler code and discoverability
across all three surfaces (browser, CLI, MCP agent) via compile-time inventory
registration. Adds protocol v2 update tooling, extends MCP from 21 to 29 tools,
and brings the self-description up to date.
## API Catalog Surface (#[onto_api] proc-macro)
- crates/ontoref-derive: new proc-macro crate; `#[onto_api(method, path,
description, auth, actors, params, tags)]` emits `inventory::submit!(ApiRouteEntry{...})`
at link time
- crates/ontoref-daemon/src/api_catalog.rs: `catalog()` — pure fn over
`inventory::iter::<ApiRouteEntry>()`, zero runtime allocation
- GET /api/catalog: returns full annotated HTTP surface as JSON
- templates/pages/api_catalog.html: new page with client-side filtering by
method, auth, path/description; detail panel per route (params table,
feature flag); linked from dashboard card and nav
- UI nav: "API" link (</> icon) added to mobile dropdown and desktop bar
- inventory = "0.3" added to workspace.dependencies (MIT, zero transitive deps)
## Protocol Update Mode
- reflection/modes/update_ontoref.ncl: 9-step DAG (5 detect parallel, 2 update
idempotent, 2 validate, 1 report) — brings any project from protocol v1 to v2
by adding manifest.ncl and connections.ncl if absent, scanning ADRs for
deprecated check_hint, validating with nickel export
- reflection/templates/update-ontology-prompt.md: 8-phase reusable prompt for
agent-driven ontology enrichment (infrastructure → audit → core.ncl →
state.ncl → manifest.ncl → connections.ncl → ADR migration → validation)
## CLI — describe group extensions
- reflection/bin/ontoref.nu: `describe diff [--fmt] [--file]` and
`describe api [--actor] [--tag] [--auth] [--fmt]` registered as canonical
subcommands with log-action; aliases `df` and `da` added; QUICK REFERENCE
and ALIASES sections updated
## MCP — two new tools (21 → 29 total)
- ontoref_api_catalog: filters catalog() output by actor/tag/auth; returns
{ routes, total } — no HTTP roundtrip, calls inventory directly
- ontoref_file_versions: reads ProjectContext.file_versions DashMap per slug;
returns BTreeMap<filename, u64> reload counters
- insert_mcp_ctx: audited and updated from 15 to 28 entries in 6 groups
- HelpTool JSON: 8 new entries (validate_adrs, validate, impact, guides,
bookmark_list, bookmark_add, api_catalog, file_versions)
- ServerHandler::get_info instructions updated to mention new tools
## Web UI — dashboard additions
- Dashboard: "API Catalog" card (9th); "Ontology File Versions" section showing
per-file reload counters from file_versions DashMap
- dashboard_mp: builds BTreeMap<String, u64> from ctx.file_versions and injects
into Tera context
## on+re update
- .ontology/core.ncl: describe-query-layer and adopt-ontoref-tooling descriptions
updated; ontoref-daemon updated ("11 pages", "29 tools", API catalog,
per-file versioning, #[onto_api]); new node api-catalog-surface (Yang/Practice)
with 3 edges; artifact_paths extended across 3 nodes
- .ontology/state.ncl: protocol-maturity blocker updated (protocol v2 complete);
self-description-coverage catalyst updated with session 2026-03-23 additions
- ADR-007: "API Surface Discoverability via #[onto_api] Proc-Macro" — Accepted
## Documentation
- README.md: crates table updated (11 pages, 29 MCP tools, ontoref-derive row);
MCP representative table expanded; API Catalog, Semantic Diff, Per-File
Versioning paragraphs added; update_ontoref onboarding section added
- CHANGELOG.md: [Unreleased] section with 4 change groups
- assets/web/src/index.html: tool counts 19→29 (EN+ES), page counts 12→11
(EN+ES), daemon description paragraph updated with API catalog + #[onto_api]
2026-03-23 00:58:27 +01:00
|
|
|
# Publishable content assets (logos, diagrams, web pages).
|
|
|
|
|
# Declares source paths and publication targets; consumed by publish modes
|
|
|
|
|
# and sync drift detection to verify assets exist and are deployed correctly.
|
|
|
|
|
content_assets | Array content.ContentAsset | default = [],
|
|
|
|
|
# Reusable NCL templates for mode steps, agent prompts, and publication cards.
|
|
|
|
|
# Each template is a parameterised NCL function at source_path.
|
|
|
|
|
templates | Array content.ContentTemplate | default = [],
|
2026-03-13 00:21:04 +00:00
|
|
|
} in
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
RepoKind = repo_kind_type,
|
|
|
|
|
ConsumerType = consumer_type,
|
|
|
|
|
ArtifactKind = artifact_kind_type,
|
|
|
|
|
AuditLevel = audit_level_type,
|
|
|
|
|
AuthMethod = auth_method_type,
|
|
|
|
|
ServiceScope = service_scope_type,
|
|
|
|
|
InstallMethod = install_method_type,
|
|
|
|
|
JustfileSystem = justfile_system_type,
|
|
|
|
|
Layer = layer_type,
|
|
|
|
|
OperationalMode = op_mode_type,
|
|
|
|
|
ConsumptionMode = consumption_mode_type,
|
|
|
|
|
PublicationService = publication_service_type,
|
|
|
|
|
ToolRequirement = tool_requirement_type,
|
|
|
|
|
JustfileConvention = justfile_convention_type,
|
|
|
|
|
ClaudeBaseline = claude_baseline_type,
|
|
|
|
|
ProjectManifest = manifest_type,
|
|
|
|
|
}
|