Repository navigation
v1.2.0 - Production Tribunal, Governed Approvals, and Investigation Campaigns - #64
Merged
Merged
Conversation
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.
[1.2.0] - 2026-10-20 - Production Tribunal, Governed Approvals, and Investigation Campaigns
Overview
v1.2.0 moves command authoring behind a Gateway-side Tribunal, adds a CLI L3 approval path with local L3 proof
verification on outbound Operators, makes consensus bindings K-of-N, and gives evaluation campaigns fresh and persistent
investigations with sealed
agent-trace.v7evidence. The legacy evaluation SUT and the JSON agent-tool registryare removed.
Protocol changes are additive except where noted under Removed; retired field and enum numbers are reserved.
Highlights
POST /api/v1/operators/intents(internal/services/tribunal/,internal/services/gateway/tribunal_intent.go). A caller submits a plain-language intent; the Tribunal runsgenerate → vote → marshal (risk) → audit as governed
INFERENCEdispatches (a high-risk winner isBLOCKEDbefore audit), then dispatches the approved command as anordinary governed
EXECUTE_BASHunder the caller's identity. It never supplies or replaces L2 or L3 proof.Outcomes:
APPROVED,NO_CONSENSUS,BLOCKED(high risk, with rationale),AUDIT_FAILED,INFERENCE_FAILED. Requires an app workload identity with a delegated user (INV-GW-GOV-07).ztd auth approve --clisigns the transaction hash with the enrolled CLIcertificate. Outbound Operators verify L3 proof locally: notary proofs carry the CLI certificate chain
(
cli_certificate_der,cli_intermediates_der) or aPasskeyVerificationContext(user, credential, COSEkey, RP ID, allowed origins). Approval logic lives in
internal/governance/cli_approval.goandpasskey_approval.go; outbound verification is ininternal/services/governance/outbound_l3_notary.go.ztd auth enroll consensus bindaccepts repeated--member-appand--quorum. A multi-member set must state its quorum, and the primary app must be a member. The Gateway and theL5 handler resolve membership through one owner (
models.ResolveConsensusMembership). New enrollment payloadfields:
consensus_member_app_ids = 22,consensus_quorum = 23.ztd eval campaigns creategains--investigation fresh|persistent:<id>,--data-operator,--condition longitudinal|control|held-context,--formations, and--posture.--hold-contextnow defaults tofalse. Campaigns can settribunal_commands, so the model states intentthrough
run_commands_with_operatorand the Tribunal writes the command.content-addressed
agent-trace.v7envelope (v1.1.3 sealedagent-trace.v5). Campaign import and theassignment verifier accept only v7 for new campaign evidence.
(
internal/cli/platform/process_exit_*.go).ztd eval runsfollows stop and status events over the existingevent stream. The
@ztd/adapterSSE polling fallback is gone.Added
ztd/tribunal/v1/tribunal.proto:TribunalIntentRequest,TribunalIntentResult,TribunalMemberCall,TribunalStage,TribunalOutcome.common.proto:PasskeyVerificationContext; notary proof fieldscli_certificate_der = 7,passkey_context = 8,cli_intermediates_der = 9;pending_dispatch = 3; consensus enrollment fieldsconsensus_member_app_ids = 22,consensus_quorum = 23.eval.proto:EvaluationInvestigationMode(FRESH,PERSISTENT),EvaluationInvestigation,EvaluationRun.provider_observation_policy = 14andmodel_provenance_policy = 15,formation_stack_set_digest = 15,tribunal_commands = 17.operator.proto:observation_receiptson inference results and failures;GOVERNANCE_REJECTION_CODE_MCP_TARGET_MISMATCH = 25;RECEIPT_FAILURE_CODE_REHYDRATION_FAILED = 21.POST /api/v1/operators/intents.ztd auth approve --cliztd auth enroll consensus bindgains repeatable--member-app <id>and--quorum <n>ztd eval campaigns createflags listed aboveztd test eval-loop [--posture ratify|notary] [--live-ollama-endpoint --live-model]: cross-processevaluation loop against real Gateway, Data Operator, and Inference Operator processes. The live mode reaches Ollama only through the governed
Inference Operator.
internal/services/assignmentaudit/) — Holds one assignment's public feedrecords. Its signed proof segment authenticates it by SHA-256, and
ztd public verify-assignment --db --segments --public-keyverifies itoffline (see Removed for the dropped vault key).
ErrScrubbingTokenUnresolved,ErrScrubbingKeyCollision,ErrMCPNativeToolHostMissing,ErrProcessNotFound,ErrUnsupportedPlatform,ErrConfigLeafCertTTLInvalid,ErrGovernanceCLISessionRequired,ErrEvaluationInvestigationInvalid,ErrMCPAuditReceiptListInvestigationReq,ErrEventRequestWireValue,ErrEventStreamTransport,ErrEventRegistryUnknownField.Changed
(
agent_native_tools.go), not a JSON registry.agent-trace.v7. Older campaigntraces are recorded as
INVALID_EVIDENCEand are not graded.ztd public verify-agent-tracestill verifiespublished v3–v5 traces and now also v6.
INVALID_EVIDENCEandPROVIDER_FAILEDassignments are never judged. Each judge score must bind to a signed inference receipt whose result summary
matches the scored result.
with no connected observer or provenance Operator skips the window; run witness policies enforce coverage at
verification.
ZTD-DLP-BOUNDARY-001,ZTD-DLP-REHYDRATE-001, andZTD-CM-STATE-001arescoped to
gateway/operator, andcomponent_scopeis a closed set.ztd gw tunnel create --ca-bundlesends the Gateway internal hostname as origin SNI.--origin-server-namewithout--ca-bundleis rejected.returns HTTP 400, not 500.
.envloading — The working-directory.envis loaded at the end of the root pre-run, after commandgates pass. A command refused at pre-run,
--help, and--versionno longer read it.carries
RECEIPT_FAILURE_CODE_REHYDRATION_FAILED.make constants-generaterejects unknown registry fields, non-governed requestevents whose wire value does not end in
.requested, and stream events with an absent or non-ssetransport.protocol/models/event_registry.schema.jsonnow matches the generator's checks, and a test pins the two together.:8081) serves ingest routes only. Anonymous read routes areserved only on the public listener (
:8082).Removed
internal/services/evaluation/sut/, the/ztd-sutroutes, SUT timingconstants, and the
ScoredTurnRequest/ScoredTurnEvent/InvestigationSeedprotocol messages.protocol/constants/agenttools/.provider_boundary_observation_ref = 32— Reserved. Observations travel asobservation_receipts.--vault-keyis removed from public assignment verification. Thedatabase carries only already-published public feed records and is authenticated by its signed proof segment.
operator.pidfiles; it stops workers through verified process discovery and fails closed.@ztd/adapterSSE polling fallback (src/sse/polling.ts).ErrEvaluationSystemLaneUnavailableand sixErrCLIL3*sentinels (ErrCLIL3ApprovalExpired,ErrCLIL3GetSuspendedTransactionFailed,ErrCLIL3InvalidFingerprintFormat,ErrCLIL3PublicKeyMissing,ErrCLIL3SuspendedStoreNotConfigured,ErrCLIL3TransactionNotApproved). CLI L3verification now uses
ErrGovernanceCLISessionRequiredand the shared approval owner.Fixed
exit is observed. A missing Operator executable is rejected before an existing Operator is stopped or its log
is truncated.
@ztd/adapterresolves under plain Node ESM: it has a root barrel (src/index.ts),.jsimport specifiers,and exported error classes.
supervisor exits with Vite's exit code.
ztd gw start.inventory models (
pdevine/qwen3.6:27b-mtp-q4_K_Mandqwen3:30bremoved).A2A_CALLevent registry entry names its actual payload message,A2aCallRequested.closed with
ErrPublicFeedOrphanedGenerationwhenpublic-proofs/,proof-mirror-sync.json, the outbox,or another feed-generation path exists without its signing key. Source transition also archives
proof-mirror-sync.json.Tests
Linux amd64 qualification of the release candidate:
make build— pass../ztd test unit— pass (128 packages)../ztd test lint— pass, 0 issues../ztd test integration— pass (129 packages)../ztd test eval-loop— pass, ratify and notary postures, scripted provider../ztd test release-smoke—result: PASS, doctrine posture.make console-lint console-test console-embed-check— pass, 49 tests.make explorer-lint explorer-test explorer-embed-check— pass, 711 tests.npm test --prefix ztd-adapterandnpm run gen:contract-pack:check --prefix ztd-adapter— pass, 429 tests.make ci-protocol,make swagger-generate,make constants-check doctrines-validate version-sync-check third-party-notices-check explorer-catalog-check— pass, no generated drift.make website-test website-build— pass; 12 PowerShell checks skipped (nopwshon the qualification host).Not qualified in this release: native macOS and Windows runs, and live Tier 4 model evaluation. No model-quality
or hosted-provider claims are made.
Documentation
docs/architecture/agents.md— Production Tribunal section.docs/architecture/gateway.md—INV-GW-GOV-07(Tribunal intent dispatch).docs/architecture/evals.md— Investigation modes, formation campaigns, Tribunal commands,agent-trace.v7.docs/architecture/consensus.md— K-of-N bindings.protocol/docs/reference/api/ztd/tribunal/v1/— Generated Tribunal reference.CHANGELOG.md—1.2.0entry under## v1.2.x.Compliance Evidence
Operational evidence bundle generated by
./ztd compliance release-prepare:gateway-operational-20261020(window 2026-10-20T16:30:10.965Z to 2026-10-20T16:30:40.965Z, 3 receipts, 4 commitments, 2 source signer keys).release-evidence/v1.2.0/report-bundle/manifest.json.compliance_bundle@2.0.0valid=true, failures=0, checksum root0b9e7ace733c7fd4c1bf908af9e0d94ed637ee32d1cffe491c43d8e520b9130c.3b99359cd00e19e4f6a0663cfdc8f42f7bdfaa5a.docs/release_notes/v1.2.x/v1.2.0-compliance-evidence.mdanddocs/release_notes/v1.2.x/v1.2.0-compliance-evidence.csv.