Skip to content

feat(capabilities): land the typed capability catalog of sixteen fleet capabilities (CFVC-09) - #78

Merged
sbracewell64 merged 1 commit into
mainfrom
fm/cfvc-09-capability-catalog-fork
Aug 11, 2026
Merged

sbracewell64 merged 1 commit into
mainfrom
fm/cfvc-09-capability-catalog-fork

Conversation

@sbracewell64

Copy link
Copy Markdown
Owner

Intent

Land CFVC-09, the typed capability catalog, on the fork trunk — the code this fleet actually runs.

The identical change was contributed upstream as kunchenguid#1919 and merged there, but a merged upstream PR is a contribution, never a landing: capabilities/catalog.json was still absent from the trunk. This PR closes that gap. Nothing was rewritten — the closure audit confirmed the catalog satisfies every property it was specified against.

What this is

A harness-neutral catalog of the typed capabilities a Firstmate work identity may be said to hold. Definitions ONLY: nothing is bound to an agent, nothing executes, and no runtime reads the file. It renames a prose capability list as typed rows without changing what any agent can do.

Each of the sixteen rows carries {name, input_schema, output_schema, owner, authority_class, verifier}:

  • Every owner is an existing file in this repo, and every verifier is an existing check that pins that owner's behavior. Both are enforced by test, so a row cannot name something that does not exist.
  • network.request is deliberately unowned and captain-required. Nothing here mediates general outbound network access, so naming an owner would invent one. The row records the intent and admits, in the file, that nothing enforces it.
  • authority_class reuses loopspecs/schema.json's already-validated enum verbatim rather than growing a second vocabulary. A capability needing a new class is a change to that schema, decided there.
  • This is not the platform's CapabilityRegistry and must not be merged into it — that answers which service implementation handles a call; this answers what a work identity is permitted to do.

The certification, stated in the artifact itself

The catalog carries a not_a_security_boundary block so the point can never be assumed away:

This catalog is a CAPABILITY boundary, not a SECURITY boundary. It constrains a mistaken agent, never a hostile one.

Every crewmate on every harness is currently launched with permission enforcement disabled, and the supported harnesses do not share a sandbox. No decision anywhere may treat a row here as containment. That changes only when an enforcement point exists that refuses rather than truncates — CFVC-10's work, deliberately not built here.

Expected red check — disclosed, not worked around

The structural attestation check ("PR must be raised via no-mistakes") will be red on this PR. That is expected on the fork-landing route: this branch was cut fresh from the trunk to land an already-validated contribution, so it carries no pipeline attestation marker. The marker was not forged and must not be. Every non-structural check should be genuinely green.

Base note

Cut from the current fork trunk cda5a75 rather than 720f06e2a685, which the audit named — the trunk advanced four commits in the interim and 720f06e2a685 is its ancestor. Same lineage, current tip, so the PR is not born stale. capabilities/catalog.json is absent from both.

AGENTS.md and bin/fm-test-run.sh had drifted on the trunk, so the change was applied as a three-way patch rather than by copying files: each gains exactly one line, and the trunk's own entries are preserved.

Verification

  • The catalog's six behavior tests pass on this base — every owner and verifier resolves in this codebase, not just the one it was written against.
  • Each test proves itself non-vacuous: every check runs against a mutated catalog first and must fail there. An external control was also run on this base (a verifier path pointed at a nonexistent file), and the suite failed and named the offending row before the real run passed.
  • bin/fm-lint.sh clean (ShellCheck 0.11.0, pinned).
  • fm-test-run, fm-documentation-audiences, and fm-ensure-agents-md pass — the tests covering the two shared files touched.

Rollback

Delete capabilities/catalog.json. No runtime reads it.

Upstream PR

kunchenguid#1919 — left exactly as it is. That branch and the upstream PR are the same ref; it was not rebased or force-pushed.

… of upstream kunchenguid#1919)

Land CFVC-09 on the fork trunk, which is the code this fleet actually
runs. The same change was contributed upstream as kunchenguid#1919 and merged there,
but a merged upstream PR is a contribution rather than a landing, so
capabilities/catalog.json was still absent from the running trunk.

The catalog is harness-neutral and definitions ONLY: nothing is bound,
nothing executes, and no runtime reads the file. Each of the sixteen rows
names an existing owner in this repo plus the existing check that pins
that owner's behavior. network.request is deliberately unowned and
captain-required, because nothing here mediates general outbound network
access and naming an owner would invent one.

authority_class reuses loopspecs/schema.json's already-validated enum
verbatim rather than growing a second vocabulary, and the file certifies
in its own text that it is a capability boundary and NOT a security
boundary: it constrains a mistaken agent, never a hostile one. Binding
and enforcement are CFVC-10's work, deliberately not built here.

Rollback is deleting the file.
@sbracewell64
sbracewell64 merged commit 48c1c2d into main Aug 11, 2026
13 of 14 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant