Skip to content

docs(change): propose CR-DD-012B shared preview/execution consumption - #135

Merged
coreytshaffer merged 3 commits into
mainfrom
docs/cr-dd-012b-shared-consumption-proposal
Aug 1, 2026
Merged

coreytshaffer merged 3 commits into
mainfrom
docs/cr-dd-012b-shared-consumption-proposal

Conversation

@coreytshaffer

@coreytshaffer coreytshaffer commented Aug 1, 2026 •

Copy link
Copy Markdown
Owner

Documentation-only proposal for CR-DD-012B. Grants no implementation
authority, no file allowlist, and no execution authority.

Scope — four documentation paths

  • docs/change/requests/CR-DD-012B-shared-preview-execution-consumption.md (new)
  • docs/change/requests/CR-DD-012-shared-governed-run-decision.md
  • docs/current_backlog.md
  • docs/architecture/daily_driver_orchestrator_spec.md

No change log, code, tests, workflow, schema, CLI, ledger, renderer, router,
worker, backend, or existing artifact contract change.

Gate status

CR-DD-012A is merged (PR #107, bccaaad) and CR-YK-002 is merged (PR #117,
5155bbb), so the sequencing prerequisites are satisfied. Satisfying a
prerequisite is not approval.
CR-DD-012B remains blocked on its own explicit
human implementation approval and its own bounded file allowlist. This proposal
is not that approval, and neither is merging it.

The ten questions, settled as recommendations

  1. Snapshot constructed once — one seam in tc_cli.tc_run, after argument
    assembly and privacy mapping, before the if planning: branch. Context
    sources are read exactly once there, which is what closes the TOCTOU gap; a
    seam after the branch would not. The preview branch keeps its early return,
    and the generated execution-correlation task ID stays after the branch so it
    cannot enter decision_id.
  2. Both paths consume one decision — build_run_plan projects a completed
    decision instead of computing one; the v1 renderer and artifact builder are
    unchanged; the artifact path stops assembling prompt\ndata independently and
    reads the snapshot's authoritative bytes. Validation is explicitly not
    permission to rebuild.
  3. RuntimeObservation and CR-DD-013 — subsumption without re-derivation.
    CapabilityResolution stays the sole source of local capability evidence and
    capability_evidence.py is off the allowlist; the observation carries it as
    provenance and adds only envelope member, actual binding, fallback occurrence,
    and reason codes. The observed/configured/unknown distinction survives
    verbatim.
  4. Envelope constraint — binding is a filter over a closed ordered set. No
    flag, config value, env var, or caller argument may extend it. No permitted
    member means the existing terminal outcome, not fall-through.
  5. Linkage — bounded decision_id on the route_decision and
    worker_result payloads via the same open extension point CR-DD-013 used.
    route-worker-ledger.v1 is untouched and unused by this path; if review finds
    otherwise, that is a stop condition, not a reason to widen the contract.
  6. Direct-library compatibility — new optional run_task parameter, on the
    CR-DD-013 precedent. Stated plainly rather than as "inert": a caller who
    supplies a decision does get different behavior; existing callers are
    unaffected because they pass nothing.
  7. Fail-closed — an eleven-row matrix, all terminating before backend
    construction, governed by three rules: termination is never repair, staleness
    is binding-defined rather than clock-defined, and a missing observation stays
    unknown rather than becoming unavailability.
  8. Provisional allowlist and tests — five code paths plus three new test
    files, with parity, no-rebuild traps, mutation, runtime separation, TOCTOU,
    privacy, and regression coverage.
  9. Exclusions — confirmed-plan execution, saved artifacts, plan v2, durable
    observation schemas, new cloud authority, acceptance, resume, quality scoring,
    G3, and G6.
  10. Stop point — work stops at this PR.

Three questions, now resolved by recorded decision

The first draft of this proposal left three questions open. All three are now
settled. Settling a design question is not implementation authority — the
slice remains unauthorized.

1. Capability volatility — binding only. Capability resolution constrains
execution binding, never governed-decision formation:

Stable inputs
  -> governed decision
  -> deterministic route intent + envelope + decision ID

Volatile runtime observations
  -> execution binding
  -> execute, use an already-authorized fallback, or fail closed

Capability answers "can the already-authorized plan execute right now?" and must
never silently answer "what policy or route should this task receive?" Otherwise
identical task and context inputs produce different decision IDs because a model
server briefly disappeared or a probe went stale — operational weather becoming
policy input, weakening replay, comparison, audit, and caching.

The behavioral cost is recorded plainly as a deliberate correction to CR-DD-013
semantics, not disguised as an implementation detail.
Today tc run may choose
a resilience route from live capability state; under this decision it no longer
may. A run with unknown local capability will produce a decision naming local
routes and fail at binding, where today it resolves to no local route earlier.
Nothing reopens CR-DD-013 — its authority stays spent, capability_evidence.py
stays off the allowlist, and the change is to the consumer.

