Compare commits

..

No commits in common. "main" and "factory/hosted-plan-check" have entirely different histories.

69 changed files with 749 additions and 5213 deletions

22
.custodian-brief.md Normal file
View file

@ -0,0 +1,22 @@
<!-- custodian-brief: generated by fix-consistency — do not edit manually -->
# Custodian Brief — reuse-surface
**Domain:** infotech
**Last synced:** 2026-09-05 23:35 UTC
**State Hub:** http://127.0.0.1:8000 *(adjust if running on a remote machine)*
## Active Workstreams
### Follow the CommerceCanon repository rename in federation sources
Progress: 1/2 done | workplan_id: `0d1beafd-e638-5bb9-b91d-13543ac42a04`
**Open tasks:**
- ! Repair archived workplan bindings reported during handoff registration `ceba0cd4`
---
## MCP Orientation (when available)
If the state-hub MCP server is reachable, call:
`get_domain_summary("infotech")`
This provides richer cross-domain context.
If the MCP call fails, use this file as your orientation source.

View file

@ -1 +0,0 @@
{"version":1,"repo_slug":"reuse-surface"}

View file

@ -1,8 +0,0 @@
# Explicit opt-in recipe; no environment files or external make includes.
CUSTODIAN_SOURCE ?= /home/worsch/the-custodian
GENERATED_REPO_SLUG ?= reuse-surface
.PHONY: generated-work-records generated-work-records-check
generated-work-records:
python3 "$(CUSTODIAN_SOURCE)/scripts/generate_staged_work_records.py" --repo . --repo-slug "$(GENERATED_REPO_SLUG)"
generated-work-records-check:
python3 "$(CUSTODIAN_SOURCE)/scripts/generate_staged_work_records.py" --repo . --repo-slug "$(GENERATED_REPO_SLUG)" --check

3
.gitignore vendored
View file

@ -182,6 +182,3 @@ cython_debug/
# PyPI configuration file # PyPI configuration file
.pypirc .pypirc
# Local State Hub orientation snapshot; authored work records remain tracked.
/.custodian-brief.md

View file

@ -313,22 +313,4 @@ reuse-surface/
- Graph explorer: docs/graph/index.html - Graph explorer: docs/graph/index.html
- CLI reference: tools/README.md - CLI reference: tools/README.md
- Agent instructions: AGENTS.md - Agent instructions: AGENTS.md
- Workplans: workplans/ - Workplans: workplans/
## Generated work-record index
This repository opts into staged-source WORK-RECORDS.md generation through
`.generated-work-records.json` and the isolated `.generated-work-records.mk`
recipe. `make generated-work-records` reuses the State Hub renderer through
the Custodian adapter; `make generated-work-records-check` verifies byte-exact
agreement with staged Markdown. The pre-commit hook uses the isolated recipe,
preserves unstaged index edits by refusing them, and retains the generated-only
commit guard. It does not contact the hub, alter workplan statuses, or grant
deployment authority. This consumes shared tooling; it does not make this
repository the provider of the generator capability.
## Local orientation brief policy — 2026-10-21
`.custodian-brief.md` is a local, ignored State Hub orientation snapshot. Refreshing
it does not require a Git commit. Authored workplans and the generated
WORK-RECORDS index keep their existing source and staged-generation contracts.

View file

@ -8,22 +8,77 @@
| Kind | ID | Status | Lane | Source | | Kind | ID | Status | Lane | Source |
| --- | --- | --- | --- | --- | | --- | --- | --- | --- | --- |
| workplan | ADHOC-2026-10-13 | finished | — | workplans/ADHOC-2026-10-13.md | | workplan | REUSE-WP-0001 | finished | — | workplans/REUSE-WP-0001-statehub-bootstrap.md |
| workplan | REUSE-WP-ADHOC-2026-10-16 | finished | — | workplans/ADHOC-2026-10-16.md | | workplan | REUSE-WP-0002 | finished | — | workplans/REUSE-WP-0002-mvp-registry-foundation.md |
| workplan | REUSE-WP-0023 | finished | — | workplans/REUSE-WP-0023-access-engine-source-rename.md | | workplan | REUSE-WP-0003 | finished | — | workplans/REUSE-WP-0003-intent-scope-gap-closure.md |
| workplan | REUSE-WP-0024 | finished | — | workplans/REUSE-WP-0024-browser-discovery-and-provider-evidence.md | | workplan | REUSE-WP-0004 | finished | — | workplans/REUSE-WP-0004-registry-hardening.md |
| workplan | REUSE-WP-0025 | blocked | — | workplans/REUSE-WP-0025-private-source-reader-boundary.md | | workplan | REUSE-WP-0005 | finished | — | workplans/REUSE-WP-0005-registry-federation.md |
| workplan | REUSE-WP-0026 | finished | — | workplans/REUSE-WP-0026-wave2-resource-right-sizing.md | | workplan | REUSE-WP-0006 | finished | — | workplans/REUSE-WP-0006-registry-hygiene-and-coverage.md |
| task | ADHOC-2026-10-13-T01 | done | — | workplans/ADHOC-2026-10-13.md | | workplan | REUSE-WP-0007 | finished | — | workplans/REUSE-WP-0007-interactive-catalog.md |
| task | ADHOC-2026-10-13-T02 | done | — | workplans/ADHOC-2026-10-13.md | | workplan | REUSE-WP-0008 | finished | — | workplans/REUSE-WP-0008-graph-explorer.md |
| task | REUSE-WP-ADHOC-2026-10-16-T01 | done | — | workplans/ADHOC-2026-10-16.md | | workplan | REUSE-WP-0009 | finished | — | workplans/REUSE-WP-0009-cli-hardening.md |
| task | REUSE-WP-0023-T01 | done | — | workplans/REUSE-WP-0023-access-engine-source-rename.md | | workplan | REUSE-WP-0010 | finished | — | workplans/REUSE-WP-0010-network-federation.md |
| task | REUSE-WP-0023-T02 | done | — | workplans/REUSE-WP-0023-access-engine-source-rename.md | | workplan | REUSE-WP-0016 | finished | — | workplans/REUSE-WP-0016-interactive-registry-maintain.md |
| task | REUSE-WP-0024-T01 | done | — | workplans/REUSE-WP-0024-browser-discovery-and-provider-evidence.md | | workplan | REUSE-WP-0020 | finished | — | workplans/REUSE-WP-0020-coulombcore-retirement-cutover.md |
| task | REUSE-WP-0024-T02 | done | — | workplans/REUSE-WP-0024-browser-discovery-and-provider-evidence.md | | workplan | REUSE-WP-0021 | active | — | workplans/REUSE-WP-0021-commerce-canon-source-rename.md |
| task | REUSE-WP-0024-T03 | done | — | workplans/REUSE-WP-0024-browser-discovery-and-provider-evidence.md | | task | REUSE-WP-0001-T01 | done | — | workplans/REUSE-WP-0001-statehub-bootstrap.md |
| task | REUSE-WP-0025-T01 | done | — | workplans/REUSE-WP-0025-private-source-reader-boundary.md | | task | REUSE-WP-0001-T02 | done | — | workplans/REUSE-WP-0001-statehub-bootstrap.md |
| task | REUSE-WP-0025-T02 | done | — | workplans/REUSE-WP-0025-private-source-reader-boundary.md | | task | REUSE-WP-0001-T03 | done | — | workplans/REUSE-WP-0001-statehub-bootstrap.md |
| task | REUSE-WP-0025-T03 | wait | — | workplans/REUSE-WP-0025-private-source-reader-boundary.md | | task | REUSE-WP-0002-T01 | done | — | workplans/REUSE-WP-0002-mvp-registry-foundation.md |
| task | REUSE-WP-0026-T01 | done | — | workplans/REUSE-WP-0026-wave2-resource-right-sizing.md | | task | REUSE-WP-0002-T02 | done | — | workplans/REUSE-WP-0002-mvp-registry-foundation.md |
| intake | REUSE-IN-0001 | closed | green | intakes/REUSE-IN-0001-headless-browser-runnable-answer.md | | task | REUSE-WP-0002-T03 | done | — | workplans/REUSE-WP-0002-mvp-registry-foundation.md |
| task | REUSE-WP-0002-T04 | done | — | workplans/REUSE-WP-0002-mvp-registry-foundation.md |
| task | REUSE-WP-0002-T05 | done | — | workplans/REUSE-WP-0002-mvp-registry-foundation.md |
| task | REUSE-WP-0002-T06 | done | — | workplans/REUSE-WP-0002-mvp-registry-foundation.md |
| task | REUSE-WP-0003-T01 | done | — | workplans/REUSE-WP-0003-intent-scope-gap-closure.md |
| task | REUSE-WP-0003-T02 | done | — | workplans/REUSE-WP-0003-intent-scope-gap-closure.md |
| task | REUSE-WP-0003-T03 | done | — | workplans/REUSE-WP-0003-intent-scope-gap-closure.md |
| task | REUSE-WP-0003-T04 | done | — | workplans/REUSE-WP-0003-intent-scope-gap-closure.md |
| task | REUSE-WP-0003-T05 | done | — | workplans/REUSE-WP-0003-intent-scope-gap-closure.md |
| task | REUSE-WP-0003-T06 | done | — | workplans/REUSE-WP-0003-intent-scope-gap-closure.md |
| task | REUSE-WP-0003-T07 | done | — | workplans/REUSE-WP-0003-intent-scope-gap-closure.md |
| task | REUSE-WP-0003-T08 | done | — | workplans/REUSE-WP-0003-intent-scope-gap-closure.md |
| task | REUSE-WP-0004-T01 | done | — | workplans/REUSE-WP-0004-registry-hardening.md |
| task | REUSE-WP-0004-T02 | done | — | workplans/REUSE-WP-0004-registry-hardening.md |
| task | REUSE-WP-0004-T03 | done | — | workplans/REUSE-WP-0004-registry-hardening.md |
| task | REUSE-WP-0004-T04 | done | — | workplans/REUSE-WP-0004-registry-hardening.md |
| task | REUSE-WP-0005-T01 | done | — | workplans/REUSE-WP-0005-registry-federation.md |
| task | REUSE-WP-0005-T02 | done | — | workplans/REUSE-WP-0005-registry-federation.md |
| task | REUSE-WP-0005-T03 | done | — | workplans/REUSE-WP-0005-registry-federation.md |
| task | REUSE-WP-0005-T04 | done | — | workplans/REUSE-WP-0005-registry-federation.md |
| task | REUSE-WP-0005-T05 | done | — | workplans/REUSE-WP-0005-registry-federation.md |
| task | REUSE-WP-0006-T01 | done | — | workplans/REUSE-WP-0006-registry-hygiene-and-coverage.md |
| task | REUSE-WP-0006-T02 | done | — | workplans/REUSE-WP-0006-registry-hygiene-and-coverage.md |
| task | REUSE-WP-0006-T03 | done | — | workplans/REUSE-WP-0006-registry-hygiene-and-coverage.md |
| task | REUSE-WP-0006-T04 | done | — | workplans/REUSE-WP-0006-registry-hygiene-and-coverage.md |
| task | REUSE-WP-0007-T01 | done | — | workplans/REUSE-WP-0007-interactive-catalog.md |
| task | REUSE-WP-0007-T02 | done | — | workplans/REUSE-WP-0007-interactive-catalog.md |
| task | REUSE-WP-0007-T03 | done | — | workplans/REUSE-WP-0007-interactive-catalog.md |
| task | REUSE-WP-0008-T01 | done | — | workplans/REUSE-WP-0008-graph-explorer.md |
| task | REUSE-WP-0008-T02 | done | — | workplans/REUSE-WP-0008-graph-explorer.md |
| task | REUSE-WP-0009-T01 | done | — | workplans/REUSE-WP-0009-cli-hardening.md |
| task | REUSE-WP-0009-T02 | done | — | workplans/REUSE-WP-0009-cli-hardening.md |
| task | REUSE-WP-0009-T03 | done | — | workplans/REUSE-WP-0009-cli-hardening.md |
| task | REUSE-WP-0010-T01 | done | — | workplans/REUSE-WP-0010-network-federation.md |
| task | REUSE-WP-0010-T02 | done | — | workplans/REUSE-WP-0010-network-federation.md |
| task | REUSE-WP-0010-T03 | done | — | workplans/REUSE-WP-0010-network-federation.md |
| task | REUSE-WP-0016-T01 | done | — | workplans/REUSE-WP-0016-interactive-registry-maintain.md |
| task | REUSE-WP-0016-T02 | done | — | workplans/REUSE-WP-0016-interactive-registry-maintain.md |
| task | REUSE-WP-0016-T03 | done | — | workplans/REUSE-WP-0016-interactive-registry-maintain.md |
| task | REUSE-WP-0016-T04 | done | — | workplans/REUSE-WP-0016-interactive-registry-maintain.md |
| task | REUSE-WP-0016-T05 | done | — | workplans/REUSE-WP-0016-interactive-registry-maintain.md |
| task | REUSE-WP-0016-T06 | done | — | workplans/REUSE-WP-0016-interactive-registry-maintain.md |
| task | REUSE-WP-0016-T07 | done | — | workplans/REUSE-WP-0016-interactive-registry-maintain.md |
| task | REUSE-WP-0016-T08 | done | — | workplans/REUSE-WP-0016-interactive-registry-maintain.md |
| task | REUSE-WP-0016-T09 | done | — | workplans/REUSE-WP-0016-interactive-registry-maintain.md |
| task | REUSE-WP-0020-T01 | done | — | workplans/REUSE-WP-0020-coulombcore-retirement-cutover.md |
| task | REUSE-WP-0020-T02 | done | — | workplans/REUSE-WP-0020-coulombcore-retirement-cutover.md |
| task | REUSE-WP-0020-T03 | done | — | workplans/REUSE-WP-0020-coulombcore-retirement-cutover.md |
| task | REUSE-WP-0020-T04 | done | — | workplans/REUSE-WP-0020-coulombcore-retirement-cutover.md |
| task | REUSE-WP-0020-T05 | done | — | workplans/REUSE-WP-0020-coulombcore-retirement-cutover.md |
| task | REUSE-WP-0020-T06 | done | — | workplans/REUSE-WP-0020-coulombcore-retirement-cutover.md |
| task | REUSE-WP-0020-T07 | done | — | workplans/REUSE-WP-0020-coulombcore-retirement-cutover.md |
| task | REUSE-WP-0020-T08 | done | — | workplans/REUSE-WP-0020-coulombcore-retirement-cutover.md |
| task | REUSE-WP-0020-T09 | done | — | workplans/REUSE-WP-0020-coulombcore-retirement-cutover.md |
| task | REUSE-WP-0021-T01 | done | — | workplans/REUSE-WP-0021-commerce-canon-source-rename.md |
| task | REUSE-WP-0021-T02 | wait | — | workplans/REUSE-WP-0021-commerce-canon-source-rename.md |

View file

@ -1,8 +1,8 @@
# Capability Catalog # Capability Catalog
**Domain:** helix_forge **Domain:** helix_forge
**Updated:** 2026-10-13 **Updated:** 2026-06-16
**Entries:** 3 **Entries:** 2
Generated by `reuse-surface catalog`. Do not edit manually. Generated by `reuse-surface catalog`. Do not edit manually.
@ -30,20 +30,3 @@ Generated by `reuse-surface catalog`. Do not edit manually.
**Known limitations:** **Known limitations:**
- warnings do not fail CI unless --fail-on-warnings is set - warnings do not fail CI unless --fail-on-warnings is set
## infotech
### Headless Browser Automation
- **ID:** `capability.infotech.headless-browser`
- **Vector:** D3 / A5 / C2 / R2
- **Owner:** reuse-surface
- **Path:** `registry/capabilities/capability.infotech.headless-browser.md`
- **Summary:** Headless browser automation, screenshots and keyboard trials through rapp-playwright 0.1.0 (Playwright 1.64.0, Chromium 156.0.8078.4). Published A5 local container; managed Railiance admission is pending. Download the Python 3.10+ standalone client from https://forgejo.coulomb.social/coulomb/rapp-playwright/raw/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/client/rapp_playwright.py and run `python3 rapp_playwright.py --url http://127.0.0.1:18083 preflight`, then `python3 rapp_playwright.py --url http://127.0.0.1:18083 trial --out trial-01` with a fresh output directory. This endpoint was verified locally on 2026-10-13 and is ephemeral; it installs no browser for the caller. If unreachable, follow the local container setup in the capability card or adapt its A2 source examples; this is an availability gap on the existing capability. Contract: https://forgejo.coulomb.social/coulomb/rapp-playwright/src/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/docs/consumer-contract.md.
**Known limitations:**
- This is a dated source inspection; run the target-repo trial before claiming adoption success.
- Firefox is evidenced in frontend-patterns; WebKit is supported upstream but unverified in this inspection.
- Selenium is an optional testdrive-jsui dependency, not verified execution; Puppeteer has no verified example here.
- Local provider availability is verified but ephemeral; managed admission and platform operation remain pending.
- Provider fixture success does not establish consumer target reachability or application acceptance.

View file

@ -1,27 +0,0 @@
# NetKingdom security capability discovery
The workstation federation includes 70 reviewed security and supporting capabilities from 60 sibling repositories. Two additional inspected repositories are nonproviders: rapp-secrets-engine is retired and rapp-forgejo is a placeholder without a package declaration. The owner capability entries are the reusable source; the architecture assessment is in the-custodian CUST-WP-0081.
## Local discovery
From a reuse-surface checkout beside those repositories:
```sh
reuse-surface federation compose
reuse-surface plan-check --intent "bound approval consumption before credential delivery" --no-llm
reuse-surface plan-check --intent "deterministic posture feedback evidence expiry" --no-llm
```
The source manifest uses relative sibling paths for the reviewed cohort and requires their indexes to exist. Other federation sources are preserved. A missing sibling is a composition error rather than silent loss of a reviewed capability. The composed local index supports planning; it is not a runtime readiness or authorization grant. `reuse-surface query` searches this repository's own index, while `plan-check` uses the composed federation.
## Hosted discovery
```sh
reuse-surface plan-check --hub-url https://reuse.coulomb.social --intent "bound approval consumption" --no-llm
```
As checked on 2026-10-14, all 60 source registry commits are published, while the hosted hub contains 32 of the 70 reviewed capabilities. Thirty-eight new owner registrations remain pending scoped write access: the normal Warden lane was allowed by the PDP but OpenBao refused the current caller with HTTP 403. Seven of those indexes also require admitted private-source read access; anonymous retrieval returns 404. Do not change repository visibility or reuse another workload's credential to make discovery pass.
The seven private sources are rapp-openbao, rapp-policy-nexus, rapp-postgres, rapp-telemetry, rapp-tenant-engine, rapp-user-engine and rapp-sbom-nexus. Hosted registration supports an `auth_env` reference to a credential already configured at the hub. Source-owner approval, scoped read provisioning and a successful native fetch must precede their registration. Thirty-one public-source registrations are otherwise ready.
The exact registration plan, source commits, raw retrieval results and local/hosted verification receipts are retained in the-custodian at `docs/assessments/netkingdom-2026-10-14/`. Existing IDs were preserved where valid; the copied Secrets Engine repository-template entry was removed. Registry C/R values retained from older entries remain owner assessments, not renewed evidence.

View file

@ -1,55 +0,0 @@
{
"id": "REUSE-WP-0025-CONSUMER-CANDIDATE-REVIEW-R1",
"reviewed_at": "2026-10-14T23:08:33.016513+00:00",
"review_scope": "Consumer code, receipt-only verification helper, exact metadata URL configuration and local image preparation integration only; not credential provisioning, production rollout, registry admission or runtime approval.",
"owner_review": {
"reviewer": "reuse-surface-owner (agent reuse-surface, codex)",
"decision": "approved",
"comment": "REUSE-WP-0025-T02. INTENT.md Registry First, Consumer Experience Matters, and Internal and External Evidence Must Stay Separate: the reviewed native patch makes source credentials usable only for operator-approved exact HTTPS URLs, before any caller-selected credential lookup; redirects are refused. The helper verifies native acquisition of the consented seven indexes and seven entries by exact hashes/schema without stale-cache fallback and returns bounded receipts. Exact candidate source/helper/config/test and preparation patch digests are bound below. 227 tests pass in explicit fixture environment and source hashes match the locally smoke-verified image. This approves consumer preparation integration only; baseline proposal unchanged-image reader delivery remains changes_requested. No credential execution, founder approval or production success is inferred."
},
"workplan_id": "REUSE-WP-0025",
"task_id": "REUSE-WP-0025-T02",
"intent_sha256": "511d1029a7aefc67b68a6363ed3ce8f803f2516c00062ff805263dffe26c771b",
"candidate_artifacts": {
"reuse_surface/federation.py": "dbaa40f25cc0f090143578cd1c7068cb2cb00960fafd17d5239bf8a5bac514dd",
"reuse_surface/private_source_verify.py": "c67a284091cc4dd62dca56658a14b8ea1357e2b3df1518120da4c51e0ee8d85c",
"tests/test_private_source_verify.py": "5f0c0b30b98b4db96d695bdda952b25707916e297d566744fadb6dde7bea18b2",
"docs/assessments/cust81-private-reader/runtime-auth-source-allowlist-r1.json": "e1948c537e206b30fc72b9e4732a3f600d92e131813e6f7ecfd4bfbb18c27286",
"docs/assessments/cust81-private-reader/suite-environment-validation.json": "84f9c410f09e0dd5c0c90987744bc9f6e85292d2e28e4db88859ee0b24e68bd2",
"docs/assessments/cust81-private-reader/reuse-owner-preparation-r1.patch": "da9634481ce80658dfce815d3539ba023234938dc76163dfd93d7677be95ed51"
},
"local_image": {
"manifest_digest": "sha256:2364b7e7859daccf9340a063654e2b09eed1bc27e0adf7b23cbb4b30135a7db0",
"receipt_path": "/home/worsch/the-custodian/docs/assessments/netkingdom-2026-10-14/hardened-reader-local-image-r1.json",
"receipt_sha256": "ed7c2516925d7f16b573a70b5e48d5656a4875e9eb94bcc8760a8bdcbe07f59c",
"published": false,
"deployed": false,
"credentials_provisioned": false
},
"existing_auth_source_inventory": {
"receipt_path": "/home/worsch/the-custodian/docs/assessments/netkingdom-2026-10-14/live-authenticated-source-inventory-r1.json",
"receipt_sha256": "ba669d6231c8c611191c7ad28f5914d6c47332032b23b0ea40a13f753e883073",
"checked_at": "2026-10-14T23:01:13.254261+00:00",
"authenticated_source_count": 0,
"must_recheck_before_rollout": true
},
"preserved_baseline_review": {
"path": "docs/assessments/cust81-private-reader/owner-review-r1.md",
"decision": "changes_requested",
"scope": "Original R1 same-image credential delivery proposal; preserved, not rewritten."
},
"remaining_execution_gates": [
"Platform/Forgejo/apps/mason owner reviews of exact current CCR and implementation.",
"Exact founder credential and live rollout decision remains separate.",
"Publish and independently verify registry image digest before rendering actual release values.",
"Recheck metadata-only authenticated source inventory and materialized exact14 reader allowlist before approved rollout.",
"Run receipt helper in actual hub environment with native authenticated fresh acquisition, then exact70 hosted audit."
],
"does_not_approve": [
"Credential provision or access grant",
"Live production mutation or rollout",
"Other owner roles",
"Registration/admission status change",
"Entire objective completion"
]
}

View file

@ -1,40 +0,0 @@
{
"id": "REUSE-WP-0025-CCR0046-CONSUMER-REVIEW-R2",
"reviewed_at": "2026-10-14T23:19:37.233425+00:00",
"workplan_id": "REUSE-WP-0025",
"task_id": "REUSE-WP-0025-T01",
"ccr_id": "CCR-2026-0046",
"revision": 2,
"review": {
"reviewer": "reuse-surface-owner (agent reuse-surface, codex)",
"decision": "approved",
"comment": "REUSE-WP-0025-T01; INTENT.md Registry First, Consumer Experience Matters and Internal and External Evidence Must Stay Separate. Reviewed exact CCR-2026-0046 revision2, provisioner, exact-token recovery, bootstrap contract and ESO policy SHA256 listed below solely for consumer delivery boundary. The exact seven consented sources/commits/hash rows match original pinned disclosure preparation. Separate reader KV and env protect scoped writer callers; contract prohibits delivery to baseline/current image and requires full reviewed HTTPS/redirect/credential-before-use allowlist enforcement plus exact fourteen metadata URLs. Final actual hub helper must prove native index AND entry hashes without stale cache; 70-ID hosted audit remains independent. Recovery confines revocation to separately approved exact dedicated PAT, preserves shared runtime KV/Secret/public sources, and does not remint after ambiguity. Full native code/helper/config preparation integration review is separately approved and pinned below. This owner judgement approves preparation integration of this consumer boundary, not human credential/rollout go, provisioner execution, status/admission changes, other owners or deployment success."
},
"artifacts": {
"credential-change-requests/CCR-2026-0046-reuse-surface-forgejo-source-read.yaml": "90522912fb78fed72e625382fb7114a0e9aafe76d59e36bffecab83c5bb7d643",
"scripts/provision-reuse-surface-forgejo-source.py": "abf60a754596baa1610d23b1fd367385b0222ac8aeaebba0f2cfb7ec4c62055b",
"scripts/revoke-reuse-surface-forgejo-source.py": "f78d1b26fbff93c6cc481a896d9fb9b9ce93049b8b3267fa41a64bc57dadb162",
"docs/proposals/2026-10-15-reuse-private-reader/bootstrap-contract.json": "2bb72671e0a5f230497ab8ef2967a20ee68d1f2cf081f07c84f6db3442e18d8b",
"openbao/policies/workload-kv-read-reuse-surface-runtime-eso.hcl": "6320f6c2d262d924ea16291d301d5f9eeb7efdb6ce7ea141c1a41d277d86b01b"
},
"consumer_preparation_review": {
"path": "docs/assessments/cust81-private-reader/candidate-owner-review-r1.json",
"sha256": "853cb3b721d83ba5aeb0847111cc47f8094b733f870059cca9834b2c1a5a6219",
"decision": "approved"
},
"preserved_baseline": "Original same-image reader delivery review remains changes_requested; this R2 consumer boundary resolves that design defect without altering earlier evidence.",
"execution_authorized": false,
"required_before_execution": [
"Human exact credential and separately scoped rollout decisions, with all required independent owner reviews.",
"Published independently verified image digest and reviewed release config for the full security patch.",
"Recheck metadata-only live authenticated-source inventory (last snapshot0) and validate exact14 runtime reader URLs.",
"Post-rollout native authenticated helper receipt plus separate registration and exact70 hosted completion audit."
],
"not_proven": [
"Real Forgejo reader scope",
"Live OpenBao/ESO materialization",
"Production image/config rollout",
"Actual authenticated metadata fetch",
"Hosted private capability admission"
]
}

View file

@ -1,75 +0,0 @@
{
"id": "CUST81-PRIVATE-NATIVE-FETCH-RECEIPT-R1",
"checked_at": "2026-10-14T22:43:42.958330+00:00",
"proposal_sha256": "7819eb51d249f5c7aff4df9fb520afcfb76603b05a4104439499102b6c20af99",
"disclosure_sha256": "46ac4fe49a08054cc215aade2fbaf3b36ee334520997857ed84f530b52da9d35",
"consent_sha256": "4a4602ad926e3af855d6ddba4731430d33e4a7432c507ba0a5193b9f43056b52",
"cache_used": false,
"all_verified": true,
"sources": [
{
"repo": "rapp-openbao",
"commit": "35672be138036c8433a5ac5de91e068c03c2b124",
"index_sha256": "044efa3d02b90e1872f2516c581159d388a8080a689f76fcd78bb4d048d6ee64",
"verified": true,
"entry_sha256": [
"9de890da536c34ac2b50576e2c4a9c03792c8a07545d2a0566ace68ac10a293e"
]
},
{
"repo": "rapp-policy-nexus",
"commit": "088b78ac03b0cebeec34a69aae3569eb7ec2f9c3",
"index_sha256": "e68bdedf61eee9ca2026f46a2434ce384c26234616e74f7a5d08a06c75b3bb00",
"verified": true,
"entry_sha256": [
"21415ed5e89dcf8bd2df0c8bc99b07d2c87173809c37fa2582de6d336918a126"
]
},
{
"repo": "rapp-postgres",
"commit": "a9f569c96d74aa384ac8d3ac4aa960e4061550b5",
"index_sha256": "d939333eed9d85172e006f526c445fbe2602a721d53f7c0d14bc68286ae08776",
"verified": true,
"entry_sha256": [
"64503872abb24bb28f291264e860ab094c6abb721fbfe90b47258ad13b77af44"
]
},
{
"repo": "rapp-sbom-nexus",
"commit": "adbedd349e8df97be43a1f57db7095af45ff29d1",
"index_sha256": "d2ee0f193d2198bf8f16ce64c90ae7664e59a2bc307ad711426af3fd47deb057",
"verified": true,
"entry_sha256": [
"1a15e37bd3d19c4c89ef25803667937f549ade1cd27bedfa85132ac48ffe3f48"
]
},
{
"repo": "rapp-telemetry",
"commit": "f158307e24b86bab88a1af4830ff6b4f85afdeb5",
"index_sha256": "ee8801f143ed5cf064205710a61c2bb24efc6ea8585d5786d6b679426ec4c1d4",
"verified": true,
"entry_sha256": [
"a67dbf6905223c04b1c003d5f967841038743c8c1479812f5cf0bb55ad6cee77"
]
},
{
"repo": "rapp-tenant-engine",
"commit": "9bdc86572728783a5ed94266f04f7b12d414c557",
"index_sha256": "d8e9c1282350b5d2fd4f4d69712aa7a5fbcd2367bb1a7fad1b6eb16a97e5d732",
"verified": true,
"entry_sha256": [
"e7cf0485cfdb6f497281638d81f908b5c2fe1053125c6ef28130504909d1d49e"
]
},
{
"repo": "rapp-user-engine",
"commit": "f35108f9e1b8702fb6c526fe42b2fec5ca032738",
"index_sha256": "95b4ed2d0b189f6847b1c0899f740d1da46933a8f40491e1a02f2d4e57c819fc",
"verified": true,
"entry_sha256": [
"84ec4fdce99134c88c110104cac93bdea36cffb5ba34e046b9ad161fb860dce2"
]
}
],
"transport": "fake-only local committed metadata; no authenticated network fetch or runtime evidence"
}

