feat(ITC-WP-0016): establish PracticePattern language
All checks were successful
CI Smoke / host-smoke (push) Successful in 1s
CI Smoke / container-smoke (push) Successful in 1s

Assistant: codex
Assistant-Model: gpt-5.6-sol
Assistant-Session: 01a025c2-407a-7a32-b40a-f37a52f03f62
This commit is contained in:
tegwick 2026-08-21 22:22:46 +02:00
parent 5e2435aaf9
commit 149d2ced70
27 changed files with 1119 additions and 99 deletions

View file

@ -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
---
<!-- GENERATED by info_tech_canon; do not edit by hand. -->
# 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.

View file

@ -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
---
<!-- GENERATED by info_tech_canon; do not edit by hand. -->
# 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.

View file

@ -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.

View file

@ -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",

View file

@ -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`

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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:

View file

@ -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

View file

@ -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.

View file

@ -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/<kebab-case-name>`;
- `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.

View file

@ -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.

View file

@ -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

View file

@ -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

View file

@ -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,

View file

@ -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` |

View file

@ -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`

View file

@ -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` | | | | | | | | | | | | | | | | | | | | | | | | | | | |

View file

@ -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

View file

@ -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`

View file

@ -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":

View file

@ -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]],

View file

@ -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:

View file

@ -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",

View file

@ -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