2. Classifier — deterministic is authoritative for all decision-relevant
fields. A model-assisted classifier may remain advisory (suggestions, confidence
notes, review evidence) and may become decision-bearing only through a separate
CR that promotes its normalized output to an explicit, stable decision input.

3. build_run_plan signature — coherence over compatibility. Preserved only
if it still represents one coherent projection from the shared snapshot and
decision. A narrow signature break is safer than preserving an attractive second
integration path.

Runtime outcome model

The decision must encode the envelope richly enough for exactly three outcomes:
primary binding succeeds; primary unavailable with an authorized fallback bound
without changing the decision; or no authorized binding, failing closed.

The forbidden fourth outcome is recorded explicitly: runtime capability
resolution inventing a route the governed decision never authorized.
Any
implementation permitting it has failed the slice regardless of what its tests
report.

Implementation approval gates — two stages

Gates 3–5 assert properties of code that does not exist yet, so they cannot be
satisfied before the authority to write that code is granted. The gates
therefore bind at two distinct stages:

Stage What it grants Gates
Permission to implement a bounded approval with an explicit file allowlist and mandatory test obligations gates 1–2 already satisfied; gates 3–5 bound by the approval
Permission to accept acceptance, merge, and closeout gates 3–5 actually pass

An approval granting permission to implement without binding gates 3–5 is
incomplete, and an implementation reaching acceptance, merge, or closeout
without them passing must be rejected.

Proposal-stage preconditions — satisfied:

  1. A recorded decision on capability volatility and its CR-DD-013 behavioral
    consequence.
  2. An explicit statement that the seam is built before the planning branch and
    consumed by both paths.

Implementation obligations — bound at approval, satisfied before acceptance:

  1. Replacement of the integration-absence guard with positive tests proving
    one snapshot, one decision, and two projections — not merely deletion.
  2. A negative test where runtime capability changes after decision formation and
    cannot change the decision ID, route policy, or envelope.
  3. A negative test showing unavailable capability causes only an authorized
    fallback or a closed failure.

Satisfying gates 1–2 grants nothing on its own: implementation authority remains
a separate explicit approval with its own bounded file allowlist.

A guard that will fail by design

tests/test_governed_decision_integration_absence.py asserts the CR-DD-012A
foundation stays unintegrated. It will fail the moment this slice integrates
it.
The proposal names it so that retiring or narrowing the guard is a
reviewable part of the implementation approval rather than a silent side effect —
an implementation that quietly deletes it should be rejected. Per gate 3,
retirement is permitted only in the same change that adds the replacement
positive tests; the coverage is replaced, never merely removed.

Validation

  • git diff --check — clean, staged and unstaged
  • exact-path audit against origin/main — the four paths above, nothing else
  • docs/change/change_log.md — 0 changes, as required
  • code/test/workflow/schema/dependency paths — 0 changes
  • no stray untracked artifacts
  • tests/test_governed_decision_integration_absence.py — 5 passed. This is the
    one focused guard that reads a file in this diff's neighbourhood and asserts
    the foundation stays unintegrated; it passes because this change is
    documentation-only.

Runtime tests were not otherwise run: the change is documentation-only and
touches no code path.

🤖 Generated with Claude Code

Documentation-only proposal. Grants no implementation authority, no file
allowlist, and no execution authority.