View file

@ -1,102 +0,0 @@
# Reuse-surface independent consumer preparation review
Disposition: **changes_requested** for reader provisioning proposal
`CUST81-PRIVATE-READER-PROVISIONING-PREPARATION-R1`, SHA256
`7819eb51d249f5c7aff4df9fb520afcfb76603b05a4104439499102b6c20af99`.
Reviewer: delegated reuse-surface owner preparation worker, supervised local scope.
This review does not authorize credentials, approve another owner's implementation,
claim deployment success, or grant permanent repo authority.
INTENT requires inspectable registry membership and evidence-driven consumer
reliability. Acquisition must protect source custody while making the explicitly
consented metadata discoverable. The proposal's seven-repository reader, separate
KV path and exact commit pins fit that purpose, but its unchanged-image rollout
assumption fails consumer credential isolation.
## Findings and prepared correction
1. Native `fetch_remote_index_text` originally supplies Authorization to urllib's
default opener. Redirect handling copies headers to the redirect target. A
source redirect can disclose the PAT to another origin or unreviewed path.
Prepared patch rejects **all authenticated redirects**, even same-origin ones.
Anonymous federation keeps its previous behavior.
2. Hub registration accepts caller-selected `auth_env`, `auth_header` and `url`.
Composition passes these to `_auth_headers`, which reads the named runtime env
and sends its value to that URL. A holder of the writer token can therefore
induce credential exfiltration without a redirect. Prepared patch validates
operator-owned `REUSE_SURFACE_AUTH_SOURCE_ALLOWLIST` JSON before looking up the
credential. Exact allowed env name and URL are mandatory; missing/malformed
configuration fails closed. Authenticated HTTP is rejected.
3. `resolve_source_index_path(refresh=True)` may return stale cache after remote
failure. A fresh composition timestamp alone cannot prove private acquisition.
Prepared helper calls native fetch directly, never the resolver/cache path,
and verifies exact consented index **and Markdown entry** SHA256 plus capability
identity, owner and entry schema. Failed receipts contain bounded categories,
never raw exception text, bodies, headers, or secrets.
## Exact prepared artifacts
- `reuse_surface/federation.py` SHA256
`dbaa40f25cc0f090143578cd1c7068cb2cb00960fafd17d5239bf8a5bac514dd`
- `reuse_surface/private_source_verify.py` SHA256
`c67a284091cc4dd62dca56658a14b8ea1357e2b3df1518120da4c51e0ee8d85c`
- `tests/test_private_source_verify.py` SHA256
`5f0c0b30b98b4db96d695bdda952b25707916e297d566744fadb6dde7bea18b2`
- `runtime-auth-source-allowlist-r1.json` SHA256
`e1948c537e206b30fc72b9e4732a3f600d92e131813e6f7ecfd4bfbb18c27286`
is the exact fourteen commit-pinned index/entry URLs for reader env
`REUSE_SURFACE_FORGEJO_SOURCE_READ_TOKEN`. Serialize this object as the runtime
value of `REUSE_SURFACE_AUTH_SOURCE_ALLOWLIST`; do not use host wildcards.
## Validation and limits
Focused fake transport tests cover native Bearer header handling, all fourteen
fetches, no cache path, mismatched index/entry hashes, tampered consent packet,
missing authentication, sanitized errors, same/cross-origin redirects without
second requests, HTTP rejection, missing/malformed/unapproved allowlists, and
broadened reader URL scope. Focused tests: **30 passed**. Whole test suite initially
reported **226 passed, 1 failed**: existing `test_federation_compose` resolved a
required sibling index to missing `/tmp/access-engine/registry/indexes/capabilities.yaml`.
The first sibling fixture preparation also stopped at maturity-engine's untracked
registry index, and that partial fixture run reported **226 passed, 1 failed**.
Both outcomes remain in `suite-environment-validation.json`; no consumer test
failure or failed preparation is hidden.
With the complete task-owned fixture environment, the unchanged source patch
passes the **entire suite: 227 passed, 1 existing dependency warning**. Command:
`/home/worsch/reuse-surface/.venv/bin/python -m pytest -q tests`, cwd
`/tmp/cust81-reuse-suite-fixtures-r1/reuse-surface`. That fixture contains sixty
required local registry indexes and thirty-nine seeded anonymous caches to avoid
live network dependencies. Fifty-nine local indexes are copied from committed
HEAD; maturity-engine's existing untracked index is copied read-only and labeled
as a test fixture, never publication evidence. Member indexes are only read;
composition writes its own copied registry/cache. No foreign checkout is written.
Tests rewrite generated catalog/graph files in their own fixture checkout; earlier
generated changes in the integration checkout were restored to its HEAD.
`local-consented-metadata-validation.json` proves schema and exact hashes for all
seven repositories' consented committed metadata using a fake transport and a
fixture-only token. It is explicitly **not** a network, credential, rollout or
live federation verification receipt.
Static `registry/federation/sources.yaml` contains no `auth_env`, but public hub
registration responses intentionally omit it and do not prove live SQLite dynamic
source inventory. This patch changes authenticated-source behavior: every existing
authenticated lane needs a reviewed exact-URL allowlist entry. Before rollout,
platform/apps must safely inventory only auth env names and registered URLs,
preserve approved existing lanes in runtime config, and prove no unrelated runtime
secret name can be routed. No raw env dump or Secret read is required for that
inventory. Until this migration and the reviewed new consumer image are complete,
do not deliver the new PAT to the existing hub image.
After separate exact credential/rollout approval, invoke the helper from inside
the hub process environment with the pinned proposal/disclosure/consent files:
```sh
python -m reuse_surface.private_source_verify --proposal /review/private-reader-provisioning-preparation-r1.json --disclosure /review/private-source-disclosure-proposal-r1.json --consent /review/private-source-owner-consent-r1.json
```
It accepts no credential argument and returns only bounded metadata receipts.
Exit zero means all seven native index/entry fetches matched pinned consent; it
does not prove registration/federation completion. Final admission still needs
separate live source registrations and exact 70-ID fresh hosted audit.

View file

@ -1,18 +0,0 @@
{
"REUSE_SURFACE_FORGEJO_SOURCE_READ_TOKEN": [
"https://forgejo.coulomb.social/api/v1/repos/coulomb/rapp-openbao/raw/registry/capabilities/capability.railiance.openbao-package.md?ref=35672be138036c8433a5ac5de91e068c03c2b124",
"https://forgejo.coulomb.social/api/v1/repos/coulomb/rapp-openbao/raw/registry/indexes/capabilities.yaml?ref=35672be138036c8433a5ac5de91e068c03c2b124",
"https://forgejo.coulomb.social/api/v1/repos/coulomb/rapp-policy-nexus/raw/registry/capabilities/capability.railiance.policy-publication-package.md?ref=088b78ac03b0cebeec34a69aae3569eb7ec2f9c3",
"https://forgejo.coulomb.social/api/v1/repos/coulomb/rapp-policy-nexus/raw/registry/indexes/capabilities.yaml?ref=088b78ac03b0cebeec34a69aae3569eb7ec2f9c3",
"https://forgejo.coulomb.social/api/v1/repos/coulomb/rapp-postgres/raw/registry/capabilities/capability.railiance.postgres-isolation-recovery.md?ref=a9f569c96d74aa384ac8d3ac4aa960e4061550b5",
"https://forgejo.coulomb.social/api/v1/repos/coulomb/rapp-postgres/raw/registry/indexes/capabilities.yaml?ref=a9f569c96d74aa384ac8d3ac4aa960e4061550b5",
"https://forgejo.coulomb.social/api/v1/repos/coulomb/rapp-sbom-nexus/raw/registry/capabilities/capability.railiance.sbom-runtime-package.md?ref=adbedd349e8df97be43a1f57db7095af45ff29d1",
"https://forgejo.coulomb.social/api/v1/repos/coulomb/rapp-sbom-nexus/raw/registry/indexes/capabilities.yaml?ref=adbedd349e8df97be43a1f57db7095af45ff29d1",
"https://forgejo.coulomb.social/api/v1/repos/coulomb/rapp-telemetry/raw/registry/capabilities/capability.railiance.telemetry-package.md?ref=f158307e24b86bab88a1af4830ff6b4f85afdeb5",
"https://forgejo.coulomb.social/api/v1/repos/coulomb/rapp-telemetry/raw/registry/indexes/capabilities.yaml?ref=f158307e24b86bab88a1af4830ff6b4f85afdeb5",
"https://forgejo.coulomb.social/api/v1/repos/coulomb/rapp-tenant-engine/raw/registry/capabilities/capability.railiance.tenant-engine-package.md?ref=9bdc86572728783a5ed94266f04f7b12d414c557",
"https://forgejo.coulomb.social/api/v1/repos/coulomb/rapp-tenant-engine/raw/registry/indexes/capabilities.yaml?ref=9bdc86572728783a5ed94266f04f7b12d414c557",
"https://forgejo.coulomb.social/api/v1/repos/coulomb/rapp-user-engine/raw/registry/capabilities/capability.railiance.user-engine-package.md?ref=f35108f9e1b8702fb6c526fe42b2fec5ca032738",
"https://forgejo.coulomb.social/api/v1/repos/coulomb/rapp-user-engine/raw/registry/indexes/capabilities.yaml?ref=f35108f9e1b8702fb6c526fe42b2fec5ca032738"
]
}

View file

@ -1,628 +0,0 @@
{
"id": "REUSE-WP-0025-SUITE-ENVIRONMENT-R1",
"fixture_checkout": "/tmp/cust81-reuse-suite-fixtures-r1/reuse-surface",
"fixture_only": true,
"sources": [
{
"repo": "access-engine",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "7d59022dac9da4d8dcbecab936d3cea9b154c8c51478b378932fd9ebe5ec7e02"
},
{
"repo": "activity-core",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "536d359366ccf3db3b2b0d390635bc2c5311bd37ac7ff89dae11d809ef15b848"
},
{
"repo": "agentic-resources",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "42986b7a274ef510166e566a9756d594a6f88706189bc97ac889bab86b20240d"
},
{
"repo": "approval-engine",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "b6812fd12dc530270fb66bae592c828f56f17f2fc86759cb04d750162fc619a4"
},
{
"repo": "artifact-store",
"kind": "anonymous_cache_seed_not_runtime_evidence",
"origin": "committed_HEAD_fixture",
"sha256": "200802ac737195721a52d6d345104f2302fbdc35b4122b431bd2255f4e5552bc"
},
{
"repo": "audit-core",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "6a1d7dbb442f0fd0e481d54fb0acbee37ef2e693198b6f2108e154d3c3795e0e"
},
{
"repo": "can-you-assist",
"kind": "anonymous_cache_seed_not_runtime_evidence",
"origin": "committed_HEAD_fixture",
"sha256": "ce106e5c106453635075dd1b5906762d516e84601af4d5620c9a7faab444be46"
},
{
"repo": "citation-engine",
"kind": "anonymous_cache_seed_not_runtime_evidence",
"origin": "committed_HEAD_fixture",
"sha256": "e02914ffe937c8342022d92b5bfa6906aef560edeb6e90f80826cbf8e0620ada"
},
{
"repo": "citation-evidence",
"kind": "anonymous_cache_seed_not_runtime_evidence",
"origin": "committed_HEAD_fixture",
"sha256": "628e338df6da2f0966675e8facf91f52cc3ac4a0c81417b33e1284045db1dfad"
},
{
"repo": "citation-work",
"kind": "anonymous_cache_seed_not_runtime_evidence",
"origin": "committed_HEAD_fixture",
"sha256": "c20b96c226bb9465d7154c127ee19a94396c7b03307e7581ff827eba42651d86"
},
{
"repo": "commerce-canon",
"kind": "anonymous_cache_seed_not_runtime_evidence",
"origin": "committed_HEAD_fixture",
"sha256": "6e1186aad49634b9725bc2cfa051c42b2ac13e5c4abe4bade7b39c0483f4242d"
},
{
"repo": "config-atlas",
"kind": "anonymous_cache_seed_not_runtime_evidence",
"origin": "committed_HEAD_fixture",
"sha256": "d0325d71a5de1e756c080dc9abc3162536b9700cc37942a028ad2f65bad9bfef"
},
{
"repo": "coordination-engine",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "f7a2c140ac1a7628a2106b1047b59e208879257b23ffed6dceef8ecf6c3bd420"
},
{
"repo": "core-hub",
"kind": "anonymous_cache_seed_not_runtime_evidence",
"origin": "committed_HEAD_fixture",
"sha256": "31cb09dd3b04a7891533387479ecb340b543445b64a849d9973ee857efa4cca1"
},
{
"repo": "domain-tree",
"kind": "anonymous_cache_seed_not_runtime_evidence",
"origin": "committed_HEAD_fixture",
"sha256": "c20b96c226bb9465d7154c127ee19a94396c7b03307e7581ff827eba42651d86"
},
{
"repo": "email-connect",
"kind": "anonymous_cache_seed_not_runtime_evidence",
"origin": "committed_HEAD_fixture",
"sha256": "5bce1e037a368816811a21dd9123ebf47f1a7d293c424c661d30fa14f2366231"
},
{
"repo": "emergent-security",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "268d9192dc9b97da462d46fe5b40ea33e678840b23944ab0cd73622c130bdef6"
},
{
"repo": "evidence-anchor",
"kind": "anonymous_cache_seed_not_runtime_evidence",
"origin": "committed_HEAD_fixture",
"sha256": "c20b96c226bb9465d7154c127ee19a94396c7b03307e7581ff827eba42651d86"
},
{
"repo": "evidence-binder",
"kind": "anonymous_cache_seed_not_runtime_evidence",
"origin": "committed_HEAD_fixture",
"sha256": "2664dfb5668238051b7cd540470ee2f7a5557415c53462fa4f14474829f3ce46"
},
{
"repo": "evidence-source",
"kind": "anonymous_cache_seed_not_runtime_evidence",
"origin": "committed_HEAD_fixture",
"sha256": "7b2a3c7b108fbdc69828b088915418c87dedfee5e202e4546defe68d8df64667"
},
{
"repo": "feature-control",
"kind": "anonymous_cache_seed_not_runtime_evidence",
"origin": "committed_HEAD_fixture",
"sha256": "2335b614d120a3e954d55389448b4c8462bfab3582de2e0bbae02dd5474dd132"
},
{
"repo": "fin-hub",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "c6bb1aa6b770f684721fae9f1576f2c2f0128d1b758f4e33b8a277e0b4ff087a"
},
{
"repo": "gate-house",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "2b63d94375d29649c41a7eae7cfb3f6e35210fd3438aa5013f3ddc22a662511a"
},
{
"repo": "glas-harness",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "8f86dbdaf6535c909ff19967f7806d85c1f7a09db1e999033abf9b9007ed805b"
},
{
"repo": "guide-board",
"kind": "anonymous_cache_seed_not_runtime_evidence",
"origin": "committed_HEAD_fixture",
"sha256": "abbc20c7ab14bcbdb73679a5143355c7ad3a7441b8f8e7bf5a1af393c7d1c1e1"
},
{
"repo": "helix-forge",
"kind": "anonymous_cache_seed_not_runtime_evidence",
"origin": "committed_HEAD_fixture",
"sha256": "c20b96c226bb9465d7154c127ee19a94396c7b03307e7581ff827eba42651d86"
},
{
"repo": "hub-core",
"kind": "anonymous_cache_seed_not_runtime_evidence",
"origin": "committed_HEAD_fixture",
"sha256": "a78d185973e0d0600f6ff05470ff3b840130fca4ed7922edaf08155d246e9008"
},
{
"repo": "human-resources",
"kind": "anonymous_cache_seed_not_runtime_evidence",
"origin": "committed_HEAD_fixture",
"sha256": "d72d6b4f1479992e33400ed7c950cdc7112ead9c22abd38275717f0ae9255787"
},
{
"repo": "ihp-railiance-probe",
"kind": "anonymous_cache_seed_not_runtime_evidence",
"origin": "committed_HEAD_fixture",
"sha256": "c20b96c226bb9465d7154c127ee19a94396c7b03307e7581ff827eba42651d86"
},
{
"repo": "info-tech-canon",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "6015ec78772586e6e351422741430be8c40d7c7116403ee4b92933df342c4c72"
},
{
"repo": "informed-decision",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "b43ea44c725dcbd59fe957ffc307805e0aabc23b60a4a9049005c70ca4871a62"
},
{
"repo": "infospace-bench",
"kind": "anonymous_cache_seed_not_runtime_evidence",
"origin": "committed_HEAD_fixture",
"sha256": "74ba65dad84faffd6ce0e6d771f8650abe76b87a6ee09ee007780bd13c5cd9b2"
},
{
"repo": "issue-core",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "70eb00870ed87072aeb0f7c38de0a879f1b3910fe6f976b982a191e261e8e7be"
},
{
"repo": "kaizen-agentic",
"kind": "anonymous_cache_seed_not_runtime_evidence",
"origin": "committed_HEAD_fixture",
"sha256": "0236d486d6df6d928e7fd9f186a02273c8a59d534abb026603f7128876fbe776"
},
{
"repo": "key-cape",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "901d15c15cacd844cf19a1a7b74c890ce5e0b00a3372a9e10bd7114f328596c8"
},
{
"repo": "kings-guard",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "8a143864a6ce9a7b6c5a0f64eb75f67cfa99c2b9b155baac4f81a261d3a5312c"
},
{
"repo": "kontextual-engine",
"kind": "anonymous_cache_seed_not_runtime_evidence",
"origin": "committed_HEAD_fixture",
"sha256": "5a5980f37031c15fc9b332f143ddbfbd6c2789ff6c6ec0f4c3e971cbc506830e"
},
{
"repo": "llm-connect",
"kind": "anonymous_cache_seed_not_runtime_evidence",
"origin": "committed_HEAD_fixture",
"sha256": "27420d2b21fb45cf6cf6ac41890518f6b5a8c10027594a7e95ec535715a01296"
},
{
"repo": "markitect-filter",
"kind": "anonymous_cache_seed_not_runtime_evidence",
"origin": "committed_HEAD_fixture",
"sha256": "95d2743d4201f6b89efedebfcd34fdb03e3f832fa00b6f4f646015c3264dfb60"
},
{
"repo": "markitect-main",
"kind": "anonymous_cache_seed_not_runtime_evidence",
"origin": "committed_HEAD_fixture",
"sha256": "ba7e29cc82fd4d1eff61e48b1d870714f2d9c97531e839c469f892602509f137"
},
{
"repo": "markitect-quarkdown",
"kind": "anonymous_cache_seed_not_runtime_evidence",
"origin": "committed_HEAD_fixture",
"sha256": "67c718d9bb8221b9b58ab30cbf9eb1cf340e2d2ecc1d77cb4b5bdaf28fa5befc"
},
{
"repo": "markitect-tool",
"kind": "anonymous_cache_seed_not_runtime_evidence",
"origin": "committed_HEAD_fixture",
"sha256": "9159a4af2783b17602c23ca4b72b552641d5e1c3170a4dee1aee69c3ba9371d2"
},
{
"repo": "maturity-engine",
"kind": "required_local_index",
"origin": "worktree_untracked_registry_fixture_not_publication_evidence",
"sha256": "42b4cd1f9c6fe0960acadd10a337a579a6313fa46c2ff5a2a34bbacf2749d049"
},
{
"repo": "net-kingdom",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "6fadeb0e89729a9226d6eebd44fbb07723512a3ebe6737f5a1113b14829447ed"
},
{
"repo": "open-cmis-tck",
"kind": "anonymous_cache_seed_not_runtime_evidence",
"origin": "committed_HEAD_fixture",
"sha256": "e8fe7a7d0d3af104009f996c466353467e737069d0c2d04f880a86ae60d76bda"
},
{
"repo": "open-reuse",
"kind": "anonymous_cache_seed_not_runtime_evidence",
"origin": "committed_HEAD_fixture",
"sha256": "f5e8b9cd3ceb7e336a2afc5097065a6c0453cc697c8c4aa2d2c39c1d1fe4fe66"
},
{
"repo": "ops-bridge",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "aefd795eb16fcfdebc108450826a0f62e000bc61e9d78007bc6221bc2328e40c"
},
{
"repo": "ops-hub",
"kind": "anonymous_cache_seed_not_runtime_evidence",
"origin": "committed_HEAD_fixture",
"sha256": "6fea9fee803a5d55ece3daefdfda0efff11eae8d2a0b719fbd0dec64f4f85314"
},
{
"repo": "ops-mason",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "5eb499bc819c874835b8e6727ccbd5f9889ebb6f25a90018e3e574e5b6082b32"
},
{
"repo": "ops-warden",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "4d3aba70ead10c826814dc766f9d23e3e0ce52475330acf57905bf62b01c819c"
},
{
"repo": "phase-memory",
"kind": "anonymous_cache_seed_not_runtime_evidence",
"origin": "committed_HEAD_fixture",
"sha256": "e84b7603c98ae48879002b16a8302fb0e0e1b6c6e1099565570a8d8f98478d31"
},
{
"repo": "policy-nexus",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "c1eb3e23621de354a9081cbf29a2f3d772b5f8538aaceca417574cde5a04c021"
},
{
"repo": "rail-knative",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "e044b8f2f6bc1b8aa7c672ee33dfac69d6813fd672388713a70ab7ea4d4052c0"
},
{
"repo": "rail-kubernetes",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "699f69facea1ce4e71d90fe0790db19b68d3a546015453651d3afc808d31d09d"
},
{
"repo": "railiance-apps",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "2a550acf8545e95bd81842bb1b00f4db46c4dbb42b522823f043e948667ddf2c"
},
{
"repo": "railiance-bootstrap",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "feefcc699e045a1a72f254d71f46460ad2362ed23c9de6e54c952711fcb33788"
},
{
"repo": "railiance-cluster",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "0e67a2aca183ee7ef9c4c04e618fcb03647120f456a133e84a8f42c2b8d8fcde"
},
{
"repo": "railiance-enablement",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "4b1f91b0da94e3098916f3e360b20b9926be4dd8683d6fb167a027aaf04ebfac"
},
{
"repo": "railiance-fabric",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "f473644906fe3f331702b407c3519e6a3cd0d96d362cf30d80e03aac53c3b862"
},
{
"repo": "railiance-forge",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "4df605d617b7656ffb94a43ab4633c8fc69ec723f68f5f5b8d5f24ad8efb6b98"
},
{
"repo": "railiance-infra",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "14a76b1f1dd317a1d426502ff5f80780e9551cd1cd600543de6fb9a84cb8ada2"
},
{
"repo": "railiance-master",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "f36cb2765ec04064314f43866f9a87a94a4f0f728adfaad46739f232b4986c0a"
},
{
"repo": "railiance-platform",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "0315d526165368e0a513de6b15932778d43c3e6045c589c95060f555fca3202e"
},
{
"repo": "railiance-telemetry",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "82f3f2d188e2d7ebea71b7262e106c5f48feaf39a2da881bb645ff9352884205"
},
{
"repo": "rapp-openbao",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "044efa3d02b90e1872f2516c581159d388a8080a689f76fcd78bb4d048d6ee64"
},
{
"repo": "rapp-playwright",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "79645df817858f96230f2443d66796d1078185c7afef5948f6a38632234d33bb"
},
{
"repo": "rapp-policy-nexus",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "e68bdedf61eee9ca2026f46a2434ce384c26234616e74f7a5d08a06c75b3bb00"
},
{
"repo": "rapp-postgres",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "d939333eed9d85172e006f526c445fbe2602a721d53f7c0d14bc68286ae08776"
},
{
"repo": "rapp-sbom-nexus",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "d2ee0f193d2198bf8f16ce64c90ae7664e59a2bc307ad711426af3fd47deb057"
},
{
"repo": "rapp-telemetry",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "ee8801f143ed5cf064205710a61c2bb24efc6ea8585d5786d6b679426ec4c1d4"
},
{
"repo": "rapp-tenant-engine",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "d8e9c1282350b5d2fd4f4d69712aa7a5fbcd2367bb1a7fad1b6eb16a97e5d732"
},
{
"repo": "rapp-user-engine",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "95b4ed2d0b189f6847b1c0899f740d1da46933a8f40491e1a02f2d4e57c819fc"
},
{
"repo": "reef-railiance",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "84a89c376021e3cb980c02c41d1a31396b874bebcc3801c2d1a9a33ae4195eb5"
},
{
"repo": "rein-aharness",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "20990ed0e016b3330a0d44e9b86bfff8966e82bc8800469ec0f320cfa8a63fbc"
},
{
"repo": "rein-openweights",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "2f4e59b2dbc7ea6078405f5c2f2be0aebd9434bee171a429b9ebe6baa83f3c2b"
},
{
"repo": "repo-manager",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "ba068a8dd7a282664e94e2acdbbb170a2ba48e260e7ce0ec8eaaa8aee6f9e7c2"
},
{
"repo": "repo-scoping",
"kind": "anonymous_cache_seed_not_runtime_evidence",
"origin": "committed_HEAD_fixture",
"sha256": "480d7c57759d6997d7bd531e966c207bb290e978f9fe831d6d246b5592c3dd71"
},
{
"repo": "repo-seed",
"kind": "anonymous_cache_seed_not_runtime_evidence",
"origin": "committed_HEAD_fixture",
"sha256": "8cb4e4baacd95a070a96db6d72f4fb3019cffda95606c65896f796ccac0c9c7c"
},
{
"repo": "resource-control",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "31b16f7d824e376f21de44aff46d5d532d3679d5e72035ce84813572b11bbd44"
},
{
"repo": "reuse-surface",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "a77c952e9e1a37a3504ccd7001a7a2493d60d46f147f277071829cd05646e31c"
},
{
"repo": "risk-nexus",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "53f0bf9e0aa06a6db0aa991f0ebdaa1d2bf74cfaf4e30eed8c003a4d2186a746"
},
{
"repo": "role-engine",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "1188e02e0333664b3554d11c59c12942fef9e29e6491b186dcec67e6ae3e8a5c"
},
{
"repo": "runbook-tutorials",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "a74fa708c4fea755f5c52504bd227393888cca78c043349cdc182c4d783390e5"
},
{
"repo": "sand-boxer",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "a182d5672d088e80b79eacff9cb37fc2f3518c3c100537e18d125abc7f169e96"
},
{
"repo": "sbom-nexus",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "ed6efd581483d0058a3928b365b933cbbd98c035b0a75c866156a69961d74edc"
},
{
"repo": "secrets-engine",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "d5d903336d05ccd0b75a49f7be7e866ef89c6bdb6444e8c747a5ffa934a6bbe2"
},
{
"repo": "security-canon",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "9b9f9348e560a72d8032f62b2ba4820d81fe182353ccc886e4f5c57cbdea563f"
},
{
"repo": "shard-wiki",
"kind": "anonymous_cache_seed_not_runtime_evidence",
"origin": "committed_HEAD_fixture",
"sha256": "b0bb63c0a080e46c60f24a87959c529da5e725334ed69c4ba985c39107c54ef9"
},
{
"repo": "state-hub",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "eab454bd985ab6ab83c38fd29e6e58ebdfe1e09bbc5388edddaa07a88133619a"
},
{
"repo": "tegwick-control",
"kind": "anonymous_cache_seed_not_runtime_evidence",
"origin": "committed_HEAD_fixture",
"sha256": "c20b96c226bb9465d7154c127ee19a94396c7b03307e7581ff827eba42651d86"
},
{
"repo": "tenant-engine",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "4131f1b63e52306f267204cdfb0faa90d6550f8bca51f97cf1062becea95d805"
},
{
"repo": "the-custodian",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "cfe7f25e91fee824347aa22ccee2a70e7dd58ac06a7106f7e2ec9e54dc163020"
},
{
"repo": "user-engine",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "7133c52c2013cea70d07d33960f145c370d33a8b4397c1dc927769fcaf200cbd"
},
{
"repo": "vantage-point",
"kind": "anonymous_cache_seed_not_runtime_evidence",
"origin": "committed_HEAD_fixture",
"sha256": "cc5cf52ead95adc2920db84299d994e54def089d3f8fd852e10d9857ab0fdd2e"
},
{
"repo": "vergabe-teilnahme",
"kind": "anonymous_cache_seed_not_runtime_evidence",
"origin": "committed_HEAD_fixture",
"sha256": "73ffd306894d9839f4800aa028144883d012bf0fe74a310ad09ef9296c627d56"
},
{
"repo": "whitehat-security",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "e4bf9bac7f62f60cf10a9fbd25aa8200c22f13d61861862ff5fa1cc90b55f37c"
},
{
"repo": "whynot-control",
"kind": "anonymous_cache_seed_not_runtime_evidence",
"origin": "committed_HEAD_fixture",
"sha256": "c20b96c226bb9465d7154c127ee19a94396c7b03307e7581ff827eba42651d86"
},
{
"repo": "whynot-design",
"kind": "anonymous_cache_seed_not_runtime_evidence",
"origin": "committed_HEAD_fixture",
"sha256": "541104bcafb17dcf7d26dabbce7ff93b2025a0bc6cad9bec71ac145f5ec72669"
},
{
"repo": "zone-engine",
"kind": "required_local_index",
"origin": "committed_HEAD_fixture",
"sha256": "b6b196089a3011f16e8a38f6914589efc72a29ee3aca4bc0c5e3cf30bee97ec4"
}
],
"foreign_repo_writes": false,
"network_fetch_needed": false,
"preserved_prior_outcomes": [
{
"environment": "original isolated checkout without siblings",
"passed": 226,
"failed": 1,
"failure": "required access-engine sibling missing"
},
{
"environment": "partial fixture preparation failed at untracked maturity-engine registry",
"passed": 226,
"failed": 1,
"failure": "required maturity-engine fixture missing; preparation failure not hidden"
}
],
"final_result": {
"command": "/home/worsch/reuse-surface/.venv/bin/python -m pytest -q tests",
"cwd": "/tmp/cust81-reuse-suite-fixtures-r1/reuse-surface",
"exit_code": 0,
"passed": 227,
"failed": 0,
"warnings": 1,
"duration_seconds": 7.8,
"warning": "Starlette httpx testclient deprecation",
"consumer_source_sha256": "dbaa40f25cc0f090143578cd1c7068cb2cb00960fafd17d5239bf8a5bac514dd"
}
}

