From 149d2ced7032a62228c3bf1b8937b2a6e8cd7055 Mon Sep 17 00:00:00 2001 From: tegwick Date: Fri, 21 Aug 2026 22:22:46 +0200 Subject: [PATCH] feat(ITC-WP-0016): establish PracticePattern language Assistant: codex Assistant-Model: gpt-5.6-sol Assistant-Session: 01a025c2-407a-7a32-b40a-f37a52f03f62 --- ...pattern-interface-deprecation-strangler.md | 33 +++ .../agent/briefs/scheme-practice-pattern.md | 32 +++ infospace/agent/global-agent-brief.md | 5 +- infospace/agent/retrieval-index.json | 69 ++++- infospace/agent/retrieval-index.md | 23 +- infospace/agent/retrieval-index.yaml | 48 +++- infospace/artifacts/index.yaml | 27 ++ infospace/indexes/artifact-tree.yaml | 23 +- infospace/indexes/concept-ownership.yaml | 18 +- infospace/indexes/import-matrix.yaml | 16 ++ infospace/infospace.yaml | 1 + .../patterns/InterfaceDeprecationStrangler.md | 267 ++++++++++++++++++ infospace/patterns/PracticePatternScheme.md | 154 ++++++++++ infospace/patterns/README.md | 16 ++ infospace/schemas/index.yaml | 2 + .../schemas/practice-pattern.schema.yaml | 54 ++++ infospace/validation/latest.json | 6 +- infospace/views/by-concept.md | 6 +- infospace/views/by-mapping-target.md | 8 + infospace/views/import-matrix.md | 142 +++++----- infospace/views/kernel-overview.md | 8 +- infospace/views/repository-tree.md | 17 +- src/info_tech_canon/generation.py | 14 + src/info_tech_canon/validation.py | 180 ++++++++++++ tests/test_cli.py | 2 +- tests/test_service.py | 19 +- .../ITC-WP-0016-practice-pattern-language.md | 28 +- 27 files changed, 1119 insertions(+), 99 deletions(-) create mode 100644 infospace/agent/briefs/practice-pattern-interface-deprecation-strangler.md create mode 100644 infospace/agent/briefs/scheme-practice-pattern.md create mode 100644 infospace/patterns/InterfaceDeprecationStrangler.md create mode 100644 infospace/patterns/PracticePatternScheme.md create mode 100644 infospace/schemas/practice-pattern.schema.yaml diff --git a/infospace/agent/briefs/practice-pattern-interface-deprecation-strangler.md b/infospace/agent/briefs/practice-pattern-interface-deprecation-strangler.md new file mode 100644 index 0000000..61dd91c --- /dev/null +++ b/infospace/agent/briefs/practice-pattern-interface-deprecation-strangler.md @@ -0,0 +1,33 @@ +--- +id: agent-brief/practice-pattern-interface-deprecation-strangler +artifact_id: practice-pattern/interface-deprecation-strangler +source_path: patterns/InterfaceDeprecationStrangler.md +source_kind: practice-pattern +generated: true +--- + + + +# Agent Brief: InterfaceDeprecationStrangler + +- Artifact ID: `practice-pattern/interface-deprecation-strangler` +- Kind: `practice-pattern` +- Canonical path: `patterns/InterfaceDeprecationStrangler.md` +- Full source: `patterns/InterfaceDeprecationStrangler.md` +- Summary: Reusable canon PracticePattern: InterfaceDeprecationStrangler. + +## Retrieval Hints + +Imports and anchors: +- `model/devsecops` +- `model/governance` +- `model/observability` +- `scheme/practice-pattern` + +## Owned Concepts + +- `InterfaceDeprecationStrangler` + +## Related Distinctions + +- **Interface deprecation vs retirement vs removal**: Deprecation guides and observes callers, retirement ends legacy behavior while retaining a metered tombstone, and removal deletes that tombstone only after the evidence gate passes. diff --git a/infospace/agent/briefs/scheme-practice-pattern.md b/infospace/agent/briefs/scheme-practice-pattern.md new file mode 100644 index 0000000..7f1fbe2 --- /dev/null +++ b/infospace/agent/briefs/scheme-practice-pattern.md @@ -0,0 +1,32 @@ +--- +id: agent-brief/scheme-practice-pattern +artifact_id: scheme/practice-pattern +source_path: patterns/PracticePatternScheme.md +source_kind: practice-pattern-scheme +generated: true +--- + + + +# Agent Brief: PracticePattern Scheme + +- Artifact ID: `scheme/practice-pattern` +- Kind: `practice-pattern-scheme` +- Canonical path: `patterns/PracticePatternScheme.md` +- Full source: `patterns/PracticePatternScheme.md` +- Summary: Contract for canon PracticePattern artifacts: PracticePattern Scheme. + +## Retrieval Hints + +Imports and anchors: +- `kernel/itc-core` + +## Owned Concepts + +- `PatternLanguage` +- `PracticePattern` +- `PracticePattern Scheme` + +## 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 a6724d0..f8a00fc 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: 68 -- Retrieval index items: 68 +- Artifact count: 70 +- Retrieval index items: 70 - Primary confidence command: `make validate` - Refresh generated indexes and views with: `make index` - Refresh agent briefs and interface templates with: `make agent-briefs` @@ -29,6 +29,7 @@ This brief summarizes the current canon service surface for agents. ## Common Distinctions +- **Interface deprecation vs retirement vs removal**: Deprecation guides and observes callers, retirement ends legacy behavior while retaining a metered tombstone, and removal deletes that tombstone only after the evidence gate passes. - **Actor vs Subject vs Principal**: Use actor for the acting entity in a context, subject for the entity a policy evaluates, and principal for the authenticated identity bound to access decisions. - **Organization Role vs AccessRole vs CARING role**: Organization roles describe responsibility or position; access roles describe permissions; CARING roles classify access-governance needs and analysis. - **Policy vs Control vs Evidence**: Policy states intent or rule, control implements or enforces that rule, and evidence records why the claim should be trusted. diff --git a/infospace/agent/retrieval-index.json b/infospace/agent/retrieval-index.json index 5102e42..6ffb83d 100644 --- a/infospace/agent/retrieval-index.json +++ b/infospace/agent/retrieval-index.json @@ -1,5 +1,13 @@ { "common_distinctions": [ + { + "id": "interface-deprecation-retirement-removal", + "source_artifacts": [ + "practice-pattern/interface-deprecation-strangler" + ], + "summary": "Deprecation guides and observes callers, retirement ends legacy behavior while retaining a metered tombstone, and removal deletes that tombstone only after the evidence gate passes.", + "title": "Interface deprecation vs retirement vs removal" + }, { "id": "actor-subject-principal", "source_artifacts": [ @@ -43,7 +51,7 @@ } ], "infospace": "canon", - "item_count": 68, + "item_count": 70, "items": [ { "canonical_path": "assimilation/it-capability-canon/ASSIMILATION.md", @@ -1523,6 +1531,42 @@ "title": "Intent Scope Purposes Pattern", "warnings": [] }, + { + "canonical_path": "patterns/InterfaceDeprecationStrangler.md", + "id": "practice-pattern/interface-deprecation-strangler", + "imports": [ + "model/devsecops", + "model/governance", + "model/observability", + "scheme/practice-pattern" + ], + "kind": "practice-pattern", + "owned_concepts": [ + "InterfaceDeprecationStrangler" + ], + "relationships": [ + { + "target": "scheme/practice-pattern", + "type": "conforms_to" + }, + { + "target": "model/governance", + "type": "uses" + }, + { + "target": "model/observability", + "type": "uses" + }, + { + "target": "model/devsecops", + "type": "uses" + } + ], + "source_path": "patterns/InterfaceDeprecationStrangler.md", + "summary": "Reusable canon PracticePattern: InterfaceDeprecationStrangler.", + "title": "InterfaceDeprecationStrangler", + "warnings": [] + }, { "canonical_path": "assimilation/intake-and-assimilation-practice.md", "id": "practice/intake-and-assimilation", @@ -1891,6 +1935,29 @@ "title": "Consumer Alignment Workplan Template", "warnings": [] }, + { + "canonical_path": "patterns/PracticePatternScheme.md", + "id": "scheme/practice-pattern", + "imports": [ + "kernel/itc-core" + ], + "kind": "practice-pattern-scheme", + "owned_concepts": [ + "PatternLanguage", + "PracticePattern", + "PracticePattern Scheme" + ], + "relationships": [ + { + "target": "kernel/itc-core", + "type": "conforms_to" + } + ], + "source_path": "patterns/PracticePatternScheme.md", + "summary": "Contract for canon PracticePattern artifacts: PracticePattern Scheme.", + "title": "PracticePattern Scheme", + "warnings": [] + }, { "canonical_path": "profiles/small-saas/artifacts/control.namespace-per-tenant.yaml", "id": "small-saas/control/namespace-per-tenant", diff --git a/infospace/agent/retrieval-index.md b/infospace/agent/retrieval-index.md index 11db4b3..efba5bf 100644 --- a/infospace/agent/retrieval-index.md +++ b/infospace/agent/retrieval-index.md @@ -4,10 +4,11 @@ Schema: `info-tech-canon.retrieval-index.v1` Infospace: `canon` -Items: **68** +Items: **70** ## Common Distinctions +- **Interface deprecation vs retirement vs removal**: Deprecation guides and observes callers, retirement ends legacy behavior while retaining a metered tombstone, and removal deletes that tombstone only after the evidence gate passes. Sources: `practice-pattern/interface-deprecation-strangler` - **Actor vs Subject vs Principal**: Use actor for the acting entity in a context, subject for the entity a policy evaluates, and principal for the authenticated identity bound to access decisions. Sources: `model/organization`, `model/access-control`, `standard/caring` - **Organization Role vs AccessRole vs CARING role**: Organization roles describe responsibility or position; access roles describe permissions; CARING roles classify access-governance needs and analysis. Sources: `model/organization`, `model/access-control`, `standard/caring` - **Policy vs Control vs Evidence**: Policy states intent or rule, control implements or enforces that rule, and evidence records why the claim should be trusted. Sources: `model/governance`, `model/security`, `model/observability` @@ -455,6 +456,16 @@ Items: **68** - Imports and anchors: `model/governance`, `model/task` - Owned concepts: `Intent Scope Purposes Pattern`, `IntentScopePurposePattern` +### InterfaceDeprecationStrangler + +- ID: `practice-pattern/interface-deprecation-strangler` +- Kind: `practice-pattern` +- Canonical path: `patterns/InterfaceDeprecationStrangler.md` +- Source path: `patterns/InterfaceDeprecationStrangler.md` +- Summary: Reusable canon PracticePattern: InterfaceDeprecationStrangler. +- Imports and anchors: `model/devsecops`, `model/governance`, `model/observability`, `scheme/practice-pattern` +- Owned concepts: `InterfaceDeprecationStrangler` + ### Intake and Assimilation Practice - ID: `practice/intake-and-assimilation` @@ -535,6 +546,16 @@ Items: **68** - Imports and anchors: `model/purpose-demand-extension`, `model/task` - Owned concepts: `Consumer Alignment Workplan Template` +### PracticePattern Scheme + +- ID: `scheme/practice-pattern` +- Kind: `practice-pattern-scheme` +- Canonical path: `patterns/PracticePatternScheme.md` +- Source path: `patterns/PracticePatternScheme.md` +- Summary: Contract for canon PracticePattern artifacts: PracticePattern Scheme. +- Imports and anchors: `kernel/itc-core` +- Owned concepts: `PatternLanguage`, `PracticePattern`, `PracticePattern Scheme` + ### Namespace Per Tenant Control - ID: `small-saas/control/namespace-per-tenant` diff --git a/infospace/agent/retrieval-index.yaml b/infospace/agent/retrieval-index.yaml index a83e33c..4583df5 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: 68 +item_count: 70 items: - id: assimilation/it-capability-canon kind: assimilation @@ -973,6 +973,29 @@ items: - type: uses target: model/task warnings: [] +- id: practice-pattern/interface-deprecation-strangler + kind: practice-pattern + title: InterfaceDeprecationStrangler + canonical_path: patterns/InterfaceDeprecationStrangler.md + source_path: patterns/InterfaceDeprecationStrangler.md + summary: 'Reusable canon PracticePattern: InterfaceDeprecationStrangler.' + owned_concepts: + - InterfaceDeprecationStrangler + imports: + - model/devsecops + - model/governance + - model/observability + - scheme/practice-pattern + relationships: + - type: conforms_to + target: scheme/practice-pattern + - type: uses + target: model/governance + - type: uses + target: model/observability + - type: uses + target: model/devsecops + warnings: [] - id: practice/intake-and-assimilation kind: practice title: Intake and Assimilation Practice @@ -1210,6 +1233,22 @@ items: - type: uses target: model/purpose-demand-extension warnings: [] +- id: scheme/practice-pattern + kind: practice-pattern-scheme + title: PracticePattern Scheme + canonical_path: patterns/PracticePatternScheme.md + source_path: patterns/PracticePatternScheme.md + summary: 'Contract for canon PracticePattern artifacts: PracticePattern Scheme.' + owned_concepts: + - PatternLanguage + - PracticePattern + - PracticePattern Scheme + imports: + - kernel/itc-core + relationships: + - type: conforms_to + target: kernel/itc-core + warnings: [] - id: small-saas/control/namespace-per-tenant kind: profile-artifact title: Namespace Per Tenant Control @@ -1584,6 +1623,13 @@ items: target: model/task warnings: [] common_distinctions: +- id: interface-deprecation-retirement-removal + title: Interface deprecation vs retirement vs removal + summary: Deprecation guides and observes callers, retirement ends legacy behavior + while retaining a metered tombstone, and removal deletes that tombstone only after + the evidence gate passes. + source_artifacts: + - practice-pattern/interface-deprecation-strangler - id: actor-subject-principal title: Actor vs Subject vs Principal summary: Use actor for the acting entity in a context, subject for the entity a diff --git a/infospace/artifacts/index.yaml b/infospace/artifacts/index.yaml index 7e9cb8d..d66846b 100644 --- a/infospace/artifacts/index.yaml +++ b/infospace/artifacts/index.yaml @@ -609,6 +609,33 @@ artifacts: target: model/governance - type: uses target: model/task + - id: scheme/practice-pattern + path: patterns/PracticePatternScheme.md + kind: practice-pattern-scheme + title: PracticePattern Scheme + provenance: + placement: authored + placement_workplan: ITC-WP-0016 + relationships: + - type: conforms_to + target: kernel/itc-core + - id: practice-pattern/interface-deprecation-strangler + path: patterns/InterfaceDeprecationStrangler.md + kind: practice-pattern + title: InterfaceDeprecationStrangler + provenance: + placement: generalized + placement_workplan: ITC-WP-0016 + known_use: state-hub/docs/workplan-terminology-transition.md + relationships: + - type: conforms_to + target: scheme/practice-pattern + - type: uses + target: model/governance + - type: uses + target: model/observability + - type: uses + target: model/devsecops - id: mapping/purpose-demand-governance-candidates path: mappings/purpose-demand-governance-candidates.yaml kind: mapping diff --git a/infospace/indexes/artifact-tree.yaml b/infospace/indexes/artifact-tree.yaml index 171d67b..54443f4 100644 --- a/infospace/indexes/artifact-tree.yaml +++ b/infospace/indexes/artifact-tree.yaml @@ -1,5 +1,5 @@ root: infospace -file_count: 183 +file_count: 190 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-attribute-value-types.md + directory: agent/briefs + name: catalog-attribute-value-types.md - path: agent/briefs/catalog-evidence-basis.md directory: agent/briefs name: catalog-evidence-basis.md @@ -82,6 +85,9 @@ files: - path: agent/briefs/kernel-itc-kernel-map.md directory: agent/briefs name: kernel-itc-kernel-map.md +- path: agent/briefs/mapping-capability-anchors.md + directory: agent/briefs + name: mapping-capability-anchors.md - path: agent/briefs/mapping-purpose-demand-governance-candidates.md directory: agent/briefs name: mapping-purpose-demand-governance-candidates.md @@ -127,6 +133,9 @@ files: - path: agent/briefs/pattern-intent-scope-purposes.md directory: agent/briefs name: pattern-intent-scope-purposes.md +- path: agent/briefs/practice-pattern-interface-deprecation-strangler.md + directory: agent/briefs + name: practice-pattern-interface-deprecation-strangler.md - path: agent/briefs/profile-small-saas.md directory: agent/briefs name: profile-small-saas.md @@ -148,6 +157,9 @@ files: - path: agent/briefs/review-kit-alignment.md directory: agent/briefs name: review-kit-alignment.md +- path: agent/briefs/scheme-practice-pattern.md + directory: agent/briefs + name: scheme-practice-pattern.md - path: agent/briefs/standard-caring.md directory: agent/briefs name: standard-caring.md @@ -394,6 +406,12 @@ files: - path: models/task/InfoTechCanonTaskModel.md directory: models/task name: InfoTechCanonTaskModel.md +- path: patterns/InterfaceDeprecationStrangler.md + directory: patterns + name: InterfaceDeprecationStrangler.md +- path: patterns/PracticePatternScheme.md + directory: patterns + name: PracticePatternScheme.md - path: patterns/README.md directory: patterns name: README.md @@ -484,6 +502,9 @@ files: - path: schemas/mapping.schema.yaml directory: schemas name: mapping.schema.yaml +- path: schemas/practice-pattern.schema.yaml + directory: schemas + name: practice-pattern.schema.yaml - path: schemas/profile.schema.yaml directory: schemas name: profile.schema.yaml diff --git a/infospace/indexes/concept-ownership.yaml b/infospace/indexes/concept-ownership.yaml index 7a4aced..4d16214 100644 --- a/infospace/indexes/concept-ownership.yaml +++ b/infospace/indexes/concept-ownership.yaml @@ -1,4 +1,4 @@ -concept_count: 110 +concept_count: 114 concepts: - concept: "Assimilation \u2014 IT Capability Canon (ITCC) v0.1" owner: assimilation/it-capability-canon @@ -268,6 +268,10 @@ concepts: owner: pattern/intent-scope-purposes path: patterns/intent-scope-purposes.md source: frontmatter.owned_concepts +- concept: InterfaceDeprecationStrangler + owner: practice-pattern/interface-deprecation-strangler + path: patterns/InterfaceDeprecationStrangler.md + source: artifact_title - concept: Intake and Assimilation Practice owner: practice/intake-and-assimilation path: assimilation/intake-and-assimilation-practice.md @@ -300,6 +304,18 @@ concepts: owner: review-kit/alignment/workplan-template path: agent/templates/consumer-alignment-workplan.template.md source: artifact_title +- concept: PracticePattern Scheme + owner: scheme/practice-pattern + path: patterns/PracticePatternScheme.md + source: artifact_title +- concept: PracticePattern + owner: scheme/practice-pattern + path: patterns/PracticePatternScheme.md + source: frontmatter.owned_concepts +- concept: PatternLanguage + owner: scheme/practice-pattern + path: patterns/PracticePatternScheme.md + source: frontmatter.owned_concepts - concept: Namespace Per Tenant Control owner: small-saas/control/namespace-per-tenant path: profiles/small-saas/artifacts/control.namespace-per-tenant.yaml diff --git a/infospace/indexes/import-matrix.yaml b/infospace/indexes/import-matrix.yaml index 8985df2..d24a11d 100644 --- a/infospace/indexes/import-matrix.yaml +++ b/infospace/indexes/import-matrix.yaml @@ -43,6 +43,7 @@ artifacts: - model/security - model/task - pattern/intent-scope-purposes +- practice-pattern/interface-deprecation-strangler - practice/intake-and-assimilation - profile/small-saas - review-kit/alignment @@ -51,6 +52,7 @@ artifacts: - review-kit/alignment/scorecard - review-kit/alignment/workflow - review-kit/alignment/workplan-template +- scheme/practice-pattern - small-saas/control/namespace-per-tenant - small-saas/dataset/subscription-ledger - small-saas/deployment/production @@ -496,6 +498,16 @@ rows: - implements model/task: - uses +- artifact: practice-pattern/interface-deprecation-strangler + targets: + model/devsecops: + - uses + model/governance: + - uses + model/observability: + - uses + scheme/practice-pattern: + - conforms_to - artifact: practice/intake-and-assimilation targets: kernel/itc-core: @@ -610,6 +622,10 @@ rows: - uses review-kit/alignment: - part_of +- artifact: scheme/practice-pattern + targets: + kernel/itc-core: + - conforms_to - artifact: small-saas/control/namespace-per-tenant targets: model/security: diff --git a/infospace/infospace.yaml b/infospace/infospace.yaml index 1fb2a6e..2f522a1 100644 --- a/infospace/infospace.yaml +++ b/infospace/infospace.yaml @@ -41,6 +41,7 @@ disciplines: path: standards/repository-layout/InfoTechCanonRepositoryLayoutStandard.md schemas: standard: schemas/standard.schema.yaml + practice-pattern: schemas/practice-pattern.schema.yaml concept: schemas/concept.schema.yaml mapping: schemas/mapping.schema.yaml profile: schemas/profile.schema.yaml diff --git a/infospace/patterns/InterfaceDeprecationStrangler.md b/infospace/patterns/InterfaceDeprecationStrangler.md new file mode 100644 index 0000000..5848c40 --- /dev/null +++ b/infospace/patterns/InterfaceDeprecationStrangler.md @@ -0,0 +1,267 @@ +--- +id: practice-pattern/interface-deprecation-strangler +title: InterfaceDeprecationStrangler +type: practice-pattern +scheme: practice-pattern/0.1 +status: active +version: "0.1" +summary: Replace an interface gradually while metering legacy use, guiding callers, and gating removal on evidence. +aliases: + - Metered Interface Strangler + - Evidence-Gated Interface Deprecation +uses: + - model/governance + - model/observability + - model/devsecops +related_patterns: [] +known_uses: + - state-hub-workstream-to-workplan-transition +--- + +# InterfaceDeprecationStrangler + +## Intent + +Phase out an old interface without guessing whether callers have migrated: +introduce and verify its successor, make deprecation visible to callers, meter +legacy use, progressively restrict the old behavior, and remove its final +tombstone only when evidence satisfies an explicit retirement policy. + +## Context + +Use this pattern when a service, library, event stream, command, file format, or +other integration surface must evolve while some callers may still depend on +the old interface. Caller inventory is incomplete, release cycles are not +coordinated, or removal has enough operational risk that absence of complaints +is insufficient evidence. + +The old and new interfaces may coexist briefly, or the old interface may +already reject requests while still receiving attempts. + +## Problem + +An interface cannot safely remain forever, but deleting it on a planned date +can break unknown callers. Keeping it indefinitely also has a cost: duplicated +logic, ambiguity, security exposure, testing burden, and pressure to keep +building on an obsolete contract. + +A published deprecation notice alone proves neither that callers received it +nor that they migrated. Raw request totals alone are also ambiguous: a request +successfully served by compatibility code is different from an attempt rejected +by a retired endpoint. + +## Forces + +- Callers need enough continuity to migrate without synchronized releases. +- Maintainers need a bounded path to removal rather than permanent dual support. +- Unknown callers cannot be coordinated directly until telemetry identifies + them. +- Caller guidance must be available at the point of use, not only in release + notes. +- Privacy and security constrain how caller identity and request data are + recorded. +- Infrequent but important callers can be absent from a short review window. +- A replacement that exists but has not been verified is not a safe successor. +- Once behavior returns a terminal response, attempted use still matters even + though no legacy work was successfully performed. + +## Solution + +Therefore, wrap the interface transition in an evidence-producing strangler: + +1. Register the legacy interface, its owner, successor, lifecycle state, and + applicable hold or retirement policy. +2. Implement and verify the successor before restricting the legacy path. +3. Instrument the legacy boundary and communicate deprecation plus an actionable + successor reference on every use where the protocol permits it. +4. Record privacy-bounded usage evidence with enough outcome information to + distinguish served legacy traffic, redirects, terminal rejection, and + failures. +5. Move through explicit stages from compatibility to terminal retirement. +6. Keep a lightweight metered tombstone after terminal retirement so late + attempts reveal remaining callers. +7. Remove the tombstone only after the configured evidence gate passes and no + manual hold remains. + +The meter and caller guidance are part of the interface lifecycle, not optional +observability added after the fact. + +## Structure + +```text +Caller + -> Legacy Boundary + -> deprecation and successor guidance + -> outcome-aware usage meter + -> compatibility implementation OR terminal response + -> Successor Interface + +Interface Registry + -> owner + lifecycle + successor + verification + holds + +Review Activity + -> usage windows + last-seen + caller attribution + outcome + -> migration action OR stage advance OR continued hold +``` + +The registry carries policy and identity. The meter carries observations. The +review activity turns both into a decision; it must not infer removal from a +calendar date alone. + +## Dynamics + +### Stage 1 — Announce and observe + +Serve the old behavior, emit protocol-appropriate deprecation and successor +information, and establish a usage baseline. Contact attributable callers. + +### Stage 2 — Migrate and narrow + +Move owned callers to the successor. Stop adding capabilities to the legacy +surface. Narrow compatibility where doing so is reversible and observable. + +### Stage 3 — Retire behavior, retain the tombstone + +Return an explicit terminal result such as HTTP `410 Gone`, a typed CLI error, +or a rejected event subject. Continue returning successor guidance and metering +attempts. + +At this stage a count means attempted use of a retired interface, not successful +legacy traffic. Dashboards and evidence must preserve that distinction. + +### Stage 4 — Remove the tombstone + +Remove routing and instrumentation only after the successor is verified, no +hold remains, and the evidence policy's quiet period has elapsed. Preserve the +registry history and decision evidence. + +Any new use can stop or reverse a stage transition when the cost of doing so is +lower than breaking the caller. + +## Invariants + +1. Every legacy interface has an owner and an actionable successor reference. +2. The successor is verified before legacy behavior is terminally retired. +3. Caller-facing deprecation information travels on the legacy interaction + where the protocol supports it. +4. Metering failure does not silently turn absence of evidence into evidence of + absence. +5. Successful legacy service and rejected post-retirement attempts are not + reported as the same outcome. +6. A manual hold prevents automatic stage advancement. +7. Quiet periods account for expected caller cadence and historical volume. +8. Irreversible removal has retained evidence, rationale, and rollback or + recovery guidance appropriate to its risk. +9. Telemetry does not capture credentials or unnecessary request payloads. + +## Evidence + +The practice should produce: + +- a registry record with interface identity, owner, successor, lifecycle state, + replacement verification, and holds; +- usage totals and bounded review windows; +- last-seen time and, where allowed, tenant/user/component or equivalent caller + attribution; +- request outcome or an unambiguous derivation from the interface lifecycle + stage; +- evidence that owned callers use the successor; +- the retirement threshold and its result; and +- the decision that advanced, paused, or reversed the transition. + +Quiet-window policy should reflect use cadence. A high-volume interface that +has been quiet for one week may require a longer last-seen threshold than an +interface that was used once. Evidence should say why an interface is or is not +a retirement candidate rather than emitting only a boolean. + +## Consequences + +The organization gains a repeatable migration language, direct discovery of +unknown callers, and an evidence-backed point at which compatibility can end. +Late use becomes actionable information instead of a surprise outage. + +The cost is temporary duplicate surface area, registry and telemetry storage, +review ownership, privacy design, and discipline around outcome semantics. A +tombstone has operating cost, but it is much smaller and safer than preserving +the full legacy implementation. + +## Failure Modes + +- **NoticeOnly:** publish a deprecation date without observing real use. +- **MeterWithoutMeaning:** count requests without distinguishing served traffic + from rejected attempts. +- **PermanentCompatibility:** meter forever but never define stage gates. +- **CalendarRemoval:** delete on a date despite contrary usage evidence. +- **UnverifiedSuccessor:** retire the old path because a replacement merely + exists. +- **SilentTombstone:** return a terminal response without successor guidance. +- **TelemetryBlindness:** treat a broken meter as a quiet interface. +- **IdentityOverreach:** collect payloads or personal data when coarse component + attribution would suffice. +- **ShortWindowConfidence:** miss monthly or quarterly callers by using only a + short quiet window. + +## When Not to Use + +Do not use the full pattern for an interface that was never released, has a +complete and controlled caller set that can be changed atomically, or must be +disabled immediately because continued exposure is an unacceptable security or +safety risk. In the last case, retire first and use the metered tombstone and +recovery guidance only where they do not preserve the vulnerability. + +## Known Uses + +### State Hub workstream-to-workplan transition + +State Hub replaced legacy `workstream` REST terminology with `workplan` +interfaces. Its legacy registry records interface identity, owner, replacement, +verification, holds, and usage buckets. Legacy responses carry deprecation, +sunset, replacement, and successor-link metadata. + +`GET /workstreams/{workstream_id}` is at Stage 3: it returns `410 Gone`, directs +the caller to `GET /workplans/{workplan_id}`, and records the attempt. The weekly +review therefore exposes remaining callers without implying that the retired +request succeeded. Retirement candidacy combines review-window traffic, +last-seen time, replacement verification, manual holds, and a quiet-period +ladder scaled by historical call volume. + +Implementation references: + +- repository: `state-hub`; +- compatibility behavior: `api/services/legacy_compat.py`; +- known route: `api/routers/workstreams.py`; +- evidence policy: `api/services/legacy_meter.py`; and +- operational description: `docs/workplan-terminology-transition.md`. + +### Arc Nexus adoption + +`arc-nexus` declares this PracticePattern as its policy for phasing out old +architecture registry interfaces. This is an adoption decision, not yet a +second implementation proof. + +## Related Patterns + +This pattern is a specialized strangler migration with an explicit evidence and +governance loop. Future related patterns may separate successor verification, +compatibility facades, evidence-gated removal, and consumer migration campaigns +once repeated uses justify independent names. + +## Adoption Checklist + +- [ ] Give the legacy and successor interfaces stable identities. +- [ ] Assign an owner and verify the successor. +- [ ] Define lifecycle stages, holds, and outcome semantics. +- [ ] Add caller-facing deprecation and successor guidance. +- [ ] Meter privacy-bounded usage and test meter failure behavior. +- [ ] Establish a review cadence and quiet-period policy. +- [ ] Migrate known callers and investigate unknown attribution. +- [ ] Retire behavior while retaining a metered tombstone. +- [ ] Confirm that evidence distinguishes attempted from successful use. +- [ ] Record the removal decision and preserve lifecycle history. + +## Evolution + +Version 0.1 generalizes the practice proven by State Hub's terminology +transition. The next useful evidence is a second implementation in a different +interface style, such as events, CLI commands, or schemas, to test which outcome +and successor fields should become structured canon concepts. diff --git a/infospace/patterns/PracticePatternScheme.md b/infospace/patterns/PracticePatternScheme.md new file mode 100644 index 0000000..8bbc48f --- /dev/null +++ b/infospace/patterns/PracticePatternScheme.md @@ -0,0 +1,154 @@ +--- +id: scheme/practice-pattern +title: PracticePattern Scheme +type: practice-pattern-scheme +status: active +version: "0.1" +summary: A common Markdown contract for naming and sharing recurring socio-technical practices. +owned_concepts: + - PracticePattern + - PatternLanguage +--- + +# PracticePattern Scheme + +## Intent + +Give people and agents a stable language for recurring ways of working. A +PracticePattern names a proven or proposed arrangement of actions, roles, +interfaces, feedback, and evidence that resolves a recurring tension in a +particular context. + +This scheme is inspired by Christopher Alexander's pattern-language method: +each pattern connects a context and a system of forces to a reusable solution, +describes the resulting consequences, and participates in a language of related +patterns. It adapts that idea for software, operations, architecture, and +governance practices; it does not copy a building pattern or require a fixed +implementation technology. + +## Artifact identity + +A PracticePattern is a Markdown canon artifact with: + +- a speakable canonical name in UpperCamelCase, such as + `InterfaceDeprecationStrangler`; +- a stable artifact ID, `practice-pattern/`; +- `type: practice-pattern`; +- `scheme: practice-pattern/0.1`; +- an independently versioned pattern body; +- a lifecycle status; and +- registration in `infospace/artifacts/index.yaml`. + +The canonical name is part of the shared language. Aliases help discovery but +must not silently replace it. + +## Required frontmatter + +```yaml +--- +id: practice-pattern/example-name +title: ExampleName +type: practice-pattern +scheme: practice-pattern/0.1 +status: candidate +version: "0.1" +summary: One sentence stating the practical move. +aliases: [] +uses: [] +related_patterns: [] +known_uses: [] +--- +``` + +The machine-readable contract is +`infospace/schemas/practice-pattern.schema.yaml`. + +### Lifecycle + +| Status | Meaning | +| --- | --- | +| `draft` | The problem and solution are still being shaped. | +| `candidate` | Coherent enough for trial, but known uses are limited. | +| `active` | Supported by at least one concrete known use and suitable for reuse. | +| `deprecated` | Superseded or discouraged; relationship to its successor is explicit. | +| `retired` | Preserved for provenance but no longer recommended. | + +Version and lifecycle are separate. A wording clarification can change the +version without changing lifecycle; evidence from a new known use can promote a +candidate to active. + +## Required body sections + +Every PracticePattern must contain these second-level headings: + +1. `Intent` — the practical move in compact form. +2. `Context` — the conditions in which the pattern applies. +3. `Problem` — the recurring failure or tension. +4. `Forces` — pressures that make a simplistic solution insufficient. +5. `Solution` — the stable arrangement, written as a directive. +6. `Dynamics` — the sequence or feedback loop through which it operates. +7. `Invariants` — properties an implementation must preserve. +8. `Evidence` — observations needed to decide, advance, or stop. +9. `Consequences` — benefits, costs, and new responsibilities. +10. `Known Uses` — concrete applications and their maturity. + +These headings are validated by the canon. Their contents may use diagrams, +tables, checklists, or prose. + +## Recommended body sections + +Use these where they improve adoption: + +- `Structure` for roles, components, and relationships; +- `Failure Modes` for common incomplete or unsafe implementations; +- `When Not to Use` for boundary conditions; +- `Adoption Checklist` for a practical start and completion test; +- `Related Patterns` for the surrounding pattern language; and +- `Evolution` for provenance, open questions, and version history. + +## Writing rules + +1. Name a recurring practice, not a product feature or one repository's + implementation. +2. State the problem before prescribing the solution. +3. Make forces genuinely competing; a list of requirements is not a force + analysis. +4. Write the solution as a stable arrangement and keep technology-specific + examples in Known Uses. +5. Separate invariants from optional implementation techniques. +6. State which evidence changes the practice's state or permits an irreversible + move. +7. Name costs and failure modes as directly as benefits. +8. A known use must identify what was actually observed; intended adoption is + not implementation evidence. +9. Relationships must use stable artifact IDs when the related artifact is in + the canon. +10. Pattern conformance means preserving the invariants, not copying a known + use literally. + +## Relationship vocabulary + +PracticePatterns form a language rather than an isolated catalog. Use: + +- `uses` when this pattern depends on another canon artifact or mechanism; +- `related_patterns` for complementary, alternative, predecessor, or successor + PracticePatterns, with the relation explained in the body; +- artifact-index `conforms_to` to point to this scheme; +- artifact-index `uses`, `requires`, or `implements` for graph-visible canon + relationships; and +- Known Uses to point outward to concrete consumer implementations. + +## Conformance + +A file conforms to PracticePattern v0.1 when its frontmatter validates against +the schema, all required body sections are present, its artifact index entry has +`kind: practice-pattern`, and every internal relationship target resolves. + +Conformance does not imply that the practice is active or recommended. That is +expressed by lifecycle status and known-use evidence. + +## Evolution + +Version 0.1 establishes the smallest useful shared contract. Later versions may +add structured force, role, evidence, and known-use records after several +patterns demonstrate which structure is genuinely reusable. diff --git a/infospace/patterns/README.md b/infospace/patterns/README.md index d58b723..e5b260a 100644 --- a/infospace/patterns/README.md +++ b/infospace/patterns/README.md @@ -1,3 +1,19 @@ # Patterns Reusable canon patterns live here. + +## PracticePattern language + +PracticePatterns give recurring socio-technical practices stable, speakable +names. They follow the Alexander-inspired, Markdown-first contract in +[PracticePatternScheme](PracticePatternScheme.md). The current scheme is v0.1; +frontmatter is described by +[`practice-pattern.schema.yaml`](../schemas/practice-pattern.schema.yaml). + +| PracticePattern | Status | Purpose | +| --- | --- | --- | +| [InterfaceDeprecationStrangler](InterfaceDeprecationStrangler.md) | active | Phase out an interface through caller guidance, usage evidence, staged retirement, and an evidence-gated removal. | + +The older [Intent Scope Purposes Pattern](intent-scope-purposes.md) predates the +PracticePattern v0.1 contract. It remains a candidate canon pattern and can be +migrated when its next substantive revision is made. diff --git a/infospace/schemas/index.yaml b/infospace/schemas/index.yaml index 1243de8..f761e3a 100644 --- a/infospace/schemas/index.yaml +++ b/infospace/schemas/index.yaml @@ -1,6 +1,8 @@ schemas: - id: standard path: standard.schema.yaml + - id: practice-pattern + path: practice-pattern.schema.yaml - id: concept path: concept.schema.yaml - id: mapping diff --git a/infospace/schemas/practice-pattern.schema.yaml b/infospace/schemas/practice-pattern.schema.yaml new file mode 100644 index 0000000..c39893b --- /dev/null +++ b/infospace/schemas/practice-pattern.schema.yaml @@ -0,0 +1,54 @@ +$schema: https://json-schema.org/draft/2020-12/schema +$id: https://info-tech-canon.local/schemas/practice-pattern.schema.yaml +title: InfoTechCanon PracticePattern frontmatter +type: object +required: + - id + - title + - type + - scheme + - status + - version + - summary +properties: + id: + type: string + pattern: ^practice-pattern/[a-z0-9]+(?:-[a-z0-9]+)*$ + title: + type: string + pattern: ^[A-Z][A-Za-z0-9]*$ + type: + const: practice-pattern + scheme: + const: practice-pattern/0.1 + status: + enum: + - draft + - candidate + - active + - deprecated + - retired + version: + type: string + pattern: ^[0-9]+\.[0-9]+(?:\.[0-9]+)?$ + summary: + type: string + minLength: 1 + aliases: + type: array + items: + type: string + uses: + type: array + items: + type: string + related_patterns: + type: array + items: + type: string + pattern: ^practice-pattern/ + known_uses: + type: array + items: + type: string +additionalProperties: true diff --git a/infospace/validation/latest.json b/infospace/validation/latest.json index 826c79d..98248eb 100644 --- a/infospace/validation/latest.json +++ b/infospace/validation/latest.json @@ -1,14 +1,14 @@ { "details": { - "artifact_count": 68, - "relationship_count": 291 + "artifact_count": 70, + "relationship_count": 296 }, "errors": [], "metrics": { "coherence_components": 1.0, "consistency_cycles": 0.0, "coverage_ratio": 1.0, - "granularity_entropy": 4.478787416971244, + "granularity_entropy": 4.566569747645274, "redundancy_ratio": 0.0 }, "ok": true, diff --git a/infospace/views/by-concept.md b/infospace/views/by-concept.md index 0908083..e6fe041 100644 --- a/infospace/views/by-concept.md +++ b/infospace/views/by-concept.md @@ -2,7 +2,7 @@ # By Concept -Concept count: **110** +Concept count: **114** | Concept | Owner | Source | | --- | --- | --- | @@ -73,6 +73,7 @@ Concept count: **110** | InfoTechCanon Task Model | `model/task` | `artifact_title` | | Intent Scope Purposes Pattern | `pattern/intent-scope-purposes` | `artifact_title` | | IntentScopePurposePattern | `pattern/intent-scope-purposes` | `frontmatter.owned_concepts` | +| InterfaceDeprecationStrangler | `practice-pattern/interface-deprecation-strangler` | `artifact_title` | | Intake and Assimilation Practice | `practice/intake-and-assimilation` | `artifact_title` | | Small SaaS System Profile | `profile/small-saas` | `artifact_title` | | Canon Consumer Alignment Review Kit | `review-kit/alignment` | `artifact_title` | @@ -81,6 +82,9 @@ Concept count: **110** | Canon Consumer Alignment Scorecard | `review-kit/alignment/scorecard` | `artifact_title` | | Canon Consumer Alignment Review Workflow | `review-kit/alignment/workflow` | `artifact_title` | | Consumer Alignment Workplan Template | `review-kit/alignment/workplan-template` | `artifact_title` | +| PracticePattern Scheme | `scheme/practice-pattern` | `artifact_title` | +| PracticePattern | `scheme/practice-pattern` | `frontmatter.owned_concepts` | +| PatternLanguage | `scheme/practice-pattern` | `frontmatter.owned_concepts` | | Namespace Per Tenant Control | `small-saas/control/namespace-per-tenant` | `artifact_title` | | Subscription Ledger Dataset | `small-saas/dataset/subscription-ledger` | `artifact_title` | | Production Deployment | `small-saas/deployment/production` | `artifact_title` | diff --git a/infospace/views/by-mapping-target.md b/infospace/views/by-mapping-target.md index 13ded47..8da342d 100644 --- a/infospace/views/by-mapping-target.md +++ b/infospace/views/by-mapping-target.md @@ -82,6 +82,7 @@ - `practice/intake-and-assimilation` via `conforms_to` - `profile/small-saas` via `conforms_to` - `review-kit/alignment` via `conforms_to` +- `scheme/practice-pattern` via `conforms_to` - `standard/caring` via `conforms_to` - `standard/repository-layout` via `conforms_to` - `standard/tagging` via `conforms_to` @@ -131,6 +132,7 @@ - `conformance/railiance-fabric/entity-edge-capture-criteria` via `uses` - `conformance/railiance-fabric/mapping-expectations` via `maps` - `kernel/itc-kernel-map` via `maps` +- `practice-pattern/interface-deprecation-strangler` via `uses` - `profile/small-saas` via `requires` - `review-kit/alignment/model-selection-guide` via `uses` - `small-saas/deployment/production` via `uses` @@ -159,6 +161,7 @@ - `model/data` via `uses` - `model/purpose-demand-extension` via `extends` - `pattern/intent-scope-purposes` via `uses` +- `practice-pattern/interface-deprecation-strangler` via `uses` - `profile/small-saas` via `requires` - `review-kit/alignment` via `uses` - `review-kit/alignment/model-selection-guide` via `uses` @@ -211,6 +214,7 @@ - `conformance/railiance-fabric/mapping-expectations` via `maps` - `kernel/itc-kernel-map` via `maps` - `model/capability` via `uses` +- `practice-pattern/interface-deprecation-strangler` via `uses` - `profile/small-saas` via `requires` - `review-kit/alignment/model-selection-guide` via `uses` - `small-saas/evidence/access-review-2026-05` via `uses` @@ -335,6 +339,10 @@ - `review-kit/alignment/workflow` via `part_of` - `review-kit/alignment/workplan-template` via `part_of` +## `scheme/practice-pattern` + +- `practice-pattern/interface-deprecation-strangler` via `conforms_to` + ## `small-saas/control/namespace-per-tenant` - `small-saas/deployment/production` via `implements` diff --git a/infospace/views/import-matrix.md b/infospace/views/import-matrix.md index d3349e2..9a36682 100644 --- a/infospace/views/import-matrix.md +++ b/infospace/views/import-matrix.md @@ -2,73 +2,75 @@ # 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/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` | | | | | | | | | | | | | | | | | | | | | | | | | | +| 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-pattern/interface-deprecation-strangler` | `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` | `scheme/practice-pattern` | `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-pattern/interface-deprecation-strangler` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | `uses` | `uses` | | | | `uses` | | | | | | | | | | | | | | | `conforms_to` | | | | | | | | | | | | | | | | | +| `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` | | | | | | | | | | | | | | | | | | | | | | | +| `scheme/practice-pattern` | | | | | | | | | | | | | | | | | | | | | | | | | | | `conforms_to` | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | +| `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 d913f17..5829017 100644 --- a/infospace/views/kernel-overview.md +++ b/infospace/views/kernel-overview.md @@ -3,7 +3,7 @@ # Kernel Overview - Infospace: `canon` -- Artifacts: 68 +- Artifacts: 70 ## Artifact Kinds @@ -39,6 +39,8 @@ - `native-concept-map`: 1 - `pattern`: 1 - `practice`: 1 +- `practice-pattern`: 1 +- `practice-pattern-scheme`: 1 - `profile`: 1 - `profile-alignment`: 1 - `profile-artifact`: 13 @@ -50,7 +52,7 @@ - `access_evidenced_by`: 1 - `changes`: 1 - `compares`: 1 -- `conforms_to`: 22 +- `conforms_to`: 24 - `constrained_by`: 1 - `deploys`: 1 - `derived_from`: 1 @@ -76,4 +78,4 @@ - `separates`: 2 - `serves`: 2 - `stress_tests`: 6 -- `uses`: 118 +- `uses`: 121 diff --git a/infospace/views/repository-tree.md b/infospace/views/repository-tree.md index 80352a6..25afc53 100644 --- a/infospace/views/repository-tree.md +++ b/infospace/views/repository-tree.md @@ -2,7 +2,7 @@ # Repository Tree -File count: **175** +File count: **190** - `README.md` - `agent/README.md` @@ -11,6 +11,8 @@ File count: **175** - `agent/briefs/benchmark-caring-kubernetes-rbac-findings.md` - `agent/briefs/benchmark-caring-kubernetes-rbac-native-concepts.md` - `agent/briefs/benchmark-caring-kubernetes-rbac.md` +- `agent/briefs/catalog-attribute-value-types.md` +- `agent/briefs/catalog-evidence-basis.md` - `agent/briefs/comparison-repo-scoping-canon-benefit-analysis.md` - `agent/briefs/comparison-repo-scoping-consumer-workplan-brief.md` - `agent/briefs/comparison-repo-scoping-extension-candidates.md` @@ -30,6 +32,7 @@ File count: **175** - `agent/briefs/example-consumer-purpose-portfolio.md` - `agent/briefs/kernel-itc-core.md` - `agent/briefs/kernel-itc-kernel-map.md` +- `agent/briefs/mapping-capability-anchors.md` - `agent/briefs/mapping-purpose-demand-governance-candidates.md` - `agent/briefs/model-access-control.md` - `agent/briefs/model-capability.md` @@ -45,6 +48,7 @@ File count: **175** - `agent/briefs/model-security.md` - `agent/briefs/model-task.md` - `agent/briefs/pattern-intent-scope-purposes.md` +- `agent/briefs/practice-pattern-interface-deprecation-strangler.md` - `agent/briefs/profile-small-saas.md` - `agent/briefs/review-kit-alignment-model-selection-guide.md` - `agent/briefs/review-kit-alignment-schema.md` @@ -52,6 +56,7 @@ File count: **175** - `agent/briefs/review-kit-alignment-workflow.md` - `agent/briefs/review-kit-alignment-workplan-template.md` - `agent/briefs/review-kit-alignment.md` +- `agent/briefs/scheme-practice-pattern.md` - `agent/briefs/standard-caring.md` - `agent/briefs/standard-repository-layout.md` - `agent/briefs/standard-tagging.md` @@ -115,14 +120,18 @@ File count: **175** - `kernel/InfoTechCanonCore.md` - `kernel/InfoTechCanonKernelMap.md` - `mappings/README.md` +- `mappings/capability-anchors.yaml` - `mappings/purpose-demand-governance-candidates.yaml` - `models/access-control/InfoTechCanonAccessControlModel.md` - `models/capability/InfoTechCanonCapabilityModel.md` - `models/capability/capabilities.yaml` - `models/data/InfoTechCanonDataModel.md` +- `models/data/attribute-value-types-alignment.md` +- `models/data/attribute-value-types.yaml` - `models/devsecops/InfoTechCanonDevSecOpsModel.md` - `models/governance/InfoTechCanonGovernanceModel.md` - `models/governance/InfoTechCanonPurposeDemandExtension.md` +- `models/governance/evidence-basis.yaml` - `models/information-space/InfoTechCanonInformationSpaceModel.md` - `models/landscape/InfoTechCanonLandscapeModel.md` - `models/network/InfoTechCanonNetworkModel.md` @@ -130,6 +139,8 @@ File count: **175** - `models/organization/InfoTechCanonOrganizationModel.md` - `models/security/InfoTechCanonSecurityModel.md` - `models/task/InfoTechCanonTaskModel.md` +- `patterns/InterfaceDeprecationStrangler.md` +- `patterns/PracticePatternScheme.md` - `patterns/README.md` - `patterns/intent-scope-purposes.md` - `profiles/README.md` @@ -153,10 +164,14 @@ File count: **175** - `schemas/agent-brief.schema.yaml` - `schemas/alignment-review.schema.yaml` - `schemas/assimilation.schema.yaml` +- `schemas/attribute-value-type.schema.yaml` +- `schemas/capability-record.schema.yaml` +- `schemas/capability.schema.yaml` - `schemas/concept.schema.yaml` - `schemas/index.yaml` - `schemas/interface-card.schema.yaml` - `schemas/mapping.schema.yaml` +- `schemas/practice-pattern.schema.yaml` - `schemas/profile.schema.yaml` - `schemas/standard.schema.yaml` - `schemas/workplan.schema.yaml` diff --git a/src/info_tech_canon/generation.py b/src/info_tech_canon/generation.py index 8834380..66f1fbe 100644 --- a/src/info_tech_canon/generation.py +++ b/src/info_tech_canon/generation.py @@ -39,6 +39,8 @@ RETRIEVAL_ARTIFACT_KINDS = { "model-selection-guide", "native-concept-map", "pattern", + "practice-pattern", + "practice-pattern-scheme", "profile-alignment", "profile", "standard", @@ -46,6 +48,14 @@ RETRIEVAL_ARTIFACT_KINDS = { } CONSUMER_BRIEF_IDS = ("user-engine", "railiance-fabric", "repo-scoping") COMMON_DISTINCTIONS = [ + { + "id": "interface-deprecation-retirement-removal", + "title": "Interface deprecation vs retirement vs removal", + "summary": "Deprecation guides and observes callers, retirement ends legacy behavior while retaining a metered tombstone, and removal deletes that tombstone only after the evidence gate passes.", + "source_artifacts": [ + "practice-pattern/interface-deprecation-strangler", + ], + }, { "id": "actor-subject-principal", "title": "Actor vs Subject vs Principal", @@ -934,6 +944,10 @@ def _summary_for_artifact(artifact: Any) -> str: return f"Native source concept map for assimilation or benchmark work: {artifact.title}." if artifact.kind == "pattern": return f"Reusable canon pattern: {artifact.title}." + if artifact.kind == "practice-pattern": + return f"Reusable canon PracticePattern: {artifact.title}." + if artifact.kind == "practice-pattern-scheme": + return f"Contract for canon PracticePattern artifacts: {artifact.title}." if artifact.kind == "profile-alignment": return f"Profile-specific evaluation alignment artifact: {artifact.title}." if artifact.kind == "visualization-example-set": diff --git a/src/info_tech_canon/validation.py b/src/info_tech_canon/validation.py index 7ba760c..745eddb 100644 --- a/src/info_tech_canon/validation.py +++ b/src/info_tech_canon/validation.py @@ -1,6 +1,7 @@ from __future__ import annotations from pathlib import Path +import re from typing import Any import yaml @@ -54,6 +55,7 @@ REQUIRED_SCHEMAS = ( "capability.schema.yaml", "capability-record.schema.yaml", "attribute-value-type.schema.yaml", + "practice-pattern.schema.yaml", ) RETRIEVAL_BRIEF_KINDS = { @@ -85,6 +87,8 @@ RETRIEVAL_BRIEF_KINDS = { "model-selection-guide", "native-concept-map", "pattern", + "practice-pattern", + "practice-pattern-scheme", "profile-alignment", "profile", "standard", @@ -348,6 +352,43 @@ ALIGNMENT_REVIEW_TEMPLATE_MARKERS = { "## Canon Feedback", } +PRACTICE_PATTERN_REQUIRED_FRONTMATTER = { + "id", + "title", + "type", + "scheme", + "status", + "version", + "summary", +} + +PRACTICE_PATTERN_STATUSES = { + "draft", + "candidate", + "active", + "deprecated", + "retired", +} + +PRACTICE_PATTERN_REQUIRED_HEADINGS = { + "## Intent", + "## Context", + "## Problem", + "## Forces", + "## Solution", + "## Dynamics", + "## Invariants", + "## Evidence", + "## Consequences", + "## Known Uses", +} + +PRACTICE_PATTERN_ID_RE = re.compile( + r"^practice-pattern/[a-z0-9]+(?:-[a-z0-9]+)*$" +) +PRACTICE_PATTERN_TITLE_RE = re.compile(r"^[A-Z][A-Za-z0-9]*$") +PRACTICE_PATTERN_VERSION_RE = re.compile(r"^[0-9]+\.[0-9]+(?:\.[0-9]+)?$") + def structural_checks(context: Any) -> dict[str, list[dict[str, Any]]]: errors: list[dict[str, Any]] = [] @@ -359,6 +400,11 @@ def structural_checks(context: Any) -> dict[str, list[dict[str, Any]]]: _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_practice_pattern_assets( + context.infospace_root, + context.infospace.artifacts, + errors, + ) _check_agent_assets(context.infospace_root, context.infospace.artifacts, errors) _check_purpose_demand_assets(context.infospace_root, context.infospace.artifacts, errors) _check_user_engine_evaluation_assets( @@ -391,6 +437,140 @@ def structural_checks(context: Any) -> dict[str, list[dict[str, Any]]]: return {"errors": errors, "warnings": warnings} +def _check_practice_pattern_assets( + infospace_root: Path, + artifacts: list[Any], + errors: list[dict[str, Any]], +) -> None: + for artifact in artifacts: + if artifact.kind != "practice-pattern": + continue + + path = infospace_root / artifact.path + frontmatter = _read_markdown_frontmatter(path, errors) + missing_fields = sorted( + PRACTICE_PATTERN_REQUIRED_FRONTMATTER - set(frontmatter) + ) + if missing_fields: + errors.append( + { + "code": "practice_pattern_missing_frontmatter", + "artifact_id": artifact.id, + "path": artifact.path, + "fields": missing_fields, + } + ) + + expected = { + "id": artifact.id, + "title": artifact.title, + "type": "practice-pattern", + "scheme": "practice-pattern/0.1", + } + for field, value in expected.items(): + if frontmatter.get(field) != value: + errors.append( + { + "code": "practice_pattern_frontmatter_mismatch", + "artifact_id": artifact.id, + "path": artifact.path, + "field": field, + "expected": value, + "actual": frontmatter.get(field), + } + ) + + status = frontmatter.get("status") + if status not in PRACTICE_PATTERN_STATUSES: + errors.append( + { + "code": "practice_pattern_invalid_status", + "artifact_id": artifact.id, + "path": artifact.path, + "status": status, + } + ) + + scalar_contracts = ( + ("id", PRACTICE_PATTERN_ID_RE), + ("title", PRACTICE_PATTERN_TITLE_RE), + ("version", PRACTICE_PATTERN_VERSION_RE), + ) + for field, pattern in scalar_contracts: + value = frontmatter.get(field) + if not isinstance(value, str) or pattern.fullmatch(value) is None: + errors.append( + { + "code": "practice_pattern_invalid_frontmatter_value", + "artifact_id": artifact.id, + "path": artifact.path, + "field": field, + "value": value, + } + ) + + summary = frontmatter.get("summary") + if not isinstance(summary, str) or not summary.strip(): + errors.append( + { + "code": "practice_pattern_invalid_frontmatter_value", + "artifact_id": artifact.id, + "path": artifact.path, + "field": "summary", + "value": summary, + } + ) + + for field in ("aliases", "uses", "related_patterns", "known_uses"): + value = frontmatter.get(field, []) + if not isinstance(value, list) or not all( + isinstance(item, str) for item in value + ): + errors.append( + { + "code": "practice_pattern_invalid_frontmatter_value", + "artifact_id": artifact.id, + "path": artifact.path, + "field": field, + "value": value, + } + ) + + related_patterns = frontmatter.get("related_patterns", []) + if isinstance(related_patterns, list): + for related in related_patterns: + if isinstance(related, str) and not related.startswith( + "practice-pattern/" + ): + errors.append( + { + "code": "practice_pattern_invalid_related_pattern", + "artifact_id": artifact.id, + "path": artifact.path, + "value": related, + } + ) + + try: + headings = { + line.strip() + for line in path.read_text(encoding="utf-8").splitlines() + if line.startswith("## ") + } + except FileNotFoundError: + continue + missing_headings = sorted(PRACTICE_PATTERN_REQUIRED_HEADINGS - headings) + if missing_headings: + errors.append( + { + "code": "practice_pattern_missing_sections", + "artifact_id": artifact.id, + "path": artifact.path, + "headings": missing_headings, + } + ) + + def _check_required_top_level_files( repo_root: Path, errors: list[dict[str, Any]], diff --git a/tests/test_cli.py b/tests/test_cli.py index 0f1eeb9..47a1b75 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"] == 68 + assert payload["infospace"]["artifact_count"] == 70 def test_cli_missing_profile_uses_structured_error(capsys) -> None: diff --git a/tests/test_service.py b/tests/test_service.py index d67289c..7566575 100644 --- a/tests/test_service.py +++ b/tests/test_service.py @@ -5,6 +5,7 @@ from info_tech_canon.service import ( generate_indexes, generate_tree, inspect_canon, + list_artifacts, list_models, list_standards, profile_graph, @@ -24,7 +25,7 @@ def test_inspect_canon_counts_artifact_kinds() -> None: assert payload["ok"] is True assert payload["infospace"]["slug"] == "canon" - assert payload["infospace"]["artifact_count"] == 68 + assert payload["infospace"]["artifact_count"] == 70 assert payload["infospace"]["kinds"] == { "access-descriptor-set": 1, "alignment-review-kit": 1, @@ -58,6 +59,8 @@ def test_inspect_canon_counts_artifact_kinds() -> None: "native-concept-map": 1, "pattern": 1, "practice": 1, + "practice-pattern": 1, + "practice-pattern-scheme": 1, "profile-alignment": 1, "profile": 1, "profile-artifact": 13, @@ -96,17 +99,27 @@ def test_validate_canon_passes_scaffold() -> None: assert payload["ok"] is True assert payload["errors"] == [] assert "warnings" in payload - assert payload["details"]["artifact_count"] == 68 + assert payload["details"]["artifact_count"] == 70 def test_graph_exports_relationship_summary() -> None: payload = artifact_graph() assert payload["ok"] is True - assert payload["graph"]["node_count"] == 68 + assert payload["graph"]["node_count"] == 70 assert payload["graph"]["edge_count"] > 15 +def test_interface_deprecation_strangler_is_a_registered_practice_pattern() -> None: + payload = list_artifacts(kind="practice-pattern") + + assert payload["count"] == 1 + pattern = payload["artifacts"][0] + assert pattern["id"] == "practice-pattern/interface-deprecation-strangler" + assert pattern["title"] == "InterfaceDeprecationStrangler" + assert pattern["path"] == "patterns/InterfaceDeprecationStrangler.md" + + def test_capability_review_joins_a_minimal_record(tmp_path) -> None: record = { "record_id": "test", diff --git a/workplans/ITC-WP-0016-practice-pattern-language.md b/workplans/ITC-WP-0016-practice-pattern-language.md index 2dab5d2..f8868d7 100644 --- a/workplans/ITC-WP-0016-practice-pattern-language.md +++ b/workplans/ITC-WP-0016-practice-pattern-language.md @@ -5,7 +5,7 @@ title: "PracticePattern language and InterfaceDeprecationStrangler" domain: infotech topic_slug: canon repo: info-tech-canon -status: active +status: finished priority: high created: "2026-08-21" updated: "2026-08-21" @@ -33,7 +33,7 @@ Christopher Alexander's pattern-language method, seed it with the proven ```task id: ITC-WP-0016-T01 -status: progress +status: done priority: high state_hub_task_id: "4e581485-52cc-4de6-86ac-8876104df930" ``` @@ -47,7 +47,7 @@ canon validation for the contract. ```task id: ITC-WP-0016-T02 -status: todo +status: done priority: high state_hub_task_id: "f94abadb-26e1-49cf-bf0a-7d6b7bbe6b2e" ``` @@ -60,7 +60,7 @@ consequences, adoption checklist, and known use in State Hub. ```task id: ITC-WP-0016-T03 -status: todo +status: done priority: medium state_hub_task_id: "ca98c387-25f4-4493-9f83-1b91269ee584" ``` @@ -73,7 +73,7 @@ retrieve the named practice without relying on the originating repository. ```task id: ITC-WP-0016-T04 -status: todo +status: done priority: medium state_hub_task_id: "ff7e1e12-ada5-43ae-8a86-78419fff79ae" ``` @@ -84,11 +84,19 @@ artifact ID and path and the local adoption expectations. ## Acceptance -- [ ] PracticePattern Markdown artifacts have a documented and validated v0.1 scheme. -- [ ] `InterfaceDeprecationStrangler` is a registered, retrieval-visible canon artifact. -- [ ] The pattern distinguishes successful legacy traffic from attempted use of a retired interface. -- [ ] `arc-nexus` names the pattern and states how it applies locally. -- [ ] Canon validation and tests pass; both repositories are committed and synchronized. +- [x] PracticePattern Markdown artifacts have a documented and validated v0.1 scheme. +- [x] `InterfaceDeprecationStrangler` is a registered, retrieval-visible canon artifact. +- [x] The pattern distinguishes successful legacy traffic from attempted use of a retired interface. +- [x] `arc-nexus` names the pattern and states how it applies locally. +- [x] Canon validation and tests pass; both repositories are committed and synchronized. + +## Result + +Completed 2026-08-21. The canon now carries an Alexander-inspired +PracticePattern v0.1 Markdown scheme, a matching frontmatter schema and +structural validator, the active `InterfaceDeprecationStrangler` known use, and +generated graph, view, and agent-retrieval assets. `arc-nexus` adopted the +pattern by name and contract in commit `ff21e8a`. ## Out of scope