Repository navigation
Bind consumer verify to judged bytes on generate and load - #499
Merged
Merged
Conversation
Generate→certify now emits through GateEmittedArtifactCompiler and CertifiedBrickActivator, so the record mints gate-emitted-artifact instead of in-process-fixture. Hot-swap and self-extend admission use Strict. When hot-swap is given a PE that matches the certificate hash, the artifact-bytes Verify overload binds those bytes. HMAC-era records without the artifact input are refused at those hosts. The reuse sample takes an optional DLL path for the same check. Co-authored-by: icfrelinger <icfrelinger@gmail.com>
Move reviewed stable-tier Unshipped symbols into Shipped.txt so the v0.1.2 tag freezes the promised surface. Co-authored-by: icfrelinger <icfrelinger@gmail.com>
Cut Unreleased notes under [0.1.2] - 2026-09-04. ci/published-version stays 0.1.1 until release.yml finishes the nuget.org push. Co-authored-by: icfrelinger <icfrelinger@gmail.com>
IanFrelinger
pushed a commit
that referenced
this pull request
Oct 1, 2026
…and refuses an empty scan
Tier 9.2 asserts no [Experimental] type appears in any PublicAPI.Shipped.txt.
It built its list of experimental types by harvesting class names from every
.cs file under src/ that contains the text "[Experimental(" - test projects
included. DiagnosticSuppressionConventionTests (added earlier in this series)
polices that attribute, so it contains the text five times, and it declares a
fixture class named AshlarSdkBuilder. The check therefore reported the real
AshlarSdkBuilder - which is [Obsolete], not [Experimental], and has been in
Ashlar.Sdk's PublicAPI.Shipped.txt since #499 - as an experimental type leaked
into the stable promise. Both UAT jobs went red on it. Nothing leaked.
- The harvest now skips any directory whose name contains "Tests".
- A floor: 82 experimental types are declared in product code today; fewer than
60 means the scan lost its lens, and "none leaked" from an empty list is a
pass that proves nothing, so it fails instead.
Observed, running only the 9.2 block against the tree:
- unfixed tree: FAIL "experimental types in the stable promise: AshlarSdkBuilder"
- the CI failure, reproduced;
- fixed tree: PASS, 82 types;
- a REAL leak (Ashlar.Core.Application.Autonomy.TouchSet appended to a Shipped
file): FAIL naming TouchSet;
- an empty scan (the file pattern changed to match nothing; anchor count 1 -> 0):
FAIL "the scan found only 0 [Experimental] types (floor 60)";
- restored: porcelain empty, PASS.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
IanFrelinger
pushed a commit
that referenced
this pull request
Oct 1, 2026
…and refuses an empty scan
Tier 9.2 asserts no [Experimental] type appears in any PublicAPI.Shipped.txt.
It built its list of experimental types by harvesting class names from every
.cs file under src/ that contains the text "[Experimental(" - test projects
included. DiagnosticSuppressionConventionTests (added earlier in this series)
polices that attribute, so it contains the text five times, and it declares a
fixture class named AshlarSdkBuilder. The check therefore reported the real
AshlarSdkBuilder - which is [Obsolete], not [Experimental], and has been in
Ashlar.Sdk's PublicAPI.Shipped.txt since #499 - as an experimental type leaked
into the stable promise. Both UAT jobs went red on it. Nothing leaked.
- The harvest now skips any directory whose name contains "Tests".
- A floor: 82 experimental types are declared in product code today; fewer than
60 means the scan lost its lens, and "none leaked" from an empty list is a
pass that proves nothing, so it fails instead.
Observed, running only the 9.2 block against the tree:
- unfixed tree: FAIL "experimental types in the stable promise: AshlarSdkBuilder"
- the CI failure, reproduced;
- fixed tree: PASS, 82 types;
- a REAL leak (Ashlar.Core.Application.Autonomy.TouchSet appended to a Shipped
file): FAIL naming TouchSet;
- an empty scan (the file pattern changed to match nothing; anchor count 1 -> 0):
FAIL "the scan found only 0 [Experimental] types (floor 60)";
- restored: porcelain empty, PASS.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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.
Summary
Follow-on to the compile-authority hardening now on
master. Production consumers bind the certificate to judged bytes, and generate→certify mintsgate-emitted-artifactthe same way the disk loader does.Operator requested the
v0.1.2tag. This PR is the release commit: PublicAPI Unshipped → Shipped, changelog cut to[0.1.2] - 2026-09-04. Localrelease-preflight-local.sh 0.1.2passed.Changes
GeneratedBrickBuildercompiles withGateEmittedArtifactCompilerand activates throughCertifiedBrickActivator.GenerateAndCertifyServicepassesEmittedArtifact, so the record mintsgate-emitted-artifact/execution-mode=gate-emitted.CertificationVerifyOptions.Strict. When a supplied PE matches the record hash, it uses the artifact-bytesVerifyoverload. HMAC-era records without that input are refused.Strict(source + kind completeness; no PE on the write path).ProjectBTrustConsumeruseStrict, with an optional DLL path for hash binding.PublicAPI.Unshipped.txtpromoted toShipped.txt; changelog cut for v0.1.2.Testing
bash scripts/run-cert-gate.shate94fc6f8: 444/444.SelfExtendInvariantACertGateTests: 5/5.bash scripts/release-preflight-local.sh 0.1.2: OK (pack-graph alignment + StableSdkHostSample 0.1.2).Testing strategy (blast radius)
SelfExtendInvariantACertGateTests5/5release-preflight-local.sh 0.1.2OKv0.1.2after merge (release.yml)Release
Tag
v0.1.2after this merges tomaster.ci/published-versionstays0.1.1until nuget.org publish fromrelease.ymlcompletes. The 2-argVerify(record, source)helper remains HMAC-era for callers that opt into it.Remaining honest limits
StateLogVerifierstill uses 2-arg verify on behavior certs.--allow-mock/ import canary / OS isolation of witness legs are unchanged.