Skip to content

[signet-ded9d4] docs(apas): separate each level's requirement from one vendor's implementation - #175

Draft
jamestexas wants to merge 2 commits into
mainfrom
docs/apas-core-profile-split
Draft

[signet-ded9d4] docs(apas): separate each level's requirement from one vendor's implementation#175
jamestexas wants to merge 2 commits into
mainfrom
docs/apas-core-profile-split

Conversation

@jamestexas

Copy link
Copy Markdown
Collaborator

Draft — this is the start of the v0.4.0 restructuring, not the whole of it. signet-ded9d4 requires the split be validated against a working second implementation (signet-96252e), which hasn't been built yet. Opening now so the shape can be argued before that work starts.

The defect

Every level stated a portable Requirement, then listed bullets — previous_chain_hash, dispatch manifests, bridge certificates, a shared CMS/Ed25519 primitive, ACP request_permission — in the position readers take as the criteria.

An implementer could not tell which lines they had to satisfy and which merely narrated how we did it. That is what makes APAS unimplementable by anyone who hasn't built our stack — not parochial properties, parochial prose.

The change

Each level now carries core properties (L2.1L2.5, L3.1L3.4, L4.1L4.5), each with a stated falsification, and the original bullets are retained verbatim as a named reference profile. §2.0 gives the reading rule and forbids a core property from naming an algorithm, envelope format, protocol, namespace, predicateType, product, or file path — if it can't be stated without one, it belongs in a profile.

Why now: a second implementation exists (new §7.7)

An independently built agentic reconciler framework, whose unit of work is a key reconciled to convergence rather than a dispatch. It satisfies L2 while failing most of L2's bullets — and by the property that actually matters, an externally certified signing identity rather than a key held by the same component that writes the attestations, it is stronger than the profile that defined the level.

A conformance scheme that scores that as non-conformant is measuring the wrong thing.

Its other finding, which recurs at every level: it has the evidence and lacks the attestation. Run traces go to telemetry unsigned; input digests live in a resume-control record. Nearly everything L4 asks for is already captured and none of it is attested.

Two new properties, both learned rather than designed

L3.3 — bounded, declared, default-deny capabilities. Generalizes ACP request_permission. A runtime permission boundary and a declarative capability set are two encodings of one property; the declarative form is preferred because it is default-deny by construction — a tool absent from the host's callback set doesn't exist in the model's tool list, so there's no prompt to fatigue a human into accepting and no approval path to social-engineer. A runtime boundary that defaults to allow on timeout or missing policy does not satisfy it: the property is default-deny, not "a decision happens". Advisory annotations are explicitly not a boundary.

L4.5 — outcome distinguishable from completion. Taken from that second implementation, which documents at the type that committing a result is no evidence work succeeded, because executors steer a stuck model into submitting a degraded one. An attestation recording only completion is correctly signed and materially misleading — the worst combination, because it survives verification. We did not have this property and should have.

Deliberately not in scope

  • The predicate-as-profile work (signet-ded9d4's original body) — needs the demo first
  • Any namespace or predicateType decision
  • L1, untouched

Section cross-references checked; §2.0 and §7.7 both resolve.

🤖 Generated with Claude Code

https://claude.ai/code/session_01NbcVvbUMkJHvSXbz1MMw5n

jamestexas and others added 2 commits August 7, 2026 10:27
Files signet-c07d12 (P1): signet-resign.yml has no successful run since
2026-05-18, and it is the only caller of gha-identity.yml, which is
workflow_call-only. So the octo-sts exchange, the pinned notme action, and the
bridge-cert exchange are dead code in practice.

Surfaced while advancing the notme action pin (#173). That fix is correct by
inspection of the bundle but cannot be correct by observation, because nothing
exercises the path — which is the more interesting defect. It also means
signet was not a live execution surface for the undici advisories, recorded on
notme-28959a so the P0 framing rests on notme's own consumers.

`signet authority setup-resign` is a documented command that configures this
workflow, so we ship a configurator for a path we have never seen succeed.

Also records the driftless demo bead (signet-96252e), the v0.4.0 dependency
edge, and the Phase 1/2 release outcomes.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NbcVvbUMkJHvSXbz1MMw5n
…e vendor's implementation

APAS 0.3.1-draft. Every level stated a portable Requirement, then listed
bullets — previous_chain_hash, dispatch manifests, bridge certificates, a
shared CMS/Ed25519 primitive, ACP request_permission — in the position readers
take as conformance criteria. An implementer could not tell which lines they
had to satisfy and which merely narrated how we built it. That made APAS
unimplementable by anyone who had not built our stack, which is the actual
obstacle to it being a standard rather than a design doc.

Each level now carries mechanism-neutral core properties (L2.1-L2.5,
L3.1-L3.4, L4.1-L4.5), each with a stated falsification, and the original
bullets are retained verbatim as a named reference profile. §2.0 gives the
reading rule and forbids core properties from naming an algorithm, envelope,
protocol, namespace, predicateType, product, or path.

Prompted by measuring a second, independently built implementation against
L2-L4 (new §7.7). It satisfies L2 while failing most of L2's bullets, and by
the property that matters — an externally certified signing identity rather
than a key held by the same component that writes the attestations — it is
STRONGER than the profile that defined the level. A scheme that scores that
non-conformant is measuring the wrong thing.

Two properties are new, and both were learned rather than designed:

L3.3 generalizes ACP request_permission to "the capability set is bounded,
declared, and default-deny". A runtime permission boundary and a declarative
capability set are two encodings of one property. The declarative form is
preferred: it is default-deny by construction, so there is no prompt to
fatigue a human into accepting and no approval path to social-engineer. A
runtime boundary that defaults to allow on timeout or missing policy does not
satisfy it — the property is default-deny, not "a decision happens". Advisory
annotations are explicitly not a boundary.

L4.5 requires outcome be distinguishable from completion. Taken from the
second implementation, which documents at the type that committing a result is
no evidence work succeeded, because executors steer a stuck model into
submitting a degraded one. An attestation recording only completion is
correctly signed and materially misleading — the worst combination, since it
survives verification.

Also refreshes the version-disambiguation note, which pinned its example to
0.3.0 and to a superseded rc; APAS 0.3.1 alongside signet v0.3.0 is now the
worked example of the two clocks diverging.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NbcVvbUMkJHvSXbz1MMw5n
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