Status: Proposed
Date: 2026-10-06
PBI: #1473(Parent: #1468)
Decision Makers: Human / external-boundary administrator — UNASSIGNED
This ADR is a decision packet, not a completed decision. AI/automation may prepare options and evidence, but MUST NOT change this ADR to
Accepted, populate Human-owned identities, provision the external boundary, or promote strong authority fields without an explicit Human decision.
PlanGate has completed the repository-side candidate chain needed to consume a future independently administered runtime-verifier boundary:
The repository can now fail closed on self-reference, wrong Evidence subjects, malformed Evidence URIs, ambiguous bootstrap packages, package tampering, stale/mismatched provenance, and candidate self-promotion.
What it still cannot prove is administrator independence. A repository-authored file, workflow, boolean, or issue comment cannot make the repository independent from itself.
The next step in #1473 is therefore a Human-owned P0 decision about the actual external trust boundary. This ADR makes that decision explicit and auditable without making it on behalf of the Human owner.
Four facts are required before external implementation can safely begin:
external_verifier_location = UNDECIDED
external_verifier_admin = UNDECIDED
nonce_ledger_owner = UNDECIDED
trusted_issuer = UNDECIDED
If implementation starts while any of these remain undecided, PlanGate risks creating a nominally “external” component whose administration is still under the same authority, or creating Evidence that the repository can self-author.
The decision therefore needs to precede provisioning.
Create or select a repository whose administration is separated from normal PlanGate repository authority. The verifier workflow, signer identity, source-digest policy, and nonce integration are pinned there.
Pros:
owner/repo/.github/workflows/file.yml@<40-sha>.Cons:
Decision status: CANDIDATE — not selected.
Use a service or trust root that is operationally and administratively independent from PlanGate.
Pros:
Cons:
Decision status: CANDIDATE — not selected.
Add another workflow/file inside PlanGate and label it “external” or “independent”.
Pros:
Cons:
Decision status: REJECTED.
Create a second repository, but leave unrestricted administration under the same effective authority as PlanGate.
Pros:
Cons:
Decision status: REJECTED unless an independently reviewable admin-separation model is established.
| Criterion | Option A: separate repository | Option B: external service |
|---|---|---|
| Admin separation | Must be proven by effective admin/control separation, not repo name | Must be proven by service/account ownership and access policy |
| Issuer identity | GitHub Actions OIDC is a concrete candidate | Service-specific issuer / trust root |
| Immutable execution identity | Workflow path + commit SHA / pinned binary | Versioned verifier identity / pinned binary |
| Nonce ownership | Separate external ledger/service required | May be native to the service if independently controlled |
| Auditability | GitHub org/repo audit evidence + policy evidence | Service audit/access logs + policy evidence |
| Integration cost | Lower with current #1470/#1471 model | Higher; may require an adapter |
| Independence failure mode | Same effective admin controls both repositories | Same effective account/admin controls PlanGate and service |
This matrix is decision support only. It does not select an option.
Regardless of the selected option, later promotion needs independently reviewable Evidence for:
A separate repository name, organization membership, workflow file, or repository-authored statement is not sufficient by itself.
Decision state: NOT_MADE.
The following values are Human-owned and MUST remain UNDECIDED until explicitly recorded by the
Human decision maker:
external_verifier_location = UNDECIDED
external_verifier_admin = UNDECIDED
nonce_ledger_owner = UNDECIDED
trusted_issuer = UNDECIDED
This ADR may move from Proposed to Accepted only when all of the following are true:
external_verifier_location names the selected external boundary;external_verifier_admin names the person/team/account boundary responsible for it;nonce_ledger_owner names the external owner/service for issue/consume/reuse state;trusted_issuer names the intended issuer/trust root;AI/automation MUST NOT satisfy items 1–6 on behalf of the Human owner.
When the Human owner makes P0, update this block explicitly. Until then every value remains a placeholder.
selected_option = UNDECIDED
external_verifier_location = UNDECIDED
external_verifier_admin = UNDECIDED
nonce_ledger_owner = UNDECIDED
trusted_issuer = UNDECIDED
decision_recorded_by = UNDECIDED
decision_recorded_at = UNDECIDED
decision_evidence_ref = UNDECIDED
Rules:
selected_option must identify Option A, Option B, or a separately reviewed equivalent.decision_recorded_by must identify the Human decision maker; an AI/automation identity is invalid.decision_recorded_at must be an explicit timestamp/date.decision_evidence_ref must point to the Human-owned auditable record.TA-113 validates structural consistency, not Human identity or independence proof.
Proposed state requires:
Status = Proposed;Decision state: NOT_MADE;Decision Makers remains UNASSIGNED;UNDECIDED.Accepted state requires:
Status = Accepted;Decision state: RECORDED_BY_HUMAN;Decision Makers names the Human decision maker and is no longer UNASSIGNED;decision_evidence_ref points to the Human-owned auditable decision record.An Accepted structure is still not Evidence that the resulting external boundary is independent. That proof belongs to P1/P2 external Evidence.
External provisioning may start only after this ADR is Accepted by a Human and the Human Decision
Record has no UNDECIDED values.
Until then:
external_boundary = NOT_PROVISIONED
authenticated_external_evidence = NOT_AVAILABLE
admin_evidence_independently_verified = false
nonce_one_time_consumption_verified = false
independent_admin_boundary_verified = false
independent_verifier_execution_attested = false
runtime_probe_attestation_verified = false
human_rollout_decision_verified = false
dispatch_ready = false
dispatch_allowed = false
The Proposed ADR itself is planning material. It is not external Evidence.
After Human acceptance:
docs/working/_runtime-attestation/external-verifier-bootstrap/docs/working/_runtime-attestation/r1-external-verifier-provenance.proposed.json