CR-DD-012A (PR #107, bccaaad) and CR-YK-002 (PR #117, 5155bbb) are both
merged, so CR-DD-012B's sequencing prerequisites are satisfied. Satisfying
a prerequisite is not approval; the slice remains blocked on its own
explicit human implementation approval and bounded allowlist.

The proposal settles the ten questions the parent CR deferred: one
snapshot/decision construction seam placed before the tc_run planning
branch so context sources are read exactly once; projection rather than
recomputation in the plan path, with governed_run_plan.v1 unchanged; a
RuntimeObservation that subsumes CR-DD-013 capability evidence as
provenance without re-deriving it; backend binding as a filter over a
closed ordered envelope rather than an injection surface; bounded
decision_id linkage through the existing open route/worker payload
extension point, leaving route-worker-ledger.v1 untouched; an optional
run_task parameter so direct callers keep current behavior; a fail-closed
matrix in which termination is never repair and staleness is
binding-defined rather than clock-defined; a provisional allowlist and
focused parity, no-rebuild, mutation, runtime-separation, TOCTOU, privacy,
and regression tests; explicit exclusions; and a stop point.

Three questions are recorded as genuinely open rather than deferred. The
load-bearing one: CR-DD-013 capability evidence currently feeds the route
input booleans that choose_resilience_route reads, so it participates in
route policy, which cannot coexist unchanged with the parent's invariant
that decision identity is stable across runtime-health changes. Two
resolutions are named with their consequences; the proposal recommends
constraining binding rather than policy, and says plainly that this is a
behavioral change requiring approval on its own terms.

The proposal also records that tests/test_governed_decision_integration_
absence.py will fail by design once the slice integrates the foundation,
so retiring that guard is a reviewable decision rather than a silent side
effect of implementation.

Scope: four documentation paths. No change log, code, tests, workflow,
schema, CLI, ledger, renderer, router, worker, backend, or artifact
contract change.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@netlify

netlify Bot commented Aug 1, 2026 •

Copy link
Copy Markdown

✅ Deploy Preview for poetic-quokka-0fd859 ready!

Name Link
🔨 Latest commit ea53ae8
🔍 Latest deploy log https://app.netlify.com/projects/poetic-quokka-0fd859/deploys/6a6e4eb1e04f2d0008234ba0
😎 Deploy Preview https://deploy-preview-135--poetic-quokka-0fd859.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

coreytshaffer and others added 2 commits August 1, 2026 12:47
Documentation-only. Still grants no implementation authority.

Resolves the three questions the first draft left open, by recorded
supervisor decision:

1. Capability volatility - binding only. Capability resolution constrains
   execution binding, never governed-decision formation. Stable inputs
   produce the decision, route intent, envelope, and decision ID; volatile
   observations may only execute, bind an already-authorized fallback, or
   fail closed. Capability answers "can the already-authorized plan execute
   right now?" and never "what policy or route should this task receive?"
   Otherwise identical inputs yield different decision IDs because a model
   server briefly disappeared, turning operational weather into policy
   input and weakening replay, comparison, audit, and caching. The
   behavioral cost is recorded plainly as a deliberate correction to
   CR-DD-013 semantics: a run with unknown local capability will produce a
   decision naming local routes and fail at binding, where today it
   resolves to no local route earlier. Nothing reopens CR-DD-013, whose
   authority stays spent; the change is to the consumer.

2. Classifier - the deterministic classifier is authoritative for
   decision-relevant fields. A model-assisted classifier may remain
   advisory and may become decision-bearing only through a separate CR
   that promotes its normalized output to an explicit stable input.

3. build_run_plan signature - preserved only if it remains one coherent
   projection. A narrow break is safer than an attractive second
   integration path.

Adds a runtime outcome model naming the three permitted outcomes and the
forbidden fourth: runtime capability inventing a route the decision never
authorized.

Adds five implementation approval gates, including that the CR-DD-012A
integration-absence guard may be retired only in the same change that adds
positive tests proving one snapshot, one decision, and two projections,
plus negative tests that post-decision capability change cannot alter the
decision ID, route policy, or envelope, and that unavailable capability
yields only an authorized fallback or a closed failure.

Scope: the same four documentation paths. No change log, code, tests,
workflow, schema, CLI, ledger, renderer, router, worker, backend, or
artifact contract change.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Documentation-only. Still grants no implementation authority.

The gates section contradicted itself: it claimed all five gates must be
satisfied before implementation authority and that none were satisfied,
then immediately marked gates 1-2 satisfied. Gates 3-5 assert properties
of code that does not exist yet, so they cannot be satisfied before the
authority to write that code is granted. The architecture spec repeated
the same timing error.

Both locations now record a two-stage model:

- Permission to implement: a bounded approval with an explicit file
  allowlist and mandatory test obligations. Gates 1-2 (the recorded
  capability-volatility decision and the pre-`planning` seam statement)
  must already be satisfied, and they are. Gates 3-5 must be bound by
  that approval.
- Permission to accept: acceptance, merge, and closeout of the
  implementation, granted only after gates 3-5 actually pass.

An approval granting permission to implement without binding gates 3-5 is
incomplete, and an implementation reaching acceptance, merge, or closeout
without them passing must be rejected. The gate list is split into
proposal-stage preconditions and implementation obligations so the two
cannot be read as one bundle. Satisfying gates 1-2 still grants nothing:
implementation authority remains a separate explicit approval with its own
bounded allowlist.

The parent CR status and both backlog entries are aligned to the same
two-stage wording.

Scope: the same four documentation paths. No change log, code, tests,
workflow, schema, CLI, ledger, renderer, router, worker, backend, or
artifact contract change.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@coreytshaffer
coreytshaffer marked this pull request as ready for review August 1, 2026 19:55
@coreytshaffer
coreytshaffer merged commit b1871b5 into main Aug 1, 2026
8 checks passed
@coreytshaffer
coreytshaffer deleted the docs/cr-dd-012b-shared-consumption-proposal branch August 1, 2026 19:59
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