Skip to content

docs: scope the Channel::Deliberate promotion submission path - #71

Merged
BunsDev merged 1 commit into
mainfrom
docs/promotion-path-scope
Sep 16, 2026
Merged

BunsDev merged 1 commit into
mainfrom
docs/promotion-path-scope

Conversation

@BunsDev

@BunsDev BunsDev commented Sep 16, 2026

Copy link
Copy Markdown
Member

Scope for threads-xpo, the daemon-side promotion-write path the merged seam
contract (#25) requires. Documentation only — it authorizes no implementation,
settles neither decision it identifies, and closes no bead.

Every claim verified against origin/main of each repository on 2026-09-16.

Why scope first

threads-xpo reads as one missing feature: the daemon never constructs
Channel::Deliberate. True — and the smallest part of the gap. The surrounding
machinery (a scratch tier, a reachable promotion module, an admission event, a
resolvable provenance anchor) is also absent, and two of those are blocked on
decisions rather than effort.

The encouraging half is larger than expected

The daemon's decision/audit/approval path is already channel-generic end to
end
— the staged envelope carries channel as a required field and ~20
downstream sites pass it through rather than re-deriving it. ward_audit
persists it and the census classifier already decodes "deliberate", so the
value round-trips today, with no schema change and no migration.

The Threads validator is complete: ChannelNotCovered, the FamiliarCoherence
ceremony §3.1 recommends, and every RejectReason/WindowCloseReason the
contract names all exist. No new rejection vocabulary is needed.

Two blockers that are decisions, not tasks

Provenance has no resolvable anchor. RFC-0001 §5.6 requires
source_attestation to resolve to an event in the append-only audit log. The
daemon generates neither candidate — ward_updated has no construction site,
principal_authorized_write appears only in an allowlist and a test. It calls
exactly two audit constructors. The substrate's Attestation is anchored to a
redacted artifact file, not the log, and nothing reconciles the shapes.

No thread holds under Deliberate. PROTECTED_CHANNELS serves as both the
woven holds_under and the pattern predicate's required floor, so a
Deliberate request rejects before anything else matters. Appending to that
const is the wrong fix — pattern.rs states Deliberate coverage is a
per-thread choice, not a floor requirement, so widening it changes weave
coherence for every protected surface.

Once those land, the surface is small: five literals and one const in
threads_gate.rs, a dispatch arm, a handler, and an admission emission site.

Two corrections to the 2026-08-09 record

  • Not every construction site is Mutation — store.rs:3444 builds
    Channel::Forced for the WARD-C6 compaction row.
  • The cmem-r59 cross-reference threads-5mn calls phantom is real. That
    check read .beads/interactions.jsonl, a passive export of a Dolt database,
    so absence from the export was never absence from the board.

Tracking

Filed threads-vd8 (provenance decision, P1), threads-7gw (coverage decision,
P1), threads-dr2 (daemon reachability, P2), and wired threads-xpo to depend
on all three. threads-55s carries a re-sequencing recommendation, deliberately
not applied — unblocking it needs its acceptance criterion split, which is
the maintainer's call.

Verified: agent-check.sh fast and full both exit 0.

🤖 Generated with Claude Code

threads-xpo reads as one missing feature: the daemon never constructs
Channel::Deliberate. That is true and it is the smallest part of the gap.
Scoping it first avoids starting at the visible symptom and discovering the
real blockers halfway in.

Verified against origin/main of each repository on 2026-09-16.

The encouraging half is larger than expected. The daemon's decision, audit and
approval path is already channel-generic end to end: the staged envelope carries
channel as a required field and roughly twenty downstream sites pass it through
rather than re-deriving it. ward_audit persists the channel and the census
classifier already decodes "deliberate", so the value round-trips today with no
schema change and no migration. On the Threads side the validator is complete,
including ChannelNotCovered and the FamiliarCoherence ceremony section 3.1
recommends, and every RejectReason and WindowCloseReason the contract names
exists. The seam needs no new rejection vocabulary.

Two blockers are decisions rather than effort, and both were found by checking
rather than assuming.

Provenance has no resolvable anchor. RFC-0001 section 5.6 requires
source_attestation to resolve to an event in the append-only audit log, but the
daemon generates neither candidate: ward_updated has no construction site and
principal_authorized_write appears only in an allowlist and a test. The daemon
calls exactly two audit constructors. The substrate's Attestation type is
anchored to a redacted artifact file rather than to the log, and nothing
reconciles the two shapes.

No thread holds under Deliberate. PROTECTED_CHANNELS serves as both the woven
holds_under and the pattern predicate's required floor, so a Deliberate request
rejects before anything else matters. Appending to that const is the wrong fix:
pattern.rs states Deliberate coverage is a per-thread choice, not a floor
requirement, so widening it would change weave coherence for every protected
surface.

The remaining surface is small once those land: five literals and one const in
threads_gate.rs, a dispatch arm, a handler, and an admission emission site.

Also corrects two claims in the 2026-08-09 threads-xpo record. Not every
construction site is Mutation; store.rs builds Channel::Forced for the WARD-C6
compaction row. And the cmem-r59 cross-reference threads-5mn calls phantom is
real: that check read .beads/interactions.jsonl, which is a passive export of a
Dolt database, so absence from the export was never absence from the board.

Authorizes no implementation, settles neither decision, and closes no bead.

Refs: threads-xpo, threads-55s, threads-5mn, threads-vd8, threads-7gw, threads-dr2

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@BunsDev
BunsDev merged commit 3fcc341 into main Sep 16, 2026
7 checks passed
@BunsDev
BunsDev deleted the docs/promotion-path-scope branch September 17, 2026 11:16
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