View file

@ -15,7 +15,7 @@
</head> </head>
<body> <body>
<h1>Capability Catalog</h1> <h1>Capability Catalog</h1>
<p class="subtitle">Updated 2026-10-13 · 3 entries</p> <p class="subtitle">Updated 2026-06-16 · 2 entries</p>
<section><h2>helix_forge</h2> <section><h2>helix_forge</h2>
<article class="card"> <article class="card">
<h3>Capability Registration</h3> <h3>Capability Registration</h3>
@ -29,12 +29,5 @@
<p>Validate capability registry entries against schema, index consistency, and relation integrity.</p> <p>Validate capability registry entries against schema, index consistency, and relation integrity.</p>
<p class="path">registry/capabilities/capability.registry.validate.md</p> <p class="path">registry/capabilities/capability.registry.validate.md</p>
</article></section> </article></section>
<section><h2>infotech</h2>
<article class="card">
<h3>Headless Browser Automation</h3>
<p class="meta"><code>capability.infotech.headless-browser</code> · D3 / A5 / C2 / R2</p>
<p>Headless browser automation, screenshots and keyboard trials through rapp-playwright 0.1.0 (Playwright 1.64.0, Chromium 156.0.8078.4). Published A5 local container; managed Railiance admission is pending. Download the Python 3.10+ standalone client from https://forgejo.coulomb.social/coulomb/rapp-playwright/raw/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/client/rapp_playwright.py and run `python3 rapp_playwright.py --url http://127.0.0.1:18083 preflight`, then `python3 rapp_playwright.py --url http://127.0.0.1:18083 trial --out trial-01` with a fresh output directory. This endpoint was verified locally on 2026-10-13 and is ephemeral; it installs no browser for the caller. If unreachable, follow the local container setup in the capability card or adapt its A2 source examples; this is an availability gap on the existing capability. Contract: https://forgejo.coulomb.social/coulomb/rapp-playwright/src/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/docs/consumer-contract.md.</p>
<p class="path">registry/capabilities/capability.infotech.headless-browser.md</p>
</article></section>
</body> </body>
</html> </html>

View file

