Repository navigation
SPEC-007 PR 4.5: subject producers, report-only - #721
Merged
Merged
Conversation
Cert-gate facts for the PR 4.5 floor, the Secret/Internal RAG leak skeleton, an unlabelled tool, a throwing tool, and the production self-extend subject. They fail until the runner, the read scope and RAGTool report.
Enter agent:<id> at SystemHigh around the cycle, begin a read around each tool call, and let only IEgressLabelledTool report. RAGTool reports canonical hit labels or Public when it read nothing. Peer chat responses observe SystemHigh after they return. Still report-only.
The status bullet and the inventory used the placeholder until the pull request existed.
string.IsNullOrEmpty does not narrow a string? on that asset, so TryGetValue was CS8604 and kernel-gate, uat, and readiness all failed the build.
…-4.5-producers-69b9 # Conflicts: # ci/cert-gate-assertions.md # docs/knowledge-graph.json # docs/knowledge-graph.md # docs/specs/SPEC-007-security-labels-and-reference-monitor.md
Co-authored-by: IanFrelinger <IanFrelinger@users.noreply.github.com>
Co-authored-by: IanFrelinger <IanFrelinger@users.noreply.github.com>
Co-authored-by: IanFrelinger <IanFrelinger@users.noreply.github.com>
A_credential_holding_a_delimiter_reaches_no_record_field failed on Windows when a random 64-bit Ref (e.g. 3017e74321a321bd) happened to contain the digit credential piece 4321. Ref is not derived from the destination; skip it in the payload substring scan like sequence/at. Co-authored-by: IanFrelinger <IanFrelinger@users.noreply.github.com>
Co-authored-by: IanFrelinger <IanFrelinger@users.noreply.github.com>
Resolve cert-gate and egress convention conflicts by keeping PR 4.5 producer wiring and incorporating PR 4.3 redirect inventory/floors. Regenerate knowledge-graph. Co-authored-by: IanFrelinger <IanFrelinger@users.noreply.github.com>
Co-authored-by: IanFrelinger <IanFrelinger@users.noreply.github.com>
cursor Bot
pushed a commit
that referenced
this pull request
Oct 8, 2026
# Conflicts: # docs/knowledge-graph.json # docs/knowledge-graph.md Co-authored-by: IanFrelinger <IanFrelinger@users.noreply.github.com>
cursor Bot
pushed a commit
that referenced
this pull request
Oct 8, 2026
Co-authored-by: IanFrelinger <IanFrelinger@users.noreply.github.com>
2 of 3 tasks
IanFrelinger
pushed a commit
that referenced
this pull request
Oct 8, 2026
This was referenced Oct 8, 2026
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
Production egress records for a self-extend cycle now name the agent.
SelfExtendRunnerAdapter.RunAsyncentersagent:<id>atSystemHigharound the cycle and the post-cycle admission and auto-share.ToolCallingAgentbegins a read around each tool call. OnlyIEgressLabelledToolmay report;RAGToolis the only labelled tool. Apeer:chat response is observed asSystemHighafter it returns. A model response is not a read.Still report-only. Nothing refuses, and no send changes. Records go from
no-subjecttosubject:agent:<id>atSystemHigh.This follows the merged 4.4 rule: a
BeginReadscope observes only when it ends. Unreported or thrown isSystemHighat dispose. A tool that reads and then egresses inside the same call, before the scope ends, is decided at the pre-read mark. That is a known limit for a runner whose floor is belowSystemHigh. The production floor isSystemHigh, so the limit does not declassify self-extend. The owner can reverse it. Making an open scope count asSystemHighwould turn the leak'sLevelTooLowintoSystemHighData, because a mark only rises and a later Secret report could not lower it.Changes
SelfExtendRunnerAdapter.RunAsyncis the only productionEgressSubject.Enter. Subject id isagent:plus the resolved agent id (the basis issubject:agent:<id>). Floor isnew HighWaterMark(SecurityLabel.SystemHigh)because the snapshot carries unlabelled carry-over. Theusingis on the flow that enters it, covers the cycle, scratchpad, claim release, admission and auto-share, does not span ayield return, and is not inside an async helper. Overloads that only awaitRunAsyncdo not enter.ToolCallingAgentwraps each tool invocation inEgressSubject.BeginRead.Completeruns only when the tool returns. A throw, including a refusal that throws, does notComplete, so dispose observesSystemHigh.Reportis accepted only when the toolbox is aCapabilityRegistryandFindreturns anIEgressLabelledTool. Otherwise the report is ignored and the scope stays unreported (SystemHigh).IEgressLabelledTool.ReportReadis the public marker, recorded insrc/Ashlar.Abstractions/PublicAPI.Unshipped.txt. It is an interface, not a default method onIToolbox(Ashlar.Abstractionsisnetstandard2.0).CapabilityRegistry.Findis the lookup.RAGToolreports every outcome. Hits: trim the name,GetByName, require reference equality with one ofDataSensitivityLevels.All, thenToDataLabel. Canonical names are the five primitives plustop-secret, any case, trimmed. A custom level, an unknown name, or an unmarked hit isSystemHigh. Zero hits, and the unrankable-query refusal, reportPublic("read nothing"). Mapping stays in BackgroundAgents. No new production reference toAI.Pipeline.EgressGuardChatClientkeeps the 3-argument constructor. A second constructor takes the target key.UseAshlarGovernancepasses it. A key that starts withpeer:(trimmed, any case) observesSystemHighafter a successful response and after a fault. A synchronous throw (PolicyGate) is not observed.local:andcloud:are not reads. With no frame, observe is a no-op. The decision for the call itself is still the pre-response mark; the next decision seesSystemHigh.Testing
Red first, on commit
11567292, before the wiring, filterEgressSubjectFloorPinTests|EgressSubjectProducerTests, net8.0:Failed! - Failed: 6, Passed: 0, Skipped: 0, Total: 6, Duration: 312 ms - Ashlar.Tests.Infrastructure.dll (net8.0)Green, on
4013b491:Ashlar.Tests.BackgroundAgents, net8.0Ashlar.Tests.BackgroundAgents, net10.0scripts/ci/run-repo-gates.shThe skipped BackgroundAgents test is the suite's existing skip. DogfoodBlock8 and
Prod_cli_objectiveswere not in these filters.A first
drop-enterattempt did not compile (CS0161).mutation-checkreportedINVALIDreason=red-no-tests. The kill above replaces theEnterwithusing (new System.IO.MemoryStream()).dotnetwas not run on the host. Cert-gate ran inside the container throughscripts/test-in-container.sh.Testing strategy (blast radius)
See Testing strategy pivot v1.
AddAshlarProviderFactory, Docker provisioners, …)make kernel-coverage-gate(not run)make kernel-gate(not run)make test-prod-style(not run)Not composed: the full
EgressEnforcementLeakTestsswitch (4.11),MeaiBackedModel/AddAshlarMeaiPipeline,VectorDataRagService, enforcing mode, Bing, or redirects. Cert-gate was not re-run on net10.0. The full Infrastructure suite outside the certification filter was not run.Checklist
TODOorNotImplementedExceptionleft unresolved.csfiles, 136 entriesIEgressLabelledToolgit addRelease
Records for the drift audit
docs/EgressInventory.md— producers section and the within-call known limit. No newEG-id.ci/egress-inventory.tsv— unchanged.ci/cert-gate-assertions.md— floor-pin row; 4.4 "no production Enter" sentences now name this wiring; certification count 133 / 136.docs/specs/SPEC-007-security-labels-and-reference-monitor.md— 4.5 status. Sibling bullets unchanged. No 4.4 merge SHA (that rides with PR 4.3).CHANGELOG.md—[Unreleased]Added entry.src/Ashlar.Abstractions/PublicAPI.Unshipped.txt—IEgressLabelledToolandReportRead.docs/knowledge-graph.jsonanddocs/knowledge-graph.md.