feat(interlock): harden Pitot interface + client readiness for external builders - #261
Merged
Conversation
…al builders Feature-preserving hardening of the Interlock↔Pitot decision-transport interface and the language clients, so outside builders can start testing. The enforcement guarantee is unchanged: the engine decides, the broker performs, every path fails closed. Two ways a newcomer got *silently* stuck are now *loudly* diagnosed, and Locus certified there are no correctness holes to fix — the frontier was readiness. Interface: - Unify on one canonical Pitot request kind (interlock.effect) across the client constant, SPEC, integration README, and validate.sh. A kind/config mismatch made Pitot find no controller and deny every request silently; kind_consistency_test.go now fails the build if the constant, README, or validate.sh drift apart. - adapter.Evaluate distinguishes schema skew (a newer client's unknown field) from a corrupt payload and from a policy deny — same fail-closed behavior, diagnosable message naming the controller protocol. Covered by adapter_test.go. Client readiness: - check-clients.sh gains an always-on version-lockstep gate: the TypeScript and Python clients must share one release version (static check, no toolchain), so a consumer can never pin mismatched clients against one controller. Public README: - New "Build on Interlock" section (language clients + run-a-decision-over-Pitot quickstart with the canonical kind and the drift-guard note) and a CONTRIBUTING.md (six-point client bar + the no-foreign-enforcement guardrail). Verified: integration go test + real-pitot E2E round-trip (allow/deny/require→deny), and scripts/validate.sh full chain (tests, -race, purity boundary, IR determinism, CGO_ENABLED=0 build, CLI lifecycle, README proof-drift, check-clients incl. the new version gate) — all green. Release note added under interlock-distribution. Disclosure-Reviewed: reviewed — public-safe only, private facet kept out of this commit
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What & why
Mirrors the Pitot readiness work (#260) for Interlock. A full Locus analysis
of the Interlock core and the Pitot↔Interlock interface certified there are no
correctness holes — the frontier was engineering readiness, not enforcement bugs.
This PR is feature-preserving hardening: the engine still decides, the broker
still performs, every path still fails closed. What changes is that the two ways an
external builder got silently stuck are now loudly diagnosed.
Locus certification (model-scoped, fidelity-validated)
Two SystemModels, every evidence ref resolved against the worktree (claims are
supported / model-scoped, not theorem-only):
adapter-collapse(verification.safety-reachability, anchored tointegrations/pitot/adapter/adapter.go): the engine 4-outcome → Pitot 2-outcomecollapse. Verdict
reachable: false— a non-allow outcome, an empty/undecodablepayload, or any unknown/future outcome surfacing as wire-
allowis unreachable; thedefault:branch fails unknowns closed. → interface soundness certified.broker-authority(control.supervisory-rw): the "authority, not interception"guarantee. Verdict
controllable: true, accepted: true— the forbiddenuncontrollable events (
agent_write_artifact,broker_promote_without_allow) haveno declared transition. → core guarantee certified.
frontier --rankover both: no correctness action available → the honest headlineis readiness, not correctness.
Advisory/model-scoped until obligations discharge against fresh tests; assumptions
(strict-mode isolation precondition; broker I/O fail-closed and engine
first-match/default-deny covered by their own tests) recorded as model
unknowns.Changes (all feature-preserving)
Interface
interlock.effectacross the client constant,SPEC, integration README, and
validate.sh. A kind/config mismatch made Pitot findno controller and deny every request silently;
kind_consistency_test.gonowfails the build if the constant, README, or
validate.shdrift apart.adapter.Evaluatedistinguishes a newer client'sunknown field from a corrupt payload and from a policy deny — same fail-closed
behavior, message names the controller protocol. Covered by
adapter_test.go.Client readiness
check-clients.sh(always-on, no toolchain): theTypeScript and Python clients must share one release version, so a consumer can
never pin mismatched clients against one controller.
Public README
quickstart with the canonical kind and the drift-guard note) and a new
CONTRIBUTING.md(six-point client bar + the no-foreign-enforcement guardrail).Verification
go test ./...(incl. new schema-skew + kind-consistency tests).asserted unmodified.
scripts/validate.shfull chain: tests,-race, purity boundary, IR determinism,CGO_ENABLED=0build, CLI lifecycle, README proof-drift, andcheck-clients.shincl. the new version gate — all green.
interlock-distribution/release-notes/.