@ -1,40 +1,7 @@
{ {
"domain": "helix_forge", "domain": "helix_forge",
"updated": "2026-10-13", "updated": "2026-06-16",
"capabilities": [ "capabilities": [
{
"id": "capability.infotech.headless-browser",
"name": "Headless Browser Automation",
"summary": "Headless browser automation, screenshots and keyboard trials through rapp-playwright 0.1.0 (Playwright 1.64.0, Chromium 156.0.8078.4). Published A5 local container; managed Railiance admission is pending. Download the Python 3.10+ standalone client from https://forgejo.coulomb.social/coulomb/rapp-playwright/raw/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/client/rapp_playwright.py and run `python3 rapp_playwright.py --url http://127.0.0.1:18083 preflight`, then `python3 rapp_playwright.py --url http://127.0.0.1:18083 trial --out trial-01` with a fresh output directory. This endpoint was verified locally on 2026-10-13 and is ephemeral; it installs no browser for the caller. If unreachable, follow the local container setup in the capability card or adapt its A2 source examples; this is an availability gap on the existing capability. Contract: https://forgejo.coulomb.social/coulomb/rapp-playwright/src/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/docs/consumer-contract.md.",
"vector": "D3 / A5 / C2 / R2",
"domain": "infotech",
"status": "reviewed",
"owner": "reuse-surface",
"path": "registry/capabilities/capability.infotech.headless-browser.md",
"tags": [
"headless",
"browser",
"automation",
"playwright",
"chromium",
"testing",
"screenshots",
"extraction",
"firefox",
"webkit",
"selenium",
"puppeteer"
],
"consumption_modes": [
"informational",
"source adaptation",
"JavaScript library",
"Python library",
"cli",
"service API",
"container"
]
},
{ {
"id": "capability.registry.register", "id": "capability.registry.register",
"name": "Capability Registration", "name": "Capability Registration",

View file

@ -1,115 +0,0 @@
# Browser discovery review — 2026-10-13
REUSE-WP-0024 resolves the registry-owned portion of REUSE-IN-0001 on the
existing `capability.infotech.headless-browser` record. Provider implementation
and managed lifecycle remain with rapp-playwright and railiance-platform;
CONTENT-WP-0000-T04 remains the consumer's acceptance task.
## Published provider evidence
Fetched the raw client, consumer contract, independent-consumer report and
release manifest at provider commit
`8831a05aeba5ce588f3b395ade676dde2a151c5d`. All four matched `git show` at that
revision byte for byte. The single-file Python client SHA-256 is
`9967a0831ed04e27fde419098af707722d5c81c993e4c294b3677ffb75729c12`.
Pinned public links are retained in the
[capability card](../../registry/capabilities/capability.infotech.headless-browser.md).
The published image is
`forgejo.coulomb.social/coulomb/rapp-playwright@sha256:8d6fd5a8172cf906bb503642ed620761945c5138b86f6396c36f65cbe6def441`
for linux/amd64. Provider publication evidence includes immutable registry
verification and railiance01 pull. This review did not redeploy the provider.
## Fresh client-only local trial
Executed the downloaded client, without installing Playwright or Chromium:
```sh
python3 /tmp/reuse-browser-review/rapp_playwright.py --url http://127.0.0.1:18083 preflight
python3 /tmp/reuse-browser-review/rapp_playwright.py --url http://127.0.0.1:18083 trial --out /tmp/reuse-browser-review/trial-01
```
Both exited 0. Run `6c710b36-319b-45b8-b062-ac2065f5e81b` completed at
**18:42:58 UTC** with **14 passed steps**: visibility, counter checks, Tab,
focused-button assertion, Enter and screenshot in two viewports. The provider
reported service 0.1.0, Playwright 1.64.0, Chromium 156.0.8078.4,
`workstation-release-check`, and the published digest above. Preflight permitted
no external origins; only the synthetic fixture was exercised.
Independently parsed all four PNG headers and recomputed hashes against the
client receipt. Desktop screenshots are 1280×800 and narrow screenshots are
390×844. This validates dimensions and integrity, not visual-baseline quality.
- [Preflight](2026-10-13-browser-discovery/preflight.json)
- [Receipt](2026-10-13-browser-discovery/receipt.json)
- [Independent artifact checks](2026-10-13-browser-discovery/artifact-checks.json)
- [Desktop fixture](2026-10-13-browser-discovery/desktop-final.png)
- [Narrow fixture](2026-10-13-browser-discovery/narrow-final.png)
Private run handles are excluded. The endpoint is ephemeral and was available
on this workstation at trial time; it is not a managed service or a promise of
future availability. The source examples remain a fallback when a provider is
unavailable. No consumer app, remote target or managed browser was tested.
## Assessment and matching
Promoted availability **A2 → A5** under the standard's deployable-container
definition. **A6 managed platform capability remains pending**. D3/C2/R2 stay
conservative; fixture execution does not prove broader target compatibility or
platform operation. Decision recorded in State Hub as
`b8ef28c1-9164-4678-8a61-1652e0f07407`.
Before this fix, `plan-check --intent "headless browser" --no-llm` returned
`new`, with an unrelated context engine first at 0.0476 and the browser third.
After scoring names independently from summaries/tags, the same query returns
`reuse`, with the browser first at **0.6667** and unrelated matches at **0.2 or
less**. Long command/evidence summaries no longer dilute direct name matches.
The output includes the standalone client link, preflight/trial commands,
ephemeral endpoint warning, managed-admission condition and availability-gap
fallback. Reuse advice now describes relevance rather than asserting readiness.
Regressions cover short-name relevance despite long summaries and higher-maturity
unrelated services, summary-only matching, equal-relevance maturity ties, and
hosted CLI output carrying conditional provider instructions. Stats tests now
use a fixed temporary registry rather than assuming the live repo always has
two capabilities.
## Validation
- `.venv/bin/python -m pytest -q`: **212 passed**. One existing Starlette
TestClient/httpx deprecation warning remains.
- `validate --relations --fail-on-warnings`: **3 entries valid**.
- `catalog`, `graph --check`, and `federation compose`: generated successfully;
**66 federated capabilities**, preserving one browser capability.
- Whitespace check passed apart from intentional Markdown hard breaks in the
generated Custodian brief.
## Publication and hosted readback
Implementation commit **`50077c9`** pushed to `origin/main`. Public raw capability
and index documents matched the committed files byte for byte. Refreshed
`https://reuse.coulomb.social/v1/federated?refresh=true` at **18:49:02 UTC**:
`stale: false`, no federation warnings, **66 capabilities**, exactly one browser
entry at **D3 / A5 / C2 / R2**.
The updated local CLI queried this hosted snapshot with `--intent "headless
browser" --no-llm`: browser first, score **0.6667**, verdict **reuse**, with the
client and conditional availability guidance in the returned summary. Matching
runs in the CLI against the hosted index; no server code deployment was needed.
- [Hosted entry readback](2026-10-13-browser-discovery/hosted-readback.json)
- [Hosted-snapshot plan-check](2026-10-13-browser-discovery/hosted-plan-check.json)
REUSE-IN-0001 is closed for registry discovery/consumption concerns. Provider
managed admission and consumer application acceptance remain outside this closure.
`statehub fix-consistency --repo reuse-surface --json` synchronized the finished
workplan and all three done tasks with zero failures or automation errors. Its
generated brief/index are included with the closure commit; the automatic
generated-only commit was refused by the existing Git hook. Four pre-existing
repository-classification advisories remain. A plain intake status PATCH returned
HTTP 500 because closure requires an outcome. Used the supported intake `/close`
transition with `outcome: promoted`, `promoted_to: REUSE-WP-0024` after recording
those fields in the canonical file.
Inbox handoffs and standing notices were read/acknowledged. Progress receipt:
`898a9638-09b8-44fa-8e04-5970c7cd2bbc`.

View file

@ -1,30 +0,0 @@
[
{
"name": "desktop-6-keyboard-result.png",
"bytes": 26622,
"sha256": "b15998824256b86c74f2bbb75f061061be65db0b4f3bb5444529ac69a723cdad",
"width": 1280,
"height": 800
},
{
"name": "desktop-final.png",
"bytes": 26622,
"sha256": "b15998824256b86c74f2bbb75f061061be65db0b4f3bb5444529ac69a723cdad",
"width": 1280,
"height": 800
},
{
"name": "narrow-6-keyboard-result.png",
"bytes": 24280,
"sha256": "49d27cb169b8e180ce93969c6d2b8619a7684cf035bb9dcae9cd91d8bd9952e8",
"width": 390,
"height": 844
},
{
"name": "narrow-final.png",
"bytes": 24280,
"sha256": "49d27cb169b8e180ce93969c6d2b8619a7684cf035bb9dcae9cd91d8bd9952e8",
"width": 390,
"height": 844
}
]

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

View file

@ -1,66 +0,0 @@
{
"query": {
"source": "intent",
"text": "headless browser",
"workplan_id": null,
"workplan_path": null
},
"verdict": "reuse",
"top_score": 0.6667,
"matches": [
{
"id": "capability.infotech.headless-browser",
"score": 0.6667,
"vector": "D3 / A5 / C2 / R2",
"owner": "reuse-surface",
"summary": "Headless browser automation, screenshots and keyboard trials through rapp-playwright 0.1.0 (Playwright 1.64.0, Chromium 156.0.8078.4). Published A5 local container; managed Railiance admission is pending. Download the Python 3.10+ standalone client from https://forgejo.coulomb.social/coulomb/rapp-playwright/raw/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/client/rapp_playwright.py and run `python3 rapp_playwright.py --url http://127.0.0.1:18083 preflight`, then `python3 rapp_playwright.py --url http://127.0.0.1:18083 trial --out trial-01` with a fresh output directory. This endpoint was verified locally on 2026-10-13 and is ephemeral; it installs no browser for the caller. If unreachable, follow the local container setup in the capability card or adapt its A2 source examples; this is an availability gap on the existing capability. Contract: https://forgejo.coulomb.social/coulomb/rapp-playwright/src/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/docs/consumer-contract.md.",
"kind": "deterministic"
},
{
"id": "capability.identity.user-engine",
"score": 0.2,
"vector": "D4 / A1 / C2 / R0",
"owner": "user-engine",
"summary": "Headless, multi-application, multi-tenant user management engine covering registration, identity/factor models, entitlement claims, hats/realms/services/assets access profiles, and onboarding journeys.",
"kind": "deterministic"
},
{
"id": "capability.infotech.pdf-evidence-ingest",
"score": 0.2,
"vector": "D2 / A1 / C1 / R1",
"owner": "evidence-source",
"summary": "Turns raw PDF bytes into an engine-shaped Document + DocumentRepresentation \u2014 SHA-256 fingerprint, canonical text, page map, and gap-free offset map \u2014 as a runtime-agnostic library with no viewer, persistence, or React coupling.",
"kind": "deterministic"
},
{
"id": "capability.communication.context-engine",
"score": 0.0476,
"vector": "D4 / A1 / C1 / R0",
"owner": "kontextual-engine",
"summary": "Headless knowledge-operations engine turning heterogeneous information assets into persistent, contextual, governed, retrievable, transformable, and agent-operable knowledge.",
"kind": "deterministic"
},
{
"id": "capability.infotech.email-connector",
"score": 0.0476,
"vector": "D2 / A1 / C1 / R0",
"owner": "email-connect",
"summary": "Headless, provider-neutral email communication and evidence service; first slice scans a mailbox or fixture directory and produces timestamped CSV evidence reports.",
"kind": "deterministic"
}
],
"federated_index_updated": "2026-10-13",
"federated_index_stale_warning": null,
"index_source": {
"kind": "hosted",
"url": "https://reuse.coulomb.social/v1/federated",
"fetched_at": "2026-10-13T18:49:10.789378+00:00",
"composed_at": "2026-10-13T18:49:02+00:00",
"capability_count": 66,
"sha256": "59d5c247ac2a769e07f7ac6e464242bc0d3af78bc838b7f31ff995a8a36671e7",
"digest_format": "response-bytes",
"max_age_hours": 24,
"stale": false,
"federation_warnings": false
}
}

View file

@ -1,43 +0,0 @@
{
"composed_at": "2026-10-13T18:49:02+00:00",
"updated": "2026-10-13",
"stale": false,
"capability_count": 66,
"federation_warnings": null,
"browser": {
"id": "capability.infotech.headless-browser",
"name": "Headless Browser Automation",
"summary": "Headless browser automation, screenshots and keyboard trials through rapp-playwright 0.1.0 (Playwright 1.64.0, Chromium 156.0.8078.4). Published A5 local container; managed Railiance admission is pending. Download the Python 3.10+ standalone client from https://forgejo.coulomb.social/coulomb/rapp-playwright/raw/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/client/rapp_playwright.py and run `python3 rapp_playwright.py --url http://127.0.0.1:18083 preflight`, then `python3 rapp_playwright.py --url http://127.0.0.1:18083 trial --out trial-01` with a fresh output directory. This endpoint was verified locally on 2026-10-13 and is ephemeral; it installs no browser for the caller. If unreachable, follow the local container setup in the capability card or adapt its A2 source examples; this is an availability gap on the existing capability. Contract: https://forgejo.coulomb.social/coulomb/rapp-playwright/src/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/docs/consumer-contract.md.",
"vector": "D3 / A5 / C2 / R2",
"domain": "infotech",
"status": "reviewed",
"owner": "reuse-surface",
"path": "registry/capabilities/capability.infotech.headless-browser.md",
"tags": [
"headless",
"browser",
"automation",
"playwright",
"chromium",
"testing",
"screenshots",
"extraction",
"firefox",
"webkit",
"selenium",
"puppeteer"
],
"consumption_modes": [
"informational",
"source adaptation",
"JavaScript library",
"Python library",
"cli",
"service API",
"container"
],
"source_repo": "reuse-surface",
"source_url": "https://forgejo.coulomb.social/coulomb/reuse-surface/raw/branch/main/registry/indexes/capabilities.yaml",
"source_index": "/data/cache/reuse-surface.yaml"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

View file

@ -1,22 +0,0 @@
{
"available": true,
"error": null,
"checked_at": "2026-10-13T18:42:18.136Z",
"browser_version": "156.0.8078.4",
"api_version": "1",
"service_version": "0.1.0",
"playwright_version": "1.64.0",
"execution_location": "workstation-release-check",
"release": "sha256:8d6fd5a8172cf906bb503642ed620761945c5138b86f6396c36f65cbe6def441",
"allowed_origins": [],
"fixture": true,
"active": 0,
"queued": 0,
"limits": {
"concurrency": 1,
"max_queue": 4,
"max_timeout_ms": 120000,
"retention_ms": 3600000,
"max_runs": 64
}
}

View file

@ -1,184 +0,0 @@
{
"id": "6c710b36-319b-45b8-b062-ac2065f5e81b",
"api_version": "1",
"status": "passed",
"error": null,
"label": "independent-browser-trial",
"target": "fixture",
"viewports": [
{
"name": "desktop",
"width": 1280,
"height": 800
},
{
"name": "narrow",
"width": 390,
"height": 844
}
],
"timeout_ms": 60000,
"created_at": "2026-10-13T18:42:41.545Z",
"expires_at": "2026-10-13T19:42:41.545Z",
"service_version": "0.1.0",
"playwright_version": "1.64.0",
"release": "sha256:8d6fd5a8172cf906bb503642ed620761945c5138b86f6396c36f65cbe6def441",
"execution_location": "workstation-release-check",
"browser_version": "156.0.8078.4",
"completed_steps": 14,
"steps": [
{
"viewport": "desktop",
"index": 0,
"action": "visible",
"status": "passed",
"at": "2026-10-13T18:42:52.067Z",
"selector": "h1"
},
{
"viewport": "desktop",
"index": 1,
"action": "text",
"status": "passed",
"at": "2026-10-13T18:42:52.461Z",
"selector": "#count"
},
{
"viewport": "desktop",
"index": 2,
"action": "press",
"status": "passed",
"at": "2026-10-13T18:42:52.576Z",
"key": "Tab"
},
{
"viewport": "desktop",
"index": 3,
"action": "focused",
"status": "passed",
"at": "2026-10-13T18:42:52.660Z",
"selector": "#increment"
},
{
"viewport": "desktop",
"index": 4,
"action": "press",
"status": "passed",
"at": "2026-10-13T18:42:52.674Z",
"key": "Enter"
},
{
"viewport": "desktop",
"index": 5,
"action": "text",
"status": "passed",
"at": "2026-10-13T18:42:52.754Z",
"selector": "#count"
},
{
"viewport": "desktop",
"index": 6,
"action": "screenshot",
"status": "passed",
"at": "2026-10-13T18:42:52.764Z"
},
{
"viewport": "narrow",
"index": 0,
"action": "visible",
"status": "passed",
"at": "2026-10-13T18:42:55.566Z",
"selector": "h1"
},
{
"viewport": "narrow",
"index": 1,
"action": "text",
"status": "passed",
"at": "2026-10-13T18:42:55.959Z",
"selector": "#count"
},
{
"viewport": "narrow",
"index": 2,
"action": "press",
"status": "passed",
"at": "2026-10-13T18:42:56.177Z",
"key": "Tab"
},
{
"viewport": "narrow",
"index": 3,
"action": "focused",
"status": "passed",
"at": "2026-10-13T18:42:56.253Z",
"selector": "#increment"
},
{
"viewport": "narrow",
"index": 4,
"action": "press",
"status": "passed",
"at": "2026-10-13T18:42:56.265Z",
"key": "Enter"
},
{
"viewport": "narrow",
"index": 5,
"action": "text",
"status": "passed",
"at": "2026-10-13T18:42:56.275Z",
"selector": "#count"
},
{
"viewport": "narrow",
"index": 6,
"action": "screenshot",
"status": "passed",
"at": "2026-10-13T18:42:56.359Z"
}
],
"artifacts": [
{
"name": "desktop-6-keyboard-result.png",
"bytes": 26622
},
{
"name": "desktop-final.png",
"bytes": 26622
},
{
"name": "narrow-6-keyboard-result.png",
"bytes": 24280
},
{
"name": "narrow-final.png",
"bytes": 24280
}
],
"started_at": "2026-10-13T18:42:41.550Z",
"blocked_requests": 13,
"finished_at": "2026-10-13T18:42:58.107Z",
"downloads": [
{
"name": "desktop-6-keyboard-result.png",
"bytes": 26622,
"sha256": "b15998824256b86c74f2bbb75f061061be65db0b4f3bb5444529ac69a723cdad"
},
{
"name": "desktop-final.png",
"bytes": 26622,
"sha256": "b15998824256b86c74f2bbb75f061061be65db0b4f3bb5444529ac69a723cdad"
},
{
"name": "narrow-6-keyboard-result.png",
"bytes": 24280,
"sha256": "49d27cb169b8e180ce93969c6d2b8619a7684cf035bb9dcae9cd91d8bd9952e8"
},
{
"name": "narrow-final.png",
"bytes": 24280,
"sha256": "49d27cb169b8e180ce93969c6d2b8619a7684cf035bb9dcae9cd91d8bd9952e8"
}
]
}

View file

@ -1,5 +1,4 @@
graph LR graph LR
capability_infotech_headless_browser["capability.infotech.headless-browser<br/>D3 / A5 / C2 / R2"]
capability_registry_register["capability.registry.register<br/>D3 / A4 / C2 / R3"] capability_registry_register["capability.registry.register<br/>D3 / A4 / C2 / R3"]
capability_registry_validate["capability.registry.validate<br/>D4 / A3 / C3 / R3"] capability_registry_validate["capability.registry.validate<br/>D4 / A3 / C3 / R3"]
capability_registry_register -->|supports| capability_feature_control_evaluate capability_registry_register -->|supports| capability_feature_control_evaluate

View file

@ -17,7 +17,7 @@
<p class="legend">Generated from entry <code>relations</code> fields. Regenerate with <code>reuse-surface graph</code>.</p> <p class="legend">Generated from entry <code>relations</code> fields. Regenerate with <code>reuse-surface graph</code>.</p>
<pre class="mermaid" id="graph"></pre> <pre class="mermaid" id="graph"></pre>
<script> <script>
document.getElementById('graph').textContent = "graph LR\n capability_infotech_headless_browser[\"capability.infotech.headless-browser<br/>D3 / A5 / C2 / R2\"]\n capability_registry_register[\"capability.registry.register<br/>D3 / A4 / C2 / R3\"]\n capability_registry_validate[\"capability.registry.validate<br/>D4 / A3 / C3 / R3\"]\n capability_registry_register -->|supports| capability_feature_control_evaluate\n capability_registry_register -->|supports| capability_identity_vocabulary_canonicalize\n capability_registry_register -->|related_to| capability_registry_validate\n capability_registry_validate -->|depends_on| capability_registry_register\n capability_registry_validate -->|related_to| capability_registry_register\n"; document.getElementById('graph').textContent = "graph LR\n capability_registry_register[\"capability.registry.register<br/>D3 / A4 / C2 / R3\"]\n capability_registry_validate[\"capability.registry.validate<br/>D4 / A3 / C3 / R3\"]\n capability_registry_register -->|supports| capability_feature_control_evaluate\n capability_registry_register -->|supports| capability_identity_vocabulary_canonicalize\n capability_registry_register -->|related_to| capability_registry_validate\n capability_registry_validate -->|depends_on| capability_registry_register\n capability_registry_validate -->|related_to| capability_registry_register\n";
</script> </script>
</body> </body>
</html> </html>

View file

@ -1,110 +0,0 @@
# REUSE-IN-0001 — Answer a headless-browser request with a runnable trial
```yaml
id: REUSE-IN-0001
kind: intake
title: "Answer a headless-browser request with a runnable trial, or say the gap is availability"
status: closed
outcome: promoted
promoted_to: REUSE-WP-0024
lane: green
flavor: implementation
origin: cross-repo
origin_ref: CONTENT-WP-0000-T04
priority: medium
owner: reuse-surface
repo: reuse-surface
requested_by: content-explorer
created: "2026-10-13"
updated: "2026-10-13"
description: >
content-explorer asked the hosted reuse-surface index for a headless browser
while CONTENT-WP-0000-T04 was open. That task needs responsive screenshots
and a keyboard walkthrough. On 2026-10-12 the workstation had no Chrome,
Chromium, Firefox, or Playwright launcher.
GET https://reuse.coulomb.social/v1/federated (composed_at
2026-10-13T11:56:56Z, stale false) returns
capability.infotech.headless-browser at D3 / A2 / C2 / R2. The card
recommends adapting Playwright plus Chromium from whynot-design,
coulomb-social, core-hub, and frontend-patterns. The entry states that it
does not deliver a shared wrapper or a hosted browser. A keyword filter for
"headless" also returns four unrelated engines (kontextual-engine,
user-engine, email-connect, evidence-source). Hosted plan-check for the
intent "headless browser" includes the entry and still returns verdict
new. The publication note on ADHOC-2026-10-13-T02 already records that
scoring limitation.
What the consumer needed from the service:
1. A response that answers whether a browser can be launched on this
workstation now.
2. When it can, one verified command path in the query response itself:
install the matching Playwright Chromium, open one page, save a screenshot,
and record a short keyboard interaction. Learning that next step should
not require opening a sibling checkout and copying another repo's fixtures.
3. When it cannot, the same response should say the record is
discovery-only, availability is A2, nothing is installed for the caller,
and nothing is hosted. The verdict should be an availability gap on
capability.infotech.headless-browser, so the worker extends that entry
instead of starting a second browser stack.
4. The phrase "headless browser" should rank apart from unrelated headless
services.
A hosted browser farm, credential handling, and permission to automate
arbitrary external sites are outside this request. The current entry is
right to keep those excluded. The useful increment is a
workstation-verified trial helper with a pinned Playwright and Chromium
version, plus a query result that names that helper or names the
availability gap. This intake does not ask reuse-surface to mark
CONTENT-WP-0000-T04 done or to import OnCo.
Owner response, 2026-10-13, following founder direction: browser service
implementation, operation and consumer workstation setup are not reuse-surface
responsibilities. A rapp-playwright-provided service will be available shortly.
Record this as announced/planned, not verified availability; no endpoint,
consumption contract or launch receipt has been verified here. Existing A2
source reuse remains available and the current maturity vector is unchanged.
reuse-surface retains responsibility for discovery, accurate availability
guidance, consumption references and the reported false-new/relevance defects.
This intake remains open for those registry concerns; its browser-delivery
request belongs to rapp-playwright. A2 means source/library reuse, not
discovery-only or already installed for a caller. CONTENT-WP-0000-T04 remains
the consumer's task and is not completed by this announcement.
state_hub_intake_id: "01a13530-89a8-77b0-bb95-ef16d74bb29b"
```
## Registry resolution — 2026-10-13
Implemented under REUSE-WP-0024 and published in commit `50077c9`.
The original description above is retained as the intake history.
- The same browser capability now includes a pinned, downloadable standalone
client, exact preflight/trial commands in the query summary, immutable local
container setup and conditional managed instructions. No sibling checkout or
consumer browser installation is needed for the provider path.
- A fresh local client-only trial passed all 14 fixture steps; four downloaded
PNGs passed independent hash/dimension checks at desktop and narrow sizes.
Availability is A5 for the published container, with A2 source reuse retained.
The endpoint is ephemeral and managed Railiance admission remains pending.
- Short-name scoring fixes relevance and false-new behavior. Plan-check using
the published hosted snapshot ranks the browser first at 0.6667, verdict
`reuse`. Relevance is explicitly separate from runtime readiness; an unavailable
provider is an availability gap on this entry.
- Hosted federation readback at 18:49:02 UTC is fresh, warning-free, and includes
one browser capability among 66 entries. Public capability/index bytes match
the published commit.
[Review, trial and publication evidence](../docs/evidence/2026-10-13-browser-discovery.md).
This closes the registry-owned intake, not CONTENT-WP-0000-T04, platform
admission or consumer application acceptance.

View file

@ -114,17 +114,6 @@ Definitions live in `specs/CapabilityMaturityStandard.md`.
## Search and filter guidance ## Search and filter guidance
For a headless browser trial, run `python3 -m reuse_surface.cli query --keyword browser`
from this repository root and read
[Headless Browser Automation](capabilities/capability.infotech.headless-browser.md).
It records implemented consumers, the scoped Playwright/Chromium recommendation,
and a practical trial procedure. Local federation reads this checkout's own index
directly, so `federation compose` includes unpublished local entries. Other sources
remain remote; the hosted hub still requires publication before it sees new entries.
For this trial use the keyword query: the deterministic `plan-check` includes the
browser entry but still returns `new` for the short intent `headless browser` due
to its token-overlap thresholds and maturity tie-breaking.
### UC-RS-004 — Search by planning need ### UC-RS-004 — Search by planning need
1. Run `reuse-surface query --discovery-min D4` or read the index and scan 1. Run `reuse-surface query --discovery-min D4` or read the index and scan
@ -234,4 +223,4 @@ R4+ requires broader consumer evidence (incidents, adoption, SLO) per
4. Update `availability.current_artifacts` when a new consumption mode appears. 4. Update `availability.current_artifacts` when a new consumption mode appears.
5. Refresh the index `vector` and run `reuse-surface validate --relations`. 5. Refresh the index `vector` and run `reuse-surface validate --relations`.
6. Run `reuse-surface federation compose` and `reuse-surface graph`. 6. Run `reuse-surface federation compose` and `reuse-surface graph`.
6. Set `status: reviewed` or `approved` when an assessor validates the entry. 6. Set `status: reviewed` or `approved` when an assessor validates the entry.

View file

@ -1,337 +0,0 @@
---
id: capability.infotech.headless-browser
name: Headless Browser Automation
summary: >-
Headless browser automation, screenshots and keyboard trials through rapp-playwright 0.1.0 (Playwright 1.64.0, Chromium 156.0.8078.4). Human and coding-agent managed trials passed on 2026-10-18 through the existing supervised workstation connection. Use the documented kubectl port-forward to 127.0.0.1:18081, then the pinned standalone Python client preflight/trial commands. No local browser installation. Independent per-caller managed admission remains pending; availability stays A5. Contract: https://forgejo.coulomb.social/coulomb/rapp-playwright/src/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/docs/consumer-contract.md.
owner: reuse-surface
status: reviewed
domain: infotech
tags: [headless, browser, automation, playwright, chromium, testing, screenshots, extraction, firefox, webkit, selenium, puppeteer]
maturity:
discovery:
current: D3
target: D4
confidence: medium
rationale: >
Inspected four implemented Playwright consumers and separated optional
dependencies and plans from usage. No comprehensive alternatives benchmark.
availability:
current: A5
target: A6
confidence: medium
rationale: >
rapp-playwright 0.1.0 is a published immutable container with a versioned
HTTP contract and standalone Python client, independently trialled locally.
A5 describes deployable container availability, not managed operation (A6).
The supervised managed build profile has real human/agent receipts; independent
per-caller admission remains pending. Existing A2 source adaptation remains usable;
no endpoint uptime or caller browser installation is implied.
external_evidence:
completeness:
level: C2
confidence: medium
basis: scope_vs_intent_and_consumer_expectations
satisfied_expectations:
- Identifies implemented consumers, browser engines and source entry points.
- Gives a scoped default recommendation and a practical trial procedure.
- Published provider client and container have independent fixture screenshots and keyboard receipts.
- Actual managed human and coding-agent supported-command trials passed on 2026-10-18 under the stated supervised build profile.
broken_expectations:
- Independent per-caller managed admission is still pending; the supervised build connection must be established first.
- Consumer application acceptance remains the consuming repo's responsibility.
out_of_scope_expectations:
- Exhaustive estate dependency inventory or comparative browser benchmark.
- Browser service implementation or operation by reuse-surface.
- Mandatory estate-wide technology policy.
reliability:
level: R2
confidence: medium
basis: consumer_quality_signals
known_reliability_risks:
- Browser binaries and system libraries must match the selected Playwright version.
- Existing examples contain application-specific fixtures and assumptions.
- Provider fixture receipts do not prove arbitrary target compatibility or independent per-caller identity.
- Local provider endpoints are ephemeral; check preflight for each trial.
evidence:
satisfied_signals:
- frontend-patterns navigation-history records a completed Chromium/Firefox experiment.
- rapp-playwright independent final-release trial passed 14 steps across desktop and narrow viewports.
- Independent provider evidence includes wrong-token, failed assertion and unavailable-service checks.
discovery:
intent: >
Help a worker select and reuse existing headless browser tooling instead of
independently introducing another automation stack.
includes:
- Playwright automation with headless Chromium as the default starting point.
- JavaScript UI tests, screenshots and page extraction examples.
- Python visual-check example and Firefox experiment evidence.
- Published rapp-playwright container, Python client and bounded HTTP fixture trials.
excludes:
- Browser hosting or workstation provisioning by reuse-surface.
- Credential provisioning and permission to automate external targets.
- Claims that a dependency declaration or a workplan proves executed browser usage.
assumptions:
- Source-adaptation consumers install matching browsers; provider clients need only Python 3.10+.
- Provider consumers establish an available endpoint and run preflight before a trial.
use_cases:
- Find which working repos already use a headless browser and where to start reusing it.
- Run a local UI assertion and screenshot in a target repo before adopting the tooling.
availability:
current_level: A5
target_level: A6
current_artifacts:
- forgejo.coulomb.social/coulomb/rapp-playwright@sha256:8d6fd5a8172cf906bb503642ed620761945c5138b86f6396c36f65cbe6def441
- https://forgejo.coulomb.social/coulomb/rapp-playwright/raw/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/client/rapp_playwright.py
- https://forgejo.coulomb.social/coulomb/rapp-playwright/src/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/releases/0.1.0.json
- ../whynot-design/playwright.config.mjs
- ../whynot-design/tests/visual/ui-kit.spec.mjs
- ../coulomb-social/scripts/test-usecase-browser.mjs
- ../core-hub/scripts/check_console_visual.py
- ../frontend-patterns/research/experiments/navigation-history/experiment.mjs
target_artifacts:
- >-
Managed Railiance deployment after platform admission, with consumer
independent per-caller access and complete recovery/rollback acceptance; the
supervised build pilot already has actual human/agent receipts.
consumption_modes: [informational, source adaptation, JavaScript library, Python library, cli, service API, container]
relations:
depends_on: []
supports: []
related_to: []
evidence:
documentation:
- https://playwright.dev/docs/browsers
- ../frontend-patterns/research/experiments/navigation-history/README.md
- ../test-driver/SCOPE.md
- ../testdrive-jsui/pyproject.toml
- https://forgejo.coulomb.social/coulomb/rapp-playwright/src/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/docs/consumer-contract.md
- https://forgejo.coulomb.social/coulomb/rapp-playwright/src/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/docs/evidence/2026-10-13-publication.md
- intakes/REUSE-IN-0001-headless-browser-runnable-answer.md
tests:
- https://forgejo.coulomb.social/coulomb/rapp-playwright/src/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/docs/evidence/2026-10-13-independent-local-consumer.md
- docs/evidence/2026-10-13-browser-discovery.md
- ../whynot-design/tests/visual/ui-kit.spec.mjs
- ../coulomb-social/scripts/test-usecase-browser.mjs
- ../core-hub/scripts/check_console_visual.py
- ../frontend-patterns/research/experiments/navigation-history/result.json
consumer_feedback:
- >-
2026-10-13 content-explorer, REUSE-IN-0001: published source examples did not
provide a verified runnable path for screenshots and keyboard interaction.
The false-new plan-check verdict is a registry discovery issue, not evidence
that a new browser stack is needed. Browser delivery belongs to the provider.
consumer_guidance:
recommended_for:
- Use Playwright with headless Chromium for a new repo's general UI automation trial.
- Reuse whynot-design for JavaScript visual tests and core-hub for Python visual checks.
- Reuse coulomb-social for JavaScript browser scripts and frontend-patterns for multi-engine experiments.
- >-
For bounded screenshot and keyboard jobs, use the published rapp-playwright
Python client against an available local provider and run preflight first.
Use the immutable container to reproduce the provider; managed Railiance
access requires admission and a working tunnel before consumption.
not_recommended_for:
- Treating this recommendation as an approved mandatory estate standard.
- Selecting test-driver as an implemented JavaScript-capable browser engine.
- Introducing Selenium or Puppeteer merely because their names match a discovery query.
known_limitations:
- This is a dated source inspection; run the target-repo trial before claiming adoption success.
- Firefox is evidenced in frontend-patterns; WebKit is supported upstream but unverified in this inspection.
- Selenium is an optional testdrive-jsui dependency, not verified execution; Puppeteer has no verified example here.
- Local provider availability is verified but ephemeral; managed admission and platform operation remain pending.
- Provider fixture success does not establish consumer target reachability or application acceptance.
promotion_history:
- date: "2026-10-13"
dimension: availability
from: A2
to: A5
rationale: >-
Published immutable rapp-playwright 0.1.0 container, versioned client/contract
and independent local release receipts satisfy deployable-container availability.
This is not an A6 managed-platform claim. D3, C2 and R2 remain conservative
assessments pending broader target and operational evidence.
author: codex
---
# Headless Browser Automation
## Recommendation
Start with **Playwright controlling headless Chromium** for general browser
automation, UI tests, screenshots and JavaScript-rendered page extraction.
This follows implemented usage in four working repos. Playwright is the automation
library; Chromium is the browser engine. Use `@playwright/test` for a JavaScript
test suite, the `playwright` library for standalone JavaScript scripts, or Python
`playwright` when the consumer is Python.
This is a reuse recommendation reviewed against source on **2026-10-13**, not a
mandatory estate standard or a benchmark verdict against Selenium/Puppeteer.
reuse-surface maintains this discovery record; the example repos maintain their
implementations and the upstream Playwright project maintains the library.
## Service provider and delivery status
**rapp-playwright 0.1.0 is published and verified as a local container provider.**
The current vector is **D3 / A5 / C2 / R2**. A5 means a deployable container under
[the maturity standard](../../specs/CapabilityMaturityStandard.md); managed
platform operation is A6 and remains **pending Railiance admission**. Source
examples remain available at A2. No browser is installed on the caller's machine
by discovery or by running the Python client.
`rapp-playwright` owns the browser service; `railiance-platform` owns managed
lifecycle admission. `reuse-surface` owns this record, discovery, consumption
guidance and evidence assessment. The
[content-explorer intake](../../intakes/REUSE-IN-0001-headless-browser-runnable-answer.md)
concerns registry relevance and availability clarity; CONTENT-WP-0000-T04
acceptance remains with the consumer.
### Verified client path
Only Python 3.10+ is needed by the consumer. Download the single revision-pinned
client into a working directory; a sibling checkout is not required:
```sh
curl -fL --output rapp_playwright.py https://forgejo.coulomb.social/coulomb/rapp-playwright/raw/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/client/rapp_playwright.py
python3 rapp_playwright.py --url http://127.0.0.1:18083 preflight
python3 rapp_playwright.py --url http://127.0.0.1:18083 trial --out trial-01
```
Use a fresh output directory for each run. Port **18083** was verified on this
workstation on **2026-10-13**; it is an ephemeral local provider, not a permanent
or remotely reachable endpoint. Preflight must report `available: true`, API 1,
service 0.1.0, Playwright **1.64.0**, Chromium **156.0.8078.4**, and the expected
release/location. Connection failure means the provider or tunnel is unavailable,
not that another browser capability is needed. Use the local setup below or the
source-adaptation fallback. Repeat `--url` on later status/download commands.
The fixture trial checks Tab focus, Enter activation and the counter assertion
across **1280×800** and **390×844** viewports, then downloads screenshots and a
receipt. It does not inspect or accept the consumer's own UI. `run.json` is a
private run handle and must not be published. For `trial`/`run`, exit 0 means
passed, 2 means UI assertion failed, and 3 means infrastructure/setup or another
unsuccessful result; `status` exit 0 only means retrieval succeeded.
### Reproduce the local provider
The published release targets **linux/amd64**. With Docker and image pull access,
start the immutable container in one terminal, then point the client at port
**18081** in another:
```sh
docker run --rm --name rapp-playwright-local --read-only \
--tmpfs /tmp:rw,size=512m --shm-size=256m --memory=1g --cpus=1 \
--cap-drop ALL --security-opt no-new-privileges \
--mount type=volume,src=rapp-playwright-local-data,dst=/data \
-p 127.0.0.1:18081:8080 -e HOST=0.0.0.0 \
-e EXECUTION_LOCATION=workstation-container \
-e RELEASE_ID=sha256:8d6fd5a8172cf906bb503642ed620761945c5138b86f6396c36f65cbe6def441 \
forgejo.coulomb.social/coulomb/rapp-playwright@sha256:8d6fd5a8172cf906bb503642ed620761945c5138b86f6396c36f65cbe6def441
python3 rapp_playwright.py --url http://127.0.0.1:18081 preflight
python3 rapp_playwright.py --url http://127.0.0.1:18081 trial --out trial-local-01
```
This is the provider's documented local setup with the published digest pinned;
it was not redeployed by this registry review. Existing independent final-release
receipts and the fresh discovery trial use the same digest. The default fixture
requires no external target grant. The provider supports trusted/synthetic pages,
not hostile-page or mutually untrusted tenant execution.
### Supervised managed development path — verified 2026-10-18
The existing private deployment was used by one actual human and one coding
agent, each completing 14 keyboard/responsive steps with downloaded screenshots.
This build profile uses an existing authenticated workstation connection;
independent per-caller identity, transport and final managed admission remain open.
Establish that existing connection, then use the same supported provider client:
```sh
kubectl -n playwright port-forward deployment/playwright 18081:8080 --address 127.0.0.1
# In another terminal, while the tunnel remains running:
python3 rapp_playwright.py preflight
python3 rapp_playwright.py trial --out trial-managed-01
```
Both managed trials passed against the deployed release digest already listed
above. The client is byte-identical to the pinned published commit.
[Human receipt](https://forgejo.coulomb.social/coulomb/the-custodian/src/commit/17635cb0a76e5595ec06421ab7419ae889f6d731/docs/changes/netkingdom-target-2026-10-18/wp80-build-mode-r1/playwright-human/receipt.json),
[agent receipt](https://forgejo.coulomb.social/coulomb/the-custodian/src/commit/17635cb0a76e5595ec06421ab7419ae889f6d731/docs/changes/netkingdom-target-2026-10-18/wp80-build-mode-r1/playwright-agent/receipt.json),
and [profile/commands](https://forgejo.coulomb.social/coulomb/the-custodian/src/commit/17635cb0a76e5595ec06421ab7419ae889f6d731/docs/changes/netkingdom-target-2026-10-18/wp80-build-mode-r1/README.md)
state the exact scope. Use a fresh output directory; keep the run capability
private. Do not distribute a kubeconfig or treat this receipt as a broader identity
acceptance. Stop the port-forward with Ctrl-C when finished. A remote browser's
localhost belongs to the provider. Consumer applications need a
provider-reachable, explicitly allowed origin; the browser API tunnel does not
forward a workstation app. See the provider contract before running a target
scenario.
### Pinned delivery evidence
All provider links below are pinned to published commit
`8831a05aeba5ce588f3b395ade676dde2a151c5d`:
- [Consumer contract](https://forgejo.coulomb.social/coulomb/rapp-playwright/src/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/docs/consumer-contract.md).
- [Release manifest](https://forgejo.coulomb.social/coulomb/rapp-playwright/src/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/releases/0.1.0.json)
and [publication/pull evidence](https://forgejo.coulomb.social/coulomb/rapp-playwright/src/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/docs/evidence/2026-10-13-publication.md).
- [Independent consumer evidence](https://forgejo.coulomb.social/coulomb/rapp-playwright/src/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/docs/evidence/2026-10-13-independent-local-consumer.md),
including final-release screenshots, keyboard assertions, wrong-token rejection,
UI failure and unavailable-service results. These are retained provider-side
reports; this review separately verified the fixture path.
- [Fresh registry review and trial](../../docs/evidence/2026-10-13-browser-discovery.md).
## Existing implementations
Paths in frontmatter are relative to the reuse-surface repository root. The links
below work with sibling checkouts. The cited files were clean at these revisions.
| Repo and inspected revision | What is implemented | Reuse starting point |
| --- | --- | --- |
| whynot-design — `a79a4d803e9aed13f66d072bf409b6f86000f01f` | Playwright Test, explicitly headless Chromium, screenshot comparisons | [Configuration](../../../whynot-design/playwright.config.mjs), [visual tests](../../../whynot-design/tests/visual/ui-kit.spec.mjs), [dependency/scripts](../../../whynot-design/package.json) |
| coulomb-social — `5c32757b987ab1610cdb46a808d56c75f569f581` | JavaScript Playwright scripts launching headless Chromium for browser tests and extraction | [Use-case test](../../../coulomb-social/scripts/test-usecase-browser.mjs), [script dependency](../../../coulomb-social/scripts/package.json) |
| core-hub — `a69ad325271485afe284a6db85673dfa30d9d4ad` | Python synchronous Playwright visual checks launching Chromium with the default headless mode | [Visual-check script](../../../core-hub/scripts/check_console_visual.py), [development dependency](../../../core-hub/pyproject.toml) |
| frontend-patterns — `047a6a2d314ff5a9d2a87d5bc987d7d84835f682` | Playwright experiments using Chromium and Firefox, with retained execution receipts | [Runner](../../../frontend-patterns/research/experiments/navigation-history/experiment.mjs), [setup and limitations](../../../frontend-patterns/research/experiments/navigation-history/README.md), [result](../../../frontend-patterns/research/experiments/navigation-history/result.json) |
These are source/retained-receipt observations, not newly executed test results.
The frontend-patterns example uses an explicit Chromium binary override; do not
copy its workstation paths as a portable browser installation recipe.
## Alternatives and misleading matches
- **Selenium:** [testdrive-jsui's optional development dependencies](../../../testdrive-jsui/pyproject.toml)
declare it at `701341d7fa520f860245e28eb16d44b767fd116b`. A declaration alone
does not establish an implemented or passing browser workflow.
- **test-driver:** [SCOPE.md](../../../test-driver/SCOPE.md) at
`c3ad06e598057862cf500cbd46c7c8b6f83885ed` explicitly excludes a browser engine,
JavaScript execution, screenshots and DOM timing. Historical Playwright plans
are not an available implementation.
- **Puppeteer:** no verified implementation was found in this inspection. This
is not a claim that every working repo has been exhaustively searched.
- **Firefox/WebKit:** Playwright supports both upstream. Firefox has retained
experiment evidence here; WebKit has no verified local example in this record.
## Source-adaptation fallback for the consuming worker
1. Query this checkout with `python3 -m reuse_surface.cli query --keyword browser`
from the reuse-surface root, then open this entry. If the CLI is installed,
`reuse-surface query --keyword browser` is equivalent.
`plan-check --intent "headless browser" --no-llm` ranks this entry first.
Its reuse verdict describes relevance; provider preflight determines current
runtime availability. Use source adaptation when the provider path is unsuitable.
2. Pick the example matching the target repo's language and task. Inspect its
fixture/server assumptions before adapting the smallest useful test or script.
3. Use the target repo's package manager and lockfile. Select a compatible
Playwright version and install its matching Chromium binary. For an installed
Node dependency, use `npx playwright install chromium`; for an installed Python
dependency, use `python -m playwright install chromium` in its environment.
Follow the upstream [browser/system-dependency instructions](https://playwright.dev/docs/browsers)
if system libraries are missing. No common estate version is established here.
4. Against a local fixture or the target repo's local development server, launch
headless Chromium, load one page, assert one meaningful rendered element or
interaction, save a screenshot if relevant, and close the browser. Exercise
a JavaScript-driven change if JavaScript rendering is the reason for adoption.
5. Report the consumer repo, reference example, package/browser versions, exact
command, assertion outcome, artifact paths and any setup failure. The trial
remains unverified until this evidence exists; installation alone is not success.
The hosted service reads published repository indexes. A local edit does not
by itself make this entry available at `reuse.coulomb.social`; use the local query
above for an unpublished trial and verify the hosted entry after publication.

View file

@ -1,35 +1,34 @@
--- ---
id: capability.registry.register id: capability.registry.register
name: Capability registry and federation name: Capability Registration
summary: Owner Markdown entries, indexes, federation hub and planning queries. summary: Register a new capability so it becomes visible for planning and implementation reuse.
owner: reuse-surface owner: reuse-surface
status: draft status: draft
domain: helix_forge domain: helix_forge
tags: tags:
- registry - registry
- governance - governance
- meta - meta
- security
- netkingdom
- framework-reuse
maturity: maturity:
discovery: discovery:
current: D3 current: D3
target: D5 target: D5
confidence: medium confidence: medium
rationale: 'Core use case UC-RS-001 is documented in specs/UseCaseCatalog.md and rationale: >
the registry model is bounded in INTENT.md, but concrete promotion workflows Core use case UC-RS-001 is documented in specs/UseCaseCatalog.md and the
registry model is bounded in INTENT.md, but concrete promotion workflows
are not yet grounded in registry artifacts. are not yet grounded in registry artifacts.
'
availability: availability:
current: A3 current: A4
target: A5 target: A5
confidence: medium confidence: medium
rationale: 'Source interface assessed 2026-10-14: Owner Markdown entries, indexes, rationale: >
federation hub and planning queries. Availability describes the delivery form, Local registry workflows use the reuse-surface CLI (A3). Federation repo
not production acceptance. Discovery is not readiness; empty and stale entries registration is also available through the hosted hub HTTP API at
need evidence-led maintenance.' reuse.coulomb.social (POST/PATCH /v1/repos), deployed and dogfood-tested
on Railiance01 (REUSE-WP-0011).
external_evidence: external_evidence:
completeness: completeness:
level: C2 level: C2
@ -37,162 +36,164 @@ external_evidence:
confidence: medium confidence: medium
basis: scope_vs_intent_and_consumer_expectations basis: scope_vs_intent_and_consumer_expectations
satisfied_expectations: satisfied_expectations:
- capability IDs can be assigned in registry entries - capability IDs can be assigned in registry entries
- maturity vectors can be recorded at registration time - maturity vectors can be recorded at registration time
- CLI validate, query, and export support registry workflows - CLI validate, query, and export support registry workflows
- promotion history can be recorded in entries - promotion history can be recorded in entries
- federation repo registration via hosted hub API and hub CLI - federation repo registration via hosted hub API and hub CLI
broken_expectations: broken_expectations:
- no automated duplicate detection yet - no automated duplicate detection yet
out_of_scope_expectations: out_of_scope_expectations:
- hosting registered capabilities - hosting registered capabilities
- enforcing implementation architecture - enforcing implementation architecture
reliability: reliability:
level: R3 level: R3
name: Usable name: Usable
confidence: medium confidence: medium
basis: consumer_quality_signals basis: consumer_quality_signals
known_reliability_risks: known_reliability_risks:
- index drift still possible if authors skip validate - index drift still possible if authors skip validate
- CLI requires local venv install - CLI requires local venv install
- sibling repos cannot register until indexes publish raw URLs - sibling repos cannot register until indexes publish raw URLs
evidence: evidence:
satisfied_signals: satisfied_signals:
- CI validate with fail-on-warnings on every push - CI validate with fail-on-warnings on every push
- hub register/list/federated smoke on production reuse.coulomb.social - hub register/list/federated smoke on production reuse.coulomb.social
- pytest coverage for hub API and federation compose paths - pytest coverage for hub API and federation compose paths
discovery: discovery:
intent: Owner Markdown entries, indexes, federation hub and planning queries intent: >
Make a capability candidate visible in the registry so humans and agents can
discover, assess, compare, and reuse it instead of rebuilding it in isolation.
includes: includes:
- Owner Markdown entries, indexes, federation hub and planning queries - stable capability ID assignment
- initial discovery and availability classification
- explicit completeness and reliability placeholders
- evidence and relation references
excludes: excludes:
- Discovery is not readiness; empty and stale entries need evidence-led maintenance - implementing the registered capability
- certifying implementation quality
- operating runtime services for registered capabilities
assumptions: assumptions:
- unregistered capabilities are invisible for registry-driven reuse - unregistered capabilities are invisible for registry-driven reuse
- low-maturity entries are acceptable when evidence gaps are explicit - low-maturity entries are acceptable when evidence gaps are explicit
use_cases: use_cases:
- UC-RS-001 - UC-RS-001
- 'U01: Architect composes a security deployment from explicit owner contracts and
case types'
- 'U09: Maintainer observes posture, prioritizes findings, coordinates work and
verifies outcomes'
- 'U14: Framework adopter validates and reuses selected contracts, tools and reference
compositions'
research_memos: research_memos:
- specs/UseCaseCatalog.md - specs/UseCaseCatalog.md
- specs/ProductRequirementsDocument.md - specs/ProductRequirementsDocument.md
availability: availability:
current_level: A3 current_level: A4
target_level: A5 target_level: A5
current_artifacts: current_artifacts:
- docs/RegistryFederation.md - templates/capability-entry.template.md
- specs/CapabilityMaturityStandard.md - registry/indexes/capabilities.yaml
- reuse_surface/cli.py
- reuse_surface/hub/
- specs/FederationHubAPI.md
- https://reuse.coulomb.social
target_artifacts: target_artifacts:
- packaged container release with documented SLO - packaged container release with documented SLO
consumption_modes: consumption_modes:
- library - informational
- CLI - markdown authoring
- cli
- service API
relations: relations:
depends_on: [] depends_on: []
supports: supports:
- capability.feature-control.evaluate - capability.feature-control.evaluate
- capability.identity.vocabulary-canonicalize - capability.identity.vocabulary-canonicalize
related_to: related_to:
- capability.registry.validate - capability.registry.validate
- capability.security.iam-tooling-suite
evidence: evidence:
documentation: documentation:
- docs/RegistryFederation.md - INTENT.md
- specs/CapabilityMaturityStandard.md - specs/UseCaseCatalog.md
- specs/FederationHubAPI.md
- docs/deploy/reuse-kubernetes.md
tests: tests:
- tests/test_hub.py - tests/test_hub.py
- tests/test_hub_sync.py - tests/test_hub_sync.py
- .forgejo/workflows/ci.yml - .forgejo/workflows/ci.yml
consumer_feedback: consumer_feedback:
- 'reuse-surface dogfood (REUSE-WP-0011): production hub registration and /v1/federated - >
compose succeeded on Railiance01 without write-path regressions after WP-0011 reuse-surface dogfood (REUSE-WP-0011): production hub registration and
deploy. /v1/federated compose succeeded on Railiance01 without write-path
regressions after WP-0011 deploy.
'
bug_reports: [] bug_reports: []
incidents: [] incidents: []
consumer_guidance: consumer_guidance:
recommended_for: recommended_for:
- Architect composes a security deployment from explicit owner contracts and case - making a new capability visible at D0/A0/C0/R0 with minimal friction
types - seeding planning discussions before implementation exists
- Maintainer observes posture, prioritizes findings, coordinates work and verifies
outcomes
- Framework adopter validates and reuses selected contracts, tools and reference
compositions
not_recommended_for: not_recommended_for:
- Discovery is not readiness; empty and stale entries need evidence-led maintenance - treating registry presence as proof of implementation readiness
- skipping explicit evidence for maturity promotion
known_limitations: known_limitations:
- Discovery is not readiness; empty and stale entries need evidence-led maintenance - manual index updates are required after adding an entry
- 2026-10-14 architecture review estimates operational maturity separately; a registry - duplicate detection is guidance-only in the MVP
entry does not authorize execution or establish deployment.
promotion_history: promotion_history:
- date: '2026-06-14' - date: "2026-06-14"
dimension: discovery dimension: discovery
from: D0 from: D0
to: D1 to: D1
rationale: Added name, summary, and registry-first intent from INTENT.md. rationale: Added name, summary, and registry-first intent from INTENT.md.
author: reuse-surface author: reuse-surface
- date: '2026-06-15' - date: "2026-06-15"
dimension: discovery dimension: discovery
from: D1 from: D1
to: D3 to: D3
rationale: Bounded scope with UC-RS-001 and MVP registry artifacts in specs/. rationale: Bounded scope with UC-RS-001 and MVP registry artifacts in specs/.
author: reuse-surface author: reuse-surface
- date: '2026-06-15' - date: "2026-06-15"
dimension: availability dimension: availability
from: A0 from: A0
to: A3 to: A3
rationale: reuse-surface CLI shipped validate, query, and export commands. rationale: reuse-surface CLI shipped validate, query, and export commands.
author: reuse-surface author: reuse-surface
- date: '2026-06-15' - date: "2026-06-15"
dimension: availability dimension: availability
from: A3 from: A3
to: A4 to: A4
rationale: 'Hosted federation hub live at reuse.coulomb.social; hub register/update rationale: >
via HTTP API and reuse-surface hub CLI; production deploy on Railiance01. Hosted federation hub live at reuse.coulomb.social; hub register/update
via HTTP API and reuse-surface hub CLI; production deploy on Railiance01.
' author: reuse-surface
author: reuse-surface - date: "2026-06-16"
- date: '2026-06-16' dimension: reliability
dimension: reliability from: R2
from: R2 to: R3
to: R3 rationale: >
rationale: 'CI gates, pytest hub/federation coverage, and production hub smoke support CI gates, pytest hub/federation coverage, and production hub smoke support
normal registration workflows with documented limitations. normal registration workflows with documented limitations.
author: reuse-surface
'
author: reuse-surface
- date: '2026-10-14'
dimension: availability
from: A4
to: A3
rationale: Interface-form reassessment from current owner sources; no completeness/reliability
promotion.
author: codex
--- ---
# Capability registry and federation # Capability Registration
Owner Markdown entries, indexes, federation hub and planning queries. ## Overview
## Reuse boundary Registration is the entry point for reuse visibility. A capability that is not
registered cannot be discovered through the registry surface, even if code or
documentation exists elsewhere.
Discovery is not readiness; empty and stale entries need evidence-led maintenance. ## Current reuse mode
## Supported use cases **Local registry (A3 CLI):** add Markdown entries under `registry/capabilities/`,
update `registry/indexes/capabilities.yaml`, run `reuse-surface validate`.
- U01: Architect composes a security deployment from explicit owner contracts and case types **Federation registration (A4 API):** register published index URLs on the hosted
- U09: Maintainer observes posture, prioritizes findings, coordinates work and verifies outcomes hub (`reuse-surface hub register`, `POST /v1/repos`) for cross-repo discovery
- U14: Framework adopter validates and reuses selected contracts, tools and reference compositions via `GET /v1/federated`.
## Evidence and integration ## Next promotion steps
- [docs/RegistryFederation.md](../../docs/RegistryFederation.md) 1. Attach concrete use cases and actors to reach D5.
- [specs/CapabilityMaturityStandard.md](../../specs/CapabilityMaturityStandard.md) 2. Package hub as a versioned container release with operator SLO (A5).
3. Record consumer expectations and broken expectations as external evidence.
Assessment: CUST-WP-0081, 2026-10-14. Relations identify interfaces to compose; they do not certify native integration. Existing external evidence levels are retained where present. New entries use conservative C1/R0 until consumer assessment exists.

View file

@ -1,31 +1,24 @@
--- ---
id: capability.registry.validate id: capability.registry.validate
name: Capability registry validation name: Registry Entry Validation
summary: Schema, index consistency and relation checks. summary: Validate capability registry entries against schema, index consistency, and relation integrity.
owner: reuse-surface owner: reuse-surface
status: draft status: draft
domain: helix_forge domain: helix_forge
tags: tags: [registry, validation, cli]
- registry
- validation
- cli
- security
- netkingdom
- framework-reuse
maturity: maturity:
discovery: discovery:
current: D4 current: D4
target: D5 target: D5
confidence: medium confidence: medium
rationale: UC-RS-023 is implemented via reuse-surface validate with schema and rationale: UC-RS-023 is implemented via reuse-surface validate with schema and drift checks.
drift checks.
availability: availability:
current: A3 current: A3
target: A3 target: A3
confidence: high confidence: high
rationale: 'Source interface assessed 2026-10-14: Schema, index consistency and rationale: Available as reuse-surface validate CLI command.
relation checks. Availability describes the delivery form, not production acceptance.
Schema validity alone proves neither capability behavior nor hosted freshness.'
external_evidence: external_evidence:
completeness: completeness:
level: C3 level: C3
@ -33,102 +26,82 @@ external_evidence:
confidence: medium confidence: medium
basis: scope_vs_intent_and_consumer_expectations basis: scope_vs_intent_and_consumer_expectations
satisfied_expectations: satisfied_expectations:
- schema validation for entry front matter - schema validation for entry front matter
- index drift detection - index drift detection
- optional relation integrity checks - optional relation integrity checks
broken_expectations: [] broken_expectations: []
out_of_scope_expectations: out_of_scope_expectations:
- runtime validation of registered capability implementations - runtime validation of registered capability implementations
reliability: reliability:
level: R3 level: R3
name: Usable name: Usable
confidence: medium confidence: medium
basis: consumer_quality_signals basis: consumer_quality_signals
known_reliability_risks: known_reliability_risks:
- requires local venv install - requires local venv install
- relation warnings require explicit --relations flag - relation warnings require explicit --relations flag
evidence: evidence:
satisfied_signals: satisfied_signals:
- validate --relations --fail-on-warnings in CI - validate --relations --fail-on-warnings in CI
- tests/test_registry.py schema and drift coverage - tests/test_registry.py schema and drift coverage
discovery: discovery:
intent: Schema, index consistency and relation checks intent: Keep registry data structurally sound so agents and humans can trust discovery metadata.
includes: includes:
- Schema, index consistency and relation checks - JSON Schema validation
- index drift warnings
- relation reference checks
excludes: excludes:
- Schema validity alone proves neither capability behavior nor hosted freshness - validating implementation code in other repos
use_cases: use_cases:
- UC-RS-023 - UC-RS-023
- 'U01: Architect composes a security deployment from explicit owner contracts and
case types'
- 'U14: Framework adopter validates and reuses selected contracts, tools and reference
compositions'
research_memos: research_memos:
- specs/UseCaseCatalog.md - specs/UseCaseCatalog.md
availability: availability:
current_level: A3 current_level: A3
target_level: A3 target_level: A3
current_artifacts: current_artifacts:
- docs/RegistryFederation.md - reuse_surface/cli.py
- schemas/capability.schema.yaml - schemas/capability.schema.yaml
consumption_modes: consumption_modes:
- library - cli
- CLI
relations: relations:
depends_on: depends_on:
- capability.registry.register - capability.registry.register
supports: [] supports: []
related_to: related_to:
- capability.registry.register - capability.registry.register
- capability.security.iam-tooling-suite
evidence: evidence:
documentation: documentation:
- docs/RegistryFederation.md - tools/README.md
- schemas/capability.schema.yaml - .forgejo/workflows/ci.yml
tests: tests:
- tests/test_registry.py - tests/test_registry.py
consumer_feedback: consumer_feedback:
- 'reuse-surface CI: registry changes fail when schema validation or relation checks - >
warn with --fail-on-warnings, giving agents a dependable pre-merge gate. reuse-surface CI: registry changes fail when schema validation or relation
checks warn with --fail-on-warnings, giving agents a dependable pre-merge gate.
'
consumer_guidance: consumer_guidance:
recommended_for: recommended_for:
- Architect composes a security deployment from explicit owner contracts and case - pre-commit and CI validation of registry changes
types
- Framework adopter validates and reuses selected contracts, tools and reference
compositions
not_recommended_for: not_recommended_for:
- Schema validity alone proves neither capability behavior nor hosted freshness - certifying business correctness of capability claims
known_limitations: known_limitations:
- Schema validity alone proves neither capability behavior nor hosted freshness - warnings do not fail CI unless --fail-on-warnings is set
- 2026-10-14 architecture review estimates operational maturity separately; a registry
entry does not authorize execution or establish deployment.
promotion_history: promotion_history:
- date: '2026-06-16' - date: "2026-06-16"
dimension: reliability dimension: reliability
from: R2 from: R2
to: R3 to: R3
rationale: CI fail-on-warnings and pytest registry coverage support dependable validation. rationale: CI fail-on-warnings and pytest registry coverage support dependable validation.
author: reuse-surface author: reuse-surface
--- ---
# Capability registry validation # Registry Entry Validation
Schema, index consistency and relation checks. Validates registry shape and consistency through the reuse-surface CLI.
## Reuse boundary
Schema validity alone proves neither capability behavior nor hosted freshness.
## Supported use cases
- U01: Architect composes a security deployment from explicit owner contracts and case types
- U14: Framework adopter validates and reuses selected contracts, tools and reference compositions
## Evidence and integration
- [docs/RegistryFederation.md](../../docs/RegistryFederation.md)
- [schemas/capability.schema.yaml](../../schemas/capability.schema.yaml)
Assessment: CUST-WP-0081, 2026-10-14. Relations identify interfaces to compose; they do not certify native integration. Existing external evidence levels are retained where present. New entries use conservative C1/R0 until consumer assessment exists.

View file

@ -206,8 +206,8 @@ repos:
hub_registered: true hub_registered: true
publish_check: pass publish_check: pass
batch: null batch: null
- slug: access-engine - slug: flex-auth
path: /home/worsch/access-engine path: /home/worsch/flex-auth
status: established status: established
capability_count: 1 capability_count: 1
capability_status: has capability_status: has

View file

@ -2,26 +2,20 @@ version: 1
domain: helix_forge domain: helix_forge
collision_policy: warn collision_policy: warn
sources: sources:
- repo: access-engine
index: ../access-engine/registry/indexes/capabilities.yaml
enabled: true
required: true
domain: infotech
- repo: activity-core - repo: activity-core
index: ../activity-core/registry/indexes/capabilities.yaml url: https://forgejo.coulomb.social/coulomb/activity-core/raw/branch/main/registry/indexes/capabilities.yaml
enabled: true enabled: true
required: true required: false
domain: infotech domain: helix_forge
cache_ttl_seconds: 86400
auth_header: Authorization
- repo: agentic-resources - repo: agentic-resources
index: ../agentic-resources/registry/indexes/capabilities.yaml url: https://forgejo.coulomb.social/coulomb/agentic-resources/raw/main/registry/indexes/capabilities.yaml
enabled: true enabled: true
required: true required: false
domain: infotech domain: helix_forge
- repo: approval-engine cache_ttl_seconds: 86400
index: ../approval-engine/registry/indexes/capabilities.yaml auth_header: Authorization
enabled: true
required: true
domain: infotech
- repo: artifact-store - repo: artifact-store
url: https://forgejo.coulomb.social/coulomb/artifact-store/raw/main/registry/indexes/capabilities.yaml url: https://forgejo.coulomb.social/coulomb/artifact-store/raw/main/registry/indexes/capabilities.yaml
enabled: true enabled: true
@ -30,10 +24,12 @@ sources:
cache_ttl_seconds: 86400 cache_ttl_seconds: 86400
auth_header: Authorization auth_header: Authorization
- repo: audit-core - repo: audit-core
index: ../audit-core/registry/indexes/capabilities.yaml url: https://forgejo.coulomb.social/coulomb/audit-core/raw/main/registry/indexes/capabilities.yaml
enabled: true enabled: true
required: true required: false
domain: infotech domain: helix_forge
cache_ttl_seconds: 86400
auth_header: Authorization
- repo: can-you-assist - repo: can-you-assist
url: https://forgejo.coulomb.social/coulomb/can-you-assist/raw/main/registry/indexes/capabilities.yaml url: https://forgejo.coulomb.social/coulomb/can-you-assist/raw/main/registry/indexes/capabilities.yaml
enabled: true enabled: true
@ -62,13 +58,6 @@ sources:
domain: helix_forge domain: helix_forge
cache_ttl_seconds: 86400 cache_ttl_seconds: 86400
auth_header: Authorization auth_header: Authorization
- repo: commerce-canon
url: https://forgejo.coulomb.social/coulomb/commerce-canon/raw/main/registry/indexes/capabilities.yaml
enabled: true
required: false
domain: helix_forge
cache_ttl_seconds: 86400
auth_header: Authorization
- repo: config-atlas - repo: config-atlas
url: https://forgejo.coulomb.social/coulomb/config-atlas/raw/main/registry/indexes/capabilities.yaml url: https://forgejo.coulomb.social/coulomb/config-atlas/raw/main/registry/indexes/capabilities.yaml
enabled: true enabled: true
@ -77,10 +66,12 @@ sources:
cache_ttl_seconds: 86400 cache_ttl_seconds: 86400
auth_header: Authorization auth_header: Authorization
- repo: coordination-engine - repo: coordination-engine
index: ../coordination-engine/registry/indexes/capabilities.yaml url: https://forgejo.coulomb.social/coulomb/coordination-engine/raw/main/registry/indexes/capabilities.yaml
enabled: true enabled: true
required: true required: false
domain: infotech domain: helix_forge
cache_ttl_seconds: 86400
auth_header: Authorization
- repo: core-hub - repo: core-hub
url: https://forgejo.coulomb.social/coulomb/core-hub/raw/branch/main/registry/indexes/capabilities.yaml url: https://forgejo.coulomb.social/coulomb/core-hub/raw/branch/main/registry/indexes/capabilities.yaml
enabled: true enabled: true
@ -102,11 +93,6 @@ sources:
domain: helix_forge domain: helix_forge
cache_ttl_seconds: 86400 cache_ttl_seconds: 86400
auth_header: Authorization auth_header: Authorization
- repo: emergent-security
index: ../emergent-security/registry/indexes/capabilities.yaml
enabled: true
required: true
domain: infotech
- repo: evidence-anchor - repo: evidence-anchor
url: https://forgejo.coulomb.social/coulomb/evidence-anchor/raw/main/registry/indexes/capabilities.yaml url: https://forgejo.coulomb.social/coulomb/evidence-anchor/raw/main/registry/indexes/capabilities.yaml
enabled: true enabled: true
@ -135,26 +121,13 @@ sources:
domain: helix_forge domain: helix_forge
cache_ttl_seconds: 86400 cache_ttl_seconds: 86400
auth_header: Authorization auth_header: Authorization
- repo: fin-hub - repo: flex-auth
index: ../fin-hub/registry/indexes/capabilities.yaml url: https://forgejo.coulomb.social/coulomb/flex-auth/raw/main/registry/indexes/capabilities.yaml
enabled: true enabled: true
required: true required: false
domain: infotech domain: helix_forge
- repo: gate-house cache_ttl_seconds: 86400
index: ../gate-house/registry/indexes/capabilities.yaml auth_header: Authorization
enabled: true
required: true
domain: infotech
- repo: gated-executor
index: ../gated-executor/registry/indexes/capabilities.yaml
enabled: true
required: true
domain: infotech
- repo: glas-harness
index: ../glas-harness/registry/indexes/capabilities.yaml
enabled: true
required: true
domain: infotech
- repo: guide-board - repo: guide-board
url: https://forgejo.coulomb.social/coulomb/guide-board/raw/main/registry/indexes/capabilities.yaml url: https://forgejo.coulomb.social/coulomb/guide-board/raw/main/registry/indexes/capabilities.yaml
enabled: true enabled: true
@ -183,6 +156,13 @@ sources:
domain: helix_forge domain: helix_forge
cache_ttl_seconds: 86400 cache_ttl_seconds: 86400
auth_header: Authorization auth_header: Authorization
- repo: commerce-canon
url: https://forgejo.coulomb.social/coulomb/commerce-canon/raw/main/registry/indexes/capabilities.yaml
enabled: true
required: false
domain: helix_forge
cache_ttl_seconds: 86400
auth_header: Authorization
- repo: ihp-railiance-probe - repo: ihp-railiance-probe
url: https://forgejo.coulomb.social/coulomb/ihp-railiance-probe/raw/main/registry/indexes/capabilities.yaml url: https://forgejo.coulomb.social/coulomb/ihp-railiance-probe/raw/main/registry/indexes/capabilities.yaml
enabled: true enabled: true
@ -191,15 +171,12 @@ sources:
cache_ttl_seconds: 86400 cache_ttl_seconds: 86400
auth_header: Authorization auth_header: Authorization
- repo: info-tech-canon - repo: info-tech-canon
index: ../info-tech-canon/registry/indexes/capabilities.yaml url: https://forgejo.coulomb.social/coulomb/info-tech-canon/raw/main/registry/indexes/capabilities.yaml
enabled: true enabled: true
required: true required: false
domain: infotech domain: helix_forge
- repo: informed-decision cache_ttl_seconds: 86400
index: ../informed-decision/registry/indexes/capabilities.yaml auth_header: Authorization
enabled: true
required: true
domain: infotech
- repo: infospace-bench - repo: infospace-bench
url: https://forgejo.coulomb.social/coulomb/infospace-bench/raw/main/registry/indexes/capabilities.yaml url: https://forgejo.coulomb.social/coulomb/infospace-bench/raw/main/registry/indexes/capabilities.yaml
enabled: true enabled: true
@ -208,10 +185,12 @@ sources:
cache_ttl_seconds: 86400 cache_ttl_seconds: 86400
auth_header: Authorization auth_header: Authorization
- repo: issue-core - repo: issue-core
index: ../issue-core/registry/indexes/capabilities.yaml url: https://forgejo.coulomb.social/coulomb/issue-core/raw/branch/main/registry/indexes/capabilities.yaml
enabled: true enabled: true
required: true required: false
domain: infotech domain: helix_forge
cache_ttl_seconds: 86400
auth_header: Authorization
- repo: kaizen-agentic - repo: kaizen-agentic
url: https://forgejo.coulomb.social/coulomb/kaizen-agentic/raw/main/registry/indexes/capabilities.yaml url: https://forgejo.coulomb.social/coulomb/kaizen-agentic/raw/main/registry/indexes/capabilities.yaml
enabled: true enabled: true
@ -220,15 +199,12 @@ sources:
cache_ttl_seconds: 86400 cache_ttl_seconds: 86400
auth_header: Authorization auth_header: Authorization
- repo: key-cape - repo: key-cape
index: ../key-cape/registry/indexes/capabilities.yaml url: https://forgejo.coulomb.social/coulomb/key-cape/raw/branch/main/registry/indexes/capabilities.yaml
enabled: true enabled: true
required: true required: false
domain: infotech domain: helix_forge
- repo: kings-guard cache_ttl_seconds: 86400
index: ../kings-guard/registry/indexes/capabilities.yaml auth_header: Authorization
enabled: true
required: true
domain: infotech
- repo: kontextual-engine - repo: kontextual-engine
url: https://forgejo.coulomb.social/coulomb/kontextual-engine/raw/main/registry/indexes/capabilities.yaml url: https://forgejo.coulomb.social/coulomb/kontextual-engine/raw/main/registry/indexes/capabilities.yaml
enabled: true enabled: true
@ -271,16 +247,13 @@ sources:
domain: helix_forge domain: helix_forge
cache_ttl_seconds: 86400 cache_ttl_seconds: 86400
auth_header: Authorization auth_header: Authorization
- repo: maturity-engine
index: ../maturity-engine/registry/indexes/capabilities.yaml
enabled: true
required: true
domain: infotech
- repo: net-kingdom - repo: net-kingdom
index: ../net-kingdom/registry/indexes/capabilities.yaml url: https://forgejo.coulomb.social/coulomb/net-kingdom/raw/main/registry/indexes/capabilities.yaml
enabled: true enabled: true
required: true required: false
domain: infotech domain: helix_forge
cache_ttl_seconds: 86400
auth_header: Authorization
- repo: open-cmis-tck - repo: open-cmis-tck
url: https://forgejo.coulomb.social/coulomb/open-cmis-tck/raw/main/registry/indexes/capabilities.yaml url: https://forgejo.coulomb.social/coulomb/open-cmis-tck/raw/main/registry/indexes/capabilities.yaml
enabled: true enabled: true
@ -296,10 +269,12 @@ sources:
cache_ttl_seconds: 86400 cache_ttl_seconds: 86400
auth_header: Authorization auth_header: Authorization
- repo: ops-bridge - repo: ops-bridge
index: ../ops-bridge/registry/indexes/capabilities.yaml url: https://forgejo.coulomb.social/coulomb/ops-bridge/raw/main/registry/indexes/capabilities.yaml
enabled: true enabled: true
required: true required: false
domain: infotech domain: helix_forge
cache_ttl_seconds: 86400
auth_header: Authorization
- repo: ops-hub - repo: ops-hub
url: https://forgejo.coulomb.social/coulomb/ops-hub/raw/main/registry/indexes/capabilities.yaml url: https://forgejo.coulomb.social/coulomb/ops-hub/raw/main/registry/indexes/capabilities.yaml
enabled: true enabled: true
@ -307,16 +282,13 @@ sources:
domain: helix_forge domain: helix_forge
cache_ttl_seconds: 86400 cache_ttl_seconds: 86400
auth_header: Authorization auth_header: Authorization
- repo: ops-mason
index: ../ops-mason/registry/indexes/capabilities.yaml
enabled: true
required: true
domain: infotech
- repo: ops-warden - repo: ops-warden
index: ../ops-warden/registry/indexes/capabilities.yaml url: https://forgejo.coulomb.social/coulomb/ops-warden/raw/main/registry/indexes/capabilities.yaml
enabled: true enabled: true
required: true required: false
domain: infotech domain: helix_forge
cache_ttl_seconds: 86400
auth_header: Authorization
- repo: phase-memory - repo: phase-memory
url: https://forgejo.coulomb.social/coulomb/phase-memory/raw/main/registry/indexes/capabilities.yaml url: https://forgejo.coulomb.social/coulomb/phase-memory/raw/main/registry/indexes/capabilities.yaml
enabled: true enabled: true
@ -324,131 +296,55 @@ sources:
domain: helix_forge domain: helix_forge
cache_ttl_seconds: 86400 cache_ttl_seconds: 86400
auth_header: Authorization auth_header: Authorization
- repo: policy-nexus
index: ../policy-nexus/registry/indexes/capabilities.yaml
enabled: true
required: true
domain: infotech
- repo: rail-knative
index: ../rail-knative/registry/indexes/capabilities.yaml
enabled: true
required: true
domain: infotech
- repo: rail-kubernetes
index: ../rail-kubernetes/registry/indexes/capabilities.yaml
enabled: true
required: true
domain: infotech
- repo: railiance-apps - repo: railiance-apps
index: ../railiance-apps/registry/indexes/capabilities.yaml url: https://forgejo.coulomb.social/coulomb/railiance-apps/raw/branch/main/registry/indexes/capabilities.yaml
enabled: true enabled: true
required: true required: false
domain: infotech domain: helix_forge
- repo: railiance-bootstrap cache_ttl_seconds: 86400
index: ../railiance-bootstrap/registry/indexes/capabilities.yaml auth_header: Authorization
enabled: true
required: true
domain: infotech
- repo: railiance-cluster - repo: railiance-cluster
index: ../railiance-cluster/registry/indexes/capabilities.yaml url: https://forgejo.coulomb.social/coulomb/railiance-cluster/raw/branch/main/registry/indexes/capabilities.yaml
enabled: true enabled: true
required: true required: false
domain: infotech domain: helix_forge
cache_ttl_seconds: 86400
auth_header: Authorization
- repo: railiance-enablement - repo: railiance-enablement
index: ../railiance-enablement/registry/indexes/capabilities.yaml url: https://forgejo.coulomb.social/coulomb/railiance-enablement/raw/branch/main/registry/indexes/capabilities.yaml
enabled: true enabled: true
required: true required: false
domain: infotech domain: helix_forge
cache_ttl_seconds: 86400
auth_header: Authorization
- repo: railiance-fabric - repo: railiance-fabric
index: ../railiance-fabric/registry/indexes/capabilities.yaml url: https://forgejo.coulomb.social/coulomb/railiance-fabric/raw/main/registry/indexes/capabilities.yaml
enabled: true enabled: true
required: true required: false
domain: infotech domain: helix_forge
cache_ttl_seconds: 86400
auth_header: Authorization
- repo: railiance-forge - repo: railiance-forge
index: ../railiance-forge/registry/indexes/capabilities.yaml url: https://forgejo.coulomb.social/coulomb/railiance-forge/raw/main/registry/indexes/capabilities.yaml
enabled: true enabled: true
required: true required: false
domain: infotech domain: helix_forge
cache_ttl_seconds: 86400
auth_header: Authorization
- repo: railiance-infra - repo: railiance-infra
index: ../railiance-infra/registry/indexes/capabilities.yaml url: https://forgejo.coulomb.social/coulomb/railiance-infra/raw/branch/main/registry/indexes/capabilities.yaml
enabled: true enabled: true
required: true required: false
domain: infotech domain: helix_forge
- repo: railiance-master cache_ttl_seconds: 86400
index: ../railiance-master/registry/indexes/capabilities.yaml auth_header: Authorization
enabled: true
required: true
domain: infotech
- repo: railiance-platform - repo: railiance-platform
index: ../railiance-platform/registry/indexes/capabilities.yaml url: https://forgejo.coulomb.social/coulomb/railiance-platform/raw/branch/main/registry/indexes/capabilities.yaml
enabled: true enabled: true
required: true required: false
domain: infotech domain: helix_forge
- repo: railiance-telemetry cache_ttl_seconds: 86400
index: ../railiance-telemetry/registry/indexes/capabilities.yaml auth_header: Authorization
enabled: true
required: true
domain: infotech
- repo: rapp-openbao
index: ../rapp-openbao/registry/indexes/capabilities.yaml
enabled: true
required: true
domain: infotech
- repo: rapp-playwright
index: ../rapp-playwright/registry/indexes/capabilities.yaml
enabled: true
required: true
domain: infotech
- repo: rapp-policy-nexus
index: ../rapp-policy-nexus/registry/indexes/capabilities.yaml
enabled: true
required: true
domain: infotech
- repo: rapp-postgres
index: ../rapp-postgres/registry/indexes/capabilities.yaml
enabled: true
required: true
domain: infotech
- repo: rapp-sbom-nexus
index: ../rapp-sbom-nexus/registry/indexes/capabilities.yaml
enabled: true
required: true
domain: infotech
- repo: rapp-telemetry
index: ../rapp-telemetry/registry/indexes/capabilities.yaml
enabled: true
required: true
domain: infotech
- repo: rapp-tenant-engine
index: ../rapp-tenant-engine/registry/indexes/capabilities.yaml
enabled: true
required: true
domain: infotech
- repo: rapp-user-engine
index: ../rapp-user-engine/registry/indexes/capabilities.yaml
enabled: true
required: true
domain: infotech
- repo: reef-railiance
index: ../reef-railiance/registry/indexes/capabilities.yaml
enabled: true
required: true
domain: infotech
- repo: rein-aharness
index: ../rein-aharness/registry/indexes/capabilities.yaml
enabled: true
required: true
domain: infotech
- repo: rein-openweights
index: ../rein-openweights/registry/indexes/capabilities.yaml
enabled: true
required: true
domain: infotech
- repo: repo-manager
index: ../repo-manager/registry/indexes/capabilities.yaml
enabled: true
required: true
domain: infotech
- repo: repo-scoping - repo: repo-scoping
url: https://forgejo.coulomb.social/coulomb/repo-scoping/raw/main/registry/indexes/capabilities.yaml url: https://forgejo.coulomb.social/coulomb/repo-scoping/raw/main/registry/indexes/capabilities.yaml
enabled: true enabled: true
@ -463,56 +359,14 @@ sources:
domain: helix_forge domain: helix_forge
cache_ttl_seconds: 86400 cache_ttl_seconds: 86400
auth_header: Authorization auth_header: Authorization
- repo: release-registry
index: ../release-registry/registry/indexes/capabilities.yaml
enabled: true
required: true
domain: infotech
- repo: resource-control
index: ../resource-control/registry/indexes/capabilities.yaml
enabled: true
required: true
domain: infotech
- repo: reuse-surface - repo: reuse-surface
index: ../reuse-surface/registry/indexes/capabilities.yaml url: https://forgejo.coulomb.social/coulomb/reuse-surface/raw/main/registry/indexes/capabilities.yaml
enabled: true enabled: true
required: true required: false
domain: infotech domain: helix_forge
- repo: risk-nexus description: Capability registry for helix_forge
index: ../risk-nexus/registry/indexes/capabilities.yaml cache_ttl_seconds: 86400
enabled: true auth_header: Authorization
required: true
domain: infotech
- repo: role-engine
index: ../role-engine/registry/indexes/capabilities.yaml
enabled: true
required: true
domain: infotech
- repo: runbook-tutorials
index: ../runbook-tutorials/registry/indexes/capabilities.yaml
enabled: true
required: true
domain: infotech
- repo: sand-boxer
index: ../sand-boxer/registry/indexes/capabilities.yaml
enabled: true
required: true
domain: infotech
- repo: sbom-nexus
index: ../sbom-nexus/registry/indexes/capabilities.yaml
enabled: true
required: true
domain: infotech
- repo: secrets-engine
index: ../secrets-engine/registry/indexes/capabilities.yaml
enabled: true
required: true
domain: infotech
- repo: security-canon
index: ../security-canon/registry/indexes/capabilities.yaml
enabled: true
required: true
domain: infotech
- repo: shard-wiki - repo: shard-wiki
url: https://forgejo.coulomb.social/coulomb/shard-wiki/raw/main/registry/indexes/capabilities.yaml url: https://forgejo.coulomb.social/coulomb/shard-wiki/raw/main/registry/indexes/capabilities.yaml
enabled: true enabled: true
@ -521,10 +375,12 @@ sources:
cache_ttl_seconds: 86400 cache_ttl_seconds: 86400
auth_header: Authorization auth_header: Authorization
- repo: state-hub - repo: state-hub
index: ../state-hub/registry/indexes/capabilities.yaml url: https://forgejo.coulomb.social/coulomb/state-hub/raw/branch/main/registry/indexes/capabilities.yaml
enabled: true enabled: true
required: true required: false
domain: infotech domain: helix_forge
cache_ttl_seconds: 86400
auth_header: Authorization
- repo: tegwick-control - repo: tegwick-control
url: https://forgejo.coulomb.social/coulomb/tegwick-control/raw/main/registry/indexes/capabilities.yaml url: https://forgejo.coulomb.social/coulomb/tegwick-control/raw/main/registry/indexes/capabilities.yaml
enabled: true enabled: true
@ -532,21 +388,20 @@ sources:
domain: helix_forge domain: helix_forge
cache_ttl_seconds: 86400 cache_ttl_seconds: 86400
auth_header: Authorization auth_header: Authorization
- repo: tenant-engine
index: ../tenant-engine/registry/indexes/capabilities.yaml
enabled: true
required: true
domain: infotech
- repo: the-custodian - repo: the-custodian
index: ../the-custodian/registry/indexes/capabilities.yaml url: https://forgejo.coulomb.social/coulomb/the-custodian/raw/main/registry/indexes/capabilities.yaml
enabled: true enabled: true
required: true required: false
domain: infotech domain: helix_forge
cache_ttl_seconds: 86400
auth_header: Authorization
- repo: user-engine - repo: user-engine
index: ../user-engine/registry/indexes/capabilities.yaml url: https://forgejo.coulomb.social/coulomb/user-engine/raw/main/registry/indexes/capabilities.yaml
enabled: true enabled: true
required: true required: false
domain: infotech domain: helix_forge
cache_ttl_seconds: 86400
auth_header: Authorization
- repo: vantage-point - repo: vantage-point
url: https://forgejo.coulomb.social/coulomb/vantage-point/raw/main/registry/indexes/capabilities.yaml url: https://forgejo.coulomb.social/coulomb/vantage-point/raw/main/registry/indexes/capabilities.yaml
enabled: true enabled: true
@ -561,16 +416,6 @@ sources:
domain: helix_forge domain: helix_forge
cache_ttl_seconds: 86400 cache_ttl_seconds: 86400
auth_header: Authorization auth_header: Authorization
- repo: web-fetcher
index: ../web-fetcher/registry/indexes/capabilities.yaml
enabled: true
required: true
domain: infotech
- repo: whitehat-security
index: ../whitehat-security/registry/indexes/capabilities.yaml
enabled: true
required: true
domain: infotech
- repo: whynot-control - repo: whynot-control
url: https://forgejo.coulomb.social/coulomb/whynot-control/raw/main/registry/indexes/capabilities.yaml url: https://forgejo.coulomb.social/coulomb/whynot-control/raw/main/registry/indexes/capabilities.yaml
enabled: true enabled: true
@ -585,8 +430,3 @@ sources:
domain: helix_forge domain: helix_forge
cache_ttl_seconds: 86400 cache_ttl_seconds: 86400
auth_header: Authorization auth_header: Authorization
- repo: zone-engine
index: ../zone-engine/registry/indexes/capabilities.yaml
enabled: true
required: true
domain: infotech

View file

@ -1,75 +1,26 @@
# Manually maintained capability index for humans and agents.
version: 1 version: 1
updated: '2026-10-18' updated: "2026-06-16"
domain: helix_forge domain: helix_forge
capabilities: capabilities:
- id: capability.infotech.headless-browser - id: capability.registry.register
name: Headless Browser Automation name: Capability Registration
summary: 'Headless browser automation, screenshots and keyboard trials through rapp-playwright summary: Register a new capability so it becomes visible for planning and implementation reuse.
0.1.0 (Playwright 1.64.0, Chromium 156.0.8078.4). Human and coding-agent managed vector: D3 / A4 / C2 / R3
trials passed on 2026-10-18 through the existing supervised workstation connection. domain: helix_forge
Use the documented kubectl port-forward to 127.0.0.1:18081, then the pinned standalone status: draft
Python client preflight/trial commands. No local browser installation. Independent owner: reuse-surface
per-caller managed admission remains pending; availability stays A5. Contract: path: registry/capabilities/capability.registry.register.md
https://forgejo.coulomb.social/coulomb/rapp-playwright/src/commit/8831a05aeba5ce588f3b395ade676dde2a151c5d/docs/consumer-contract.md.' tags: [registry, governance, meta]
vector: D3 / A5 / C2 / R2 consumption_modes: [informational, markdown authoring, cli, service API]
domain: infotech
status: reviewed - id: capability.registry.validate
owner: reuse-surface name: Registry Entry Validation
path: registry/capabilities/capability.infotech.headless-browser.md summary: Validate capability registry entries against schema, index consistency, and relation integrity.
tags: vector: D4 / A3 / C3 / R3
- headless domain: helix_forge
- browser status: draft
- automation owner: reuse-surface
- playwright path: registry/capabilities/capability.registry.validate.md
- chromium tags: [registry, validation, cli]
- testing consumption_modes: [cli]
- screenshots
- extraction
- firefox
- webkit
- selenium
- puppeteer
consumption_modes:
- informational
- source adaptation
- JavaScript library
- Python library
- cli
- service API
- container
- id: capability.registry.register
name: Capability registry and federation
summary: Owner Markdown entries, indexes, federation hub and planning queries.
domain: helix_forge
status: draft
owner: reuse-surface
tags:
- registry
- governance
- meta
- security
- netkingdom
- framework-reuse
vector: D3 / A3 / C2 / R3
path: registry/capabilities/capability.registry.register.md
consumption_modes:
- library
- CLI
- id: capability.registry.validate
name: Capability registry validation
summary: Schema, index consistency and relation checks.
domain: helix_forge
status: draft
owner: reuse-surface
tags:
- registry
- validation
- cli
- security
- netkingdom
- framework-reuse
vector: D4 / A3 / C3 / R3
path: registry/capabilities/capability.registry.validate.md
consumption_modes:
- library
- CLI

File diff suppressed because it is too large Load diff

View file

@ -1,50 +0,0 @@
# No owner classification file. Recorded internal/medium for this wave.
kind: release-unit
unit_id: reuse-surface
owner: reuse-surface
contract_version: 1.0.0
data_classification: internal
criticality: medium
composition:
purpose: Covers the live reuse-surface workloads as one release unit.
member_repos:
- repo: reuse-surface
role: rollout owner
deployables:
- reuse-surface
- reuse-surface-landing
rollout_contract:
default_mode: helm-upgrade-install
smoke_contract:
required:
- workload-ready
rollback_contract:
order:
- owner-rollback
workloads:
- kind: Deployment
namespace: reuse
name: reuse-surface
- kind: Deployment
namespace: reuse
name: reuse-surface-landing
pins:
component:
name: ocm.railiance.dev/reuse-surface
version: live
resources:
- name: reuse-surface
type: ociImage
version: live
digest:
hashAlgorithm: SHA-256
normalisationAlgorithm: ociArtifactDigest/v1
value: sha256:2364b7e7859daccf9340a063654e2b09eed1bc27e0adf7b23cbb4b30135a7db0
sources:
- name: reuse-surface
type: git
version: live
digest:
hashAlgorithm: SHA-1
normalisationAlgorithm: gitCommit/v1
value: bf30d5e988dd38921eb43902b27cca24f4e760ef

View file

@ -1,7 +1,6 @@
from __future__ import annotations from __future__ import annotations
import argparse import argparse
from collections import Counter
import json import json
import sys import sys
from pathlib import Path from pathlib import Path
@ -88,7 +87,6 @@ from reuse_surface.registry import (
parse_vector, parse_vector,
registry_paths, registry_paths,
resolve_repo_root, resolve_repo_root,
vectors_match,
) )
@ -116,48 +114,12 @@ def _check_index_drift(
repo_root: Path, repo_root: Path,
) -> list[str]: ) -> list[str]:
warnings: list[str] = [] warnings: list[str] = []
if not isinstance(index, dict) or not isinstance(index.get("capabilities"), list): indexed_paths = {item["path"] for item in index.get("capabilities", [])}
return ["index drift: index must contain a capabilities list"]
rows = []
for position, row in enumerate(index["capabilities"]):
if not isinstance(row, dict) or any(
not isinstance(row.get(field), str) or not row[field]
for field in ("id", "path")
):
warnings.append(f"index drift: row {position} requires nonempty string id and path")
continue
rows.append(row)
indexed_paths = {item["path"] for item in rows}
file_paths = {str(path.relative_to(repo_root)) for path in entry_paths} file_paths = {str(path.relative_to(repo_root)) for path in entry_paths}
for path in sorted(file_paths - indexed_paths): for path in sorted(file_paths - indexed_paths):
warnings.append(f"index drift: entry file not indexed: {path}") warnings.append(f"index drift: entry file not indexed: {path}")
for path in sorted(indexed_paths - file_paths): for path in sorted(indexed_paths - file_paths):
warnings.append(f"index drift: index references missing file: {path}") warnings.append(f"index drift: index references missing file: {path}")
for field in ("id", "path"):
for value, count in sorted(Counter(row[field] for row in rows).items()):
if count > 1:
warnings.append(f"index drift: duplicate {field}: {value} ({count} rows)")
for row in rows:
path = repo_root / row["path"]
if not path.is_file():
continue
try:
entry = parse_front_matter(path)
except (ValueError, yaml.YAMLError):
continue # The entry validation pass reports malformed source.
# The index projects the owner entry; index-only changes cannot replace it.
for field in ("id", "name", "summary", "domain", "status", "owner", "tags"):
if row.get(field) != entry.get(field):
warnings.append(f"index drift: {row['path']}: {field} differs from entry")
availability = entry.get("availability")
modes = availability.get("consumption_modes") if isinstance(availability, dict) else None
if row.get("consumption_modes") != modes:
warnings.append(f"index drift: {row['path']}: consumption_modes differs from entry")
try:
if not vectors_match(row["vector"], entry):
warnings.append(f"index drift: {row['path']}: vector differs from entry")
except (KeyError, TypeError, AttributeError):
warnings.append(f"index drift: {row['path']}: vector cannot be compared to entry")
return warnings return warnings
@ -183,7 +145,7 @@ def _run_validate(
for path in paths: for path in paths:
try: try:
data = parse_front_matter(path) data = parse_front_matter(path)
except (ValueError, yaml.YAMLError) as exc: except ValueError as exc:
errors.append(str(exc)) errors.append(str(exc))
continue continue
for error in sorted(validator.iter_errors(data), key=lambda e: e.path): for error in sorted(validator.iter_errors(data), key=lambda e: e.path):
@ -193,12 +155,8 @@ def _run_validate(
if not target: if not target:
index_path = registry_paths(repo_root)["index"] index_path = registry_paths(repo_root)["index"]
if index_path.exists(): if index_path.exists():
try: index = load_index_at(index_path)
index = load_index_at(index_path) warnings.extend(_check_index_drift(paths, index, repo_root))
except (ValueError, yaml.YAMLError) as exc:
errors.append(f"{index_path}: {exc}")
else:
warnings.extend(_check_index_drift(paths, index, repo_root))
if relations and repo_root == ROOT: if relations and repo_root == ROOT:
warnings.extend(check_relations()) warnings.extend(check_relations())
return errors, warnings, paths return errors, warnings, paths

View file

@ -1,10 +1,8 @@
from __future__ import annotations from __future__ import annotations
import os import os
import json
import re import re
import urllib.error import urllib.error
import urllib.parse
import urllib.request import urllib.request
from datetime import date, datetime, timezone from datetime import date, datetime, timezone
from pathlib import Path from pathlib import Path
@ -105,44 +103,11 @@ def _auth_headers(source: dict[str, Any]) -> dict[str, str]:
return {header_name: token} return {header_name: token}
class _RejectAuthenticatedRedirect(urllib.request.HTTPRedirectHandler):
"""Never replay a source credential at a redirect target.
A private source must register its final URL. This also rejects same-origin
redirects because a path change can escape the reviewed repository scope.
"""
def redirect_request(self, req, fp, code, msg, headers, newurl):
raise ConnectionError("authenticated source redirect refused")
def fetch_remote_index_text(url: str, source: dict[str, Any]) -> str: def fetch_remote_index_text(url: str, source: dict[str, Any]) -> str:
if source.get("auth_env"): headers = {"User-Agent": USER_AGENT, **_auth_headers(source)}
if urllib.parse.urlsplit(url).scheme.lower() != "https":
raise ValueError("authenticated source requires HTTPS")
# Registrations are writable data, not credential-routing authority.
# Operators must bind each allowed environment name to exact URLs in
# runtime configuration before the credential itself can be read.
try:
allowlist = json.loads(os.environ.get("REUSE_SURFACE_AUTH_SOURCE_ALLOWLIST", "{}"))
allowed_urls = allowlist.get(source["auth_env"], [])
permitted = isinstance(allowed_urls, list) and url in allowed_urls
except (ValueError, AttributeError, TypeError):
permitted = False
if not permitted:
raise ValueError("authenticated source URL is not runtime-authorized")
auth_headers = _auth_headers(source)
headers = {"User-Agent": USER_AGENT, **auth_headers}
request = urllib.request.Request(url, headers=headers) request = urllib.request.Request(url, headers=headers)
# urllib's default redirect handler copies Authorization to the target.
# Anonymous federation retains its existing redirect behavior.
opener = (
urllib.request.build_opener(_RejectAuthenticatedRedirect()).open
if auth_headers
else urllib.request.urlopen
)
try: try:
with opener(request, timeout=30) as response: with urllib.request.urlopen(request, timeout=30) as response:
return response.read().decode("utf-8") return response.read().decode("utf-8")
except urllib.error.HTTPError as exc: except urllib.error.HTTPError as exc:
raise ConnectionError( raise ConnectionError(
@ -348,4 +313,4 @@ def write_federated_index(
header + yaml.safe_dump(federated, sort_keys=False), header + yaml.safe_dump(federated, sort_keys=False),
encoding="utf-8", encoding="utf-8",
) )
return target, warnings return target, warnings

View file

@ -147,14 +147,7 @@ def match_query(
tokens = _tokens(blob) tokens = _tokens(blob)
if not tokens: if not tokens:
continue continue
# Score the name independently: descriptive summaries must not dilute score = len(query.tokens & tokens) / len(query.tokens | tokens)
# a direct short-intent match (e.g. "headless browser"). Keep the full
# blob score for longer intents and summary/tag-only matches.
name_tokens = _tokens(item.get("name", ""))
score = max(
len(query.tokens & tokens) / len(query.tokens | tokens),
len(query.tokens & name_tokens) / len(query.tokens | name_tokens),
)
if score <= 0: if score <= 0:
continue continue
scored.append( scored.append(
@ -347,7 +340,7 @@ def format_plan_check_markdown(result: dict[str, Any]) -> str:
verdict = result["verdict"] verdict = result["verdict"]
if verdict == "reuse": if verdict == "reuse":
lines.append("**Verdict: REUSE** — a close lexical match exists; review its consumption contract and availability before adopting it.") lines.append("**Verdict: REUSE** — an existing capability already covers this; link it instead of building new.")
elif verdict == "extend": elif verdict == "extend":
lines.append("**Verdict: EXTEND** — scope overlaps closely enough that extending the top match is likely cheaper than a new capability.") lines.append("**Verdict: EXTEND** — scope overlaps closely enough that extending the top match is likely cheaper than a new capability.")
else: else:

View file

@ -1,178 +0,0 @@
"""Owner-prepared, receipt-only native acquisition check for CUST81 revision 1.
Run inside the hub environment after a separately approved credential rollout:
python -m reuse_surface.private_source_verify --proposal FILE --disclosure FILE
--consent FILE
No credentials are accepted as arguments. No bodies or exception text are emitted.
This command does not register sources or use the federation cache.
"""
from __future__ import annotations
import argparse
import hashlib
import json
import os
import re
from datetime import datetime, timezone
from pathlib import Path
from typing import Any
from urllib.parse import quote
import yaml
from jsonschema import Draft202012Validator
from reuse_surface import federation
from reuse_surface.registry import load_schema
PROPOSAL_SHA256 = "7819eb51d249f5c7aff4df9fb520afcfb76603b05a4104439499102b6c20af99"
DISCLOSURE_SHA256 = "46ac4fe49a08054cc215aade2fbaf3b36ee334520997857ed84f530b52da9d35"
CONSENT_SHA256 = "4a4602ad926e3af855d6ddba4731430d33e4a7432c507ba0a5193b9f43056b52"
AUTH_ENV = "REUSE_SURFACE_FORGEJO_SOURCE_READ_TOKEN"
REPOSITORIES = frozenset({
"rapp-openbao", "rapp-policy-nexus", "rapp-postgres", "rapp-sbom-nexus",
"rapp-telemetry", "rapp-tenant-engine", "rapp-user-engine",
})
def _sha(content: bytes) -> str:
return hashlib.sha256(content).hexdigest()
def _load(path: Path, expected: str) -> dict[str, Any]:
data = path.read_bytes()
if _sha(data) != expected:
raise ValueError("packet_digest_mismatch")
return json.loads(data)
def _raw_url(repo: str, commit: str, path: str) -> str:
if not re.fullmatch(r"[0-9a-f]{40}", commit):
raise ValueError("invalid_commit")
if not re.fullmatch(r"registry/(indexes|capabilities)/[a-zA-Z0-9._-]+\.(yaml|md)", path):
raise ValueError("invalid_metadata_path")
return (
f"https://forgejo.coulomb.social/api/v1/repos/coulomb/{repo}/raw/"
f"{quote(path, safe='/')}?ref={commit}"
)
def _prepared_sources(proposal_path: Path, disclosure_path: Path, consent_path: Path):
proposal = _load(proposal_path, PROPOSAL_SHA256)
disclosure = _load(disclosure_path, DISCLOSURE_SHA256)
consent = _load(consent_path, CONSENT_SHA256)
if (
consent["consent_status"] != "approved"
or consent["proposal_sha256"] != DISCLOSURE_SHA256
or consent["proposal_id"] != disclosure["id"]
or consent["proposal_revision"] != disclosure["revision"]
or set(consent["repositories"]) != REPOSITORIES
):
raise ValueError("invalid_consent")
sources = proposal["sources"]
approved = {source["repo"]: source for source in disclosure["sources"]}
if len(sources) != 7 or {source["repo"] for source in sources} != REPOSITORIES:
raise ValueError("invalid_source_scope")
for source in sources:
owner = approved[source["repo"]]
files = {item["path"]: item["sha256"] for item in owner["files"]}
if (
source["consented_commit"] != owner["commit"]
or source["capability_ids"] != owner["capability_ids"]
or source["index_sha256"] != files["registry/indexes/capabilities.yaml"]
or source["auth_env"] != AUTH_ENV
or source["native_raw_url"] != _raw_url(
source["repo"], owner["commit"], "registry/indexes/capabilities.yaml"
)
):
raise ValueError("source_not_consented")
yield source, files
def verify(proposal_path: Path, disclosure_path: Path, consent_path: Path) -> dict[str, Any]:
receipt: dict[str, Any] = {
"id": "CUST81-PRIVATE-NATIVE-FETCH-RECEIPT-R1",
"checked_at": datetime.now(timezone.utc).isoformat(),
"proposal_sha256": PROPOSAL_SHA256,
"disclosure_sha256": DISCLOSURE_SHA256,
"consent_sha256": CONSENT_SHA256,
"cache_used": False,
"all_verified": False,
"sources": [],
}
try:
# Exhaust all packet checks before any native network request.
sources = list(_prepared_sources(proposal_path, disclosure_path, consent_path))
expected_urls = {
_raw_url(source["repo"], source["consented_commit"], path)
for source, files in sources for path in files
}
allowlist = json.loads(os.environ.get("REUSE_SURFACE_AUTH_SOURCE_ALLOWLIST", "{}"))
actual_urls = allowlist.get(AUTH_ENV)
if (
not isinstance(actual_urls, list)
or len(actual_urls) != 14
or set(actual_urls) != expected_urls
):
raise ValueError("runtime_scope_not_exact")
schema = Draft202012Validator(load_schema())
except Exception:
receipt["error"] = "packet_scope_or_schema_validation_failed"
return receipt
for source, files in sources:
row = {
"repo": source["repo"],
"commit": source["consented_commit"],
"index_sha256": source["index_sha256"],
"verified": False,
"entry_sha256": [],
}
receipt["sources"].append(row)
try:
index_text = federation.fetch_remote_index_text(source["native_raw_url"], source)
if _sha(index_text.encode("utf-8")) != source["index_sha256"]:
raise ValueError("index_hash_mismatch")
index = yaml.safe_load(index_text)
entries = index["capabilities"]
if not isinstance(entries, list) or [e["id"] for e in entries] != source["capability_ids"]:
raise ValueError("unexpected_capability_ids")
for entry in entries:
if not {"id", "name", "summary", "vector", "domain", "status", "owner", "path"} <= entry.keys():
raise ValueError("invalid_index_row")
if entry["owner"] != source["repo"] or entry["path"] not in files:
raise ValueError("unconsented_entry")
entry_url = _raw_url(source["repo"], source["consented_commit"], entry["path"])
entry_text = federation.fetch_remote_index_text(entry_url, source)
digest = _sha(entry_text.encode("utf-8"))
if digest != files[entry["path"]]:
raise ValueError("entry_hash_mismatch")
front = re.match(r"^---\n(.*?)\n---", entry_text, re.DOTALL)
if front is None:
raise ValueError("missing_front_matter")
metadata = yaml.safe_load(front.group(1))
schema.validate(metadata)
if metadata["id"] != entry["id"] or metadata["owner"] != source["repo"]:
raise ValueError("entry_identity_mismatch")
row["entry_sha256"].append(digest)
row["verified"] = True
except Exception:
# Never stringify errors: HTTP handlers and parsers can embed bodies,
# headers, credentials, or private source text in their messages.
row["error"] = "native_fetch_or_metadata_validation_failed"
receipt["all_verified"] = len(receipt["sources"]) == 7 and all(
row["verified"] for row in receipt["sources"]
)
return receipt
def main() -> int:
parser = argparse.ArgumentParser(description=__doc__)
for name in ("proposal", "disclosure", "consent"):
parser.add_argument(f"--{name}", type=Path, required=True)
args = parser.parse_args()
receipt = verify(args.proposal, args.disclosure, args.consent)
print(json.dumps(receipt, sort_keys=True))
return 0 if receipt["all_verified"] else 1
if __name__ == "__main__":
raise SystemExit(main())

View file

@ -61,11 +61,9 @@ Reuses the token-Jaccard approach already proven in `overlaps.py`
same codebase: same codebase:
1. **Tokenize** the query blob with the existing `TOKEN_RE`. 1. **Tokenize** the query blob with the existing `TOKEN_RE`.
2. **Score** with the maximum of two token-Jaccard similarities: query versus 2. **Score** against every federated capability's blob (`name` + `summary` +
capability `name`, and query versus `name` + `summary` + `tags`. `tags` + `discovery.intent` + `discovery.includes`, mirroring
Scoring the name separately prevents detailed summaries and consumption `overlaps._entry_blob`) via Jaccard similarity.
instructions from diluting a short direct query such as "headless browser".
Summary/tag matches and longer intents retain the full-blob signal.
3. **Rank signal, not just tie-break:** among candidates within 3. **Rank signal, not just tie-break:** among candidates within
`--tie-window` (default 0.05) of the top score, prefer the entry with the `--tie-window` (default 0.05) of the top score, prefer the entry with the
higher discovery/availability vector (a more mature capability is a safer higher discovery/availability vector (a more mature capability is a safer
@ -78,7 +76,7 @@ same codebase:
| Verdict | Condition | Meaning | | Verdict | Condition | Meaning |
|---|---|---| |---|---|---|
| `reuse` | top score ≥ `--reuse-threshold` (default 0.45) | A close lexical match exists; review its consumption contract and availability before adoption. | | `reuse` | top score ≥ `--reuse-threshold` (default 0.45) | An existing capability already covers this need — link it, don't rebuild it. |
| `extend` | top score in `[--extend-threshold, --reuse-threshold)` (default 0.22–0.45) | Scope overlaps a capability closely enough that extending it is very likely cheaper than a new one — surfaced with an explicit "consider extending" framing. | | `extend` | top score in `[--extend-threshold, --reuse-threshold)` (default 0.22–0.45) | Scope overlaps a capability closely enough that extending it is very likely cheaper than a new one — surfaced with an explicit "consider extending" framing. |
| `new` | top score < `--extend-threshold`, or no federated capabilities exist | No good match. Proceed; optionally file a capability request (T04). | | `new` | top score < `--extend-threshold`, or no federated capabilities exist | No good match. Proceed; optionally file a capability request (T04). |
@ -88,12 +86,6 @@ the same threshold reasoning as `overlaps.py`'s `--threshold 0.28` default,
shifted since plan-check matches short intent text against short summaries shifted since plan-check matches short intent text against short summaries
rather than long entry-to-entry blobs. rather than long entry-to-entry blobs.
Verdicts describe relevance, not runtime readiness. A source-only candidate or
an unavailable endpoint is an availability gap on the existing capability, not
evidence that a second capability should be built. The match summary carries
provider consumption guidance where published; callers must run its preflight
and respect any local-only or managed-admission conditions.
## 6. Output ## 6. Output
### Markdown (TTY default) ### Markdown (TTY default)

View file

@ -58,31 +58,6 @@ def test_hosted_only_capability_and_provenance_without_local_fallback(monkeypatc
assert result["index_source"]["capability_count"] == 1 assert result["index_source"]["capability_count"] == 1
def test_hosted_browser_discovery_includes_conditional_trial_guidance(monkeypatch, capsys):
from reuse_surface.registry import load_index
browser = next(item for item in load_index()["capabilities"]
if item["id"] == "capability.infotech.headless-browser")
payload = snapshot()
payload["capabilities"] = [
{"id": "capability.example.headless", "name": "Headless Knowledge Engine",
"summary": "Headless information management", "tags": [],
"vector": "D7 / A7 / C6 / R6"},
browser,
]
serve(monkeypatch, payload)
assert main(["plan-check", "--intent", "headless browser", "--hub-url",
"https://registry.example", "--no-llm", "--format", "json"]) == 0
result = json.loads(capsys.readouterr().out)
assert result["verdict"] == "reuse"
assert result["matches"][0]["id"] == browser["id"]
summary = result["matches"][0]["summary"]
assert "rapp_playwright.py" in summary
assert "preflight" in summary and "trial --out" in summary
assert "ephemeral" in summary and "admission is pending" in summary
assert "availability gap" in summary
@pytest.mark.parametrize("change", [ @pytest.mark.parametrize("change", [
{"stale": True}, {"stale": None}, {"composed_at": None}, {"stale": True}, {"stale": None}, {"composed_at": None},
{"composed_at": "2020-01-01T00:00:00Z"}, {"composed_at": "2020-01-01T00:00:00Z"},

View file

@ -1,91 +0,0 @@
"""Exercise the same strict native validator used by the existing Forgejo job."""
from __future__ import annotations
import copy
import subprocess
import sys
from pathlib import Path
import pytest
import yaml
ROOT = Path(__file__).resolve().parent.parent
def fixture_registry(tmp_path):
index = yaml.safe_load((ROOT / "registry/indexes/capabilities.yaml").read_text())
row = copy.deepcopy(index["capabilities"][0])
source = ROOT / row["path"]
target = tmp_path / row["path"]
target.parent.mkdir(parents=True)
target.write_bytes(source.read_bytes())
index["capabilities"] = [row]
index_path = tmp_path / "registry/indexes/capabilities.yaml"
index_path.parent.mkdir(parents=True)
return index_path, index
def validate(root):
return subprocess.run(
[sys.executable, "-m", "reuse_surface.cli", "validate", "--root", str(root),
"--fail-on-warnings"], cwd=ROOT, capture_output=True, text=True,
)
@pytest.mark.parametrize("field,value", [
("id", "capability.synthetic.stale"), ("name", "stale name"),
("summary", "stale summary"), ("domain", "stale-domain"),
("status", "retired"), ("owner", "wrong-owner"),
("tags", ["stale"]), ("consumption_modes", ["stale"]),
("vector", "D0 / A0 / C0 / R0"),
])
def test_existing_strict_validator_refuses_stale_projection(tmp_path, field, value):
path, index = fixture_registry(tmp_path)
path.write_text(yaml.safe_dump(index))
assert validate(tmp_path).returncode == 0
original_entry = (tmp_path / index["capabilities"][0]["path"]).read_bytes()
index["capabilities"][0][field] = value
path.write_text(yaml.safe_dump(index))
result = validate(tmp_path)
assert result.returncode == 1, result.stdout + result.stderr
assert f"{field} differs from entry" in result.stderr
assert (tmp_path / index["capabilities"][0]["path"]).read_bytes() == original_entry
def test_duplicate_id_and_path_cannot_satisfy_exactly_once(tmp_path):
path, index = fixture_registry(tmp_path)
index["capabilities"].append(copy.deepcopy(index["capabilities"][0]))
path.write_text(yaml.safe_dump(index))
result = validate(tmp_path)
assert result.returncode == 1
assert "duplicate id:" in result.stderr
assert "duplicate path:" in result.stderr
def test_equivalent_vector_whitespace_is_allowed(tmp_path):
path, index = fixture_registry(tmp_path)
index["capabilities"][0]["vector"] = index["capabilities"][0]["vector"].replace(" ", "")
path.write_text(yaml.safe_dump(index))
assert validate(tmp_path).returncode == 0
@pytest.mark.parametrize("source", ["null", "[]", "availability: null", "availability: []", "availability: ["])
def test_malformed_frontmatter_returns_failure_without_traceback(tmp_path, source):
path, index = fixture_registry(tmp_path)
path.write_text(yaml.safe_dump(index))
(tmp_path / index["capabilities"][0]["path"]).write_text("---\n" + source + "\n---\n")
result = validate(tmp_path)
assert result.returncode == 1
assert "Traceback" not in result.stderr
assert "error:" in result.stderr
@pytest.mark.parametrize("rows", [None, {}, [None], [[]], [{}], [{"id": [], "path": "x"}], [{"id": "x", "path": None}]])
def test_unvalidated_index_shape_returns_failure_without_traceback(tmp_path, rows):
path, index = fixture_registry(tmp_path)
index["capabilities"] = rows
path.write_text(yaml.safe_dump(index))
result = validate(tmp_path)
assert result.returncode == 1
assert "Traceback" not in result.stderr
assert "index drift:" in result.stderr

View file

@ -80,63 +80,6 @@ def test_match_query_no_capabilities():
assert match_query(query, []) == [] assert match_query(query, []) == []
def test_short_browser_intent_outranks_mature_headless_services(monkeypatch):
browser = {
"id": "capability.infotech.headless-browser",
"name": "Headless Browser Automation",
"summary": "Playwright Chromium screenshots keyboard " + " ".join(
f"detail{i}" for i in range(100)
),
"vector": "D3 / A2 / C2 / R2",
"tags": ["headless", "browser"],
}
other = {
"id": "capability.communication.context-engine",
"name": "Context Engine",
"summary": "Headless knowledge operations",
"vector": "D7 / A7 / C6 / R6",
}
monkeypatch.setattr(
"reuse_surface.plan_check.load_federated_capabilities",
lambda: ([other, browser], _recent_date()),
)
result = run_plan_check(load_query_from_intent("headless browser"), use_llm=False)
assert result["verdict"] == "reuse"
assert result["matches"][0]["id"] == browser["id"]
assert result["matches"][0]["score"] > result["matches"][1]["score"]
assert maybe_file_capability_request(
result, requesting_domain="infotech", requesting_agent="test"
) is None
# Extra operational documentation must not turn a direct name match into NEW.
original_score = result["top_score"]
browser["summary"] += " " + " ".join(f"command{i}" for i in range(100))
repeated = run_plan_check(load_query_from_intent("headless browser"), use_llm=False)
assert repeated["top_score"] == original_score
def test_summary_only_matching_survives_name_scoring():
query = load_query_from_intent("responsive screenshots keyboard assertions")
matches = match_query(query, [{
"id": "capability.infotech.headless-browser",
"name": "Browser Automation",
"summary": "Responsive screenshots keyboard assertions",
}])
assert verdict_for_score(matches[0].score) == "reuse"
def test_maturity_still_breaks_equally_relevant_name_ties():
candidates = [
{"id": "capability.example.early", "name": "Browser Automation",
"summary": "Early implementation", "vector": "D2 / A2 / C1 / R1"},
{"id": "capability.example.mature", "name": "Browser Automation",
"summary": "Documented implementation", "vector": "D4 / A5 / C3 / R3"},
]
matches = match_query(load_query_from_intent("browser automation"), candidates)
assert matches[0].id == "capability.example.mature"
assert matches[0].score == matches[1].score
def test_load_query_from_workplan(tmp_path): def test_load_query_from_workplan(tmp_path):
workplan = tmp_path / "TEST-WP-0001-thing.md" workplan = tmp_path / "TEST-WP-0001-thing.md"
workplan.write_text( workplan.write_text(

View file

@ -1,188 +0,0 @@
import hashlib
import io
import json
from email.message import Message
from urllib.request import HTTPSHandler, build_opener
from urllib.response import addinfourl
import pytest
import yaml
from reuse_surface import federation, private_source_verify as verifier
def _digest(text):
return hashlib.sha256(text.encode()).hexdigest()
@pytest.fixture
def packets(tmp_path, monkeypatch):
"""Fake owner-consented bodies; no estate credential or network transport."""
approved, sources, bodies = [], [], {}
for repo in sorted(verifier.REPOSITORIES):
cap_id = f"capability.fixture.{repo}"
commit = "a" * 40
path = f"registry/capabilities/{cap_id}.md"
metadata = {
"id": cap_id, "name": "Fixture", "summary": "Fixture metadata",
"owner": repo, "status": "draft",
"maturity": {"discovery": {"current": "D3", "target": "D5"}, "availability": {"current": "A2", "target": "A5"}},
"external_evidence": {"completeness": {"level": "C1"}, "reliability": {"level": "R0"}},
}
entry = "---\n" + yaml.safe_dump(metadata) + "---\nPrivate fixture body\n"
index = yaml.safe_dump({"capabilities": [{
"id": cap_id, "name": "Fixture", "summary": "Fixture metadata", "vector": "D3 / A2 / C1 / R0",
"domain": "infotech", "status": "draft", "owner": repo, "path": path,
}]})
index_url = verifier._raw_url(repo, commit, "registry/indexes/capabilities.yaml")
bodies[index_url] = index
bodies[verifier._raw_url(repo, commit, path)] = entry
sources.append({"repo": repo, "capability_ids": [cap_id], "consented_commit": commit,
"native_raw_url": index_url, "index_sha256": _digest(index), "auth_env": verifier.AUTH_ENV})
approved.append({"repo": repo, "capability_ids": [cap_id], "commit": commit, "files": [
{"path": "registry/indexes/capabilities.yaml", "sha256": _digest(index)},
{"path": path, "sha256": _digest(entry)},
]})
disclosure = json.dumps({"id": "fixture", "revision": 1, "sources": approved})
consent = json.dumps({"consent_status": "approved", "proposal_sha256": _digest(disclosure),
"proposal_id": "fixture", "proposal_revision": 1, "repositories": sorted(verifier.REPOSITORIES)})
proposal = json.dumps({"sources": sources})
paths = []
for name, text in (("proposal", proposal), ("disclosure", disclosure), ("consent", consent)):
path = tmp_path / f"{name}.json"
path.write_text(text)
paths.append(path)
monkeypatch.setattr(verifier, f"{name.upper()}_SHA256", _digest(text))
return paths, bodies
def _transport(monkeypatch, bodies, mutate=None):
calls = []
class FakeResponse:
def __init__(self, body):
self.body = body
def __enter__(self):
return self
def __exit__(self, *args):
return False
def read(self):
return self.body.encode()
class FakeOpener:
def open(self, req, timeout):
assert req.get_header("Authorization") == "Bearer fixture-secret"
assert timeout == 30
calls.append(req.full_url)
body = bodies[req.full_url]
return FakeResponse(mutate(req.full_url, body) if mutate else body)
monkeypatch.setenv(verifier.AUTH_ENV, "fixture-secret")
monkeypatch.setenv("REUSE_SURFACE_AUTH_SOURCE_ALLOWLIST", json.dumps({verifier.AUTH_ENV: list(bodies)}))
monkeypatch.setattr(federation.urllib.request, "build_opener", lambda handler: FakeOpener())
# Deliberately prohibit composition/cache resolution; direct fetch must work.
monkeypatch.setattr(federation, "resolve_source_index_path", lambda *a, **k: pytest.fail("cache path used"))
return calls
def test_exact_consented_native_index_and_entries_no_cache(packets, monkeypatch):
paths, bodies = packets
calls = _transport(monkeypatch, bodies)
receipt = verifier.verify(*paths)
assert receipt["all_verified"]
assert not receipt["cache_used"]
assert len(calls) == 14
assert all("?ref=" + "a" * 40 in url for url in calls)
output = json.dumps(receipt)
assert "fixture-secret" not in output
assert "Private fixture body" not in output
@pytest.mark.parametrize("suffix", [".yaml", ".md"])
def test_changed_unconsented_body_fails(packets, monkeypatch, suffix):
paths, bodies = packets
_transport(monkeypatch, bodies, lambda url, text: text + "changed" if suffix in url else text)
receipt = verifier.verify(*paths)
assert not receipt["all_verified"]
assert all(not row["verified"] for row in receipt["sources"])
def test_packet_tampering_rejected_before_fetch(packets, monkeypatch):
paths, _ = packets
paths[0].write_text(paths[0].read_text() + " ")
monkeypatch.setattr(federation, "fetch_remote_index_text", lambda *a: pytest.fail("network before consent checks"))
assert verifier.verify(*paths)["error"] == "packet_scope_or_schema_validation_failed"
def test_missing_auth_fails_before_transport(packets, monkeypatch):
paths, bodies = packets
monkeypatch.setenv("REUSE_SURFACE_AUTH_SOURCE_ALLOWLIST", json.dumps({verifier.AUTH_ENV: list(bodies)}))
monkeypatch.delenv(verifier.AUTH_ENV, raising=False)
monkeypatch.setattr(federation.urllib.request, "build_opener", lambda *a: pytest.fail("transport without auth"))
receipt = verifier.verify(*paths)
assert not receipt["all_verified"]
assert all(not row["verified"] for row in receipt["sources"])
def test_error_output_never_embeds_secret_or_body(packets, monkeypatch):
paths, bodies = packets
monkeypatch.setenv("REUSE_SURFACE_AUTH_SOURCE_ALLOWLIST", json.dumps({verifier.AUTH_ENV: list(bodies)}))
def failure(*args):
raise ValueError("fixture-secret Private fixture body")
monkeypatch.setattr(federation, "fetch_remote_index_text", failure)
output = json.dumps(verifier.verify(*paths))
assert "fixture-secret" not in output
assert "Private fixture body" not in output
def test_broadened_runtime_reader_scope_fails_before_fetch(packets, monkeypatch):
paths, bodies = packets
monkeypatch.setenv("REUSE_SURFACE_AUTH_SOURCE_ALLOWLIST", json.dumps({verifier.AUTH_ENV: list(bodies) + ["https://attacker.invalid/"]}))
monkeypatch.setattr(federation, "fetch_remote_index_text", lambda *a: pytest.fail("broadened scope used"))
assert not verifier.verify(*paths)["all_verified"]
@pytest.mark.parametrize("target", ["https://attacker.invalid/stolen", "https://forgejo.coulomb.social/other/repo"])
def test_native_auth_redirect_never_replays_header(monkeypatch, target):
calls = []
class FakeHTTPS(HTTPSHandler):
def https_open(self, req):
calls.append(req.full_url)
headers = Message()
headers["Location"] = target
result = addinfourl(io.BytesIO(b""), headers, req.full_url, 302)
result.msg = "Found"
return result
# Use real urllib opener/redirect/error processors and fake HTTPS transport.
opener = build_opener(FakeHTTPS(), federation._RejectAuthenticatedRedirect())
monkeypatch.setattr(federation.urllib.request, "build_opener", lambda *a: opener)
monkeypatch.setenv("FIXTURE_AUTH", "fixture-secret")
monkeypatch.setenv("REUSE_SURFACE_AUTH_SOURCE_ALLOWLIST", json.dumps({"FIXTURE_AUTH": ["https://forgejo.coulomb.social/approved"]}))
with pytest.raises(ConnectionError, match="redirect refused"):
federation.fetch_remote_index_text("https://forgejo.coulomb.social/approved", {"repo": "fixture", "auth_env": "FIXTURE_AUTH"})
assert calls == ["https://forgejo.coulomb.social/approved"]
def test_authenticated_http_rejected_before_transport(monkeypatch):
monkeypatch.setenv("FIXTURE_AUTH", "fixture-secret")
monkeypatch.setattr(federation.urllib.request, "build_opener", lambda *a: pytest.fail("cleartext transport"))
with pytest.raises(ValueError, match="HTTPS"):
federation.fetch_remote_index_text("http://forgejo.coulomb.social/approved", {"repo": "fixture", "auth_env": "FIXTURE_AUTH"})
@pytest.mark.parametrize("config", [None, "broken-json", "[]", '{"FIXTURE_AUTH":"https://attacker.invalid/"}', '{"OTHER_AUTH":["https://attacker.invalid/"]}'])
def test_unapproved_auth_target_rejected_before_credential_lookup(monkeypatch, config):
if config is None:
monkeypatch.delenv("REUSE_SURFACE_AUTH_SOURCE_ALLOWLIST", raising=False)
else:
monkeypatch.setenv("REUSE_SURFACE_AUTH_SOURCE_ALLOWLIST", config)
monkeypatch.setattr(federation, "_auth_headers", lambda *a: pytest.fail("unauthorized credential lookup"))
with pytest.raises(ValueError, match="runtime-authorized"):
federation.fetch_remote_index_text("https://attacker.invalid/", {"repo": "fixture", "auth_env": "FIXTURE_AUTH"})

View file

@ -2,8 +2,6 @@ from __future__ import annotations
from pathlib import Path from pathlib import Path
import pytest
from reuse_surface.stats import ( from reuse_surface.stats import (
collect_roster_stats, collect_roster_stats,
collect_stats, collect_stats,
@ -12,36 +10,19 @@ from reuse_surface.stats import (
) )
@pytest.fixture def test_collect_stats_on_repo_root():
def stats_repo(tmp_path, monkeypatch): root = Path(__file__).resolve().parent.parent
monkeypatch.delenv("REUSE_SURFACE_URL", raising=False) stats = collect_stats(root)
index = tmp_path / "registry/indexes/capabilities.yaml"
index.parent.mkdir(parents=True)
index.write_text("""version: 1
domain: infotech
capabilities:
- id: capability.example.source
vector: D3 / A2 / C2 / R2
path: registry/capabilities/source.md
- id: capability.example.service
vector: D4 / A5 / C3 / R3
path: registry/capabilities/service.md
""")
return tmp_path
def test_collect_stats_on_repo_root(stats_repo):
stats = collect_stats(stats_repo)
assert stats["capability_count"] == 2 assert stats["capability_count"] == 2
assert stats["index_present"] is True assert stats["index_present"] is True
assert stats["histograms"]["discovery"]["D3"] == 1 assert "discovery" in stats["histograms"]
assert stats["histograms"]["discovery"]["D4"] == 1
assert stats["reliability"] == {"r0_r2": 1, "r3_plus": 1}
def test_format_stats_markdown_contains_count(stats_repo): def test_format_stats_markdown_contains_count():
text = format_stats_markdown(collect_stats(stats_repo)) root = Path(__file__).resolve().parent.parent
assert "**Capabilities:** 2" in text text = format_stats_markdown(collect_stats(root))
assert "Capabilities:" in text
assert "2" in text
def test_collect_roster_stats_federation_ready(): def test_collect_roster_stats_federation_ready():

View file

@ -1,72 +0,0 @@
---
id: ADHOC-2026-10-13
type: workplan
title: "Register existing headless browser tooling for a worker trial"
domain: infotech
repo: reuse-surface
status: finished
owner: codex
created: "2026-10-13"
updated: "2026-10-13"
state_hub_workstream_id: "052a02f6-25ae-54cd-a61e-49f9e5dc1120"
---
## Register browser automation and verify discovery
```task
id: ADHOC-2026-10-13-T01
status: done
priority: medium
state_hub_task_id: "e35c0122-9afe-5007-b1f8-278d628b94ba"
```
User requested the evidence and recommendation from the browser-tooling assessment
be included in reuse-surface for a subsequent worker trial. Add a capability entry
and index metadata, distinguish implemented examples from optional dependencies
and plans, give scoped Playwright/Chromium guidance, and validate discovery.
The consuming worker performs the browser trial separately.
Completed 2026-10-13:
- Added `capability.infotech.headless-browser` at D3/A2/C2/R2, with four
revision-pinned implementation examples, scoped guidance and trial steps.
- Added local index metadata and regenerated the catalog, graph and federation
(66 capabilities). Local federation now reads this checkout's own index;
hosted registration remains unchanged and needs publication of the new content.
- `query --keyword browser` and `query --keyword playwright` each return the
browser entry. All cited local evidence paths and Markdown links resolve.
- `validate --relations --fail-on-warnings` and graph checks pass. Existing
registry, federation, plan-check and hosted-plan-check suites: **76 passed**.
- Documented the existing matcher limitation: short-intent `plan-check` includes
this candidate but still returns `new`; use the explicit keyword query for the
worker trial. No matcher behavior or browser execution was changed or claimed.
## Publish and synchronize browser discovery
```task
id: ADHOC-2026-10-13-T02
status: done
priority: medium
state_hub_task_id: "2a8633d9-5664-5df8-9fd5-16b1d4bef91f"
```
User explicitly authorized publication, sync and commit on 2026-10-13. Commit and
push the registry content, refresh the hosted federation, verify that the hosted
entry and published source document are accessible, and synchronize work records.
Publication verified 2026-10-13:
- Content commit `64e1674` pushed to `origin/main`.
- Published source document fetched from
`https://forgejo.coulomb.social/coulomb/reuse-surface/raw/branch/main/registry/capabilities/capability.infotech.headless-browser.md`
matches the committed local file byte for byte.
- Refreshed `https://reuse.coulomb.social/v1/federated?refresh=true`;
`composed_at: 2026-10-13T11:56:56+00:00`, `stale: false`, 66 capabilities,
exactly one `capability.infotech.headless-browser`, no federation warnings.
- Hosted `plan-check --intent "headless browser" --no-llm` includes the entry.
Its documented scoring limitation remains; publication does not change ranking.
- Registry validation and graph checks passed again before publication; the
previously recorded 76-test result covers the unchanged implementation.
- State Hub indexed both completed tasks. Its consistency tool required reopening
the finished workstream before indexing T02; the record is closed again after
that sync. Generated writeback files are committed with this publication record.

View file

@ -1,45 +0,0 @@
---
id: REUSE-WP-ADHOC-2026-10-16
type: workplan
title: "Refuse owner/index drift in the existing native registry validator"
domain: infotech
repo: reuse-surface
status: finished
owner: codex
created: "2026-10-16"
updated: "2026-10-16"
flavor: implementation
state_hub_workstream_id: "803c5bb3-12c5-51be-9852-c6719f7c80fd"
---
## Refuse owner/index drift in the existing native registry validator
```task
id: REUSE-WP-ADHOC-2026-10-16-T01
status: done
priority: medium
state_hub_task_id: "63c0e025-f7aa-5849-ac2f-61128ceb7a0e"
```
The existing strict validator accepted stale index metadata and duplicate IDs/paths. Extend its existing parity warnings and add native CLI regression tests, including malformed frontmatter/index shape without tracebacks. Existing mandatory Forgejo validation consumes this source; fleet adoption and hosted freshness are unverified.
Completed 2026-10-16 under the founder's NetKingdom target implementation demand
(CUST-WP-0080, TSA-11). Source review and exact before/after native CLI evidence:
`the-custodian/docs/changes/netkingdom-target-2026-10-16/improvement-loop-next/`.
The current 60-provider cohort has all 70 reviewed IDs exactly once; 3 field
mismatches across 2 capabilities become zero with the source corrections.
Native hosted refresh/readback and the accepted Activity/rein schedule remain
separate gates. No production change, model call, credential access or external
message was performed.
Validation and publication checkpoint, 2026-10-16: 23 new native CLI cases
passed, covering projected fields, duplicate ID/path, vector whitespace,
malformed frontmatter and unvalidated index row shapes. Root independently
reviewed source and passed all 30 parity/native-registry cases across its
initial run and three required filesystem-approved reruns. The failed sandbox
writes remain failed observations, not source defects. All three affected owner
strict validations pass. Source commit `dd00b27` was published by the normal
`statehub fix-consistency` backlog push; no manual push was used. Its automatic
brief-only writeback was refused by the unchanged generated-only guard. This
source record retains the issued workstream/task bindings; generated artifacts
are not bundled to evade that refusal. Hosted readback remains outstanding.

View file

@ -4,13 +4,12 @@ type: workplan
title: "Follow the CommerceCanon repository rename in federation sources" title: "Follow the CommerceCanon repository rename in federation sources"
domain: infotech domain: infotech
repo: reuse-surface repo: reuse-surface
status: finished status: active
flavor: residual
owner: codex owner: codex
origin: residual origin: residual
origin_ref: IDENTITY-WP-0004 origin_ref: IDENTITY-WP-0004
created: "2026-09-05" created: "2026-09-05"
updated: "2026-09-20" updated: "2026-09-06"
state_hub_workstream_id: "0d1beafd-e638-5bb9-b91d-13543ac42a04" state_hub_workstream_id: "0d1beafd-e638-5bb9-b91d-13543ac42a04"
--- ---
@ -26,7 +25,6 @@ repository's source/refresh evidence.
```task ```task
id: REUSE-WP-0021-T01 id: REUSE-WP-0021-T01
status: done status: done
flavor: residual
priority: medium priority: medium
state_hub_task_id: "b7803b7d-0b70-5aac-8f6a-2704794fccf2" state_hub_task_id: "b7803b7d-0b70-5aac-8f6a-2704794fccf2"
``` ```
@ -49,8 +47,7 @@ service, or capability-semantic migration is authorized by this task.
```task ```task
id: REUSE-WP-0021-T02 id: REUSE-WP-0021-T02
status: done status: wait
flavor: residual
priority: low priority: low
state_hub_task_id: "ceba0cd4-3992-5f16-bdd2-1f054055d10b" state_hub_task_id: "ceba0cd4-3992-5f16-bdd2-1f054055d10b"
``` ```
@ -91,34 +88,3 @@ a stale UUID. Do not manually substitute identifiers or run a derived-identity
migration to quiet this audit. T02 must use a reviewed restoration tool that migration to quiet this audit. T02 must use a reviewed restoration tool that
verifies existing primary records and historical source provenance. These verifies existing primary records and historical source provenance. These
archived binding defects do not invalidate the source-coordinate refresh. archived binding defects do not invalidate the source-coordinate refresh.
## Binding repair completed — 2026-09-20
T02 is done. The restoration used the State Hub's own authoritative records
rather than derived identifiers, so work-record identity and history are intact.
**Workplan bindings.** The hub already carried correct `backing_relative_path`
and `backing_archived: true` for all three archived workplans, which confirmed
each UUID against its file. The verified existing identities were written back
into the blank frontmatter fields — the same three UUIDs recorded in the
2026-09-06 note above, not newly derived ones. `bindings` upload then returned
`synced 22/22` instead of 422; C-03 cleared at the workplan level.
**Task bindings.** The file task ids matched neither DB set. The hub holds each
archived task twice: the original records created 2026-07-06 at registration,
and a deterministic UUIDv5 duplicate set created 2026-08-28 by an unrelated
migration. The files were rebound to the **2026-07-06 originals** — the
historical identities — matched one-to-one by section heading and creation
order, with every title aligning exactly. The v5 duplicates were left in place;
removing them is hub-side data repair and is not authorized from this repo.
**One collateral repair.** An intermediate `fix-consistency` run canceled
REUSE-WP-0019-T06 (`a9f44d45…`) as an orphan while its file binding was still
missing. Once rebound, the task was restored to `done` via
`PATCH /tasks/{id}` — a sanctioned status update reflecting work already
completed in 2026-07.
`statehub fix-consistency --repo reuse-surface` now reports
**0 automation-error, 0 assessment-fail, PASS (with warnings)**. Remaining
warnings are unrelated: C-24 capability-tag advisories and an unread flex-auth
inbox message (C-28/C-29, FLEX-WP-0020 handoff).

View file

@ -4,13 +4,12 @@ type: workplan
title: "Use current hosted capability discovery in factory planning" title: "Use current hosted capability discovery in factory planning"
domain: infotech domain: infotech
repo: reuse-surface repo: reuse-surface
status: finished status: active
owner: the-custodian owner: the-custodian
topic_slug: helix-forge topic_slug: helix-forge
created: "2026-09-08" created: "2026-09-08"
updated: "2026-09-08" updated: "2026-09-08"
related: [HFACT-WP-0001, VERGABE-WP-0018] related: [HFACT-WP-0001, VERGABE-WP-0018]
state_hub_workstream_id: "9f90448a-b149-5d04-91b5-0bfc163a9ea2"
--- ---
# Hosted query-before-build # Hosted query-before-build
@ -29,7 +28,6 @@ id: REUSE-WP-0022-T01
status: done status: done
priority: high priority: high
assignee: the-custodian assignee: the-custodian
state_hub_task_id: "004ba579-64d0-5b56-9847-b4b02fbf0f7a"
``` ```
Use the existing public GET /v1/federated. Preserve local mode compatibility. Use the existing public GET /v1/federated. Preserve local mode compatibility.
@ -43,11 +41,10 @@ No additional service, model call or mutation credential is necessary.
```task ```task
id: REUSE-WP-0022-T02 id: REUSE-WP-0022-T02
status: done status: progress
priority: high priority: high
assignee: the-custodian assignee: the-custodian
depends_on: [REUSE-WP-0022-T01] depends_on: [REUSE-WP-0022-T01]
state_hub_task_id: "a97e7347-70b1-5ce6-93fa-ff9fb1df2133"
``` ```
Publish the tested implementation through the existing Forgejo review path. Publish the tested implementation through the existing Forgejo review path.
@ -63,18 +60,3 @@ warning). Vergabe-teilnahme invoked the CLI against the real hosted federation:
`bfb6b79970867ac981fc48286dea24b2ff766cf732d3675f73ccbddb8971e498`. `bfb6b79970867ac981fc48286dea24b2ff766cf732d3675f73ccbddb8971e498`.
Consumer receipt: `vergabe-teilnahme/docs/evidence/2026-09-08-hosted-plan-check.json`. Consumer receipt: `vergabe-teilnahme/docs/evidence/2026-09-08-hosted-plan-check.json`.
This attended implementation does not count as a governed factory run. This attended implementation does not count as a governed factory run.
## Completion and handoff
Integrated on published `main` at `998a5ef3efd42af728fb276594f634f516855daa`
after PR 1 and live CI run 331 passed. Main CI 333 and image publication 334
passed. Image `main-998a5ef` has digest
`sha256:b510acc6bb1aee0e70709f65e53c61a96336ca837eba6dd75ceaa1f5cbf3d441`.
Vergabe-teilnahme's consumer and build gate are integrated and its image is
published under VERGABE-WP-0018. No production deployment is claimed here.
Residual integration/operating acceptance remains live in HFACT-WP-0001-T06/T07.
HFACT-WP-0001-T02 also owns disposition of three archived REUSE-WP-0017/0018/0019
null-ID consistency findings; these are historical projection issues, not failed
checks for REUSE-WP-0022. Forgejo PR 1 metadata still needs the authenticated
`manually-merged` receipt after OpenBao caller login; source is already on main.

View file

@ -1,140 +0,0 @@
---
id: REUSE-WP-0023
type: workplan
title: "Follow the access-engine repository rename in federation sources"
domain: infotech
repo: reuse-surface
status: finished
flavor: residual
owner: claude
origin: residual
origin_ref: FLEX-WP-0020
created: "2026-09-20"
updated: "2026-09-30"
state_hub_workstream_id: "65c03b24-4349-5a60-b7d6-79cf54931d06"
---
# access-engine source-coordinate handoff
flex-auth is being renamed to access-engine under FLEX-WP-0020. Forge
repository ID 42 is unchanged and the State Hub repo UUID
`fda8ad85-a7d7-4055-8f21-902a533e59df` stays. **Runtime names stay
`flex-auth`** per FLEX-DEC-2026-013 — this is a repository-coordinate rename
only, not a service or capability rename.
This repository owns the federation-source side: the URL, cache path, and
roster entry that point at the renamed repository, plus evidence that the
published capability survives the move unchanged.
This is the same shape as **REUSE-WP-0021** (identity-canon → commerce-canon,
finished 2026-09-20); reuse that workplan's approach and evidence format.
## Status at registration — 2026-09-20
**The rename has not landed yet.** Probed on 2026-09-20:
- `https://forgejo.coulomb.social/coulomb/access-engine/raw/main/registry/indexes/capabilities.yaml` → **404**
- `https://forgejo.coulomb.social/coulomb/flex-auth/raw/main/registry/indexes/capabilities.yaml` → **303** (still resolves)
T01 therefore starts in `wait`. Do not pre-emptively rewrite the source
coordinates: flipping the URL before the forge rename lands would break an
enabled, publish-passing source and drop its capability from the composed
index. Start T01 when `access-engine` serves the raw index.
## Update source coordinates and verify federation
```task
id: REUSE-WP-0023-T01
status: done
flavor: residual
priority: medium
state_hub_task_id: "d97094d4-4cad-5b35-aa88-eb952215937a"
```
Blocked until the forge rename lands (see above).
Update `registry/federation/sources.yaml` and
`registry/federation/local-repo-roster.yaml` to the canonical access-engine
URL and path. Refresh that source's cache and recompose
`registry/indexes/federated.yaml` through the repository's federation tooling.
Preserve the capability identifier published by flex-auth — a repository
rename alone does not redefine a capability, and runtime names are explicitly
unchanged by FLEX-DEC-2026-013. Source owner/URL/cache metadata should match
the newly published access-engine registry.
Verify the capability entry remains discoverable with canonical source links,
confirm the composed row count does not drop, record commands and results,
commit, and hand evidence back to FLEX-WP-0020. Leave historical
workplan/completion provenance intact. No credential, runtime service, or
capability-semantic migration is authorized by this task.
## Reconcile the hosted hub registration
```task
id: REUSE-WP-0023-T02
status: done
flavor: residual
priority: medium
state_hub_task_id: "77b1eb56-bbf6-5454-892f-bf60e32b864a"
```
Blocked on T01.
The production hub at `https://reuse.coulomb.social` carries its own repo
registrations independent of the checked-in manifest. Register the
access-engine coordinates there and retire the flex-auth registration the same
way commerce-canon was handled under REUSE-WP-0021: keep the superseded
registration disabled with a replacement note rather than deleting it, so the
rename stays auditable. Confirm the hub's composed index serves the capability
from the canonical URL with no target warnings.
## Loose-end review — 2026-09-28
Reviewed all 23 repository workplans, including archived files. The 22 closed
workplans have no unfinished task blocks; T01 and T02 here are the only open
tasks. Neither can complete before the upstream FLEX-WP-0020 rename lands.
This workplan is now `blocked`, with both tasks remaining `wait`; no new tasks
or workplans were opened.
Fresh read-only probes used `curl -sS -L -o <temporary-file> -w '%{http_code}'`
against the raw capability-index URLs listed above:
- `access-engine/raw/main/registry/indexes/capabilities.yaml`: HTTP **404**.
- `flex-auth/raw/main/registry/indexes/capabilities.yaml`: HTTP **200** after
following redirects.
The 2026-09-20 flex-auth inbox handoff also confirms T01 must follow
FLEX-WP-0020-T06, with the upstream owner responsible for announcing that the
new raw index is available. The checked-in source and local roster still use
`flex-auth`, correctly preserving the working source until that prerequisite
is met. T02 remains blocked on T01; the hosted registration must follow the
verified source migration. Resume these existing tasks when the canonical
access-engine raw index is available and validates successfully.
## T01 evidence — 2026-09-30
FLEX-WP-0020 rename landed (access-engine, head b943d9a). Probe:
`/coulomb/access-engine/raw/main/registry/indexes/capabilities.yaml` returns 303 then 200.
Changed `registry/federation/sources.yaml` (repo + URL) and
`local-repo-roster.yaml` (slug + path ~/access-engine). Ran
`reuse-surface federation compose --refresh`: 65 capabilities before and after;
only `source_repo`/`source_url`/`source_index` of the one entry changed, capability
identifier preserved. `reuse-surface validate` ok. Old `cache/flex-auth*` files are
ignored cache and were left. T02 (hosted hub) handed to an operator.
## T02 evidence — 2026-09-30
Operator ran, with their own OpenBao login (`bao kv get -field=REUSE_SURFACE_TOKEN
platform/workloads/reuse/reuse-surface/runtime-secrets`): `hub register --repo
access-engine --domain helix_forge --url <access-engine raw index>` (ok) and
`hub update --repo flex-auth --no-enabled --description "Superseded by
access-engine ..."` (ok). The `warden access --exec` lane was refused by design
(WARDEN-WP-0039: resource.system=railiance-platform vs. ops-warden binding; no
delegated-read contract yet) — not rename breakage; the owner-native `bao` read
is the working route.
Verified read-only against `https://reuse.coulomb.social`: `/v1/repos` shows
access-engine enabled and flex-auth disabled with the replacement note;
`/v1/federated` serves `capability.authorization.policy-evaluate` from the
access-engine URL, 65 capabilities (unchanged), `stale: false`.

View file

@ -1,84 +0,0 @@
---
id: REUSE-WP-0024
type: workplan
title: "Resolve browser discovery relevance and publish verified provider consumption"
domain: infotech
repo: reuse-surface
status: finished
owner: codex
origin: cross-repo
origin_ref: REUSE-IN-0001
created: "2026-10-13"
updated: "2026-10-13"
state_hub_workstream_id: "3d62d0af-5deb-55b5-b570-e62f05a43666"
---
# Browser discovery and provider evidence
Reviewed against the current checkout and rapp-playwright's published 0.1.0
contract, immutable release and independent consumer receipts. All prior
workplans are closed. REUSE-IN-0001 and the October 13 provider inbox handoffs
are the remaining actionable work. User authorized review, implementation,
commit and synchronization.
## Publish the verified provider path
```task
id: REUSE-WP-0024-T01
status: done
priority: high
state_hub_task_id: "dd75f033-02f1-521e-b5c3-cddb5dce80df"
```
Update the existing capability, index and generated views with pinned public
client/contract/release/evidence links and executable preflight/trial guidance.
Assess maturity against the standard; distinguish deployable local container
availability from pending managed platform admission and ephemeral endpoints.
Retain the source-adaptation fallback. No second browser capability or consumer
task closure. Verify published sources and the available local fixture path.
## Fix short-intent relevance
```task
id: REUSE-WP-0024-T02
status: done
priority: high
state_hub_task_id: "a689bc2a-a112-59d4-b00c-f6934665dffb"
```
Keep deterministic token matching, but score capability names separately so
long summaries cannot dilute a direct name match. Test browser versus unrelated
headless services, unrelated queries, long descriptions, and maturity ties.
Make reuse advice distinguish lexical relevance from runtime availability.
Verify the same behavior against the hosted snapshot using the local CLI.
## Validate, publish and synchronize
```task
id: REUSE-WP-0024-T03
status: done
priority: medium
state_hub_task_id: "0be283ba-12da-52a1-b1af-0c2d6dcb58f1"
```
Run the appropriate tests and registry/generated-artifact checks. Commit and
push, refresh hosted federation, retain public readback evidence, reconcile
REUSE-IN-0001 and workplan statuses, and log progress to State Hub. Browser
deployment and CONTENT-WP-0000-T04 acceptance remain their owners' work.
## Implementation evidence
See [review and trial receipts](../docs/evidence/2026-10-13-browser-discovery.md).
The published client passed 14 fixture steps and produced four independently
checked screenshots. Availability is now A5 for the published local container;
A6 managed admission remains pending. Name scoring ranks the browser first at
0.6667 instead of returning false-new. Replaced stale live-registry stats
assumptions with a controlled fixture after the full suite exposed them.
Completed publication: implementation commit `50077c9` pushed to `origin/main`;
public capability and index bytes match. Hosted readback at 18:49:02 UTC is fresh
and warning-free, with 66 capabilities and one browser entry. The updated local
CLI against that snapshot returns browser first, 0.6667, `reuse`; no server code
deployment was required. All **212 tests** pass, registry validation and graph
checks pass. REUSE-IN-0001 is closed for the registry-owned concerns. Managed
admission and consumer acceptance remain with their existing owners.

View file

@ -1,84 +0,0 @@
---
id: REUSE-WP-0025
type: workplan
title: "Bind private source reader to consented metadata URLs"
domain: infotech
repo: reuse-surface
status: blocked
owner: reuse-surface-owner-preparation-worker
created: "2026-10-15"
updated: "2026-10-21"
flavor: implementation
depends_on: [CUST-WP-0081]
state_hub_workstream_id: "23c7bcf5-5f5d-524f-a06e-be5247ae1a98"
---
Prepared in an isolated owner checkout under the user's explicit worker-agent
request. This worker has supervised local preparation scope only; no founder
credential approval, permanent repo-owner authority, deployment, or source-owner
consent is inferred. The custodian integration agent handles hub synchronization
after accepting the proposed owner workitem. No State Hub mutation is performed
from this isolated checkout.
## Independent consumer review
```task
id: REUSE-WP-0025-T01
status: done
priority: high
state_hub_task_id: "1f841e28-fc55-5b12-bb51-bb3291f17d8b"
```
Reviewed consumer INTENT, native authenticated acquisition, public API registration
fields, and stale-cache behavior. The deployed baseline is unsuitable for a new
private reader: registered auth_env/URL can route runtime credentials to arbitrary
hosts; urllib's default redirect handler also forwards Authorization. Review is
`changes_requested`; metadata consent does not authorize reader provisioning.
See docs/assessments/cust81-private-reader/owner-review-r1.md.
## Prepare native boundary and verification helper
```task
id: REUSE-WP-0025-T02
status: done
priority: high
state_hub_task_id: "a9e794f6-a894-52e6-bd93-4781e05c6a55"
```
Patch rejects authenticated cleartext URLs and all redirects, and requires an
operator-controlled exact env-to-URL allowlist before credential lookup. Receipt
helper invokes native fetch directly for all seven consented index/entry pairs,
checks exact hashes and entry schema, and never uses cached fallback. Fake
transport tests and local committed metadata validation are preparation evidence,
not live authenticated fetch receipts.
## Review, publish and verify deployed consumer
```task
id: REUSE-WP-0025-T03
status: wait
priority: high
blocked_on: message-from:railiance-apps
blocking_reason: "Approved rollout requested from railiance-apps (msg f8f142bc); prerequisite: operator creates reuse-surface-reader bot + PAT in OpenBao"
state_hub_task_id: "789bb918-4848-5bdf-bfd4-8ee42877addb"
```
Owner review and exact credential/rollout disposition remain pending. Platform/apps
must inventory every existing authenticated dynamic registration without reading
Secret values, migrate approved exact URLs, and deliver a reviewed image containing
the fix plus the exact reader allowlist. Then run helper inside the hub environment
with the owner-provided packets, verify all seven sources fresh, and hand a
sanitized receipt to the custodian for registration and final 70-capability audit.
No new PAT is delivered to the current baseline consumer.
2026-10-21: decision 81c8535a resolved by Bernd — approved (1) the native
boundary fix, (2A) a dedicated Forgejo machine user (e.g. `reuse-surface-reader`)
with read access to exactly the seven consented repos and a `read:repository`
PAT on its own OpenBao KV path, delivered via ESO as
`REUSE_SURFACE_FORGEJO_SOURCE_READ_TOKEN` and allowlisted to the 14 commit-pinned
URLs, and (3) the platform/apps rollout as described above. Remaining: create the
bot user and token (human/operator — agents do not handle the secret value), roll
out, run the helper, hand over the receipt. Follow-up: define how allowlist pins
are refreshed and re-approved when the source repos update their metadata.
Rollout requested from railiance-apps via hub message f8f142bc; T03 now waits
on that reply (image digest, Helm revision, sanitized helper receipt).

View file

@ -1,59 +0,0 @@
---
id: REUSE-WP-0026
type: workplan
title: "Wave-2 resource right-sizing from the 2026-10-21 allocation review"
domain: infotech
repo: reuse-surface
status: finished
flavor: implementation
owner: claude
created: "2026-10-21"
updated: "2026-10-21"
related:
- CUST-WP-0071
- RESOURCE-WP-0008
state_hub_workstream_id: "d0b06425-2d20-5816-bd09-9e9bec846236"
---
# REUSE-WP-0026 — Wave-2 resource right-sizing from the 2026-10-21 allocation review
Receiving workplan in `reuse-surface` for the wave-2 request changes below.
Origin: the 2026-10-21 node allocation review (`RESOURCE-WP-0008-T03`, feeding `CUST-WP-0071-T03`). Per the founder's 2026-10-21 delivery interview (`the-custodian/docs/decisions/2026-10-21-cust-wp-0071-delivery-interview.md`) the small adjustments form wave 2: one receiving task per owner repo, applied later in a batch. Applying wave 2 needs a separate founder approval, so every cluster-write task here is a human-gated `wait`. This file changes no manifest.
## Apply the reviewed request changes
```task
id: REUSE-WP-0026-T01
status: done
priority: medium
state_hub_task_id: "2fd47858-94d8-5a57-96f9-35b25d54bb1d"
```
Values are pod-aggregate figures from the budget file (7-day window ending 2026-10-21T06:08Z). Limits stay unchanged unless stated.
| Workload (ns/name) | Pods | CPU request | CPU limit | CPU p95/peak 7d (m) | Memory request | Memory limit | Mem p95/peak (Mi) | Throttle | Action |
|---|---:|---:|---:|---:|---:|---:|---:|---:|---|
| `reuse/reuse-surface` | 2 | 110m → **10m** | 550m | 2.1/10.2 | 288Mi → **80Mi** | 576Mi | 56.2/57.0 | 0.0 | decrease + memory down |
Source and container detail:
- `reuse/reuse-surface`: two pods from `railiance-apps/charts/reuse-surface/values.yaml`: main `resources` (100m/256Mi) and the second component's `resources` (10m/32Mi) — the chart lives in railiance-apps. Split the 10m/80Mi total as 5m/48Mi main and 5m/32Mi second, or by per-pod p95.
**Prepared 2026-10-21 (wave-2 worker W1a; not applied).** Live owner is Helm release `reuse` (rev 11) from railiance-apps. Change: railiance-apps `b7fb7b2`, `helm/reuse-surface-values.yaml`. Split by per-pod p95: main 100m/256Mi → 5m/64Mi (p95 about 51Mi, so 48Mi would have sat below the working set); landing 10m/32Mi → 5m/16Mi. Total 10m/80Mi, limits unchanged. The full render against live shows only `resources.requests` on both Deployments. Apply: `cd railiance-apps && make reuse-deploy`. RollingUpdate.
Evidence: resource-control `docs/evidence/2026-10-21-node-allocation-review/2026-10-21-node-budget.md` (+ `.json`, commit `3d9b1bd`). Rule: CPU = max(floor, p95x1.5, peakx0.5) rounded up to 5m; memory request = 7d p95 working set x1.15 (only when the change is at least 64Mi).
Steps:
1. Map the pod-aggregate proposal onto the named container(s) in the source file; where a workload has several containers or pods, split by the per-pod figures in `2026-10-21-workload-usage.json` and keep the sum at the proposed value.
2. Prepare the source change as a reviewed commit (no push, no sync) and record the before values here.
3. Apply only inside the batched wave-2 rollout, after founder approval, through the owner's normal deploy path (ArgoCD sync or documented helm/kubectl apply).
Verification: `kubectl -n <ns> get pod -o jsonpath='{..resources}'` shows the new requests; pods Ready with no new restarts or OOMKilled over 24h; for CPU decreases the throttle ratio and request latency stay at or below the 7d baseline; node request total drops by the expected delta.
Rollback: revert the source commit and re-sync/re-apply; the before values in the table above are the rollback target. Keep before/after `kubectl get -o yaml` captures as the receipt.
## Applied — 2026-10-22 (REUSE-WP-0026-T01)
Applied under the founder's wave-2 authorization (the-custodian docs/decisions/2026-10-21-cust-wp-0071-delivery-interview.md), after a full-render diff against live that showed resources only. railiance-apps `make reuse-deploy`, Helm revision 12; main and landing are Ready. Evidence: the-custodian docs/evidence/2026-10-22-wave2-apply.md.

View file

@ -9,7 +9,7 @@ owner: claude-code
topic_slug: helix-forge topic_slug: helix-forge
created: "2026-07-06" created: "2026-07-06"
updated: "2026-07-07" updated: "2026-07-07"
state_hub_workstream_id: "a2d83504-fcd0-4561-8688-b77a01cb7f06" state_hub_workstream_id:
--- ---
> **Terminology note:** Historical text in this archived workplan may use the legacy term "workstream". The fleet term is **workplan** (`canon/standards/workplan-terminology-fleet_v0.1.md`). > **Terminology note:** Historical text in this archived workplan may use the legacy term "workstream". The fleet term is **workplan** (`canon/standards/workplan-terminology-fleet_v0.1.md`).
@ -76,7 +76,7 @@ and CI.
id: REUSE-WP-0017-T01 id: REUSE-WP-0017-T01
status: done status: done
priority: high priority: high
state_hub_task_id: "90fe5bf2-7c03-4af5-bc4a-e5d608c7e879" state_hub_task_id: "40236c01-58f0-43a2-a4d6-5bf5bd80bdc7"
``` ```
- Add `capability_status: has | none | pending` to roster schema and - Add `capability_status: has | none | pending` to roster schema and
@ -93,7 +93,7 @@ state_hub_task_id: "90fe5bf2-7c03-4af5-bc4a-e5d608c7e879"
id: REUSE-WP-0017-T02 id: REUSE-WP-0017-T02
status: done status: done
priority: high priority: high
state_hub_task_id: "17ea8783-1344-4d04-8f7f-f93859ae4a20" state_hub_task_id: "8f608a69-4bd1-4018-b51d-bb19d0ca887c"
``` ```
- For each empty-scaffold repo: read INTENT/SCOPE/README + top-level layout, - For each empty-scaffold repo: read INTENT/SCOPE/README + top-level layout,
@ -110,7 +110,7 @@ state_hub_task_id: "17ea8783-1344-4d04-8f7f-f93859ae4a20"
id: REUSE-WP-0017-T03 id: REUSE-WP-0017-T03
status: done status: done
priority: medium priority: medium
state_hub_task_id: "3465cebf-84f9-4d67-8d8a-cca9771f2f06" state_hub_task_id: "2e0b5b06-b000-45a8-8d8c-31fee5eb6678"
``` ```
For each confirmed `no-capability` repo: For each confirmed `no-capability` repo:
@ -126,7 +126,7 @@ For each confirmed `no-capability` repo:
id: REUSE-WP-0017-T04 id: REUSE-WP-0017-T04
status: done status: done
priority: high priority: high
state_hub_task_id: "20d67516-331b-46bd-8a90-1170139313c2" state_hub_task_id: "89a30f80-d0bd-432f-81ae-005fd1ec1356"
``` ```
**Note:** `establish --discover` requires a running `llm-connect` backend, **Note:** `establish --discover` requires a running `llm-connect` backend,
@ -194,7 +194,7 @@ Notable calls in this cohort:
id: REUSE-WP-0017-T05 id: REUSE-WP-0017-T05
status: done status: done
priority: high priority: high
state_hub_task_id: "56b68b6f-4dca-4fed-925f-d20783dc40d9" state_hub_task_id: "efa64aab-dde5-499e-a10b-11ce81ef6941"
``` ```
- Bernd reviews drafted entries per cohort (maturity honesty, scope, ids) - Bernd reviews drafted entries per cohort (maturity honesty, scope, ids)
@ -215,7 +215,7 @@ refresh.
id: REUSE-WP-0017-T06 id: REUSE-WP-0017-T06
status: done status: done
priority: medium priority: medium
state_hub_task_id: "1a04b60a-b982-4b5f-ae20-955bc88d4204" state_hub_task_id: "e94a792d-9b6d-4a4b-b9a6-6171a52557d2"
``` ```
**Diagnosis complete — two separate issues, conflated in the original note:** **Diagnosis complete — two separate issues, conflated in the original note:**
@ -259,7 +259,7 @@ config-atlas is now present among the 61 sources at
id: REUSE-WP-0017-T07 id: REUSE-WP-0017-T07
status: done status: done
priority: low priority: low
state_hub_task_id: "24ac37bf-2509-4077-9aa3-c09a599dd644" state_hub_task_id: "c8cf18f5-3140-42f1-a065-9aa6f03de1f0"
``` ```
- `report gaps` shows 0 unclassified scaffolds; record final coverage ratio - `report gaps` shows 0 unclassified scaffolds; record final coverage ratio

View file

@ -10,7 +10,7 @@ topic_slug: helix-forge
created: "2026-07-06" created: "2026-07-06"
updated: "2026-07-07" updated: "2026-07-07"
reuse_check: "new — dogfooded 2026-07-07 via reuse-surface plan-check against the full 61-capability federated index; no existing capability covers query-before-build matching" reuse_check: "new — dogfooded 2026-07-07 via reuse-surface plan-check against the full 61-capability federated index; no existing capability covers query-before-build matching"
state_hub_workstream_id: "cd8683ff-6e6c-4f6c-a62f-565bd55113ea" state_hub_workstream_id:
--- ---
> **Terminology note:** Historical text in this archived workplan may use the legacy term "workstream". The fleet term is **workplan** (`canon/standards/workplan-terminology-fleet_v0.1.md`). > **Terminology note:** Historical text in this archived workplan may use the legacy term "workstream". The fleet term is **workplan** (`canon/standards/workplan-terminology-fleet_v0.1.md`).
@ -87,7 +87,7 @@ maturity vector, owning repo, and consumer guidance.
id: REUSE-WP-0018-T01 id: REUSE-WP-0018-T01
status: done status: done
priority: high priority: high
state_hub_task_id: "c7b3407a-2b9d-46ba-ae9c-7ab12235f0ba" state_hub_task_id: "2507e1d0-5c67-491e-a5d1-6ac32a59ed7f"
``` ```
Design doc `specs/PlanCheck.md`: Design doc `specs/PlanCheck.md`:
@ -107,7 +107,7 @@ Design doc `specs/PlanCheck.md`:
id: REUSE-WP-0018-T02 id: REUSE-WP-0018-T02
status: done status: done
priority: high priority: high
state_hub_task_id: "24911d0e-41bc-4c8c-a39a-7dc8ec65d8c6" state_hub_task_id: "33bbe7c8-461b-43e9-9b51-1a10f6413e6a"
``` ```
Implemented in `reuse_surface/plan_check.py` + `plan-check` CLI command: Implemented in `reuse_surface/plan_check.py` + `plan-check` CLI command:
@ -130,7 +130,7 @@ Implemented in `reuse_surface/plan_check.py` + `plan-check` CLI command:
id: REUSE-WP-0018-T03 id: REUSE-WP-0018-T03
status: done status: done
priority: medium priority: medium
state_hub_task_id: "9040505a-238e-4815-ae1a-8c5f8c12afa9" state_hub_task_id: "cf3f1923-a7b7-4ccc-8b81-6b21ba040835"
``` ```
Unblocked 2026-07-07 — `llm-connect` running locally (mock provider, Unblocked 2026-07-07 — `llm-connect` running locally (mock provider,
@ -167,7 +167,7 @@ Unblocked 2026-07-07 — `llm-connect` running locally (mock provider,
id: REUSE-WP-0018-T04 id: REUSE-WP-0018-T04
status: done status: done
priority: medium priority: medium
state_hub_task_id: "8249dca7-18ca-4150-9671-ca87e6a5ad88" state_hub_task_id: "ef94baac-57ed-405c-a9f1-9752683bfc71"
``` ```
Implemented in `reuse_surface/statehub_bridge.py` against the live local Implemented in `reuse_surface/statehub_bridge.py` against the live local
@ -195,7 +195,7 @@ State Hub HTTP API (`http://127.0.0.1:8000`, confirmed reachable):
id: REUSE-WP-0018-T05 id: REUSE-WP-0018-T05
status: done status: done
priority: high priority: high
state_hub_task_id: "c232a669-b263-4978-a8b1-3721b8bfaa68" state_hub_task_id: "572bd9ed-1e2d-46bc-8ae5-e8b5f8ea03ea"
``` ```
Gate cleared 2026-07-07: WP-0017 finished, `federated.yaml` composed with Gate cleared 2026-07-07: WP-0017 finished, `federated.yaml` composed with
@ -225,7 +225,7 @@ WP-0017 landed.
id: REUSE-WP-0018-T06 id: REUSE-WP-0018-T06
status: done status: done
priority: low priority: low
state_hub_task_id: "ff0a91eb-cc41-487b-b726-8c2f84860399" state_hub_task_id: "6c00931f-5ff6-4bde-b04d-9146a999047d"
``` ```
- `tools/README.md` command reference for `plan-check` and - `tools/README.md` command reference for `plan-check` and

View file

@ -10,7 +10,7 @@ topic_slug: helix-forge
created: "2026-07-06" created: "2026-07-06"
updated: "2026-07-08" updated: "2026-07-08"
reuse_check: "new — dogfooded 2026-07-07 via reuse-surface plan-check against the full 61-capability federated index; no existing capability covers Forgejo webhook automation or reuse telemetry" reuse_check: "new — dogfooded 2026-07-07 via reuse-surface plan-check against the full 61-capability federated index; no existing capability covers Forgejo webhook automation or reuse telemetry"
state_hub_workstream_id: "569be717-34f8-4039-bb26-497685f60159" state_hub_workstream_id:
--- ---
> **Terminology note:** Historical text in this archived workplan may use the legacy term "workstream". The fleet term is **workplan** (`canon/standards/workplan-terminology-fleet_v0.1.md`). > **Terminology note:** Historical text in this archived workplan may use the legacy term "workstream". The fleet term is **workplan** (`canon/standards/workplan-terminology-fleet_v0.1.md`).
@ -66,7 +66,7 @@ refresh* and moves reliability evidence beyond structural.
id: REUSE-WP-0019-T01 id: REUSE-WP-0019-T01
status: done status: done
priority: high priority: high
state_hub_task_id: "4a187b56-bff9-4097-abd0-b423e7bf9442" state_hub_task_id: "337866d5-9952-40b8-a338-8ac16a699be0"
``` ```
**Inventory findings (2026-07-07):** cross-referenced `sources.yaml` (61 **Inventory findings (2026-07-07):** cross-referenced `sources.yaml` (61
@ -117,7 +117,7 @@ Implemented:
id: REUSE-WP-0019-T02 id: REUSE-WP-0019-T02
status: done status: done
priority: high priority: high
state_hub_task_id: "691eb32a-6f20-4a2a-b9ff-0ae427b659aa" state_hub_task_id: "212352fe-3caf-4999-b5a2-58fa2441ca56"
``` ```
**Note:** `POST /v1/federated/compose` (token-auth, triggers a real **Note:** `POST /v1/federated/compose` (token-auth, triggers a real
@ -193,7 +193,7 @@ production ingress template edit outside this workplan's scope.
id: REUSE-WP-0019-T03 id: REUSE-WP-0019-T03
status: done status: done
priority: medium priority: medium
state_hub_task_id: "aa9e9f80-b878-490c-832e-515d8cbbbb60" state_hub_task_id: "a8e0bdc6-0a92-4a87-a7b2-19cf0a46db70"
``` ```
**Org-level Forgejo webhook — done by `railiance-apps` (2026-07-07), **Org-level Forgejo webhook — done by `railiance-apps` (2026-07-07),
@ -271,7 +271,7 @@ whenever a future deploy wants to switch registries.
id: REUSE-WP-0019-T04 id: REUSE-WP-0019-T04
status: done status: done
priority: medium priority: medium
state_hub_task_id: "c8e9064e-5c39-4c84-80e9-8b255f8edaec" state_hub_task_id: "88e240d1-0b85-42d8-9d9e-44fb46937894"
``` ```
The shared schema (`schemas/reuse-event.schema.json`) already existed from The shared schema (`schemas/reuse-event.schema.json`) already existed from
@ -314,7 +314,7 @@ Implemented:
id: REUSE-WP-0019-T05 id: REUSE-WP-0019-T05
status: done status: done
priority: medium priority: medium
state_hub_task_id: "f0282cfa-0a71-4b46-a558-80b51ef04fa7" state_hub_task_id: "5694b776-f516-47ec-a848-714060dd2261"
``` ```
"Blocked on T04 plus initial event volume" — T04 is done, and the "Blocked on T04 plus initial event volume" — T04 is done, and the
@ -376,7 +376,7 @@ follow-up rather than rushed in.
id: REUSE-WP-0019-T06 id: REUSE-WP-0019-T06
status: done status: done
priority: low priority: low
state_hub_task_id: "a9f44d45-91e2-4b43-909f-30a5f906cf3b" state_hub_task_id: "b5b4cfaf-16fa-45ce-b1f2-6ad48fb090ab"
``` ```
SCOPE.md's "automatic hub refresh" flip was already done incidentally in SCOPE.md's "automatic hub refresh" flip was already done incidentally in