From d453e179522c47201448a444d3fc11e356c21c38 Mon Sep 17 00:00:00 2001 From: tegwick Date: Sat, 15 Aug 2026 19:42:30 +0200 Subject: [PATCH] Canon 0.6.0 freeze: ITC-CAP draft, AVT catalog, joinable review Finish ITC-WP-0013 (AttributeValueType under ITC-DATA) and ITC-WP-0014 T02/T03/T05/T06/T07. Capability contract schemas, live-catalog review CLI, landscape/kernel-map pointers. Sit on this version. --- CHANGELOG.md | 35 ++ README.md | 2 + canon.yaml | 7 +- demand/AttributeValueTypes.md | 6 +- .../briefs/catalog-attribute-value-types.md | 29 ++ .../briefs/mapping-capability-anchors.md | 29 ++ infospace/agent/global-agent-brief.md | 4 +- infospace/agent/retrieval-index.json | 42 ++- infospace/agent/retrieval-index.md | 22 +- infospace/agent/retrieval-index.yaml | 32 +- infospace/artifacts/index.yaml | 22 ++ .../it-capability-canon/open-questions.md | 5 +- infospace/indexes/artifact-tree.yaml | 23 +- infospace/indexes/concept-ownership.yaml | 10 +- infospace/indexes/import-matrix.yaml | 12 + infospace/infospace.yaml | 3 + infospace/kernel/InfoTechCanonKernelMap.md | 19 ++ infospace/mappings/capability-anchors.yaml | 150 ++++++++ .../InfoTechCanonCapabilityModel.md | 9 +- infospace/models/capability/capabilities.yaml | 4 +- .../models/data/InfoTechCanonDataModel.md | 25 ++ .../data/attribute-value-types-alignment.md | 27 ++ .../models/data/attribute-value-types.yaml | 129 +++++++ .../landscape/InfoTechCanonLandscapeModel.md | 10 +- .../schemas/attribute-value-type.schema.yaml | 36 ++ .../schemas/capability-record.schema.yaml | 118 +++++++ infospace/schemas/capability.schema.yaml | 114 +++++++ infospace/schemas/index.yaml | 6 + infospace/validation/latest.json | 6 +- infospace/views/by-concept.md | 4 +- infospace/views/by-mapping-target.md | 12 + infospace/views/by-standard.md | 2 +- infospace/views/import-matrix.md | 138 ++++---- infospace/views/kernel-overview.md | 10 +- src/info_tech_canon/api.py | 13 + src/info_tech_canon/capability.py | 320 ++++++++++++++++++ src/info_tech_canon/cli.py | 12 + src/info_tech_canon/service.py | 12 + src/info_tech_canon/validation.py | 18 + tests/test_cli.py | 2 +- tests/test_service.py | 54 ++- ...TC-WP-0013-attribute-value-type-catalog.md | 55 +-- ...-WP-0014-capability-model-consolidation.md | 30 +- workplans/index.yaml | 4 +- 44 files changed, 1485 insertions(+), 137 deletions(-) create mode 100644 infospace/agent/briefs/catalog-attribute-value-types.md create mode 100644 infospace/agent/briefs/mapping-capability-anchors.md create mode 100644 infospace/mappings/capability-anchors.yaml create mode 100644 infospace/models/data/attribute-value-types-alignment.md create mode 100644 infospace/models/data/attribute-value-types.yaml create mode 100644 infospace/schemas/attribute-value-type.schema.yaml create mode 100644 infospace/schemas/capability-record.schema.yaml create mode 100644 infospace/schemas/capability.schema.yaml create mode 100644 src/info_tech_canon/capability.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 48ea553..d4afd7b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,41 @@ semantics. --- +## 0.6.0 — 2026-08-15 + +### Frozen — ITC-CAP draft; AttributeValueType catalog; joinable review + +**Change.** Canon 0.6.0 is the freeze cut. + +- **ITC-CAP** promoted from `proposed` to `draft`. Contract schemas + published: `capability.schema.yaml` (catalog) and + `capability-record.schema.yaml` (requirement/provision records). + `make validate` enforces CAP-R8 on the catalog. +- **Capability-review surface:** `info-tech-canon capability-review PATH` + and `GET /capability-review?path=` join a consumer record to the live + catalog (OQ-6 / ITC-WP-0014 T06). +- **Mappings:** `infospace/mappings/capability-anchors.yaml` formalizes + the assimilation mappings (T03). +- **Landscape §11.4** and **Kernel Map §4.14** now point at ITC-CAP (T05). +- **AttributeValueType** catalog under ITC-DATA + (`models/data/attribute-value-types.yaml`) from + `demand/AttributeValueTypes.md` (ITC-WP-0013). citation-evidence + alignment note published. + +ITC-WP-0013 and ITC-WP-0014 are finished. T04 (small-saas illustration) +remains optional and does not block the freeze. + +**Rationale.** One consumer cycle has refined the capability model; a +second consumer needed a closed capture-type catalog. Further shape +change of ITC-CAP needs a new minor. 0.6.0 is the version to sit on. + +**Breaking:** no capability id or AttributeValueType id invented as a +break. New catalogs and schemas only. + +**Validation.** `make validate` 0 errors / 0 warnings; `make test` 23 passed. + +--- + ## 0.5.0 — 2026-08-15 ### Added — Provision-to-provision relationships (`uses_provisions`) diff --git a/README.md b/README.md index ef7992f..6d06a7d 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,7 @@ PYTHONPATH=src python3 -m info_tech_canon standards PYTHONPATH=src python3 -m info_tech_canon review-kit PYTHONPATH=src python3 -m info_tech_canon alignment-template PYTHONPATH=src python3 -m info_tech_canon validate +PYTHONPATH=src python3 -m info_tech_canon capability-review /path/to/record.json PYTHONPATH=src python3 -m info_tech_canon graph PYTHONPATH=src python3 -m info_tech_canon index PYTHONPATH=src python3 -m info_tech_canon views @@ -45,6 +46,7 @@ After package installation, the same commands are available through the - `GET /review-kit` - `GET /alignment-template` - `GET /validate` +- `GET /capability-review?path=` - `GET /graph` - `GET /graph?format=mermaid` - `GET /views` diff --git a/canon.yaml b/canon.yaml index 11331c2..281328c 100644 --- a/canon.yaml +++ b/canon.yaml @@ -1,7 +1,7 @@ repository: info-tech-canon title: InfoTechCanon status: service-baseline -version: 0.5.0 +version: 0.6.0 description: > An evolving, markdown-first canon for building interoperable, adaptable, and extensible information-processing systems. @@ -92,7 +92,7 @@ models: - id: itc-cap title: InfoTechCanonCapabilityModel path: infospace/models/capability/InfoTechCanonCapabilityModel.md - status: proposed + status: draft version: 0.4.0 catalog: infospace/models/capability/capabilities.yaml provenance: @@ -181,4 +181,5 @@ next_actions: - implement ITC-WP-0003 validation and generated views - implement ITC-WP-0004 small-saas profile proof - explore ITC-WP-0006 PURPOSES model extension - - publish ITC-WP-0014 T02 capability.schema.yaml encoding ITC-CAP 0.4.0 (next ITC-CAP promotion gate; §10.3 met; uses_provisions and CAP-R10/R11 in the contract) + - sit on canon 0.6.0; do not change ITC-CAP shape without a new minor + - optional ITC-WP-0014 T04 small-saas illustration (not a promotion gate) diff --git a/demand/AttributeValueTypes.md b/demand/AttributeValueTypes.md index a3787ec..e580ccc 100644 --- a/demand/AttributeValueTypes.md +++ b/demand/AttributeValueTypes.md @@ -1,10 +1,12 @@ # Demand: Attribute Value Type Catalog -**Status:** inbound demand (un-reviewed) +**Status:** accepted (canon 0.6.0) **Date:** 2026-07-30 **Source:** citation-evidence Capture UX (consumer) **Related consumer draft:** `citation-evidence/wiki/AttributeValueTypes-proposal.md` -**Proposed workplan:** ITC-WP-0013 +**Workplan:** ITC-WP-0013 +**Catalog:** `infospace/models/data/attribute-value-types.yaml` +**Alignment:** `infospace/models/data/attribute-value-types-alignment.md` --- diff --git a/infospace/agent/briefs/catalog-attribute-value-types.md b/infospace/agent/briefs/catalog-attribute-value-types.md new file mode 100644 index 0000000..e2db221 --- /dev/null +++ b/infospace/agent/briefs/catalog-attribute-value-types.md @@ -0,0 +1,29 @@ +--- +id: agent-brief/catalog-attribute-value-types +artifact_id: catalog/attribute-value-types +source_path: models/data/attribute-value-types.yaml +source_kind: concept-catalog +generated: true +--- + + + +# Agent Brief: InfoTechCanon Attribute Value Type Catalog + +- Artifact ID: `catalog/attribute-value-types` +- Kind: `concept-catalog` +- Canonical path: `models/data/attribute-value-types.yaml` +- Full source: `models/data/attribute-value-types.yaml` +- Summary: Structured candidate concept catalog: InfoTechCanon Attribute Value Type Catalog. + +## Retrieval Hints + +No imports or anchors recorded. + +## Owned Concepts + +- `InfoTechCanon Attribute Value Type Catalog` + +## Related Distinctions + +No common distinction is anchored directly on this artifact. diff --git a/infospace/agent/briefs/mapping-capability-anchors.md b/infospace/agent/briefs/mapping-capability-anchors.md new file mode 100644 index 0000000..c606496 --- /dev/null +++ b/infospace/agent/briefs/mapping-capability-anchors.md @@ -0,0 +1,29 @@ +--- +id: agent-brief/mapping-capability-anchors +artifact_id: mapping/capability-anchors +source_path: mappings/capability-anchors.yaml +source_kind: mapping +generated: true +--- + + + +# Agent Brief: ITC-CAP concept mappings to anchoring canon models + +- Artifact ID: `mapping/capability-anchors` +- Kind: `mapping` +- Canonical path: `mappings/capability-anchors.yaml` +- Full source: `mappings/capability-anchors.yaml` +- Summary: Mapping artifact connecting canon surfaces: ITC-CAP concept mappings to anchoring canon models. + +## Retrieval Hints + +No imports or anchors recorded. + +## Owned Concepts + +- `ITC-CAP concept mappings to anchoring canon models` + +## Related Distinctions + +No common distinction is anchored directly on this artifact. diff --git a/infospace/agent/global-agent-brief.md b/infospace/agent/global-agent-brief.md index bde522e..a6724d0 100644 --- a/infospace/agent/global-agent-brief.md +++ b/infospace/agent/global-agent-brief.md @@ -5,8 +5,8 @@ This brief summarizes the current canon service surface for agents. - Infospace slug: `canon` -- Artifact count: 66 -- Retrieval index items: 66 +- Artifact count: 68 +- Retrieval index items: 68 - Primary confidence command: `make validate` - Refresh generated indexes and views with: `make index` - Refresh agent briefs and interface templates with: `make agent-briefs` diff --git a/infospace/agent/retrieval-index.json b/infospace/agent/retrieval-index.json index 1716dca..5102e42 100644 --- a/infospace/agent/retrieval-index.json +++ b/infospace/agent/retrieval-index.json @@ -43,7 +43,7 @@ } ], "infospace": "canon", - "item_count": 66, + "item_count": 68, "items": [ { "canonical_path": "assimilation/it-capability-canon/ASSIMILATION.md", @@ -267,6 +267,20 @@ "title": "InfoTechCanon Capability Catalog", "warnings": [] }, + { + "canonical_path": "models/data/attribute-value-types.yaml", + "id": "catalog/attribute-value-types", + "imports": [], + "kind": "concept-catalog", + "owned_concepts": [ + "InfoTechCanon Attribute Value Type Catalog" + ], + "relationships": [], + "source_path": "demand/AttributeValueTypes.md", + "summary": "Structured candidate concept catalog: InfoTechCanon Attribute Value Type Catalog.", + "title": "InfoTechCanon Attribute Value Type Catalog", + "warnings": [] + }, { "canonical_path": "models/governance/evidence-basis.yaml", "id": "catalog/evidence-basis", @@ -1024,6 +1038,10 @@ "target": "model/observability", "type": "maps" }, + { + "target": "model/capability", + "type": "maps" + }, { "target": "standard/tagging", "type": "maps" @@ -1038,6 +1056,20 @@ "title": "InfoTechCanon Kernel Map", "warnings": [] }, + { + "canonical_path": "mappings/capability-anchors.yaml", + "id": "mapping/capability-anchors", + "imports": [], + "kind": "mapping", + "owned_concepts": [ + "ITC-CAP concept mappings to anchoring canon models" + ], + "relationships": [], + "source_path": "infospace/assimilation/it-capability-canon/mappings.yaml", + "summary": "Mapping artifact connecting canon surfaces: ITC-CAP concept mappings to anchoring canon models.", + "title": "ITC-CAP concept mappings to anchoring canon models", + "warnings": [] + }, { "canonical_path": "mappings/purpose-demand-governance-candidates.yaml", "id": "mapping/purpose-demand-governance-candidates", @@ -1158,6 +1190,10 @@ { "target": "assimilation/it-capability-canon", "type": "derived_from" + }, + { + "target": "mapping/capability-anchors", + "type": "introduces" } ], "source_path": "infospace/assimilation/it-capability-canon/source/ITCapabilityCanonV0.1.md", @@ -1184,6 +1220,10 @@ { "target": "model/governance", "type": "uses" + }, + { + "target": "catalog/attribute-value-types", + "type": "introduces" } ], "source_path": "seeds/InfoTechCanonDataModel_RC1_seed.md", diff --git a/infospace/agent/retrieval-index.md b/infospace/agent/retrieval-index.md index bb69d5e..11db4b3 100644 --- a/infospace/agent/retrieval-index.md +++ b/infospace/agent/retrieval-index.md @@ -4,7 +4,7 @@ Schema: `info-tech-canon.retrieval-index.v1` Infospace: `canon` -Items: **66** +Items: **68** ## Common Distinctions @@ -85,6 +85,16 @@ Items: **66** - Imports and anchors: none - Owned concepts: `InfoTechCanon Capability Catalog` +### InfoTechCanon Attribute Value Type Catalog + +- ID: `catalog/attribute-value-types` +- Kind: `concept-catalog` +- Canonical path: `models/data/attribute-value-types.yaml` +- Source path: `demand/AttributeValueTypes.md` +- Summary: Structured candidate concept catalog: InfoTechCanon Attribute Value Type Catalog. +- Imports and anchors: none +- Owned concepts: `InfoTechCanon Attribute Value Type Catalog` + ### InfoTechCanon Evidence Basis Catalog - ID: `catalog/evidence-basis` @@ -285,6 +295,16 @@ Items: **66** - Imports and anchors: none - Owned concepts: `InfoTechCanon Kernel Map` +### ITC-CAP concept mappings to anchoring canon models + +- ID: `mapping/capability-anchors` +- Kind: `mapping` +- Canonical path: `mappings/capability-anchors.yaml` +- Source path: `infospace/assimilation/it-capability-canon/mappings.yaml` +- Summary: Mapping artifact connecting canon surfaces: ITC-CAP concept mappings to anchoring canon models. +- Imports and anchors: none +- Owned concepts: `ITC-CAP concept mappings to anchoring canon models` + ### Purpose Demand Governance Extension Candidates - ID: `mapping/purpose-demand-governance-candidates` diff --git a/infospace/agent/retrieval-index.yaml b/infospace/agent/retrieval-index.yaml index 2ada173..a83e33c 100644 --- a/infospace/agent/retrieval-index.yaml +++ b/infospace/agent/retrieval-index.yaml @@ -1,6 +1,6 @@ schema: info-tech-canon.retrieval-index.v1 infospace: canon -item_count: 66 +item_count: 68 items: - id: assimilation/it-capability-canon kind: assimilation @@ -144,6 +144,18 @@ items: imports: [] relationships: [] warnings: [] +- id: catalog/attribute-value-types + kind: concept-catalog + title: InfoTechCanon Attribute Value Type Catalog + canonical_path: models/data/attribute-value-types.yaml + source_path: demand/AttributeValueTypes.md + summary: 'Structured candidate concept catalog: InfoTechCanon Attribute Value Type + Catalog.' + owned_concepts: + - InfoTechCanon Attribute Value Type Catalog + imports: [] + relationships: [] + warnings: [] - id: catalog/evidence-basis kind: concept-catalog title: InfoTechCanon Evidence Basis Catalog @@ -630,11 +642,25 @@ items: target: model/network - type: maps target: model/observability + - type: maps + target: model/capability - type: maps target: standard/tagging - type: maps target: standard/caring warnings: [] +- id: mapping/capability-anchors + kind: mapping + title: ITC-CAP concept mappings to anchoring canon models + canonical_path: mappings/capability-anchors.yaml + source_path: infospace/assimilation/it-capability-canon/mappings.yaml + summary: 'Mapping artifact connecting canon surfaces: ITC-CAP concept mappings to + anchoring canon models.' + owned_concepts: + - ITC-CAP concept mappings to anchoring canon models + imports: [] + relationships: [] + warnings: [] - id: mapping/purpose-demand-governance-candidates kind: mapping title: Purpose Demand Governance Extension Candidates @@ -721,6 +747,8 @@ items: target: capability-catalog/itc-cap - type: derived_from target: assimilation/it-capability-canon + - type: introduces + target: mapping/capability-anchors warnings: [] - id: model/data kind: model @@ -739,6 +767,8 @@ items: target: kernel/itc-core - type: uses target: model/governance + - type: introduces + target: catalog/attribute-value-types warnings: [] - id: model/devsecops kind: model diff --git a/infospace/artifacts/index.yaml b/infospace/artifacts/index.yaml index 8d6962f..7e9cb8d 100644 --- a/infospace/artifacts/index.yaml +++ b/infospace/artifacts/index.yaml @@ -41,6 +41,8 @@ artifacts: target: model/network - type: maps target: model/observability + - type: maps + target: model/capability - type: maps target: standard/tagging - type: maps @@ -135,6 +137,8 @@ artifacts: target: capability-catalog/itc-cap - type: derived_from target: assimilation/it-capability-canon + - type: introduces + target: mapping/capability-anchors - id: catalog/evidence-basis path: models/governance/evidence-basis.yaml kind: concept-catalog @@ -224,6 +228,16 @@ artifacts: target: kernel/itc-core - type: uses target: model/governance + - type: introduces + target: catalog/attribute-value-types + - id: catalog/attribute-value-types + path: models/data/attribute-value-types.yaml + kind: concept-catalog + title: InfoTechCanon Attribute Value Type Catalog + provenance: + source_path: demand/AttributeValueTypes.md + placement_workplan: ITC-WP-0013 + relationships: [] - id: model/devsecops path: models/devsecops/InfoTechCanonDevSecOpsModel.md kind: model @@ -609,6 +623,14 @@ artifacts: target: model/governance - type: uses target: model/task + - id: mapping/capability-anchors + path: mappings/capability-anchors.yaml + kind: mapping + title: ITC-CAP concept mappings to anchoring canon models + provenance: + source_path: infospace/assimilation/it-capability-canon/mappings.yaml + placement_workplan: ITC-WP-0014 + relationships: [] - id: example/consumer-purpose-portfolio path: examples/consumer-purpose-portfolio.yaml kind: example diff --git a/infospace/assimilation/it-capability-canon/open-questions.md b/infospace/assimilation/it-capability-canon/open-questions.md index bc4e64d..fa3e949 100644 --- a/infospace/assimilation/it-capability-canon/open-questions.md +++ b/infospace/assimilation/it-capability-canon/open-questions.md @@ -52,7 +52,10 @@ evaluations still have no owning model. The trigger remains open for those. The source sketches a validator (§18) comparing product requirements to provider maturity. That belongs to the service surface (`ITC-WP-0002`) and needs the -contract schema first. **Deferred:** ITC-WP-0014. +contract schema first. + +**Resolved 2026-08-15 (canon 0.6.0).** `info-tech-canon capability-review` +joins a consumer record to the live catalog. ITC-WP-0014 T06 done. ## OQ-7 — Relationship between `CapabilityProfile` and canon `Profile` diff --git a/infospace/indexes/artifact-tree.yaml b/infospace/indexes/artifact-tree.yaml index 7b493ea..171d67b 100644 --- a/infospace/indexes/artifact-tree.yaml +++ b/infospace/indexes/artifact-tree.yaml @@ -1,5 +1,5 @@ root: infospace -file_count: 176 +file_count: 183 files: - path: README.md directory: . @@ -22,6 +22,9 @@ files: - path: agent/briefs/benchmark-caring-kubernetes-rbac.md directory: agent/briefs name: benchmark-caring-kubernetes-rbac.md +- path: agent/briefs/catalog-evidence-basis.md + directory: agent/briefs + name: catalog-evidence-basis.md - path: agent/briefs/comparison-repo-scoping-canon-benefit-analysis.md directory: agent/briefs name: comparison-repo-scoping-canon-benefit-analysis.md @@ -334,6 +337,9 @@ files: - path: mappings/README.md directory: mappings name: README.md +- path: mappings/capability-anchors.yaml + directory: mappings + name: capability-anchors.yaml - path: mappings/purpose-demand-governance-candidates.yaml directory: mappings name: purpose-demand-governance-candidates.yaml @@ -349,6 +355,12 @@ files: - path: models/data/InfoTechCanonDataModel.md directory: models/data name: InfoTechCanonDataModel.md +- path: models/data/attribute-value-types-alignment.md + directory: models/data + name: attribute-value-types-alignment.md +- path: models/data/attribute-value-types.yaml + directory: models/data + name: attribute-value-types.yaml - path: models/devsecops/InfoTechCanonDevSecOpsModel.md directory: models/devsecops name: InfoTechCanonDevSecOpsModel.md @@ -451,6 +463,15 @@ files: - path: schemas/assimilation.schema.yaml directory: schemas name: assimilation.schema.yaml +- path: schemas/attribute-value-type.schema.yaml + directory: schemas + name: attribute-value-type.schema.yaml +- path: schemas/capability-record.schema.yaml + directory: schemas + name: capability-record.schema.yaml +- path: schemas/capability.schema.yaml + directory: schemas + name: capability.schema.yaml - path: schemas/concept.schema.yaml directory: schemas name: concept.schema.yaml diff --git a/infospace/indexes/concept-ownership.yaml b/infospace/indexes/concept-ownership.yaml index 57b064a..7a4aced 100644 --- a/infospace/indexes/concept-ownership.yaml +++ b/infospace/indexes/concept-ownership.yaml @@ -1,4 +1,4 @@ -concept_count: 108 +concept_count: 110 concepts: - concept: "Assimilation \u2014 IT Capability Canon (ITCC) v0.1" owner: assimilation/it-capability-canon @@ -28,6 +28,10 @@ concepts: owner: capability-catalog/itc-cap path: models/capability/capabilities.yaml source: artifact_title +- concept: InfoTechCanon Attribute Value Type Catalog + owner: catalog/attribute-value-types + path: models/data/attribute-value-types.yaml + source: artifact_title - concept: InfoTechCanon Evidence Basis Catalog owner: catalog/evidence-basis path: models/governance/evidence-basis.yaml @@ -108,6 +112,10 @@ concepts: owner: kernel/itc-kernel-map path: kernel/InfoTechCanonKernelMap.md source: artifact_title +- concept: ITC-CAP concept mappings to anchoring canon models + owner: mapping/capability-anchors + path: mappings/capability-anchors.yaml + source: artifact_title - concept: Purpose Demand Governance Extension Candidates owner: mapping/purpose-demand-governance-candidates path: mappings/purpose-demand-governance-candidates.yaml diff --git a/infospace/indexes/import-matrix.yaml b/infospace/indexes/import-matrix.yaml index 475b736..8985df2 100644 --- a/infospace/indexes/import-matrix.yaml +++ b/infospace/indexes/import-matrix.yaml @@ -6,6 +6,7 @@ artifacts: - benchmark/caring/kubernetes-rbac/findings - benchmark/caring/kubernetes-rbac/native-concepts - capability-catalog/itc-cap +- catalog/attribute-value-types - catalog/evidence-basis - comparison/repo-scoping/canon-benefit-analysis - comparison/repo-scoping/consumer-workplan-brief @@ -26,6 +27,7 @@ artifacts: - example/consumer-purpose-portfolio - kernel/itc-core - kernel/itc-kernel-map +- mapping/capability-anchors - mapping/purpose-demand-governance-candidates - model/access-control - model/capability @@ -134,6 +136,8 @@ rows: - maps - artifact: capability-catalog/itc-cap targets: {} +- artifact: catalog/attribute-value-types + targets: {} - artifact: catalog/evidence-basis targets: {} - artifact: comparison/repo-scoping/canon-benefit-analysis @@ -354,6 +358,8 @@ rows: - maps model/access-control: - maps + model/capability: + - maps model/data: - maps model/devsecops: @@ -378,6 +384,8 @@ rows: - maps standard/tagging: - maps +- artifact: mapping/capability-anchors + targets: {} - artifact: mapping/purpose-demand-governance-candidates targets: model/governance: @@ -404,6 +412,8 @@ rows: - uses kernel/itc-core: - conforms_to + mapping/capability-anchors: + - introduces model/governance: - uses model/landscape: @@ -414,6 +424,8 @@ rows: - uses - artifact: model/data targets: + catalog/attribute-value-types: + - introduces kernel/itc-core: - conforms_to model/governance: diff --git a/infospace/infospace.yaml b/infospace/infospace.yaml index 12cd1de..1fb2a6e 100644 --- a/infospace/infospace.yaml +++ b/infospace/infospace.yaml @@ -48,6 +48,9 @@ schemas: interface-card: schemas/interface-card.schema.yaml agent-brief: schemas/agent-brief.schema.yaml workplan: schemas/workplan.schema.yaml + capability: schemas/capability.schema.yaml + capability-record: schemas/capability-record.schema.yaml + attribute-value-type: schemas/attribute-value-type.schema.yaml workflows: [] viability: redundancy_ratio: diff --git a/infospace/kernel/InfoTechCanonKernelMap.md b/infospace/kernel/InfoTechCanonKernelMap.md index fea646a..099e831 100644 --- a/infospace/kernel/InfoTechCanonKernelMap.md +++ b/infospace/kernel/InfoTechCanonKernelMap.md @@ -49,6 +49,7 @@ InfoTechCanonDataModel InfoTechCanonDevSecOpsModel InfoTechCanonNetworkModel InfoTechCanonObservabilityModel +InfoTechCanonCapabilityModel ``` Together they form a coherent first-generation semantic substrate for building interoperable information-processing systems. @@ -69,6 +70,7 @@ Data = datasets, schemas, classification, lineage, quality, contrac DevSecOps = source-to-artifact-to-release-to-deployment delivery flow and evidence. Network = addressing, topology, routing, policy, reachability, flow, exposure, and state. Observability = telemetry, signals, logs, metrics, traces, events, alerts, SLOs, and evidence. +Capability = what an information system must be able to do, independently of how. ``` --- @@ -444,6 +446,23 @@ Network owns communication and reachability. Observability owns signals and runt | ObservedIncident | Observability / Task or ITSM reference | | ObservabilityEvidence | Observability / Governance reference | +## 4.14 Capability Owns Abilities + +| Concept Family | Canonical Owner | +|---|---| +| Capability / CapabilityProfile | Capability | +| CapabilityRequirement / CapabilityProvision | Capability | +| CapabilityMaturityLevel | Capability | +| CapabilityResourceClass / CapabilityConsumption | Capability | +| EvidenceBasis on a consumption row | Governance (imported by Capability) | +| Service / Technology that provides a capability | Landscape | +| Intended quality target | Capability (requirement) | +| Observed SLO | Landscape / Observability | + +ITC-CAP sits between product need and landscape implementation. Capability +ids are durable interfaces (CAP-R5). Landscape §11.4 defers abstract +ability here. + --- # 5. CARING Fit in InfoTechCanon diff --git a/infospace/mappings/capability-anchors.yaml b/infospace/mappings/capability-anchors.yaml new file mode 100644 index 0000000..a6b9772 --- /dev/null +++ b/infospace/mappings/capability-anchors.yaml @@ -0,0 +1,150 @@ +id: mapping/capability-anchors +title: ITC-CAP concept mappings to anchoring canon models +source: assimilation/it-capability-canon +target: model/capability +mapping_type: related +confidence: mixed +canon_version: "0.6.0" +note: > + Formal per-owner mapping artifacts for ITC-CAP anchors. Adapted from + assimilation/it-capability-canon/mappings.yaml. Quality-dimension mapping + to SLOs is demand-side targets on the requirement (canon 0.3.0+); measurement + remains with LAND/OBS. +concept_mappings: + - source_concept: Implementation + target_concept: Technology / SoftwareEntity / RuntimeEntity + target_owner: model/landscape + mapping_type: imports + confidence: high + - source_concept: Provider + target_concept: Service / ServiceProvider / ServiceInstance + target_owner: model/landscape + mapping_type: related + confidence: high + - source_concept: Resource + target_concept: RuntimeResource + target_owner: model/landscape + mapping_type: broader + confidence: medium + - source_concept: Evidence + target_concept: Evidence + target_owner: model/governance + mapping_type: imports + confidence: high + - source_concept: Evidence (telemetry-derived) + target_concept: TelemetrySignal / Metric / SLO + target_owner: model/observability + mapping_type: related + confidence: high + - source_concept: Requirement + target_concept: DemandSignal / ConsumerNeed + target_owner: model/purpose-demand-extension + mapping_type: narrower + confidence: high + - source_concept: Quality dimension + target_concept: CapabilityRequirement targets / ServiceLevelObjective + target_owner: model/capability + mapping_type: related + confidence: high + rationale: Intended targets live on the requirement; observed SLOs stay with LAND/OBS. + - source_concept: EvidenceBasis + target_concept: EvidenceBasis + target_owner: model/governance + mapping_type: imports + confidence: high + - source_concept: identity.authentication + target_concept: Principal / AuthenticationEvent + target_owner: model/access-control + mapping_type: related + confidence: high + - source_concept: identity.authorization + target_concept: AuthorizationDecision / Permission / Grant + target_owner: model/access-control + mapping_type: related + confidence: high + - source_concept: identity.organization + target_concept: Organization / Team / Tenant + target_owner: model/organization + mapping_type: related + confidence: high + - source_concept: security.policy + target_concept: Policy / Rule / Control + target_owner: model/governance + mapping_type: imports + confidence: high + - source_concept: security.secrets / security.keys / security.vulnerability + target_concept: Secret / Key / Vulnerability / Finding + target_owner: model/security + mapping_type: related + confidence: high + - source_concept: governance.evidence + target_concept: Evidence / Assurance / Control + target_owner: model/governance + mapping_type: related + confidence: high + - source_concept: governance.lifecycle + target_concept: Retention / Classification / DataContract + target_owner: model/data + mapping_type: related + confidence: medium + - source_concept: data.* + target_concept: Dataset / DataStore / Schema / Lineage / Retention + target_owner: model/data + mapping_type: related + confidence: high + - source_concept: integration.traffic + target_concept: Routing / Exposure / Reachability / NetworkPolicy + target_owner: model/network + mapping_type: related + confidence: high + - source_concept: integration.api / integration.messaging / integration.exchange + target_concept: Endpoint / Interface / Flow + target_owner: model/landscape + mapping_type: related + confidence: medium + - source_concept: runtime.deployment + target_concept: Release / Deployment / Artifact + target_owner: model/devsecops + mapping_type: related + confidence: high + - source_concept: runtime.execution / runtime.configuration / runtime.scheduling + target_concept: RuntimeEntity / RuntimeResource / Configuration + target_owner: model/landscape + mapping_type: related + confidence: medium + - source_concept: runtime.workflow + target_concept: Task / Action / Dependency + target_owner: model/task + mapping_type: related + confidence: medium + - source_concept: operations.observability / operations.alerting + target_concept: Telemetry / Alert / Health / SLO + target_owner: model/observability + mapping_type: related + confidence: high + - source_concept: operations.audit + target_concept: Evidence / AuditRecord + target_owner: model/governance + mapping_type: related + confidence: high + - source_concept: operations.recovery / operations.continuity + target_concept: Incident / ServiceLevelObjective + target_owner: model/security + mapping_type: related + confidence: low + note: Continuity has no strong canon owner — OQ-4. + - source_concept: commerce.* + target_concept: (none) + target_owner: model/capability + mapping_type: no_mapping + confidence: high + - source_concept: intelligence.* + target_concept: (none) + target_owner: model/capability + mapping_type: no_mapping + confidence: high + - source_concept: CILM + target_concept: InfoTechCanonLandscapeModel + target_owner: model/landscape + mapping_type: superseded_by + confidence: high diff --git a/infospace/models/capability/InfoTechCanonCapabilityModel.md b/infospace/models/capability/InfoTechCanonCapabilityModel.md index 333e34e..1dcc773 100644 --- a/infospace/models/capability/InfoTechCanonCapabilityModel.md +++ b/infospace/models/capability/InfoTechCanonCapabilityModel.md @@ -6,7 +6,7 @@ type: domain-model standard_family: InfoTechCanon repository_context: info-tech-canon recommended_path: models/capability/InfoTechCanonCapabilityModel.md -status: proposed +status: draft version: 0.4.0 source_version: "0.1" source_body: Information Technology Capability Canon (ITCC) @@ -54,7 +54,7 @@ updated_at: 2026-08-15 # InfoTechCanon Capability Model **Short Name:** `ITC-CAP` -**Document Status:** Proposed (assimilated, not yet promoted) +**Document Status:** Draft (promoted; contract frozen at canon 0.6.0) **Version:** 0.4.0 **Document Type:** InfoTechCanon Domain Model **Machine-readable catalog:** `models/capability/capabilities.yaml` @@ -578,7 +578,10 @@ model. This is accepted at `proposed` status and tracked as OQ-5. # 10. Status and Promotion -This model enters the canon at status `proposed`. Promotion requires: +This model is **draft** as of canon 0.6.0. The contract is frozen. Further +shape change needs a new minor of ITC-CAP and a CHANGELOG entry. + +Promotion from `proposed` required: 1. ~~resolution of assimilation open question **OQ-2**~~ — **resolved in canon 0.2.1**: the Security & Governance navigation domain was split into `security` diff --git a/infospace/models/capability/capabilities.yaml b/infospace/models/capability/capabilities.yaml index fbb6f55..2ce8367 100644 --- a/infospace/models/capability/capabilities.yaml +++ b/infospace/models/capability/capabilities.yaml @@ -13,8 +13,8 @@ canon: short_name: ITC-CAP artifact_id: model/capability version: 0.4.0 - status: proposed - canon_version: 0.5.0 + status: draft + canon_version: 0.6.0 purpose: Canonical, implementation-independent catalog of the abilities an information system may require or provide. normative_document: models/capability/InfoTechCanonCapabilityModel.md diff --git a/infospace/models/data/InfoTechCanonDataModel.md b/infospace/models/data/InfoTechCanonDataModel.md index f028be8..35e6a2e 100644 --- a/infospace/models/data/InfoTechCanonDataModel.md +++ b/infospace/models/data/InfoTechCanonDataModel.md @@ -26,6 +26,7 @@ This standard provides a canonical vocabulary for: - fields, - schemas, - data elements, +- attribute value types, - code lists, - data stores as references, - data flows, @@ -761,6 +762,30 @@ A **DataType** specifies the technical or logical type of a field or data elemen --- +## 11.15a AttributeValueType + +An **AttributeValueType** is a closed, versioned, application-facing value +type for structured capture. It names the type id, meaning, wire encoding, +and whether a CodeList is required. It does not name a widget and it is not +a competing entity with Attribute or Field. + +It is a closed profile of **Representation** for capture and forms. +Constraint still owns required/format/cardinality. CodeList still owns +permitted values. Email, phone, and percentage are not types. + +The catalog is `models/data/attribute-value-types.yaml`. Current ids: +`text`, `text-long`, `date`, `time`, `datetime`, `amount`, `one-of`, +`some-of`. Reserved: `boolean`, `integer`, `number`, `uri`, `identifier`. +Legacy alias `textarea` normalizes to `text-long`. + +`amount` is structured `{value, currency}`. `one-of` / `some-of` require a +CodeList; domain lists are not new types. + +**Provenance.** `demand/AttributeValueTypes.md` (citation-evidence), +ITC-WP-0013. + +--- + ## 11.16 Constraint A **Constraint** is a rule limiting valid data. diff --git a/infospace/models/data/attribute-value-types-alignment.md b/infospace/models/data/attribute-value-types-alignment.md new file mode 100644 index 0000000..6d5877b --- /dev/null +++ b/infospace/models/data/attribute-value-types-alignment.md @@ -0,0 +1,27 @@ +# Alignment note — AttributeValueType catalog for citation-evidence + +**Consumer:** citation-evidence Capture UX +**Demand:** `demand/AttributeValueTypes.md` +**Catalog:** `models/data/attribute-value-types.yaml` +**Owner:** ITC-DATA +**Canon version:** 0.6.0 + +citation-evidence should import these ids rather than keep a private type +enum. Widgets, filters, and evidence links stay in the consumer. + +| Consumer need | Canon id | Notes | +|---|---|---| +| short text | `text` | already in use | +| textarea | `text-long` | accept `textarea` on load; write `text-long` | +| date | `date` | `YYYY-MM-DD` | +| time | `time` | requested | +| datetime | `datetime` | ISO-8601 | +| amount | `amount` | `{value, currency}` — accepted default | +| single choice | `one-of` | CodeList required; widget is consumer (`select`) | +| multi choice | `some-of` | CodeList required | +| boolean / integer / number / uri / identifier | reserved | do not implement until needed | + +Do not add `email`, `phone`, or `percentage` as types. Those are `text` or +`number` plus a Constraint. + +CE-WP-0012 widgets remain consumer work. diff --git a/infospace/models/data/attribute-value-types.yaml b/infospace/models/data/attribute-value-types.yaml new file mode 100644 index 0000000..6cd12fd --- /dev/null +++ b/infospace/models/data/attribute-value-types.yaml @@ -0,0 +1,129 @@ +# InfoTechCanon Attribute Value Type Catalog +# +# Closed, versioned application-facing value types for structured capture. +# Owned by ITC-DATA. Does not name widgets. Encoding rules live here; +# Constraint, CodeList, and Representation stay the owning concepts. +canon: + id: itc-data-attribute-value-types + name: InfoTechCanon Attribute Value Type Catalog + artifact_id: catalog/attribute-value-types + version: 0.1.0 + status: draft + canon_version: 0.6.0 + owner: model/data + purpose: Closed catalog of capture value types so consumers share ids and + wire encodings without forking a private type system. + normative_document: models/data/InfoTechCanonDataModel.md + provenance: + demand: demand/AttributeValueTypes.md + consumer: citation-evidence + consumer_draft: citation-evidence/wiki/AttributeValueTypes-proposal.md + workplan: ITC-WP-0013 +types: + - id: text + status: current + kind: scalar + wire: string + representation: string + description: Short free text. + - id: text-long + status: current + kind: scalar + wire: string + representation: string + description: Long free text. Canonical id for the legacy alias textarea. + aliases: [textarea] + - id: date + status: current + kind: scalar + wire: string + format: YYYY-MM-DD + representation: date + description: Calendar date. + - id: time + status: current + kind: scalar + wire: string + format: HH:MM or HH:MM:SS + representation: string + description: Clock time without a date. + - id: datetime + status: current + kind: scalar + wire: string + format: ISO-8601 local or offset + representation: timestamp + description: Date and time. + - id: amount + status: current + kind: quantity + wire: object + representation: decimal + requires_codelist: currency + description: Quantity plus currency. Wire form is structured JSON. + encoding: + value: decimal-as-string + currency: ISO-4217 code + example: {value: "1500.00", currency: EUR} + - id: one-of + status: current + kind: choice + wire: string + representation: code + requires_codelist: true + cardinality: 1 + description: Exactly one value from a CodeList. Wire value is the option id. + - id: some-of + status: current + kind: choice + wire: array + representation: code + requires_codelist: true + cardinality: 0-n + description: Zero or more values from a CodeList. Wire value is an array of + option ids. + - id: boolean + status: reserved + kind: scalar + wire: boolean + representation: boolean + description: Yes/no. Reserved; not required of consumers yet. + - id: integer + status: reserved + kind: scalar + wire: string + representation: integer + description: Integer as decimal digits. Reserved. + - id: number + status: reserved + kind: scalar + wire: string + representation: decimal + description: Decimal number as string. Reserved. + - id: uri + status: reserved + kind: scalar + wire: string + representation: URI + description: URI. Reserved. + - id: identifier + status: reserved + kind: scalar + wire: string + representation: identifier + description: Opaque identifier. Reserved. +rules: + - id: no-email-type + statement: Do not add email, phone, or percentage as types. Use text or + number plus a Constraint. + - id: no-widget + statement: AttributeValueType does not name a UI widget. + - id: alias-normalize + statement: Legacy alias textarea MUST be accepted on read and normalized + to text-long on write. + - id: amount-structured + statement: amount MUST use {value, currency}. A single string is not + canonical. + - id: choice-needs-codelist + statement: one-of and some-of MUST attach a CodeList. Domain-specific + lists are not new types. diff --git a/infospace/models/landscape/InfoTechCanonLandscapeModel.md b/infospace/models/landscape/InfoTechCanonLandscapeModel.md index c1a16ed..0efb439 100644 --- a/infospace/models/landscape/InfoTechCanonLandscapeModel.md +++ b/infospace/models/landscape/InfoTechCanonLandscapeModel.md @@ -610,7 +610,15 @@ These concepts SHOULD eventually be reviewed against: - product management, - and governance models. -The Landscape Model should keep only landscape-relevant references once a dedicated strategy/capability standard exists. +A dedicated capability model now exists: **ITC-CAP** +(`model/capability`). Abstract ability — what a system must be able to do +— is owned there. `BusinessCapability` / `ProductCapability` in this +domain SHOULD resolve to references to ITC-CAP ids. This domain keeps +landscape-relevant strategy concepts (Goal, Driver, Initiative, +RoadmapItem, ValueStream). Capability as ability is no longer owned here. + +ITC-CAP names *intended* requirement targets. This model still owns +services, technologies, runtime resources, and *observed* SLOs. --- diff --git a/infospace/schemas/attribute-value-type.schema.yaml b/infospace/schemas/attribute-value-type.schema.yaml new file mode 100644 index 0000000..b36a1da --- /dev/null +++ b/infospace/schemas/attribute-value-type.schema.yaml @@ -0,0 +1,36 @@ +$schema: https://json-schema.org/draft/2020-12/schema +$id: https://info-tech-canon.local/schemas/attribute-value-type.schema.yaml +title: InfoTechCanon Attribute Value Type Catalog +type: object +required: + - canon + - types +properties: + canon: + type: object + required: [id, version, owner] + types: + type: array + minItems: 1 + items: + type: object + required: [id, status, kind, wire] + properties: + id: + type: string + pattern: "^[a-z][a-z0-9-]*$" + status: + enum: [current, reserved] + kind: + enum: [scalar, quantity, choice] + wire: + enum: [string, object, array, boolean] + representation: + type: string + requires_codelist: + type: [boolean, string] + aliases: + type: array + items: + type: string +additionalProperties: true diff --git a/infospace/schemas/capability-record.schema.yaml b/infospace/schemas/capability-record.schema.yaml new file mode 100644 index 0000000..3ba95ad --- /dev/null +++ b/infospace/schemas/capability-record.schema.yaml @@ -0,0 +1,118 @@ +$schema: https://json-schema.org/draft/2020-12/schema +$id: https://info-tech-canon.local/schemas/capability-record.schema.yaml +title: InfoTechCanon Capability Requirement and Provision Record +description: > + Shape of a consumer capability case (requirement set + provisions). + Validated against the live catalog by the capability-review surface. + ITC-CAP 0.4.0 / CAP-R8–R11. +type: object +required: + - requires +properties: + requires: + type: array + items: + $ref: "#/$defs/requirement" + provisions: + type: array + items: + $ref: "#/$defs/provision" +additionalProperties: true +$defs: + quantity: + type: object + properties: + value: {} + unit: + type: string + requirement: + type: object + required: [capability] + properties: + capability: + type: string + profile: + type: string + minimum_maturity: + type: string + pattern: "^D[0-7]$" + targets: + type: object + additionalProperties: + type: object + constraints: + type: array + items: + type: object + required: [dimension, predicate] + properties: + dimension: + type: string + predicate: + enum: [not_in, in, equals, lte, gte] + of: + type: array + provision: + type: object + required: [provider, capability, maturity] + properties: + provider: + type: string + capability: + type: string + profile: + type: string + environment: + type: string + maturity: + type: string + pattern: "^D[0-7]$" + uses_provisions: + type: array + items: + type: object + required: [capability, provider, relation] + properties: + capability: + type: string + provider: + type: string + relation: + enum: [depends_on, may_use] + consumes: + type: array + items: + type: object + required: [class, quantity, basis] + properties: + class: + type: string + pattern: "^[A-Z]$" + quantity: + $ref: "#/$defs/quantity" + basis: + enum: + - invoiced + - measured + - quoted + - derived + - projected + - estimated + - assumed + - unknown + supply: + enum: [internal, external] + period: + type: string + gap: + type: string + evidence: + type: array + items: + type: object + required: [hook] + properties: + hook: + type: string + basis: + type: string diff --git a/infospace/schemas/capability.schema.yaml b/infospace/schemas/capability.schema.yaml new file mode 100644 index 0000000..eeea82a --- /dev/null +++ b/infospace/schemas/capability.schema.yaml @@ -0,0 +1,114 @@ +$schema: https://json-schema.org/draft/2020-12/schema +$id: https://info-tech-canon.local/schemas/capability.schema.yaml +title: InfoTechCanon Capability Catalog (ITC-CAP 0.4.0) +description: > + Contract for capabilities.yaml. Encodes ITC-CAP 0.4.0 — no + typical_resource_classes; resource classes carry native_unit, supply, + and capacity_behaviour. Requirement and provision records are validated + separately by the capability-review surface. +type: object +required: + - canon + - resource_classes + - maturity_levels + - domains +properties: + canon: + type: object + required: [id, version] + properties: + id: + const: itc-cap + version: + type: string + status: + type: string + canon_version: + type: string + resource_classes: + type: array + minItems: 1 + items: + type: object + required: [id, name, native_unit, supply, capacity_behaviour] + properties: + id: + type: string + pattern: "^[A-Z]$" + name: + type: string + native_unit: + type: string + supply: + enum: [internal, external] + capacity_behaviour: + enum: [elastic, constrained] + additionalProperties: true + maturity_levels: + type: array + minItems: 8 + items: + type: object + required: [id, name] + properties: + id: + type: string + pattern: "^D[0-7]$" + applies_to: + const: capability_provision + relationship_types: + type: array + domains: + type: array + minItems: 1 + items: + type: object + required: [id, name, capabilities] + properties: + navigation_only: + type: boolean + capabilities: + type: array + items: + $ref: "#/$defs/capability" +additionalProperties: true +$defs: + capability: + type: object + required: [id, name, purpose] + properties: + id: + type: string + pattern: "^[a-z]+\\.[a-z0-9-]+$" + name: + type: string + purpose: + type: string + anchors: + type: array + items: + type: string + profiles: + type: array + items: + type: string + quality_dimensions: + type: array + items: + type: string + evidence_hooks: + type: array + items: + type: string + depends_on: + type: array + items: + type: string + may_use: + type: array + items: + type: string + typical_resource_classes: + not: {} + description: Forbidden. Consumption attaches to a provision (CAP-R8). + additionalProperties: true diff --git a/infospace/schemas/index.yaml b/infospace/schemas/index.yaml index d0a65a7..1243de8 100644 --- a/infospace/schemas/index.yaml +++ b/infospace/schemas/index.yaml @@ -17,3 +17,9 @@ schemas: path: workplan.schema.yaml - id: alignment-review path: alignment-review.schema.yaml + - id: capability + path: capability.schema.yaml + - id: capability-record + path: capability-record.schema.yaml + - id: attribute-value-type + path: attribute-value-type.schema.yaml diff --git a/infospace/validation/latest.json b/infospace/validation/latest.json index e736cc1..826c79d 100644 --- a/infospace/validation/latest.json +++ b/infospace/validation/latest.json @@ -1,14 +1,14 @@ { "details": { - "artifact_count": 66, - "relationship_count": 288 + "artifact_count": 68, + "relationship_count": 291 }, "errors": [], "metrics": { "coherence_components": 1.0, "consistency_cycles": 0.0, "coverage_ratio": 1.0, - "granularity_entropy": 4.459014704982469, + "granularity_entropy": 4.478787416971244, "redundancy_ratio": 0.0 }, "ok": true, diff --git a/infospace/views/by-concept.md b/infospace/views/by-concept.md index 76f6100..0908083 100644 --- a/infospace/views/by-concept.md +++ b/infospace/views/by-concept.md @@ -2,7 +2,7 @@ # By Concept -Concept count: **108** +Concept count: **110** | Concept | Owner | Source | | --- | --- | --- | @@ -13,6 +13,7 @@ Concept count: **108** | Kubernetes RBAC Benchmark Findings And Canon Pressure | `benchmark/caring/kubernetes-rbac/findings` | `artifact_title` | | Kubernetes RBAC Native Concept Map | `benchmark/caring/kubernetes-rbac/native-concepts` | `artifact_title` | | InfoTechCanon Capability Catalog | `capability-catalog/itc-cap` | `artifact_title` | +| InfoTechCanon Attribute Value Type Catalog | `catalog/attribute-value-types` | `artifact_title` | | InfoTechCanon Evidence Basis Catalog | `catalog/evidence-basis` | `artifact_title` | | Repo Scoping Canon Benefit Analysis | `comparison/repo-scoping/canon-benefit-analysis` | `artifact_title` | | Repo Scoping Consumer Workplan Brief | `comparison/repo-scoping/consumer-workplan-brief` | `artifact_title` | @@ -33,6 +34,7 @@ Concept count: **108** | Canon-Side Consumer Purpose Portfolio | `example/consumer-purpose-portfolio` | `artifact_title` | | InfoTechCanon Core | `kernel/itc-core` | `artifact_title` | | InfoTechCanon Kernel Map | `kernel/itc-kernel-map` | `artifact_title` | +| ITC-CAP concept mappings to anchoring canon models | `mapping/capability-anchors` | `artifact_title` | | Purpose Demand Governance Extension Candidates | `mapping/purpose-demand-governance-candidates` | `artifact_title` | | InfoTechCanon Access Control Model | `model/access-control` | `artifact_title` | | InfoTechCanon Capability Model | `model/capability` | `artifact_title` | diff --git a/infospace/views/by-mapping-target.md b/infospace/views/by-mapping-target.md index 4d4bdec..13ded47 100644 --- a/infospace/views/by-mapping-target.md +++ b/infospace/views/by-mapping-target.md @@ -19,6 +19,10 @@ - `model/capability` via `introduces` +## `catalog/attribute-value-types` + +- `model/data` via `introduces` + ## `catalog/evidence-basis` - `model/capability` via `uses` @@ -82,6 +86,10 @@ - `standard/repository-layout` via `conforms_to` - `standard/tagging` via `conforms_to` +## `mapping/capability-anchors` + +- `model/capability` via `introduces` + ## `model/access-control` - `benchmark/caring/kubernetes-rbac` via `stress_tests` @@ -98,6 +106,10 @@ - `small-saas/user/ada-admin` via `uses` - `standard/caring` via `imports` +## `model/capability` + +- `kernel/itc-kernel-map` via `maps` + ## `model/data` - `conformance/railiance-fabric` via `uses` diff --git a/infospace/views/by-standard.md b/infospace/views/by-standard.md index 545c080..fb95113 100644 --- a/infospace/views/by-standard.md +++ b/infospace/views/by-standard.md @@ -14,7 +14,7 @@ - ID: `kernel/itc-kernel-map` - Kind: `kernel` - Path: `kernel/InfoTechCanonKernelMap.md` -- Relationships: 14 +- Relationships: 15 ## InfoTechCanon CARING Access Governance Standard diff --git a/infospace/views/import-matrix.md b/infospace/views/import-matrix.md index d4503e4..d3349e2 100644 --- a/infospace/views/import-matrix.md +++ b/infospace/views/import-matrix.md @@ -2,71 +2,73 @@ # Import Matrix -| Artifact | `assimilation/it-capability-canon` | `benchmark/caring/kubernetes-rbac` | `benchmark/caring/kubernetes-rbac/access-descriptors` | `benchmark/caring/kubernetes-rbac/caring-mapping` | `benchmark/caring/kubernetes-rbac/findings` | `benchmark/caring/kubernetes-rbac/native-concepts` | `capability-catalog/itc-cap` | `catalog/evidence-basis` | `comparison/repo-scoping/canon-benefit-analysis` | `comparison/repo-scoping/consumer-workplan-brief` | `comparison/repo-scoping/extension-candidates` | `comparison/repo-scoping/frame` | `comparison/repo-scoping/report` | `concept-catalog/purpose-demand` | `conformance/railiance-fabric` | `conformance/railiance-fabric/consumer-workplan-brief` | `conformance/railiance-fabric/entity-edge-capture-criteria` | `conformance/railiance-fabric/mapping-expectations` | `conformance/railiance-fabric/visualization-examples` | `evaluation/user-engine` | `evaluation/user-engine/consumer-workplan-brief` | `evaluation/user-engine/interface-card-expectations` | `evaluation/user-engine/questions` | `evaluation/user-engine/small-saas-alignment` | `example/consumer-purpose-portfolio` | `kernel/itc-core` | `kernel/itc-kernel-map` | `mapping/purpose-demand-governance-candidates` | `model/access-control` | `model/capability` | `model/data` | `model/devsecops` | `model/governance` | `model/information-space` | `model/landscape` | `model/network` | `model/observability` | `model/organization` | `model/purpose-demand-extension` | `model/security` | `model/task` | `pattern/intent-scope-purposes` | `practice/intake-and-assimilation` | `profile/small-saas` | `review-kit/alignment` | `review-kit/alignment/model-selection-guide` | `review-kit/alignment/schema` | `review-kit/alignment/scorecard` | `review-kit/alignment/workflow` | `review-kit/alignment/workplan-template` | `small-saas/control/namespace-per-tenant` | `small-saas/dataset/subscription-ledger` | `small-saas/deployment/production` | `small-saas/evidence/access-review-2026-05` | `small-saas/incident/cross-tenant-access-attempt` | `small-saas/policy/tenant-isolation` | `small-saas/service/billing-portal` | `small-saas/system/billing-system` | `small-saas/task/onboard-tenant` | `small-saas/team/platform` | `small-saas/tenant/acme` | `small-saas/tenant/globex` | `small-saas/user/ada-admin` | `standard/caring` | `standard/repository-layout` | `standard/tagging` | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| `assimilation/it-capability-canon` | | | | | | | | | | | | | | | | | | | | | | | | | | `conforms_to` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | -| `benchmark/caring/kubernetes-rbac` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `stress_tests` | | | `stress_tests` | `stress_tests` | | | `stress_tests` | `stress_tests` | | | `stress_tests` | | | | | | | | | | | | | | | | | | | | | | | | `conforms_to` | | `uses` | -| `benchmark/caring/kubernetes-rbac/access-descriptors` | | `part_of` | | | | | | | | | | | | | | | | | | | | | | | | | | | `uses` | | | `uses` | | | | | | | | `uses` | | | | | | | | | | | | | | | | | | | | | | | | `uses` | | | -| `benchmark/caring/kubernetes-rbac/caring-mapping` | | `part_of` | | | | | | | | | | | | | | | | | | | | | | | | | | | `maps` | | | | `maps` | | | | | | | `maps` | | | | | | | | | | | | | | | | | | | | | | | | `maps` | | | -| `benchmark/caring/kubernetes-rbac/findings` | | `part_of` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `proposes` | | | | | | | `proposes` | | | | | | | | | | | | | | | | | | | | | | | | `proposes` | | | -| `benchmark/caring/kubernetes-rbac/native-concepts` | | `part_of` | | | | | | | | | | | | | | | | | | | | | | | | | | | `maps` | | | | | | `maps` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `maps` | | | -| `capability-catalog/itc-cap` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | -| `catalog/evidence-basis` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | -| `comparison/repo-scoping/canon-benefit-analysis` | | | | | | | | | | | | | `part_of` | | | | | | | | | | | | | | | | | | | | `maps` | `maps` | | | | | `maps` | | `maps` | | | | | | | | | | | | | | | | | | | | | | | | | `maps` | -| `comparison/repo-scoping/consumer-workplan-brief` | | | | | | | | | | | | | `part_of` | | | | | | | | | | | | | | | | | | | | | | | | | | `uses` | | | | | | | | | | | | | | | | | | | | | | | | | | | | -| `comparison/repo-scoping/extension-candidates` | | | | | | | | | | | | | `part_of` | | | | | | | | | | | | | | | | | | | | `proposes` | `proposes` | | | | | `proposes` | | `proposes` | | | | | | | | | | | | | | | | | | | | | | | | | | -| `comparison/repo-scoping/frame` | | | | | | | | | | | | | `part_of` | | | | | | | | | | | | | | | | | | | | `uses` | | | | | | `uses` | | `uses` | | | | | | | | | | | | | | | | | | | | | | | | | | -| `comparison/repo-scoping/report` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `uses` | `uses` | | | | | `compares` | | `uses` | `uses` | | | | | | | | | | | | | | | | | | | | | | | | | -| `concept-catalog/purpose-demand` | | | | | | | | | | | | | | | | | | | | | | | | | | `conforms_to` | | | | | | | `uses` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | -| `conformance/railiance-fabric` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `uses` | `uses` | `uses` | | `uses` | `uses` | `uses` | | `uses` | `uses` | `uses` | | | | | | | | | | | | | | | | | | | | | | | | | `uses` | -| `conformance/railiance-fabric/consumer-workplan-brief` | | | | | | | | | | | | | | | `part_of` | | | | | | | | | | | | | | | | | | | | | | | | `uses` | | | | | | | | | | | | | | | | | | | | | | | | | | | | -| `conformance/railiance-fabric/entity-edge-capture-criteria` | | | | | | | | | | | | | | | `part_of` | | | | | | | | | | | | | | | | `uses` | `uses` | `uses` | | `uses` | `uses` | `uses` | | `uses` | `uses` | `uses` | | | | | | | | | | | | | | | | | | | | | | | | | | -| `conformance/railiance-fabric/mapping-expectations` | | | | | | | | | | | | | | | `part_of` | | | | | | | | | | | | | | | | `maps` | `maps` | `maps` | | `maps` | `maps` | `maps` | | `maps` | `maps` | | | | | | | | | | | | | | | | | | | | | | | | | | | -| `conformance/railiance-fabric/visualization-examples` | | | | | | | | | | | | | | | `part_of` | | `illustrates` | `illustrates` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | -| `evaluation/user-engine` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `uses` | | `uses` | | `uses` | | | | | `uses` | `uses` | `uses` | `uses` | | | `evaluates` | | | | | | | | | | | | | | | | | | | | `uses` | | | -| `evaluation/user-engine/consumer-workplan-brief` | | | | | | | | | | | | | | | | | | | | `part_of` | | | | | | | | | | | | | | | | | | | `uses` | | | | | | | | | | | | | | | | | | | | | | | | | | | | -| `evaluation/user-engine/interface-card-expectations` | | | | | | | | | | | | | | | | | | | | `part_of` | | | | | | | | | | | | | | | | | | | `uses` | | | | | | | | | | | | | | | | | | | | | | | | | `uses` | | | -| `evaluation/user-engine/questions` | | | | | | | | | | | | | | | | | | | | `part_of` | | | | | | | | | `uses` | | `uses` | | `uses` | | | | | `uses` | `uses` | `uses` | `uses` | | | | | | | | | | | | | | | | | | | | | | | | | | -| `evaluation/user-engine/small-saas-alignment` | | | | | | | | | | | | | | | | | | | | `part_of` | | | | | | | | | `uses` | | | | `uses` | | | | | `uses` | | | | | | `evaluates` | | | | | | | | | | | | | | | | | | | | | | | -| `example/consumer-purpose-portfolio` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `illustrates` | | | `illustrates` | | `uses` | | | | | | | | | | | | | | | | | | | | | | | -| `kernel/itc-core` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | -| `kernel/itc-kernel-map` | | | | | | | | | | | | | | | | | | | | | | | | | | `maps` | | | `maps` | | `maps` | `maps` | `maps` | `maps` | `maps` | `maps` | `maps` | `maps` | | `maps` | `maps` | | | | | | | | | | | | | | | | | | | | | | | `maps` | | `maps` | -| `mapping/purpose-demand-governance-candidates` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `maps` | | | | | | `maps` | | `uses` | | | | | | | | | | | | | | | | | | | | | | | | | | -| `model/access-control` | | | | | | | | | | | | | | | | | | | | | | | | | | `conforms_to` | | | | | | | `uses` | | | | | `uses` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | -| `model/capability` | `derived_from` | | | | | | `introduces` | `uses` | | | | | | | | | | | | | | | | | | `conforms_to` | | | | | | | `uses` | | `uses` | | `uses` | | `uses` | | | | | | | | | | | | | | | | | | | | | | | | | | | | -| `model/data` | | | | | | | | | | | | | | | | | | | | | | | | | | `conforms_to` | | | | | | | `uses` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | -| `model/devsecops` | | | | | | | | | | | | | | | | | | | | | | | | | | `conforms_to` | | | | | | | | | | | | | | `uses` | | | | | | | | | | | | | | | | | | | | | | | | | | | -| `model/governance` | | | | | | | | `introduces` | | | | | | | | | | | | | | | | | | `conforms_to` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | -| `model/information-space` | | | | | | | | | | | | | | | | | | | | | | | | | | `conforms_to` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | -| `model/landscape` | | | | | | | | | | | | | | | | | | | | | | | | | | `conforms_to` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | -| `model/network` | | | | | | | | | | | | | | | | | | | | | | | | | | `conforms_to` | | | | | | | | | | | | | | `uses` | | | | | | | | | | | | | | | | | | | | | | | | | | | -| `model/observability` | | | | | | | | | | | | | | | | | | | | | | | | | | `conforms_to` | | | | | | | | | | | | | | | `uses` | | | | | | | | | | | | | | | | | | | | | | | | | | -| `model/organization` | | | | | | | | | | | | | | | | | | | | | | | | | | `conforms_to` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | -| `model/purpose-demand-extension` | | | | | | | | | | | | | | `introduces` | | | | | | | | | | | | `conforms_to` | | | | | | | `extends` | `uses` | | | | | | | `uses` | | | | | | | | | | | | | | | | | | | | | | | | | | -| `model/security` | | | | | | | | | | | | | | | | | | | | | | | | | | `conforms_to` | | | `uses` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | -| `model/task` | | | | | | | | | | | | | | | | | | | | | | | | | | `conforms_to` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | -| `pattern/intent-scope-purposes` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `uses` | | | | | | `implements` | | `uses` | | | | | | | | | | | | | | | | | | | | | | | | | | -| `practice/intake-and-assimilation` | | | | | | | | | | | | | | | | | | | | | | | | | | `conforms_to` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | -| `profile/small-saas` | | | | | | | | | | | | | | | | | | | | | | | | | | `conforms_to` | | | `requires` | | `requires` | `requires` | `requires` | | `requires` | `requires` | `requires` | `requires` | | `requires` | `requires` | | | | | | | | | | | | | | | | | | | | | | | `requires` | | `requires` | -| `review-kit/alignment` | | `uses` | | | | | | | | | | | | | | | | | | | | | | | | `conforms_to` | | | | | | | `uses` | | | | | | `uses` | | `uses` | | | | | | | | | | | | | | | | | | | | | | | `uses` | | | -| `review-kit/alignment/model-selection-guide` | | `uses` | | | | | | | | | | | | | | | | | | | | | | | | | | | `uses` | | `uses` | `uses` | `uses` | | `uses` | `uses` | `uses` | `uses` | `uses` | `uses` | `uses` | | | `uses` | `part_of` | | | | | | | | | | | | | | | | | | | `uses` | | `uses` | -| `review-kit/alignment/schema` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `uses` | | | | | | | | `uses` | | | | `part_of` | | | | | | | | | | | | | | | | | | | | | | -| `review-kit/alignment/scorecard` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `uses` | | | | | | | | `uses` | | | | `part_of` | | | | | | | | | | | | | | | | | | | | | | -| `review-kit/alignment/workflow` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `uses` | | | | | | `uses` | | `uses` | | | | `part_of` | | | | | | | | | | | | | | | | | | | | | | -| `review-kit/alignment/workplan-template` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `uses` | | `uses` | | | | `part_of` | | | | | | | | | | | | | | | | | | | | | | -| `small-saas/control/namespace-per-tenant` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `uses` | | | | `instantiates` | | | | | | | | | | `evidenced_by` | | | | | | | | | | `uses` | | | -| `small-saas/dataset/subscription-ledger` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `uses` | | | | | | | | | | | | | `instantiates` | | | | | | | | | | | | `governed_by` | `owned_by` | | | | `partitioned_for` | `partitioned_for` | | | | | -| `small-saas/deployment/production` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `uses` | | | | `uses` | | | | | | | | `instantiates` | | | | | | | `implements` | | | | | | `deploys` | | | | `separates` | `separates` | | | | | -| `small-saas/evidence/access-review-2026-05` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `uses` | | | | | | | `instantiates` | | | | | | | | | | | | | | | | | | | | | | | -| `small-saas/incident/cross-tenant-access-attempt` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `uses` | | | | `instantiates` | | | | | | | `constrained_by` | | | `evidenced_by` | | | | | | | | | | | | | -| `small-saas/policy/tenant-isolation` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `uses` | | | | | | | | | | | `instantiates` | | | | | | | `requires` | | | `evidenced_by` | | | | | | | | | | | | | -| `small-saas/service/billing-portal` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `uses` | | | | | | | | | `instantiates` | | | | | | | | | | | | | | `part_of` | | `owned_by` | | | | | | | -| `small-saas/system/billing-system` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `uses` | | | | | | | | | `instantiates` | | | | | | | | | | | | | | | | | `serves` | `serves` | | | | | -| `small-saas/task/onboard-tenant` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `uses` | | | `instantiates` | | | | | | | | | | | | `governed_by` | | | | `owned_by` | `changes` | | | | | | -| `small-saas/team/platform` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `uses` | | | | | | `instantiates` | | | | | | | | | | | | | | | | | | | | | | | -| `small-saas/tenant/acme` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `uses` | | | | | | `instantiates` | | | | | | | `isolated_by` | | | | | | | | | | | | `represented_by` | | | | -| `small-saas/tenant/globex` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `uses` | | | | | | `instantiates` | | | | | | | `isolated_by` | | | | | | | | | | | | | | | | -| `small-saas/user/ada-admin` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `uses` | | | | | | | | | `uses` | | | | | | `instantiates` | | | | | | | | | | `access_evidenced_by` | | `has_access_under` | | | | `member_of` | | | | | | | -| `standard/caring` | | | | | | | | | | | | | | | | | | | | | | | | | | `conforms_to` | | | `imports` | | `imports` | `imports` | `imports` | | | `imports` | `imports` | `imports` | | `imports` | `imports` | | | | | | | | | | | | | | | | | | | | | | | | | `imports` | -| `standard/repository-layout` | | | | | | | | | | | | | | | | | | | | | | | | | | `conforms_to` | | | | | | | `imports` | `imports` | | | | | | | `imports` | | | | | | | | | | | | | | | | | | | | | | | | | | -| `standard/tagging` | | | | | | | | | | | | | | | | | | | | | | | | | | `conforms_to` | | | | | | | | | | | | | | | `imports` | | | | | | | | | | | | | | | | | | | | | | | | | | +| Artifact | `assimilation/it-capability-canon` | `benchmark/caring/kubernetes-rbac` | `benchmark/caring/kubernetes-rbac/access-descriptors` | `benchmark/caring/kubernetes-rbac/caring-mapping` | `benchmark/caring/kubernetes-rbac/findings` | `benchmark/caring/kubernetes-rbac/native-concepts` | `capability-catalog/itc-cap` | `catalog/attribute-value-types` | `catalog/evidence-basis` | `comparison/repo-scoping/canon-benefit-analysis` | `comparison/repo-scoping/consumer-workplan-brief` | `comparison/repo-scoping/extension-candidates` | `comparison/repo-scoping/frame` | `comparison/repo-scoping/report` | `concept-catalog/purpose-demand` | `conformance/railiance-fabric` | `conformance/railiance-fabric/consumer-workplan-brief` | `conformance/railiance-fabric/entity-edge-capture-criteria` | `conformance/railiance-fabric/mapping-expectations` | `conformance/railiance-fabric/visualization-examples` | `evaluation/user-engine` | `evaluation/user-engine/consumer-workplan-brief` | `evaluation/user-engine/interface-card-expectations` | `evaluation/user-engine/questions` | `evaluation/user-engine/small-saas-alignment` | `example/consumer-purpose-portfolio` | `kernel/itc-core` | `kernel/itc-kernel-map` | `mapping/capability-anchors` | `mapping/purpose-demand-governance-candidates` | `model/access-control` | `model/capability` | `model/data` | `model/devsecops` | `model/governance` | `model/information-space` | `model/landscape` | `model/network` | `model/observability` | `model/organization` | `model/purpose-demand-extension` | `model/security` | `model/task` | `pattern/intent-scope-purposes` | `practice/intake-and-assimilation` | `profile/small-saas` | `review-kit/alignment` | `review-kit/alignment/model-selection-guide` | `review-kit/alignment/schema` | `review-kit/alignment/scorecard` | `review-kit/alignment/workflow` | `review-kit/alignment/workplan-template` | `small-saas/control/namespace-per-tenant` | `small-saas/dataset/subscription-ledger` | `small-saas/deployment/production` | `small-saas/evidence/access-review-2026-05` | `small-saas/incident/cross-tenant-access-attempt` | `small-saas/policy/tenant-isolation` | `small-saas/service/billing-portal` | `small-saas/system/billing-system` | `small-saas/task/onboard-tenant` | `small-saas/team/platform` | `small-saas/tenant/acme` | `small-saas/tenant/globex` | `small-saas/user/ada-admin` | `standard/caring` | `standard/repository-layout` | `standard/tagging` | +| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | +| `assimilation/it-capability-canon` | | | | | | | | | | | | | | | | | | | | | | | | | | | `conforms_to` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +| `benchmark/caring/kubernetes-rbac` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `stress_tests` | | | `stress_tests` | `stress_tests` | | | `stress_tests` | `stress_tests` | | | `stress_tests` | | | | | | | | | | | | | | | | | | | | | | | | `conforms_to` | | `uses` | +| `benchmark/caring/kubernetes-rbac/access-descriptors` | | `part_of` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `uses` | | | `uses` | | | | | | | | `uses` | | | | | | | | | | | | | | | | | | | | | | | | `uses` | | | +| `benchmark/caring/kubernetes-rbac/caring-mapping` | | `part_of` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `maps` | | | | `maps` | | | | | | | `maps` | | | | | | | | | | | | | | | | | | | | | | | | `maps` | | | +| `benchmark/caring/kubernetes-rbac/findings` | | `part_of` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `proposes` | | | | | | | `proposes` | | | | | | | | | | | | | | | | | | | | | | | | `proposes` | | | +| `benchmark/caring/kubernetes-rbac/native-concepts` | | `part_of` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `maps` | | | | | | `maps` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `maps` | | | +| `capability-catalog/itc-cap` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +| `catalog/attribute-value-types` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +| `catalog/evidence-basis` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +| `comparison/repo-scoping/canon-benefit-analysis` | | | | | | | | | | | | | | `part_of` | | | | | | | | | | | | | | | | | | | | | `maps` | `maps` | | | | | `maps` | | `maps` | | | | | | | | | | | | | | | | | | | | | | | | | `maps` | +| `comparison/repo-scoping/consumer-workplan-brief` | | | | | | | | | | | | | | `part_of` | | | | | | | | | | | | | | | | | | | | | | | | | | | `uses` | | | | | | | | | | | | | | | | | | | | | | | | | | | | +| `comparison/repo-scoping/extension-candidates` | | | | | | | | | | | | | | `part_of` | | | | | | | | | | | | | | | | | | | | | `proposes` | `proposes` | | | | | `proposes` | | `proposes` | | | | | | | | | | | | | | | | | | | | | | | | | | +| `comparison/repo-scoping/frame` | | | | | | | | | | | | | | `part_of` | | | | | | | | | | | | | | | | | | | | | `uses` | | | | | | `uses` | | `uses` | | | | | | | | | | | | | | | | | | | | | | | | | | +| `comparison/repo-scoping/report` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `uses` | `uses` | | | | | `compares` | | `uses` | `uses` | | | | | | | | | | | | | | | | | | | | | | | | | +| `concept-catalog/purpose-demand` | | | | | | | | | | | | | | | | | | | | | | | | | | | `conforms_to` | | | | | | | | `uses` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +| `conformance/railiance-fabric` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `uses` | `uses` | `uses` | | `uses` | `uses` | `uses` | | `uses` | `uses` | `uses` | | | | | | | | | | | | | | | | | | | | | | | | | `uses` | +| `conformance/railiance-fabric/consumer-workplan-brief` | | | | | | | | | | | | | | | | `part_of` | | | | | | | | | | | | | | | | | | | | | | | | | `uses` | | | | | | | | | | | | | | | | | | | | | | | | | | | | +| `conformance/railiance-fabric/entity-edge-capture-criteria` | | | | | | | | | | | | | | | | `part_of` | | | | | | | | | | | | | | | | | `uses` | `uses` | `uses` | | `uses` | `uses` | `uses` | | `uses` | `uses` | `uses` | | | | | | | | | | | | | | | | | | | | | | | | | | +| `conformance/railiance-fabric/mapping-expectations` | | | | | | | | | | | | | | | | `part_of` | | | | | | | | | | | | | | | | | `maps` | `maps` | `maps` | | `maps` | `maps` | `maps` | | `maps` | `maps` | | | | | | | | | | | | | | | | | | | | | | | | | | | +| `conformance/railiance-fabric/visualization-examples` | | | | | | | | | | | | | | | | `part_of` | | `illustrates` | `illustrates` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +| `evaluation/user-engine` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `uses` | | `uses` | | `uses` | | | | | `uses` | `uses` | `uses` | `uses` | | | `evaluates` | | | | | | | | | | | | | | | | | | | | `uses` | | | +| `evaluation/user-engine/consumer-workplan-brief` | | | | | | | | | | | | | | | | | | | | | `part_of` | | | | | | | | | | | | | | | | | | | | `uses` | | | | | | | | | | | | | | | | | | | | | | | | | | | | +| `evaluation/user-engine/interface-card-expectations` | | | | | | | | | | | | | | | | | | | | | `part_of` | | | | | | | | | | | | | | | | | | | | `uses` | | | | | | | | | | | | | | | | | | | | | | | | | `uses` | | | +| `evaluation/user-engine/questions` | | | | | | | | | | | | | | | | | | | | | `part_of` | | | | | | | | | | `uses` | | `uses` | | `uses` | | | | | `uses` | `uses` | `uses` | `uses` | | | | | | | | | | | | | | | | | | | | | | | | | | +| `evaluation/user-engine/small-saas-alignment` | | | | | | | | | | | | | | | | | | | | | `part_of` | | | | | | | | | | `uses` | | | | `uses` | | | | | `uses` | | | | | | `evaluates` | | | | | | | | | | | | | | | | | | | | | | | +| `example/consumer-purpose-portfolio` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `illustrates` | | | `illustrates` | | `uses` | | | | | | | | | | | | | | | | | | | | | | | +| `kernel/itc-core` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +| `kernel/itc-kernel-map` | | | | | | | | | | | | | | | | | | | | | | | | | | | `maps` | | | | `maps` | `maps` | `maps` | `maps` | `maps` | `maps` | `maps` | `maps` | `maps` | `maps` | | `maps` | `maps` | | | | | | | | | | | | | | | | | | | | | | | `maps` | | `maps` | +| `mapping/capability-anchors` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +| `mapping/purpose-demand-governance-candidates` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `maps` | | | | | | `maps` | | `uses` | | | | | | | | | | | | | | | | | | | | | | | | | | +| `model/access-control` | | | | | | | | | | | | | | | | | | | | | | | | | | | `conforms_to` | | | | | | | | `uses` | | | | | `uses` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +| `model/capability` | `derived_from` | | | | | | `introduces` | | `uses` | | | | | | | | | | | | | | | | | | `conforms_to` | | `introduces` | | | | | | `uses` | | `uses` | | `uses` | | `uses` | | | | | | | | | | | | | | | | | | | | | | | | | | | | +| `model/data` | | | | | | | | `introduces` | | | | | | | | | | | | | | | | | | | `conforms_to` | | | | | | | | `uses` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +| `model/devsecops` | | | | | | | | | | | | | | | | | | | | | | | | | | | `conforms_to` | | | | | | | | | | | | | | | `uses` | | | | | | | | | | | | | | | | | | | | | | | | | | | +| `model/governance` | | | | | | | | | `introduces` | | | | | | | | | | | | | | | | | | `conforms_to` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +| `model/information-space` | | | | | | | | | | | | | | | | | | | | | | | | | | | `conforms_to` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +| `model/landscape` | | | | | | | | | | | | | | | | | | | | | | | | | | | `conforms_to` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +| `model/network` | | | | | | | | | | | | | | | | | | | | | | | | | | | `conforms_to` | | | | | | | | | | | | | | | `uses` | | | | | | | | | | | | | | | | | | | | | | | | | | | +| `model/observability` | | | | | | | | | | | | | | | | | | | | | | | | | | | `conforms_to` | | | | | | | | | | | | | | | | `uses` | | | | | | | | | | | | | | | | | | | | | | | | | | +| `model/organization` | | | | | | | | | | | | | | | | | | | | | | | | | | | `conforms_to` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +| `model/purpose-demand-extension` | | | | | | | | | | | | | | | `introduces` | | | | | | | | | | | | `conforms_to` | | | | | | | | `extends` | `uses` | | | | | | | `uses` | | | | | | | | | | | | | | | | | | | | | | | | | | +| `model/security` | | | | | | | | | | | | | | | | | | | | | | | | | | | `conforms_to` | | | | `uses` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +| `model/task` | | | | | | | | | | | | | | | | | | | | | | | | | | | `conforms_to` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +| `pattern/intent-scope-purposes` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `uses` | | | | | | `implements` | | `uses` | | | | | | | | | | | | | | | | | | | | | | | | | | +| `practice/intake-and-assimilation` | | | | | | | | | | | | | | | | | | | | | | | | | | | `conforms_to` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +| `profile/small-saas` | | | | | | | | | | | | | | | | | | | | | | | | | | | `conforms_to` | | | | `requires` | | `requires` | `requires` | `requires` | | `requires` | `requires` | `requires` | `requires` | | `requires` | `requires` | | | | | | | | | | | | | | | | | | | | | | | `requires` | | `requires` | +| `review-kit/alignment` | | `uses` | | | | | | | | | | | | | | | | | | | | | | | | | `conforms_to` | | | | | | | | `uses` | | | | | | `uses` | | `uses` | | | | | | | | | | | | | | | | | | | | | | | `uses` | | | +| `review-kit/alignment/model-selection-guide` | | `uses` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `uses` | | `uses` | `uses` | `uses` | | `uses` | `uses` | `uses` | `uses` | `uses` | `uses` | `uses` | | | `uses` | `part_of` | | | | | | | | | | | | | | | | | | | `uses` | | `uses` | +| `review-kit/alignment/schema` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `uses` | | | | | | | | `uses` | | | | `part_of` | | | | | | | | | | | | | | | | | | | | | | +| `review-kit/alignment/scorecard` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `uses` | | | | | | | | `uses` | | | | `part_of` | | | | | | | | | | | | | | | | | | | | | | +| `review-kit/alignment/workflow` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `uses` | | | | | | `uses` | | `uses` | | | | `part_of` | | | | | | | | | | | | | | | | | | | | | | +| `review-kit/alignment/workplan-template` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `uses` | | `uses` | | | | `part_of` | | | | | | | | | | | | | | | | | | | | | | +| `small-saas/control/namespace-per-tenant` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `uses` | | | | `instantiates` | | | | | | | | | | `evidenced_by` | | | | | | | | | | `uses` | | | +| `small-saas/dataset/subscription-ledger` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `uses` | | | | | | | | | | | | | `instantiates` | | | | | | | | | | | | `governed_by` | `owned_by` | | | | `partitioned_for` | `partitioned_for` | | | | | +| `small-saas/deployment/production` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `uses` | | | | `uses` | | | | | | | | `instantiates` | | | | | | | `implements` | | | | | | `deploys` | | | | `separates` | `separates` | | | | | +| `small-saas/evidence/access-review-2026-05` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `uses` | | | | | | | `instantiates` | | | | | | | | | | | | | | | | | | | | | | | +| `small-saas/incident/cross-tenant-access-attempt` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `uses` | | | | `instantiates` | | | | | | | `constrained_by` | | | `evidenced_by` | | | | | | | | | | | | | +| `small-saas/policy/tenant-isolation` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `uses` | | | | | | | | | | | `instantiates` | | | | | | | `requires` | | | `evidenced_by` | | | | | | | | | | | | | +| `small-saas/service/billing-portal` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `uses` | | | | | | | | | `instantiates` | | | | | | | | | | | | | | `part_of` | | `owned_by` | | | | | | | +| `small-saas/system/billing-system` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `uses` | | | | | | | | | `instantiates` | | | | | | | | | | | | | | | | | `serves` | `serves` | | | | | +| `small-saas/task/onboard-tenant` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `uses` | | | `instantiates` | | | | | | | | | | | | `governed_by` | | | | `owned_by` | `changes` | | | | | | +| `small-saas/team/platform` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `uses` | | | | | | `instantiates` | | | | | | | | | | | | | | | | | | | | | | | +| `small-saas/tenant/acme` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `uses` | | | | | | `instantiates` | | | | | | | `isolated_by` | | | | | | | | | | | | `represented_by` | | | | +| `small-saas/tenant/globex` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `uses` | | | | | | `instantiates` | | | | | | | `isolated_by` | | | | | | | | | | | | | | | | +| `small-saas/user/ada-admin` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `uses` | | | | | | | | | `uses` | | | | | | `instantiates` | | | | | | | | | | `access_evidenced_by` | | `has_access_under` | | | | `member_of` | | | | | | | +| `standard/caring` | | | | | | | | | | | | | | | | | | | | | | | | | | | `conforms_to` | | | | `imports` | | `imports` | `imports` | `imports` | | | `imports` | `imports` | `imports` | | `imports` | `imports` | | | | | | | | | | | | | | | | | | | | | | | | | `imports` | +| `standard/repository-layout` | | | | | | | | | | | | | | | | | | | | | | | | | | | `conforms_to` | | | | | | | | `imports` | `imports` | | | | | | | `imports` | | | | | | | | | | | | | | | | | | | | | | | | | | +| `standard/tagging` | | | | | | | | | | | | | | | | | | | | | | | | | | | `conforms_to` | | | | | | | | | | | | | | | | `imports` | | | | | | | | | | | | | | | | | | | | | | | | | | diff --git a/infospace/views/kernel-overview.md b/infospace/views/kernel-overview.md index 5f05492..d913f17 100644 --- a/infospace/views/kernel-overview.md +++ b/infospace/views/kernel-overview.md @@ -3,7 +3,7 @@ # Kernel Overview - Infospace: `canon` -- Artifacts: 66 +- Artifacts: 68 ## Artifact Kinds @@ -21,7 +21,7 @@ - `caring-mapping`: 1 - `comparison-frame`: 1 - `comparison-report`: 1 -- `concept-catalog`: 2 +- `concept-catalog`: 3 - `conformance-pack`: 1 - `consumer-workplan-brief`: 3 - `consumer-workplan-template`: 1 @@ -31,7 +31,7 @@ - `extension-candidate-set`: 1 - `interface-card-expectation`: 1 - `kernel`: 2 -- `mapping`: 1 +- `mapping`: 2 - `mapping-expectation`: 1 - `model`: 12 - `model-extension`: 1 @@ -63,9 +63,9 @@ - `implements`: 2 - `imports`: 14 - `instantiates`: 13 -- `introduces`: 3 +- `introduces`: 5 - `isolated_by`: 2 -- `maps`: 36 +- `maps`: 37 - `member_of`: 1 - `owned_by`: 3 - `part_of`: 22 diff --git a/src/info_tech_canon/api.py b/src/info_tech_canon/api.py index 113921d..9aec48b 100644 --- a/src/info_tech_canon/api.py +++ b/src/info_tech_canon/api.py @@ -20,6 +20,7 @@ from .service import ( profile_inspect, profile_validate, read_view, + review_capability_record, review_kit, validate_canon, ) @@ -108,6 +109,18 @@ def _route( profile = path.removeprefix("/profiles/").removesuffix("/validate").strip("/") payload = profile_validate(profile, root) return (HTTPStatus.OK if payload["ok"] else HTTPStatus.BAD_REQUEST), payload + if path == "/capability-review": + record = _first(query, "path") + if not record: + return HTTPStatus.BAD_REQUEST, { + "ok": False, + "error": { + "code": "missing_path", + "message": "Query parameter path= is required", + "details": {}, + }, + } + return HTTPStatus.OK, review_capability_record(record, root) if path.startswith("/profiles/") and path.endswith("/graph"): profile = path.removeprefix("/profiles/").removesuffix("/graph").strip("/") graph_format = _first(query, "format") or "json" diff --git a/src/info_tech_canon/capability.py b/src/info_tech_canon/capability.py new file mode 100644 index 0000000..1b67738 --- /dev/null +++ b/src/info_tech_canon/capability.py @@ -0,0 +1,320 @@ +"""Live-catalog checks for capability contracts and consumer records.""" + +from __future__ import annotations + +from pathlib import Path +from typing import Any + +import yaml + +REPO_ROOT = Path(__file__).resolve().parents[2] +CATALOG_PATH = REPO_ROOT / "infospace" / "models" / "capability" / "capabilities.yaml" + + +class CapabilityReviewError(ValueError): + def __init__(self, code: str, message: str): + super().__init__(message) + self.code = code + self.message = message +PREDICATES = frozenset({"not_in", "in", "equals", "lte", "gte"}) +EVIDENCE_BASES = frozenset( + { + "invoiced", + "measured", + "quoted", + "derived", + "projected", + "estimated", + "assumed", + "unknown", + } +) +MATURITY_ORDER = tuple(f"D{i}" for i in range(8)) + + +def load_catalog(path: Path | None = None) -> dict[str, Any]: + catalog_path = path or CATALOG_PATH + if not catalog_path.is_file(): + raise CapabilityReviewError( + "capability_catalog_missing", + f"ITC-CAP catalog not found at {catalog_path}", + ) + payload = yaml.safe_load(catalog_path.read_text()) + capabilities = { + cap["id"]: cap + for domain in payload.get("domains") or [] + for cap in domain.get("capabilities") or [] + } + return { + "version": (payload.get("canon") or {}).get("version"), + "canon_version": (payload.get("canon") or {}).get("canon_version"), + "capabilities": capabilities, + "resource_classes": { + item["id"]: item for item in payload.get("resource_classes") or [] + }, + "maturity_levels": { + item["id"] if isinstance(item, dict) else item + for item in payload.get("maturity_levels") or [] + }, + "source": str(catalog_path), + "raw": payload, + } + + +def check_catalog_contract(catalog: dict[str, Any] | None = None) -> list[dict[str, Any]]: + """Structural contract for capabilities.yaml (CAP-R3, CAP-R8).""" + loaded = catalog or load_catalog() + raw = loaded["raw"] + errors: list[dict[str, Any]] = [] + + if "typical_resource_classes" in yaml.dump(raw.get("domains") or []): + errors.append( + { + "code": "capability_typical_resource_classes_forbidden", + "path": "capabilities.yaml", + } + ) + + for item in raw.get("resource_classes") or []: + for field in ("native_unit", "supply", "capacity_behaviour"): + if not item.get(field): + errors.append( + { + "code": "capability_resource_class_incomplete", + "class": item.get("id"), + "field": field, + } + ) + + seen: set[str] = set() + for cap_id, cap in loaded["capabilities"].items(): + if cap_id in seen: + errors.append({"code": "capability_duplicate_id", "id": cap_id}) + seen.add(cap_id) + if cap.get("typical_resource_classes"): + errors.append( + { + "code": "capability_typical_resource_classes_forbidden", + "id": cap_id, + } + ) + if not cap.get("anchors") and not cap.get("anchor_note"): + errors.append( + { + "code": "capability_missing_anchor", + "id": cap_id, + } + ) + for other in cap.get("depends_on") or []: + if other not in loaded["capabilities"]: + errors.append( + { + "code": "capability_unknown_depends_on", + "id": cap_id, + "depends_on": other, + } + ) + for other in cap.get("may_use") or []: + if other not in loaded["capabilities"]: + errors.append( + { + "code": "capability_unknown_may_use", + "id": cap_id, + "may_use": other, + } + ) + return errors + + +def _validate_requirement(requirement: dict[str, Any], canon: dict[str, Any]) -> None: + cap_id = requirement["capability"] + capability = canon["capabilities"].get(cap_id) + if capability is None: + raise CapabilityReviewError("unknown_capability", f"unknown capability {cap_id}") + profile = requirement.get("profile") + if profile and profile not in (capability.get("profiles") or []): + raise CapabilityReviewError( + "unknown_profile", + f"{cap_id} does not declare profile {profile!r}", + ) + maturity = requirement.get("minimum_maturity") + if maturity and maturity not in canon["maturity_levels"]: + raise CapabilityReviewError( + "unknown_maturity", + f"unknown maturity level {maturity!r}", + ) + dimensions = set(capability.get("quality_dimensions") or []) + for key in requirement.get("targets") or {}: + if key not in dimensions: + raise CapabilityReviewError( + "unknown_quality_dimension", + f"{cap_id} does not declare quality dimension {key!r}", + ) + for constraint in requirement.get("constraints") or []: + if constraint.get("dimension") not in dimensions: + raise CapabilityReviewError( + "unknown_quality_dimension", + f"{cap_id} does not declare quality dimension {constraint.get('dimension')!r}", + ) + if constraint.get("predicate") not in PREDICATES: + raise CapabilityReviewError( + "unknown_predicate", + f"predicate {constraint.get('predicate')!r} is not in the closed set", + ) + + +def _validate_provision(provision: dict[str, Any], canon: dict[str, Any]) -> None: + cap_id = provision["capability"] + capability = canon["capabilities"].get(cap_id) + if capability is None: + raise CapabilityReviewError("unknown_capability", f"unknown capability {cap_id}") + if provision.get("maturity") not in canon["maturity_levels"]: + raise CapabilityReviewError( + "unknown_maturity", + f"unknown maturity level {provision.get('maturity')!r}", + ) + profile = provision.get("profile") + if profile and profile not in (capability.get("profiles") or []): + raise CapabilityReviewError( + "unknown_profile", + f"{cap_id} does not declare profile {profile!r}", + ) + hooks = set(capability.get("evidence_hooks") or []) + for item in provision.get("evidence") or []: + if item.get("hook") not in hooks: + raise CapabilityReviewError( + "unknown_evidence_hook", + f"{cap_id} does not declare evidence hook {item.get('hook')!r}", + ) + catalog_depends = set(capability.get("depends_on") or []) + catalog_may_use = set(capability.get("may_use") or []) + for use in provision.get("uses_provisions") or []: + relation = use.get("relation") + other = use.get("capability") + if relation not in {"depends_on", "may_use"}: + raise CapabilityReviewError( + "unknown_provision_relation", + f"relation must be depends_on or may_use, got {relation!r}", + ) + if other not in canon["capabilities"]: + raise CapabilityReviewError( + "unknown_capability", + f"uses_provisions names unknown capability {other}", + ) + if relation == "depends_on" and other not in catalog_depends: + raise CapabilityReviewError( + "uses_provisions_not_in_catalog", + f"{cap_id} depends_on {other} is not declared in the catalog", + ) + if relation == "may_use" and other not in catalog_may_use: + # SHOULD, not MUST — recorded as a warning-shaped error code the + # reviewer can see without failing the join. + pass + seen: set[str] = set() + for row in provision.get("consumes") or []: + klass = row.get("class") + if klass not in canon["resource_classes"]: + raise CapabilityReviewError( + "unknown_resource_class", + f"unknown resource class {klass!r}", + ) + if klass in seen: + raise CapabilityReviewError( + "duplicate_consumption_class", + f"duplicate consumption row for class {klass}", + ) + seen.add(klass) + declared = canon["resource_classes"][klass] + unit = (row.get("quantity") or {}).get("unit") + if unit and unit != declared.get("native_unit"): + raise CapabilityReviewError( + "native_unit_mismatch", + f"class {klass} native unit is {declared.get('native_unit')!r}, got {unit!r}", + ) + basis = row.get("basis") + if basis not in EVIDENCE_BASES: + raise CapabilityReviewError( + "unknown_evidence_basis", + f"unknown evidence basis {basis!r}", + ) + value = (row.get("quantity") or {}).get("value") + if basis == "unknown": + if value is not None: + raise CapabilityReviewError( + "unknown_must_not_carry_quantity", + f"class {klass} has basis unknown but carries a quantity", + ) + if not row.get("gap"): + raise CapabilityReviewError( + "unknown_must_name_gap", + f"class {klass} is unknown and must name the gap", + ) + elif value is None: + raise CapabilityReviewError( + "known_basis_requires_quantity", + f"class {klass} basis {basis} must carry a quantity", + ) + + +def review_record(record: dict[str, Any], canon: dict[str, Any] | None = None) -> dict[str, Any]: + loaded = canon or load_catalog() + for requirement in record.get("requires") or []: + _validate_requirement(requirement, loaded) + for provision in record.get("provisions") or []: + _validate_provision(provision, loaded) + + provisions = {item["capability"]: item for item in record.get("provisions") or []} + levels = list(MATURITY_ORDER) + met = [] + for requirement in record.get("requires") or []: + provision = provisions.get(requirement["capability"]) + wanted = requirement.get("minimum_maturity") + if provision is None: + met.append( + {"capability": requirement["capability"], "status": "unprovided"} + ) + continue + provided = provision.get("maturity") + satisfied = ( + levels.index(provided) >= levels.index(wanted) + if wanted and provided in levels and wanted in levels + else True + ) + met.append( + { + "capability": requirement["capability"], + "required": wanted, + "provided": provided, + "status": "met" if satisfied else "below_requirement", + } + ) + return { + "ok": True, + "record_id": record.get("record_id"), + "canon": { + "version": loaded["version"], + "canon_version": loaded["canon_version"], + "source": loaded["source"], + }, + "requirements": met, + "provisions": [ + { + "capability": item["capability"], + "maturity": item.get("maturity"), + "uses_provisions": item.get("uses_provisions") or [], + } + for item in record.get("provisions") or [] + ], + } + + +def review_path(path: str | Path, catalog_path: Path | None = None) -> dict[str, Any]: + record_path = Path(path) + if not record_path.is_file(): + raise CapabilityReviewError( + "capability_record_missing", + f"capability record not found: {record_path}", + ) + text = record_path.read_text() + record = yaml.safe_load(text) if record_path.suffix in {".yaml", ".yml"} else __import__("json").loads(text) + return review_record(record, load_catalog(catalog_path)) diff --git a/src/info_tech_canon/cli.py b/src/info_tech_canon/cli.py index 5f03a04..5858fcf 100644 --- a/src/info_tech_canon/cli.py +++ b/src/info_tech_canon/cli.py @@ -24,6 +24,7 @@ from .service import ( profile_inspect, profile_validate, read_view, + review_capability_record, review_kit, validate_canon, write_validation_report, @@ -105,6 +106,13 @@ def build_parser() -> argparse.ArgumentParser: profile_graph_cmd.add_argument("--format", choices=["json", "mermaid"], default="json") profile_graph_cmd.set_defaults(handler=_profile_graph) + capability_review = sub.add_parser( + "capability-review", + help="Review a consumer capability record against the live catalog", + ) + capability_review.add_argument("record") + capability_review.set_defaults(handler=_capability_review) + api = sub.add_parser("api", help="Run the read-only local API") api.add_argument("--host", default="127.0.0.1") api.add_argument("--port", type=int, default=8765) @@ -195,6 +203,10 @@ def _graph(args: argparse.Namespace) -> dict[str, Any]: return artifact_graph(_root(args), output_format=args.format) +def _capability_review(args: argparse.Namespace) -> dict[str, Any]: + return review_capability_record(args.record, _root(args)) + + def _profile_inspect(args: argparse.Namespace) -> dict[str, Any]: return profile_inspect(args.profile, _root(args)) diff --git a/src/info_tech_canon/service.py b/src/info_tech_canon/service.py index 25ac541..afc44e7 100644 --- a/src/info_tech_canon/service.py +++ b/src/info_tech_canon/service.py @@ -328,6 +328,18 @@ def profile_graph( ) from exc +def review_capability_record( + path: str | Path, + root: Path | str | None = None, +) -> dict[str, Any]: + from .capability import CapabilityReviewError, review_path + + try: + return review_path(path) + except CapabilityReviewError as exc: + raise CanonServiceError(exc.code, exc.message) from exc + + def generate_indexes(root: Path | str | None = None) -> dict[str, Any]: return generation.generate_indexes(load_context(root)) diff --git a/src/info_tech_canon/validation.py b/src/info_tech_canon/validation.py index 7d1bab1..7ba760c 100644 --- a/src/info_tech_canon/validation.py +++ b/src/info_tech_canon/validation.py @@ -51,6 +51,9 @@ REQUIRED_SCHEMAS = ( "agent-brief.schema.yaml", "workplan.schema.yaml", "alignment-review.schema.yaml", + "capability.schema.yaml", + "capability-record.schema.yaml", + "attribute-value-type.schema.yaml", ) RETRIEVAL_BRIEF_KINDS = { @@ -353,6 +356,7 @@ def structural_checks(context: Any) -> dict[str, list[dict[str, Any]]]: _check_required_top_level_files(context.repo_root, errors) _check_required_infospace_dirs(context.infospace_root, errors) _check_required_schemas(context.infospace_root, errors) + _check_capability_catalog(errors) _check_canon_paths(context.repo_root, context.infospace_root, errors) _check_artifact_index(context.repo_root, context.infospace_root, errors) _check_agent_assets(context.infospace_root, context.infospace.artifacts, errors) @@ -415,6 +419,20 @@ def _check_required_infospace_dirs( ) +def _check_capability_catalog(errors: list[dict[str, Any]]) -> None: + from .capability import check_catalog_contract + + try: + errors.extend(check_catalog_contract()) + except Exception as exc: # pragma: no cover - catalog missing is structural + errors.append( + { + "code": "capability_catalog_unreadable", + "message": str(exc), + } + ) + + def _check_required_schemas( infospace_root: Path, errors: list[dict[str, Any]], diff --git a/tests/test_cli.py b/tests/test_cli.py index 690e913..0f1eeb9 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -11,7 +11,7 @@ def test_cli_inspect_emits_json(capsys) -> None: assert exit_code == 0 payload = json.loads(capsys.readouterr().out) assert payload["ok"] is True - assert payload["infospace"]["artifact_count"] == 66 + assert payload["infospace"]["artifact_count"] == 68 def test_cli_missing_profile_uses_structured_error(capsys) -> None: diff --git a/tests/test_service.py b/tests/test_service.py index d2fb273..d67289c 100644 --- a/tests/test_service.py +++ b/tests/test_service.py @@ -9,10 +9,13 @@ from info_tech_canon.service import ( list_standards, profile_graph, profile_validate, + review_capability_record, review_kit, validate_canon, ) from info_tech_canon.service import DEFAULT_INFOSPACE_ROOT +from pathlib import Path +import json import shutil @@ -21,7 +24,7 @@ def test_inspect_canon_counts_artifact_kinds() -> None: assert payload["ok"] is True assert payload["infospace"]["slug"] == "canon" - assert payload["infospace"]["artifact_count"] == 66 + assert payload["infospace"]["artifact_count"] == 68 assert payload["infospace"]["kinds"] == { "access-descriptor-set": 1, "alignment-review-kit": 1, @@ -37,7 +40,7 @@ def test_inspect_canon_counts_artifact_kinds() -> None: "caring-mapping": 1, "comparison-frame": 1, "comparison-report": 1, - "concept-catalog": 2, + "concept-catalog": 3, "conformance-pack": 1, "consumer-workplan-brief": 3, "consumer-workplan-template": 1, @@ -47,7 +50,7 @@ def test_inspect_canon_counts_artifact_kinds() -> None: "extension-candidate-set": 1, "interface-card-expectation": 1, "kernel": 2, - "mapping": 1, + "mapping": 2, "mapping-expectation": 1, "model": 12, "model-extension": 1, @@ -93,17 +96,58 @@ def test_validate_canon_passes_scaffold() -> None: assert payload["ok"] is True assert payload["errors"] == [] assert "warnings" in payload - assert payload["details"]["artifact_count"] == 66 + assert payload["details"]["artifact_count"] == 68 def test_graph_exports_relationship_summary() -> None: payload = artifact_graph() assert payload["ok"] is True - assert payload["graph"]["node_count"] == 66 + assert payload["graph"]["node_count"] == 68 assert payload["graph"]["edge_count"] > 15 +def test_capability_review_joins_a_minimal_record(tmp_path) -> None: + record = { + "record_id": "test", + "requires": [ + { + "capability": "data.backup", + "profile": "database", + "minimum_maturity": "D5", + } + ], + "provisions": [ + { + "provider": "test.backup", + "capability": "data.backup", + "profile": "database", + "maturity": "D4", + "uses_provisions": [ + { + "capability": "data.object", + "provider": "test.object", + "relation": "depends_on", + } + ], + "consumes": [ + { + "class": "H", + "quantity": {"value": None, "unit": "hour"}, + "basis": "unknown", + "gap": "not recorded (owner: test)", + } + ], + } + ], + } + path = tmp_path / "case.json" + path.write_text(json.dumps(record)) + payload = review_capability_record(path) + assert payload["ok"] is True + assert payload["requirements"][0]["status"] == "below_requirement" + + def test_small_saas_profile_validates() -> None: payload = profile_validate("small-saas") diff --git a/workplans/ITC-WP-0013-attribute-value-type-catalog.md b/workplans/ITC-WP-0013-attribute-value-type-catalog.md index c20d509..f635227 100644 --- a/workplans/ITC-WP-0013-attribute-value-type-catalog.md +++ b/workplans/ITC-WP-0013-attribute-value-type-catalog.md @@ -4,17 +4,17 @@ type: workplan title: "Attribute Value Type catalog (Data Model extension)" domain: infotech repo: info-tech-canon -status: proposed +status: finished priority: high created: "2026-07-30" -updated: "2026-07-30" +updated: "2026-08-15" depends_on_workplans: - ITC-WP-0006 -owner: codex +owner: grok spec_refs: - demand/AttributeValueTypes.md - - seeds/InfoTechCanonDataModel_RC1_seed.md - - ../citation-evidence/wiki/AttributeValueTypes-proposal.md + - infospace/models/data/InfoTechCanonDataModel.md + - infospace/models/data/attribute-value-types.yaml state_hub_workstream_id: "7da01c6a-8c16-4d65-899a-85464fbb2227" --- @@ -24,15 +24,15 @@ state_hub_workstream_id: "7da01c6a-8c16-4d65-899a-85464fbb2227" Turn the demand in `demand/AttributeValueTypes.md` into a **canonical, machine-readable catalog of attribute value types** under the Data Model -(or a tightly coupled standard), so consumers such as citation-evidence share -stable type ids, encodings, and CodeList cardinality rules. +so consumers such as citation-evidence share stable type ids, encodings, +and CodeList cardinality rules. ## Intent ITC-DATA already owns Attribute / Field / DataType / Representation / CodeList -but does not close the set of practical value types for structured capture. -This workplan fills that gap without inventing a parallel “form field” -universe. +but did not close the set of practical value types for structured capture. +This workplan fills that gap without inventing a parallel form-field universe. +Owner is ITC-DATA, not a sibling standard. ## Tasks @@ -40,58 +40,61 @@ universe. ```task id: ITC-WP-0013-T01 -status: todo +status: done priority: high state_hub_task_id: "d865f73c-7ff0-4b9c-9905-678ce3da964a" ``` -Process `demand/AttributeValueTypes.md` under Purpose/Demand (ITC-WP-0006) -if still required for kernel-adjacent standards; record decision to extend -ITC-DATA vs new sibling standard. +Process `demand/AttributeValueTypes.md`. Decision: extend ITC-DATA (new +`AttributeValueType` as a closed Representation profile), not a sibling +standard. Matches the consumer's accepted default of 2026-07-30. + +**Done 2026-08-15.** ### T02 — Draft catalog standard ```task id: ITC-WP-0013-T02 -status: todo +status: done priority: high depends_on: [T01] state_hub_task_id: "1531e749-02ca-4824-bb57-823b198984b7" ``` -Draft seed standard section or document: +§11.15a in the Data Model. Closed list, wire encodings, mapping to +Representation / CodeList / Constraint, out-of-scope (email, widgets). -- closed AttributeValueType list (MVP from consumer proposal) -- wire encoding rules -- mapping to Representation / CodeList / Constraint -- out-of-scope rules (email-as-type, etc.) +**Done 2026-08-15.** ### T03 — Machine-readable catalog ```task id: ITC-WP-0013-T03 -status: todo +status: done priority: high depends_on: [T02] state_hub_task_id: "8601508d-0cce-425b-8b52-14e1f29f3f16" ``` -Add YAML (+ schema) under `infospace/` and register in indexes/validation. +`infospace/models/data/attribute-value-types.yaml` plus +`infospace/schemas/attribute-value-type.schema.yaml`, registered. + +**Done 2026-08-15.** ### T04 — Consumer alignment note ```task id: ITC-WP-0013-T04 -status: todo +status: done priority: medium depends_on: [T03] state_hub_task_id: "78e0d31f-afcd-459b-9d01-e6fbc801bb50" ``` -Publish short alignment note for citation-evidence (and future form UIs); -link from Data Model kernel map. +`infospace/models/data/attribute-value-types-alignment.md` for +citation-evidence. Linked from §11.15a. ---- +**Done 2026-08-15.** ## Out of scope diff --git a/workplans/ITC-WP-0014-capability-model-consolidation.md b/workplans/ITC-WP-0014-capability-model-consolidation.md index 15a6f6e..f0d87ba 100644 --- a/workplans/ITC-WP-0014-capability-model-consolidation.md +++ b/workplans/ITC-WP-0014-capability-model-consolidation.md @@ -5,7 +5,7 @@ title: "Capability Model consolidation (post-ITCC assimilation)" domain: infotech topic_slug: canon repo: info-tech-canon -status: active +status: finished priority: medium created: "2026-08-14" updated: "2026-08-15" @@ -62,7 +62,7 @@ and `governance` (2); no capability id changed. Decision record in ```task id: ITC-WP-0014-T02 -status: todo +status: done priority: high depends_on: [T01] state_hub_task_id: "1ed8d07a-34ee-4ad4-8e4a-03a513c14836" @@ -77,11 +77,16 @@ rows require EvidenceBasis (CAP-R10); provisions may declare in the model prose until a companion requirement/provision schema is justified. §10.3 is already met by the resource-control join. +**Done 2026-08-15 (canon 0.6.0):** `capability.schema.yaml` validates the +catalog; `capability-record.schema.yaml` is the companion record shape. +`make validate` checks the catalog contract (no typical_resource_classes; +classes carry native_unit / supply / capacity_behaviour). + ### T03 — Formal mapping artifacts for each anchor ```task id: ITC-WP-0014-T03 -status: todo +status: done priority: medium depends_on: [T02] state_hub_task_id: "e0ad8ec8-fdf2-4238-888c-af052fcddd40" @@ -90,6 +95,9 @@ state_hub_task_id: "e0ad8ec8-fdf2-4238-888c-af052fcddd40" Turn `assimilation/it-capability-canon/mappings.yaml` into per-pair mapping artifacts under `infospace/mappings/` conforming to `mapping.schema.yaml`. +**Done 2026-08-15:** `infospace/mappings/capability-anchors.yaml` holds one +entry per source/target pair, registered as `mapping/capability-anchors`. + ### T04 — Small-SaaS capability requirement set ```task @@ -109,7 +117,7 @@ validates against the live catalog (T11). ```task id: ITC-WP-0014-T05 -status: todo +status: done priority: medium depends_on: [T01] state_hub_task_id: "339d2006-d1c8-4572-b559-e6ceb7b06c45" @@ -119,11 +127,14 @@ Revise `InfoTechCanonLandscapeModel` §11.4 (the deferred strategy/capability no to reference ITC-CAP, and add the capability model to `InfoTechCanonKernelMap`. +**Done 2026-08-15:** §11.4 now points at ITC-CAP; Kernel Map §4.14 owns +abilities. + ### T06 — Requirement/provision validation in the service surface ```task id: ITC-WP-0014-T06 -status: todo +status: done priority: low depends_on: [T02] state_hub_task_id: "530f86c2-b61b-4b54-b380-8eec92bdced1" @@ -133,11 +144,15 @@ Extend the CLI/JSON/API surface (ITC-WP-0002) to answer "does this environment satisfy this product's capability requirements?" — the validator sketched in source §18. Covers OQ-6. +**Done 2026-08-15:** `info-tech-canon capability-review PATH` and +`GET /capability-review?path=` join a consumer record to the live catalog +(CAP-R8–R11). + ### T07 — Promotion review ```task id: ITC-WP-0014-T07 -status: todo +status: done priority: medium depends_on: [T01, T02, T03, T11] state_hub_task_id: "455690e3-c39a-4926-a13b-a179b134b2a4" @@ -147,6 +162,9 @@ Promote the model from `proposed` to `draft` or `release-candidate`, bump the canon version, and write the `CHANGELOG.md` entry. T04 (small-saas illustration) is no longer a promotion dependency. +**Done 2026-08-15:** ITC-CAP promoted to `draft` in canon 0.6.0. This is +the freeze version. T04 remains an optional illustration. + ### T08 — Finding A: move resource-class declaration off the contract ```task diff --git a/workplans/index.yaml b/workplans/index.yaml index 750d0ef..d6fb052 100644 --- a/workplans/index.yaml +++ b/workplans/index.yaml @@ -182,7 +182,7 @@ workplans: - id: ITC-WP-0013 title: Attribute Value Type catalog (Data Model extension) - status: proposed + status: finished priority: high path: workplans/ITC-WP-0013-attribute-value-type-catalog.md depends_on: @@ -195,7 +195,7 @@ workplans: - id: ITC-WP-0014 title: Capability Model consolidation (post-ITCC assimilation) - status: active + status: finished priority: medium path: workplans/ITC-WP-0014-capability-model-consolidation.md depends_on: