diff --git a/.claude/ralph-loop.local.md b/.claude/ralph-loop.local.md new file mode 100644 index 0000000..6ccd020 --- /dev/null +++ b/.claude/ralph-loop.local.md @@ -0,0 +1,21 @@ +--- +active: true +iteration: 1 +session_id: +max_iterations: 20 +completion_promise: "HEUREKA" +workplan_id: REUSE-WP-0003 +workplan_file: /home/worsch/reuse-surface/workplans/REUSE-WP-0003-intent-scope-gap-closure.md +started_at: "2026-06-14T23:09:59Z" +--- + +Read the workplan at `/home/worsch/reuse-surface/workplans/REUSE-WP-0003-intent-scope-gap-closure.md`. + +If every task has `status: done` AND frontmatter `status: done`: +run `rm -f .claude/ralph-loop.local.md` first (deactivates the loop so the stop hook exits cleanly), +then output HEUREKA. + +Otherwise implement the next `todo` task as described in the workplan. +Set task `in_progress` when starting, `done` when complete. +When all tasks are done set frontmatter `status: done`. + diff --git a/AGENTS.md b/AGENTS.md index 0875cb5..5dbb89b 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -103,29 +103,29 @@ curl -s -X PATCH "http://127.0.0.1:8000/tasks/" \ ## Local Developer Workflow -This repository is currently documentation-only. There is no package manifest, -runtime application, build system, executable test suite, or formatter/linter -configuration checked in. +The repository is primarily documentation-first with a small Python CLI for +registry validate, query, and export. There is no long-running service. ### Install -No install step is required for normal repository work. +```bash +python3 -m venv .venv +.venv/bin/pip install -e . +``` ### Build -No build step exists. Treat Markdown, YAML, and workplan edits as source +No separate build step. Treat Markdown, YAML, and workplan edits as source artifacts. ### Test / lint -There is no project test runner or markdown linter configured yet. Use these -checks before closing a change: - ```bash -# Confirm the repository file inventory still looks intentional -rg --files +# Registry validation (schema + index drift) +.venv/bin/reuse-surface validate -# Catch whitespace errors in tracked and staged diffs +# Repository hygiene +rg --files git diff --check ``` @@ -178,6 +178,10 @@ implementation reuse. # Fast discovery surface — read this first cat registry/indexes/capabilities.yaml +# CLI discovery and export +.venv/bin/reuse-surface query --discovery-min D4 +.venv/bin/reuse-surface export --format yaml + # Authoring template and schema cat templates/capability-entry.template.md cat schemas/capability.schema.yaml @@ -189,7 +193,7 @@ cat tools/README.md ### Query workflow -1. Read `registry/indexes/capabilities.yaml`. +1. Run `.venv/bin/reuse-surface query` with filters, or read the index directly. 2. Filter by `vector`, `tags`, `consumption_modes`, `domain`, or `summary`. 3. Open only matching files under `registry/capabilities/`. 4. Compare candidates using `discovery`, `external_evidence`, `availability`, @@ -205,7 +209,7 @@ cat tools/README.md `registry/capabilities/capability...md`. 3. Start at `D0 / A0 / C0 / R0` when evidence is minimal; keep gaps explicit. 4. Add the entry to `registry/indexes/capabilities.yaml`. -5. Run the manual validation checklist in `registry/README.md`. +5. Run `.venv/bin/reuse-surface validate`. ### Promote a capability @@ -225,7 +229,7 @@ cat tools/README.md | Identify current consumption mode | `availability` + index `consumption_modes` | | Record expectations and broken expectations | `external_evidence.completeness` | | Record reliability evidence | `external_evidence.reliability` | -| Search by maturity and availability | `indexes/capabilities.yaml` filters | +| Search by maturity and availability | `reuse-surface query` or index filters | | Compare candidates | entry vectors + relations + README guidance | | Avoid duplicate capabilities | index search before add | diff --git a/INTENT.md b/INTENT.md index d2f79d0..23b6e1a 100644 --- a/INTENT.md +++ b/INTENT.md @@ -205,10 +205,10 @@ maturity: external_evidence: completeness: - current: C1 + level: C1 confidence: low reliability: - current: R0 + level: R0 confidence: low discovery: @@ -239,28 +239,40 @@ evidence: ## Initial Repository Role -The initial role of `reuse-surface` is to define and maintain the capability registry model, standards, schemas, examples, and reference tooling. +The initial role of `reuse-surface` is to define and maintain the capability +registry model, standards, schemas, examples, and reference tooling. -Likely early repository contents: +Current repository layout (authoritative for delivery): ```text reuse-surface/ ├── INTENT.md -├── README.md -├── standards/ +├── SCOPE.md +├── AGENTS.md +├── specs/ +│ ├── ProductRequirementsDocument.md +│ ├── UseCaseCatalog.md │ └── CapabilityMaturityStandard.md -├── registry/ -│ ├── capabilities.yaml -│ └── examples/ ├── schemas/ -│ └── capability.schema.json +│ └── capability.schema.yaml +├── templates/ +│ └── capability-entry.template.md +├── registry/ +│ ├── README.md +│ ├── capabilities/ +│ └── indexes/ +│ └── capabilities.yaml ├── docs/ │ ├── CapabilityRegistryConcept.md -│ └── CapabilityAssessmentGuide.md +│ └── IntentScopeGapAnalysis.md └── tools/ └── README.md ``` +See `SCOPE.md` for what is possible now versus planned. See +`docs/IntentScopeGapAnalysis.md` for tracked gaps between intent and delivered +scope. + ## Success Criteria `reuse-surface` is successful when it helps humans and agents: diff --git a/SCOPE.md b/SCOPE.md index 1ef8466..e3e977a 100644 --- a/SCOPE.md +++ b/SCOPE.md @@ -14,13 +14,14 @@ for reuse within this product boundary. ## In Scope - Maintain the capability maturity model, standards, schemas, registry formats, - sample entries, indexes, validation guidance, and agent instructions. + sample entries, indexes, validation guidance, CLI tooling, and agent + instructions. - Keep `INTENT.md`, `specs/`, registry artifacts, and State Hub workplans aligned on the registry-first reuse boundary. - Support humans and agents as registry consumers through Markdown-first authoring and machine-readable metadata. - Record decisions, progress, and workplan status through State Hub. -- Verify changes with documentation review, `git diff --check`, and ADR-001 +- Verify changes with `reuse-surface validate`, `git diff --check`, and ADR-001 consistency checks. ## Out of Scope @@ -34,53 +35,47 @@ for reuse within this product boundary. ## What Is Possible Now -The MVP registry foundation is in place. Humans and agents can: +The MVP registry foundation plus CLI tooling (REUSE-WP-0003) is in place. Humans +and agents can: -- **Discover capabilities** via `registry/indexes/capabilities.yaml` +- **Discover capabilities** via `registry/indexes/capabilities.yaml` or + `reuse-surface query` - **Add a new capability** at D0/A0/C0/R0 using `templates/capability-entry.template.md` -- **Promote capabilities** by updating front matter with evidence-backed - discovery, availability, completeness, and reliability levels +- **Promote capabilities** with evidence, optional `promotion_history`, and index + vector updates - **Compare candidates** using maturity vectors, scope, relations, and consumer - guidance in entry files + guidance - **Record expectations** through `external_evidence.completeness` and - `external_evidence.reliability` fields -- **Validate entries manually** using the checklist in `registry/README.md` - against `schemas/capability.schema.yaml` -- **Avoid duplicates** by searching the index before creating new entries + `external_evidence.reliability` +- **Validate entries automatically** with `reuse-surface validate` +- **Export a machine-readable bundle** with `reuse-surface export` +- **Avoid duplicates** by querying the index before creating new entries -These workflows satisfy the MVP acceptance criteria in -`specs/ProductRequirementsDocument.md` section 16 through manual, Git-friendly -authoring. There is no CLI, API, or automated validator yet. +Registry tooling availability is **A3** (CLI). The registry product itself is +still documentation-first for authoring; consumption combines Markdown entries, +the index, and CLI automation. ## What Is Not Possible Yet -- Automated schema validation or registry export -- CLI query/filter commands - Generated human-readable catalog site - Capability graph visualization -- Promotion history tracking or review workflows in tooling +- Automated duplicate/overlap detection - Federation across repositories or organizations +- CI integration or packaged releases beyond local `pip install -e .` -See `tools/README.md` for planned tooling that remains out of scope for the -current MVP. +See `tools/README.md` for command reference. ## Current State -- Status: active MVP registry (documentation-only, A0 availability). -- The repository has no package manifest, build system, runtime app, or - executable test suite. Registry consumption is informational: read, author, - compare, and plan. -- Three sample capabilities are registered in `registry/capabilities/`: - - `capability.registry.register` — D3 / A0 / C1 / R0 - - `capability.feature-control.evaluate` — D5 / A4 / C3 / R3 - - `capability.identity.vocabulary-canonicalize` — D4 / A0 / C2 / R0 -- `specs/` holds the product requirements, use case catalog, and maturity - standard. `schemas/`, `templates/`, `registry/`, and `tools/` hold the - registry authoring and validation surfaces. -- Bootstrap work (`REUSE-WP-0001`) and MVP registry foundation - (`REUSE-WP-0002`) are finished. The next work should expand registry coverage, - tighten validation, or add CLI tooling through new workplans. +- Status: active MVP registry with CLI tooling. +- Six helix_forge capabilities are registered in `registry/capabilities/`. +- `reuse-surface` CLI provides `validate`, `query`, and `export` via + `pyproject.toml` and `reuse_surface/`. +- `docs/CapabilityRegistryConcept.md` and `docs/IntentScopeGapAnalysis.md` + document onboarding and intent-scope tracking. +- Finished workplans: `REUSE-WP-0001`, `REUSE-WP-0002`, `REUSE-WP-0003`. +- **Self-assessed vector:** `D5 / A3 / C4 / R2` (see gap analysis). ## Repository Layout @@ -89,32 +84,27 @@ reuse-surface/ ├── INTENT.md ├── SCOPE.md ├── AGENTS.md +├── pyproject.toml +├── reuse_surface/ ├── specs/ -│ ├── ProductRequirementsDocument.md -│ ├── UseCaseCatalog.md -│ └── CapabilityMaturityStandard.md ├── schemas/ -│ └── capability.schema.yaml ├── templates/ -│ └── capability-entry.template.md ├── registry/ -│ ├── README.md -│ ├── capabilities/ -│ └── indexes/ -│ └── capabilities.yaml +├── docs/ ├── tools/ -│ └── README.md └── workplans/ ``` ## Getting Oriented - Start with: INTENT.md +- Registry concept: docs/CapabilityRegistryConcept.md - Intent vs scope gaps: docs/IntentScopeGapAnalysis.md - Product requirements: specs/ProductRequirementsDocument.md - Use cases: specs/UseCaseCatalog.md - Maturity standard: specs/CapabilityMaturityStandard.md - Registry index: registry/indexes/capabilities.yaml - Registry guidance: registry/README.md +- CLI reference: tools/README.md - Agent instructions: AGENTS.md - Workplans: workplans/ \ No newline at end of file diff --git a/docs/CapabilityRegistryConcept.md b/docs/CapabilityRegistryConcept.md new file mode 100644 index 0000000..bfb43a2 --- /dev/null +++ b/docs/CapabilityRegistryConcept.md @@ -0,0 +1,129 @@ +# Capability Registry Concept + +**Repository:** `reuse-surface` +**Audience:** Humans onboarding to the registry +**Companion docs:** `INTENT.md`, `SCOPE.md`, `specs/CapabilityMaturityStandard.md` + +--- + +## 1. What problem this solves + +Reusable capabilities are often scattered across repositories, documents, +prototypes, and services. Without a registry, teams and agents rediscover, +duplicate, and inconsistently assess the same behaviors. + +`reuse-surface` makes capabilities **visible**, **comparable**, and **reusable** +for planning and implementation through a registry-first reuse layer. + +> A capability that is not registered is invisible for registry-driven reuse. + +--- + +## 2. Core principles + +### Registry first + +The registry is the boundary of practical reuse awareness. Analysis starts with +what is registered, not with everything that might exist informally. + +### Reuse over inventory + +The goal is capability reuse, not a complete inventory of all work products. + +### Planning and implementation are different + +- **Planning reuse** feeds primarily on **Discovery** maturity (D0–D7). +- **Implementation reuse** feeds primarily on **Availability** maturity (A0–A7). + +A capability may be well researched (D5) but only informational (A0). Another +may be deployable (A4) but weakly bounded (D2). Compare both dimensions. + +### Internal and external evidence stay separate + +| Type | Dimensions | Question | +|---|---|---| +| Internal registry assessment | Discovery, Availability | How reusable is it for planning? How consumable is it? | +| External consumer evidence | Completeness, Reliability | Does scope satisfy intent? Does it behave well in use? | + +Do not treat availability as reliability, or research depth as completeness. + +--- + +## 3. Maturity vector + +A compact summary: + +```text +D5 / A4 / C3 / R3 +``` + +Vectors are descriptive, not grades. A research vocabulary capability may +naturally target `D5 / A0 / C4 / R3`. A CLI tool may target `D5 / A3 / C5 / R5`. + +Canonical level definitions: `specs/CapabilityMaturityStandard.md`. + +--- + +## 4. How the artifacts fit together + +```text +templates/capability-entry.template.md → authoring starting point +registry/capabilities/*.md → canonical entries (YAML front matter) +registry/indexes/capabilities.yaml → fast discovery index for agents +schemas/capability.schema.yaml → machine-readable entry contract +registry/README.md → validation and search guidance +tools/ → CLI validate, query, export +``` + +**Authoring flow** + +1. Search the index for overlap. +2. Copy the template to `registry/capabilities/`. +3. Fill maturity and evidence fields explicitly. +4. Add an index row. +5. Validate with `reuse-surface validate`. + +**Consumption flow** + +1. Read `registry/indexes/capabilities.yaml`. +2. Filter by vector, tags, or consumption mode. +3. Open candidate entry files for scope, relations, and guidance. +4. Prefer planning reuse at D3+ and implementation reuse at A2+. + +--- + +## 5. What is manual vs automated today + +See `SCOPE.md` for the live boundary. In summary: + +| Activity | Mode | +|---|---| +| Discover capabilities | Index + `reuse-surface query` | +| Add or promote entries | Markdown authoring + index update | +| Validate shape | `reuse-surface validate` | +| Export for agents | `reuse-surface export` | +| Promotion history | Optional `promotion_history` in entries | +| Graph visualization, federation, CI gates | Not yet available | + +--- + +## 6. When to register a capability + +Register when a bounded reusable behavior should be: + +- discoverable for roadmap or architecture planning +- comparable to adjacent capabilities +- consumable through known artifacts (now or later) +- assessed with explicit evidence over time + +Do not register one-off features, tickets, or internal code modules unless they +represent a reusable capability boundary. + +--- + +## 7. Further reading + +- Product requirements: `specs/ProductRequirementsDocument.md` +- Use cases: `specs/UseCaseCatalog.md` +- Intent vs delivered scope: `docs/IntentScopeGapAnalysis.md` +- Agent workflows: `AGENTS.md` \ No newline at end of file diff --git a/docs/IntentScopeGapAnalysis.md b/docs/IntentScopeGapAnalysis.md index 388dfc9..27e3195 100644 --- a/docs/IntentScopeGapAnalysis.md +++ b/docs/IntentScopeGapAnalysis.md @@ -13,25 +13,21 @@ current delivered scope so future workplans can close them deliberately. `INTENT.md` describes the long-term capability registry product: a reuse surface that makes capabilities visible, assessable, and consumable across planning and -implementation. `SCOPE.md` describes what the repository actually delivers today: -an MVP registry foundation at **A0 availability** with manual, Markdown-first -workflows. +implementation. `SCOPE.md` describes what the repository actually delivers today: an MVP registry +with **A3 CLI tooling** (`validate`, `query`, `export`) atop Markdown-first +authoring. The two documents are **directionally aligned** on registry-first reuse, four -maturity dimensions, and human/agent consumers. The main gaps are: +maturity dimensions, and human/agent consumers. REUSE-WP-0003 closed the +priority gaps from section 8. Remaining gaps are primarily scale, automation, +and presentation concerns: -1. **Delivery depth** — INTENT promises eventual technical foundation and broad - planning/implementation support; SCOPE delivers informational tooling only. -2. **Structural drift** — INTENT's expected repository layout and entry shape - differ from the implemented layout and schema in small but important ways. -3. **Evidence and operations** — INTENT emphasizes consumer evidence and - progress tracking; SCOPE has no reliability evidence, promotion history, or - automated validation yet. -4. **Document cross-coverage** — SCOPE operationalizes State Hub, MVP acceptance - criteria, and helix_forge domain context that INTENT does not mention; INTENT - carries success criteria and conceptual depth that SCOPE does not restate. +1. **Planning analytics** — no gap reports, overlap detection, or catalog site. +2. **Reliability depth** — registry product dogfood evidence is early (R2). +3. **Document cross-coverage** — SCOPE still carries operational detail INTENT + omits; INTENT success criteria are not fully enumerated in SCOPE. -**Current reuse-surface vector (self-assessment):** `D4 / A0 / C3 / R0` +**Current reuse-surface vector (self-assessment):** `D5 / A3 / C4 / R2` --- @@ -256,18 +252,25 @@ own evidence (e.g. feature-control at R3). ## 8. Priority Gap Closure Order -Recommended sequence for future workplans: +| Priority | Gap | Outcome | Status | +|---|---|---|---| +| 1 | INTENT layout stale | INTENT layout aligned to delivered structure | Closed (WP-0003) | +| 2 | No automated validation | `reuse-surface validate` | Closed (WP-0003) | +| 3 | Thin registry coverage | Six helix_forge entries | Closed (WP-0003) | +| 4 | Missing concept docs | `docs/CapabilityRegistryConcept.md` | Closed (WP-0003) | +| 5 | No promotion history | `promotion_history` in schema/template | Closed (WP-0003) | +| 6 | Search/filter manual only | `reuse-surface query` | Closed (WP-0003) | +| 7 | No registry export | `reuse-surface export` | Closed (WP-0003) | +| 8 | Self-reliability evidence | `capability.registry.register` at R2; friction recorded | Closed (WP-0003) | + +### Next recommended work | Priority | Gap | Suggested outcome | |---|---|---| -| 1 | INTENT layout stale | Update INTENT "Initial Repository Role" to match `SCOPE.md` layout | -| 2 | No automated validation | CLI or script: validate entries against schema | -| 3 | Thin registry coverage | Register additional helix_forge capabilities beyond 3 samples | -| 4 | Missing concept docs | Add `docs/CapabilityRegistryConcept.md` distilled from INTENT | -| 5 | No promotion history | Add `promotion_history` to schema or separate changelog | -| 6 | Search/filter manual only | CLI `query` with discovery/availability filters | -| 7 | No registry export | YAML/JSON bundle export for agents (UC-RS-019) | -| 8 | Self-reliability evidence | Dogfood registry; record friction as reliability evidence | +| 9 | Catalog site | Static browsable capability catalog (UC-RS-018) | +| 10 | Overlap detection | CLI or report for duplicate/overlapping capabilities | +| 11 | CI validation | Run `reuse-surface validate` in CI on registry changes | +| 12 | Registry federation | Cross-repo capability index composition | --- @@ -285,4 +288,5 @@ Recommended sequence for future workplans: | Date | Change | |---|---| -| 2026-06-15 | Initial analysis after REUSE-WP-0002 completion | \ No newline at end of file +| 2026-06-15 | Initial analysis after REUSE-WP-0002 completion | +| 2026-06-15 | REUSE-WP-0003 closed priority gaps 1–8; vector updated to D5/A3/C4/R2 | \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..9d5128e --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,21 @@ +[build-system] +requires = ["setuptools>=68"] +build-backend = "setuptools.build_meta" + +[project] +name = "reuse-surface" +version = "0.1.0" +description = "Capability registry tooling for reuse-surface" +readme = "README.md" +requires-python = ">=3.11" +dependencies = [ + "jsonschema>=4.0", + "pyyaml>=6.0", +] + +[project.scripts] +reuse-surface = "reuse_surface.cli:main" + +[tool.setuptools.packages.find] +where = ["."] +include = ["reuse_surface*"] \ No newline at end of file diff --git a/registry/README.md b/registry/README.md index afd59b2..3a10ac1 100644 --- a/registry/README.md +++ b/registry/README.md @@ -74,7 +74,8 @@ Definitions live in `specs/CapabilityMaturityStandard.md`. ### UC-RS-004 — Search by planning need -1. Read `indexes/capabilities.yaml` and scan `summary`, `tags`, and `vector`. +1. Run `reuse-surface query --discovery-min D4` or read the index and scan + `summary`, `tags`, and `vector`. 2. Open candidate entries and review `discovery.intent`, `discovery.use_cases`, and `discovery.includes`. 3. Prefer entries with discovery `D3+` for roadmap work and `D5+` for MVP @@ -131,6 +132,8 @@ or `generalizes` rather than creating silent duplicates. 1. Attach evidence appropriate to the target level in `specs/CapabilityMaturityStandard.md`. 2. Update `maturity` and/or `external_evidence` with rationale and confidence. -3. Update `availability.current_artifacts` when a new consumption mode appears. -4. Refresh the index `vector` and run the validation checklist. -5. Set `status: reviewed` or `approved` when an assessor validates the entry. \ No newline at end of file +3. Append a `promotion_history` record with `date`, `dimension`, `from`, `to`, + and `rationale` (optional `author`). +4. Update `availability.current_artifacts` when a new consumption mode appears. +5. Refresh the index `vector` and run `reuse-surface validate`. +6. Set `status: reviewed` or `approved` when an assessor validates the entry. \ No newline at end of file diff --git a/registry/capabilities/capability.feature-control.rollout.md b/registry/capabilities/capability.feature-control.rollout.md new file mode 100644 index 0000000..61bc303 --- /dev/null +++ b/registry/capabilities/capability.feature-control.rollout.md @@ -0,0 +1,111 @@ +--- +id: capability.feature-control.rollout +name: Feature Rollout Control +summary: Gradually expose features to subjects across tenants, domains, groups, or cohorts using rollout rules and staged availability. +owner: feature-control +status: draft +domain: helix_forge +tags: + - feature-control + - rollout + - planning + +maturity: + discovery: + current: D4 + target: D6 + confidence: medium + rationale: > + Rollout is a distinct bounded behavior from single-point evaluation, with + research references in the feature-control domain and maturity standard. + availability: + current: A2 + target: A4 + confidence: low + rationale: > + Rollout logic may exist in source modules but is not yet consistently + exposed as a standalone SDK or API surface distinct from evaluate. + +external_evidence: + completeness: + level: C2 + name: Partial + confidence: low + basis: scope_vs_intent_and_consumer_expectations + satisfied_expectations: + - rollout concepts documented adjacent to feature evaluation + broken_expectations: + - no dedicated rollout artifact called out separately from evaluate + - percentage and cohort rollout variants not indexed independently + out_of_scope_expectations: + - billing-driven entitlements + reliability: + level: R1 + name: Fragile + confidence: low + basis: consumer_quality_signals + known_reliability_risks: + - rollout behavior may be conflated with evaluate in consumer mental models + +discovery: + intent: > + Control how features become available over time and across cohorts without + conflating rollout policy with authorization or billing. + includes: + - staged rollout rules + - cohort and context targeting for rollout + - explainable rollout state + excludes: + - one-time feature evaluation only + - authorization decisions + - billing entitlements + assumptions: + - feature evaluation capability exists for final availability decisions + use_cases: + - ucc.feature-control.domain-rollout + research_memos: + - specs/CapabilityMaturityStandard.md + +availability: + current_level: A2 + target_level: A4 + current_artifacts: + - feature-control/packages/feature-control-sdk + target_artifacts: + - feature-control/services/feature-control-api + consumption_modes: + - source module + - SDK + +relations: + depends_on: + - capability.feature-control.evaluate + supports: [] + related_to: + - capability.feature-control.visibility + +evidence: + documentation: + - specs/CapabilityMaturityStandard.md + tests: [] + consumer_feedback: [] + bug_reports: [] + incidents: [] + +consumer_guidance: + recommended_for: + - planning staged feature exposure separate from binary evaluation + not_recommended_for: + - simple on/off evaluation without rollout semantics + - entitlement or billing ownership + known_limitations: + - distinguish carefully from capability.feature-control.evaluate +--- + +# Feature Rollout Control + +## Overview + +Rollout governs how availability changes over time and across cohorts. It +complements evaluation, which answers whether a feature is available for a +subject in a context right now. \ No newline at end of file diff --git a/registry/capabilities/capability.identity.subject-resolution.md b/registry/capabilities/capability.identity.subject-resolution.md new file mode 100644 index 0000000..c4afcad --- /dev/null +++ b/registry/capabilities/capability.identity.subject-resolution.md @@ -0,0 +1,115 @@ +--- +id: capability.identity.subject-resolution +name: Identity Subject Resolution +summary: Resolve who or what is acting in a context by mapping principals, accounts, actors, and identifiers to a stable subject model. +owner: identity-canon +status: draft +domain: helix_forge +tags: + - identity + - subject + - architecture + +maturity: + discovery: + current: D3 + target: D5 + confidence: medium + rationale: > + Subject/principal terminology is explored in identity-canon conflict maps + and conceptual model, but dedicated use-case grounding is incomplete. + availability: + current: A0 + target: A4 + confidence: low + rationale: > + Canon and research artifacts exist; no standalone resolver service or SDK + is registered yet. + +external_evidence: + completeness: + level: C1 + name: Fragmentary + confidence: low + basis: scope_vs_intent_and_consumer_expectations + satisfied_expectations: + - overloaded subject and principal terms are mapped as candidates + broken_expectations: + - no runtime resolver artifact + - canonical subject model not finalized across all actor types + out_of_scope_expectations: + - authentication protocol implementation + - credential storage + reliability: + level: R0 + confidence: low + basis: consumer_quality_signals + known_reliability_risks: + - draft terminology may change during source-note backfill + +discovery: + intent: > + Give planners and implementers a consistent subject concept for authorization, + feature control, tenancy, and agent workflows without collapsing product-specific + identity models. + includes: + - subject vs principal vs account distinctions + - actor type modeling + - identifier resolution concepts + excludes: + - authentication execution + - credential issuance + - directory provisioning + assumptions: + - vocabulary canonicalization supports but does not replace subject resolution + use_cases: + - UC-RS-004 + research_memos: + - identity-canon/terminology/TerminologyConflictMap.md + - identity-canon/model/ConceptualModel.md + +availability: + current_level: A0 + target_level: A4 + current_artifacts: + - identity-canon/model/ConceptualModel.md + - identity-canon/canon/CanonicalGlossary.md + target_artifacts: + - identity-canon/packages/subject-resolution-sdk + consumption_modes: + - informational + +relations: + depends_on: + - capability.identity.vocabulary-canonicalize + supports: + - capability.feature-control.evaluate + - capability.statehub.workstream-coordinate + related_to: [] + +evidence: + documentation: + - identity-canon/canon/CanonicalGlossary.md + - identity-canon/scenarios/ScenarioTests.md + tests: [] + consumer_feedback: [] + bug_reports: [] + incidents: [] + +consumer_guidance: + recommended_for: + - architecture planning where subject/principal/account terms overlap + not_recommended_for: + - runtime authentication or token validation + - treating draft canon as finalized resolver behavior + known_limitations: + - resolver artifacts are not yet available +--- + +# Identity Subject Resolution + +## Overview + +Subject resolution defines how actors and identifiers map to a stable subject +concept for downstream capabilities such as feature evaluation and coordination. +Today this capability is planning-heavy (D3/A0). \ No newline at end of file diff --git a/registry/capabilities/capability.registry.register.md b/registry/capabilities/capability.registry.register.md index 6893b75..a567529 100644 --- a/registry/capabilities/capability.registry.register.md +++ b/registry/capabilities/capability.registry.register.md @@ -20,34 +20,38 @@ maturity: registry model is bounded in INTENT.md, but concrete promotion workflows are not yet grounded in registry artifacts. availability: - current: A0 + current: A3 target: A3 confidence: medium rationale: > - Registration is currently manual through Markdown entries and the index. - A CLI validator/query tool would raise availability to A3. + Registration and maintenance are automatable through the reuse-surface CLI + for validate, query, and export workflows. external_evidence: completeness: - level: C1 - name: Fragmentary - confidence: low + level: C2 + name: Partial + confidence: medium basis: scope_vs_intent_and_consumer_expectations satisfied_expectations: - capability IDs can be assigned in registry entries - maturity vectors can be recorded at registration time + - CLI validate, query, and export support registry workflows + - promotion history can be recorded in entries broken_expectations: - no automated duplicate detection yet - - no promotion history tracking yet out_of_scope_expectations: - hosting registered capabilities - enforcing implementation architecture reliability: - level: R0 - confidence: low + level: R2 + name: Tolerable + confidence: medium basis: consumer_quality_signals known_reliability_risks: - - registry consistency depends on manual index maintenance + - index drift still possible if authors skip validate + - CLI requires local venv install + - schema ID pattern required a fix during WP-0003 dogfooding discovery: intent: > @@ -72,17 +76,17 @@ discovery: - specs/ProductRequirementsDocument.md availability: - current_level: A0 + current_level: A3 target_level: A3 current_artifacts: - templates/capability-entry.template.md - registry/indexes/capabilities.yaml - target_artifacts: - - tools/validate-registry - - tools/query-registry + - reuse_surface/cli.py + target_artifacts: [] consumption_modes: - informational - markdown authoring + - cli relations: depends_on: [] @@ -111,6 +115,26 @@ consumer_guidance: known_limitations: - manual index updates are required after adding an entry - duplicate detection is guidance-only in the MVP + +promotion_history: + - date: "2026-06-14" + dimension: discovery + from: D0 + to: D1 + rationale: Added name, summary, and registry-first intent from INTENT.md. + author: reuse-surface + - date: "2026-06-15" + dimension: discovery + from: D1 + to: D3 + rationale: Bounded scope with UC-RS-001 and MVP registry artifacts in specs/. + author: reuse-surface + - date: "2026-06-15" + dimension: availability + from: A0 + to: A3 + rationale: reuse-surface CLI shipped validate, query, and export commands. + author: reuse-surface --- # Capability Registration diff --git a/registry/capabilities/capability.statehub.workstream-coordinate.md b/registry/capabilities/capability.statehub.workstream-coordinate.md new file mode 100644 index 0000000..1966a50 --- /dev/null +++ b/registry/capabilities/capability.statehub.workstream-coordinate.md @@ -0,0 +1,117 @@ +--- +id: capability.statehub.workstream-coordinate +name: Workstream And Task Coordination +summary: Track active workstreams, tasks, progress, and consistency across domain repositories through a local-first coordination service. +owner: state-hub +status: draft +domain: helix_forge +tags: + - state-hub + - coordination + - workplans + +maturity: + discovery: + current: D4 + target: D5 + confidence: medium + rationale: > + State Hub intent, scope, and ADR-001 workplan conventions are documented; + concrete agent workflows are still being standardized across repos. + availability: + current: A4 + target: A6 + confidence: medium + rationale: > + Consumers integrate through the State Hub HTTP API and custodian scripts. + Managed platform operation is the natural target for multi-repo agents. + +external_evidence: + completeness: + level: C3 + name: Functional Core + confidence: medium + basis: scope_vs_intent_and_consumer_expectations + satisfied_expectations: + - workstream and task tracking via HTTP API + - workplan file to database consistency sync + - progress event logging + broken_expectations: + - no native MCP server for all agent environments + out_of_scope_expectations: + - replacing git-backed workplan canon + - identity authority + reliability: + level: R2 + name: Tolerable + confidence: low + basis: consumer_quality_signals + known_reliability_risks: + - depends on local hub availability and operator maintenance + +discovery: + intent: > + Give agents and operators a live, queryable memory of work across domains + without replacing file-backed workplans and governance canon. + includes: + - workstream and task indexing + - progress and decision events + - repo consistency synchronization + - inbox and human-review flags + excludes: + - canon ownership + - task factory for all work origins + - identity authority + assumptions: + - workplans remain authoritative in git for ADR-001 repos + use_cases: + - UC-RS-013 + research_memos: + - state-hub/INTENT.md + +availability: + current_level: A4 + target_level: A6 + current_artifacts: + - state-hub/api/ + - state-hub/scripts/consistency_check.py + target_artifacts: + - state-hub/platform/state-hub-service + consumption_modes: + - service API + - HTTP REST + +relations: + depends_on: [] + supports: + - capability.registry.register + related_to: + - capability.statehub.progress-log + +evidence: + documentation: + - state-hub/INTENT.md + - state-hub/AGENTS.md + tests: [] + consumer_feedback: [] + bug_reports: [] + incidents: [] + +consumer_guidance: + recommended_for: + - cross-repo agent orientation and task status sync + - logging progress after workplan changes + not_recommended_for: + - storing canonical requirements or architecture canon + - assuming hub state overrides git workplan files + known_limitations: + - requires running State Hub locally or via tunnel +--- + +# Workstream And Task Coordination + +## Overview + +State Hub provides live coordination for helix_forge repositories while +workplans remain file-backed. This entry represents the service/API consumption +mode for cross-repo agent work. \ No newline at end of file diff --git a/registry/indexes/capabilities.yaml b/registry/indexes/capabilities.yaml index 82aded8..adfa467 100644 --- a/registry/indexes/capabilities.yaml +++ b/registry/indexes/capabilities.yaml @@ -7,13 +7,13 @@ capabilities: - id: capability.registry.register name: Capability Registration summary: Register a new capability so it becomes visible for planning and implementation reuse. - vector: D3 / A0 / C1 / R0 + vector: D3 / A3 / C2 / R2 domain: helix_forge status: draft owner: reuse-surface path: registry/capabilities/capability.registry.register.md tags: [registry, governance, meta] - consumption_modes: [informational, markdown authoring] + consumption_modes: [informational, markdown authoring, cli] - id: capability.feature-control.evaluate name: Feature Availability Evaluation @@ -26,6 +26,17 @@ capabilities: tags: [feature-control, evaluation, sdk] consumption_modes: [SDK, service API] + - id: capability.feature-control.rollout + name: Feature Rollout Control + summary: Gradually expose features to subjects across tenants, domains, groups, or cohorts using rollout rules and staged availability. + vector: D4 / A2 / C2 / R1 + domain: helix_forge + status: draft + owner: feature-control + path: registry/capabilities/capability.feature-control.rollout.md + tags: [feature-control, rollout, planning] + consumption_modes: [source module, SDK] + - id: capability.identity.vocabulary-canonicalize name: Identity Vocabulary Canonicalization summary: Define and maintain an implementation-neutral vocabulary for identity-related concepts across overlapping domains. @@ -35,4 +46,26 @@ capabilities: owner: identity-canon path: registry/capabilities/capability.identity.vocabulary-canonicalize.md tags: [identity, terminology, research] - consumption_modes: [informational] \ No newline at end of file + consumption_modes: [informational] + + - id: capability.identity.subject-resolution + name: Identity Subject Resolution + summary: Resolve who or what is acting in a context by mapping principals, accounts, actors, and identifiers to a stable subject model. + vector: D3 / A0 / C1 / R0 + domain: helix_forge + status: draft + owner: identity-canon + path: registry/capabilities/capability.identity.subject-resolution.md + tags: [identity, subject, architecture] + consumption_modes: [informational] + + - id: capability.statehub.workstream-coordinate + name: Workstream And Task Coordination + summary: Track active workstreams, tasks, progress, and consistency across domain repositories through a local-first coordination service. + vector: D4 / A4 / C3 / R2 + domain: helix_forge + status: draft + owner: state-hub + path: registry/capabilities/capability.statehub.workstream-coordinate.md + tags: [state-hub, coordination, workplans] + consumption_modes: [service API, HTTP REST] \ No newline at end of file diff --git a/reuse_surface/__init__.py b/reuse_surface/__init__.py new file mode 100644 index 0000000..acc5310 --- /dev/null +++ b/reuse_surface/__init__.py @@ -0,0 +1 @@ +"""Registry CLI for reuse-surface.""" \ No newline at end of file diff --git a/reuse_surface/cli.py b/reuse_surface/cli.py new file mode 100644 index 0000000..694b5d4 --- /dev/null +++ b/reuse_surface/cli.py @@ -0,0 +1,192 @@ +from __future__ import annotations + +import argparse +import json +import sys +from pathlib import Path +from typing import Any + +import yaml +from jsonschema import Draft202012Validator + +from reuse_surface.registry import ( + CAPABILITIES_DIR, + INDEX_PATH, + ROOT, + capability_paths, + level_at_least, + load_index, + load_schema, + parse_front_matter, + parse_vector, +) + + +def _check_index_drift(entry_paths: list[Path], index: dict[str, Any]) -> list[str]: + warnings: list[str] = [] + indexed_paths = {item["path"] for item in index.get("capabilities", [])} + file_paths = {str(path.relative_to(ROOT)) for path in entry_paths} + for path in sorted(file_paths - indexed_paths): + warnings.append(f"index drift: entry file not indexed: {path}") + for path in sorted(indexed_paths - file_paths): + warnings.append(f"index drift: index references missing file: {path}") + return warnings + + +def cmd_validate(args: argparse.Namespace) -> int: + schema = load_schema() + validator = Draft202012Validator(schema) + target = Path(args.path) if args.path else None + paths = capability_paths(target) + errors: list[str] = [] + warnings: list[str] = [] + + for path in paths: + try: + data = parse_front_matter(path) + except ValueError as exc: + errors.append(str(exc)) + continue + for error in sorted(validator.iter_errors(data), key=lambda e: e.path): + location = ".".join(str(part) for part in error.path) or "" + errors.append(f"{path}: {location}: {error.message}") + + if not target: + index = load_index() + warnings.extend(_check_index_drift(paths, index)) + + for warning in warnings: + print(f"warning: {warning}", file=sys.stderr) + for error in errors: + print(f"error: {error}", file=sys.stderr) + + if errors: + return 1 + print(f"ok: validated {len(paths)} capability entr{'y' if len(paths) == 1 else 'ies'}") + return 0 + + +def _matches_query(item: dict[str, Any], args: argparse.Namespace) -> bool: + vector = parse_vector(item["vector"]) + if args.discovery_min and not level_at_least( + "discovery", vector["discovery"], args.discovery_min + ): + return False + if args.availability_min and not level_at_least( + "availability", vector["availability"], args.availability_min + ): + return False + if args.domain and item.get("domain") != args.domain: + return False + if args.tag and args.tag not in item.get("tags", []): + return False + if args.consumption_mode: + modes = [mode.lower() for mode in item.get("consumption_modes", [])] + if args.consumption_mode.lower() not in modes: + return False + if args.keyword: + haystack = " ".join( + [ + item.get("id", ""), + item.get("name", ""), + item.get("summary", ""), + " ".join(item.get("tags", [])), + ] + ).lower() + if args.keyword.lower() not in haystack: + return False + return True + + +def cmd_query(args: argparse.Namespace) -> int: + index = load_index() + matches = [ + item for item in index.get("capabilities", []) if _matches_query(item, args) + ] + if not matches: + print("no matches") + return 0 + for item in matches: + print( + f"{item['id']} {item['vector']} {item['path']}\n" + f" {item['summary']}" + ) + print(f"\n{len(matches)} match{'es' if len(matches) != 1 else ''}") + return 0 + + +def cmd_export(args: argparse.Namespace) -> int: + index = load_index() + bundle: dict[str, Any] = { + "version": index.get("version", 1), + "domain": index.get("domain"), + "updated": index.get("updated"), + "capabilities": [], + } + errors: list[str] = [] + + for item in index.get("capabilities", []): + path = ROOT / item["path"] + try: + front_matter = parse_front_matter(path) + except ValueError as exc: + errors.append(str(exc)) + continue + bundle["capabilities"].append( + { + "index": item, + "entry": front_matter, + } + ) + + if errors: + for error in errors: + print(f"error: {error}", file=sys.stderr) + return 1 + + if args.format == "json": + print(json.dumps(bundle, indent=2, sort_keys=True)) + else: + print(yaml.safe_dump(bundle, sort_keys=False)) + print( + f"# exported {len(bundle['capabilities'])} capabilities", + file=sys.stderr, + ) + return 0 + + +def main(argv: list[str] | None = None) -> int: + parser = argparse.ArgumentParser(prog="reuse-surface") + subparsers = parser.add_subparsers(dest="command", required=True) + + validate = subparsers.add_parser("validate", help="validate capability entries") + validate.add_argument( + "path", + nargs="?", + help="optional capability markdown file; defaults to all entries", + ) + validate.set_defaults(func=cmd_validate) + + query = subparsers.add_parser("query", help="query capability index") + query.add_argument("--discovery-min") + query.add_argument("--availability-min") + query.add_argument("--domain") + query.add_argument("--tag") + query.add_argument("--consumption-mode") + query.add_argument("--keyword") + query.set_defaults(func=cmd_query) + + export = subparsers.add_parser("export", help="export registry bundle") + export.add_argument( + "--format", + choices=["yaml", "json"], + default="yaml", + ) + export.set_defaults(func=cmd_export) + + args = parser.parse_args(argv) + return args.func(args) + + +if __name__ == "__main__": + raise SystemExit(main()) \ No newline at end of file diff --git a/reuse_surface/registry.py b/reuse_surface/registry.py new file mode 100644 index 0000000..043499f --- /dev/null +++ b/reuse_surface/registry.py @@ -0,0 +1,63 @@ +from __future__ import annotations + +import re +from pathlib import Path +from typing import Any + +import yaml + +ROOT = Path(__file__).resolve().parent.parent +CAPABILITIES_DIR = ROOT / "registry" / "capabilities" +INDEX_PATH = ROOT / "registry" / "indexes" / "capabilities.yaml" +SCHEMA_PATH = ROOT / "schemas" / "capability.schema.yaml" + +LEVEL_ORDERS = { + "discovery": ["D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7"], + "availability": ["A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7"], + "completeness": ["C0", "C1", "C2", "C3", "C4", "C5", "C6"], + "reliability": ["R0", "R1", "R2", "R3", "R4", "R5", "R6"], +} + + +def load_schema() -> dict[str, Any]: + with SCHEMA_PATH.open(encoding="utf-8") as handle: + return yaml.safe_load(handle) + + +def parse_front_matter(path: Path) -> dict[str, Any]: + text = path.read_text(encoding="utf-8") + match = re.match(r"^---\n(.*?)\n---", text, re.DOTALL) + if not match: + raise ValueError(f"{path}: missing YAML front matter") + data = yaml.safe_load(match.group(1)) + if not isinstance(data, dict): + raise ValueError(f"{path}: front matter must be a mapping") + return data + + +def capability_paths(target: Path | None = None) -> list[Path]: + if target is not None: + return [target] + return sorted(CAPABILITIES_DIR.glob("*.md")) + + +def load_index() -> dict[str, Any]: + with INDEX_PATH.open(encoding="utf-8") as handle: + return yaml.safe_load(handle) + + +def parse_vector(vector: str) -> dict[str, str]: + parts = [part.strip() for part in vector.split("/")] + if len(parts) != 4: + raise ValueError(f"invalid vector: {vector}") + return { + "discovery": parts[0], + "availability": parts[1], + "completeness": parts[2], + "reliability": parts[3], + } + + +def level_at_least(dimension: str, current: str, minimum: str) -> bool: + order = LEVEL_ORDERS[dimension] + return order.index(current) >= order.index(minimum) \ No newline at end of file diff --git a/schemas/capability.schema.yaml b/schemas/capability.schema.yaml index 418ce4f..8a8566c 100644 --- a/schemas/capability.schema.yaml +++ b/schemas/capability.schema.yaml @@ -17,7 +17,7 @@ required: properties: id: type: string - pattern: '^capability\.[a-z0-9]+(\.[a-z0-9-]+)+$' + pattern: '^capability(\.[a-z][a-z0-9-]*)+$' description: Stable reverse-domain capability identifier. name: type: string @@ -162,6 +162,10 @@ properties: type: array items: type: string + promotion_history: + type: array + items: + $ref: '#/$defs/promotionRecord' $defs: confidence: type: string @@ -182,7 +186,7 @@ $defs: type: array items: type: string - pattern: '^capability\.[a-z0-9]+(\.[a-z0-9-]+)+$' + pattern: '^capability(\.[a-z][a-z0-9-]*)+$' internalMaturityDimension: type: object additionalProperties: false @@ -244,4 +248,25 @@ $defs: known_reliability_risks: type: array items: - type: string \ No newline at end of file + type: string + promotionDimension: + type: string + enum: [discovery, availability, completeness, reliability] + promotionRecord: + type: object + additionalProperties: false + required: [date, dimension, from, to, rationale] + properties: + date: + type: string + pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}$' + dimension: + $ref: '#/$defs/promotionDimension' + from: + type: string + to: + type: string + rationale: + type: string + author: + type: string \ No newline at end of file diff --git a/templates/capability-entry.template.md b/templates/capability-entry.template.md index e55f2c6..aada653 100644 --- a/templates/capability-entry.template.md +++ b/templates/capability-entry.template.md @@ -78,6 +78,15 @@ consumer_guidance: - describe unsafe or weak reuse scenarios known_limitations: - list known gaps, risks, or missing evidence + +# Optional: append a row when a maturity dimension is promoted with evidence. +promotion_history: [] +# - date: "2026-06-15" +# dimension: discovery +# from: D0 +# to: D1 +# rationale: Added intent, summary, and basic actors. +# author: capability-owner --- # Example Capability diff --git a/tools/README.md b/tools/README.md index 0ea1cda..a8e2b7f 100644 --- a/tools/README.md +++ b/tools/README.md @@ -1,52 +1,64 @@ # Registry Tools -Reference tooling for the capability registry. The MVP is document-first; this -directory documents validation and query workflows until executable tools land. +CLI tooling for the capability registry, implemented in `reuse_surface/`. -## Current MVP workflows - -| Workflow | Location | Mode | -|---|---|---| -| Add capability | `templates/capability-entry.template.md` | manual | -| Discover capabilities | `registry/indexes/capabilities.yaml` | manual / agent | -| Validate entry shape | `registry/README.md` checklist | manual | -| Schema reference | `schemas/capability.schema.yaml` | manual | -| Maturity definitions | `specs/CapabilityMaturityStandard.md` | manual | - -## Manual validation procedure - -1. Open the capability entry Markdown file. -2. Compare YAML front matter against `schemas/capability.schema.yaml`. -3. Run the checklist in `registry/README.md`. -4. Confirm the index entry exists and the `vector` is current. -5. Confirm relation targets exist or are intentionally external. - -## Planned tools (out of MVP scope) - -Future CLI commands may include: +## Install ```bash -# validate one entry or the whole registry -reuse-surface validate registry/capabilities/ - -# query by planning need, availability, or vector -reuse-surface query --discovery-min D4 --tag identity - -# export machine-readable registry bundle -reuse-surface export --format yaml +python3 -m venv .venv +.venv/bin/pip install -e . ``` -These are documented here as targets only. Do not assume they exist yet. +## Commands -## Agent query pattern +### validate -Agents should start with the index, not individual entry files: +Validate one entry or the full registry against `schemas/capability.schema.yaml` +and warn on index drift. -1. Read `registry/indexes/capabilities.yaml`. -2. Filter by `vector`, `tags`, `consumption_modes`, or `summary`. -3. Open only the candidate entry paths. -4. Before creating a new capability, search for overlap using the duplicate - guidance in `registry/README.md`. +```bash +reuse-surface validate +reuse-surface validate registry/capabilities/capability.registry.register.md +``` + +### query + +Filter the capability index by maturity, tags, domain, consumption mode, or keyword. + +```bash +reuse-surface query --discovery-min D4 +reuse-surface query --availability-min A3 +reuse-surface query --tag identity +reuse-surface query --consumption-mode cli +reuse-surface query --keyword rollout +``` + +### export + +Export a machine-readable bundle combining index rows and parsed entry front matter. + +```bash +reuse-surface export +reuse-surface export --format json +``` + +## Export format + +The export bundle includes: + +- `version`, `domain`, `updated` from the index +- `capabilities[]` with `{ index, entry }` pairs + +Stable IDs and maturity fields are preserved for agent consumption (UC-RS-019). + +## Workflows + +| Workflow | Command | +|---|---| +| Add capability | template + index update + `reuse-surface validate` | +| Discover capabilities | `reuse-surface query` or read the index | +| Validate entry shape | `reuse-surface validate` | +| Export for agents | `reuse-surface export --format json` | ## Related use cases diff --git a/workplans/REUSE-WP-0003-intent-scope-gap-closure.md b/workplans/REUSE-WP-0003-intent-scope-gap-closure.md index dee6e37..3692856 100644 --- a/workplans/REUSE-WP-0003-intent-scope-gap-closure.md +++ b/workplans/REUSE-WP-0003-intent-scope-gap-closure.md @@ -4,7 +4,7 @@ type: workplan title: "Close intent-scope gaps: docs, tooling, and registry growth" domain: helix_forge repo: reuse-surface -status: ready +status: finished owner: codex topic_slug: helix-forge created: "2026-06-15" @@ -38,7 +38,7 @@ T01, T04 (documentation — parallel) ```task id: REUSE-WP-0003-T01 -status: todo +status: done priority: high state_hub_task_id: "51c58b43-7b0f-4737-bf48-51efd6f50ead" ``` @@ -56,7 +56,7 @@ Close gap analysis item 1. Update `INTENT.md`: ```task id: REUSE-WP-0003-T02 -status: todo +status: done priority: high state_hub_task_id: "570a036a-d310-4cb7-9812-594a7f4de904" ``` @@ -76,7 +76,7 @@ Close gap analysis item 2 and UC-RS-023. Add a minimal Python CLI under ```task id: REUSE-WP-0003-T03 -status: todo +status: done priority: medium state_hub_task_id: "2c59041d-6c27-4610-afc0-c83873e18b9b" ``` @@ -96,7 +96,7 @@ illustrate a different planning or consumption profile than existing entries. ```task id: REUSE-WP-0003-T04 -status: todo +status: done priority: high state_hub_task_id: "70077cfe-f5ca-4a61-97b2-81829a6b4565" ``` @@ -116,7 +116,7 @@ Do not duplicate the full maturity standard — link to `specs/` instead. ```task id: REUSE-WP-0003-T05 -status: todo +status: done priority: medium state_hub_task_id: "22a3db94-21c7-44d6-8d77-5235f9f10537" ``` @@ -135,7 +135,7 @@ over time (UC-RS-022). Requirements: ```task id: REUSE-WP-0003-T06 -status: todo +status: done priority: medium state_hub_task_id: "1958f555-a3a6-46a8-84cd-c570d6706cb3" ``` @@ -154,7 +154,7 @@ queries in `registry/README.md` and `AGENTS.md`. ```task id: REUSE-WP-0003-T07 -status: todo +status: done priority: medium state_hub_task_id: "6e595b66-ce73-4867-af79-5d0a43a0056d" ``` @@ -171,7 +171,7 @@ the index and parsed front matter from all capability entries. Requirements: ```task id: REUSE-WP-0003-T08 -status: todo +status: done priority: medium state_hub_task_id: "d876f449-68e3-4785-ba3c-7d91c4abbafc" ```