Skip to content

Commit 4718fab

Browse files
committed
release: v0.8.0
1 parent ab15852 commit 4718fab

14 files changed

Lines changed: 603 additions & 22 deletions

File tree

AGENTS.md

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,57 @@ present field is not, and the two must not be handled by the same fallback
254254
path. See `examples/strict-output-schema/` for a before/after reference
255255
implementation and a live repro of the `bool("false")` bug.
256256

257+
### Compartmentalized Multi-Agent Isolation (TR-SEC-013)
258+
259+
When multiple agents share one backing service — a tool surface and the data
260+
behind it — isolate them at **two independent layers**, not one:
261+
262+
1. **Tool-registry / authorization scope** — a distinct credential per agent,
263+
with the server (not the agent) deciding which tools that credential may
264+
invoke. This bounds what is *offered* to a given agent's own reasoning.
265+
2. **Data-layer scope** — a per-agent role on the underlying store (database
266+
role, file-system mount, or equivalent), enforced independently of
267+
whatever the authorization layer believes it has granted. This bounds
268+
what is *reachable* even if layer 1 has a bug.
269+
270+
Neither layer substitutes for the other. A tool-registry bug (a stray
271+
wildcard registration, a misrouted credential map) can hand an agent a tool
272+
it should never have gotten — the data-layer role is what still blocks the
273+
resulting call. A data layer with no tool-registry scope would still let a
274+
compromised or over-broad tool call reach everything a shared credential can
275+
see. Assign both layers by exposure: the agent with an external input path
276+
(internet, untrusted user messages) gets the narrowest grant at both layers;
277+
the most broadly-privileged agent gets no external egress at all. See
278+
`examples/compartmentalized-agents/` for a reference implementation,
279+
including a test that simulates a tool-registry bug and shows the data layer
280+
still holds the line.
281+
282+
When reusing a prior isolation design (an existing threat model, a past ADR)
283+
for a new agent split, re-verify its *reasoning* still holds before carrying
284+
its conclusions forward — a control copied without re-checking why it existed
285+
can turn into process weight that closes no actual gap.
286+
287+
### Ground-Truth Verification for Agent Security Claims (TR-TEST-007)
288+
289+
An agent's own self-report is not verification evidence for a
290+
security-relevant property — isolation between agents, a permission
291+
boundary, memory or session scoping. Asking an agent in conversation ("do
292+
you have tool X," "do you remember Y") can produce a false pass: the
293+
question may be answered by the wrong backend, a stale cache, or the agent's
294+
own incorrect belief about its state, none of which is the property actually
295+
under test.
296+
297+
Verify instead against the system's own ground truth — the target
298+
component's own list/read endpoint, a database row, a server log line —
299+
independent of what the agent under test reports. This is the
300+
security-property-specific form of the general "verify before referencing"
301+
discipline: the authoritative source for whether a boundary holds is the
302+
boundary's own enforcement point, never an agent's narration of it. See
303+
`examples/compartmentalized-agents/` for a reference implementation, where a
304+
`SelfReportingAgent`'s claim about its own tool access is shown to drift out
305+
of sync with the tool registry's actual state — the registry, not the
306+
agent's claim, is ground truth.
307+
257308
### Deterministic Checks Before Agent Judgment
258309

259310
Use scripts, tests, linters, and schema validators before asking a model to

CHANGELOG.md

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,45 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
55

66
## [Unreleased]
77

8+
## [0.8.0] - 2026-07-31
9+
10+
### Added
11+
12+
- `registry/tr-registry.yaml` — TR-SEC-013 (two-layer isolation for
13+
multi-agent tool and data access) and TR-TEST-007 (agent security-property
14+
claims verified against ground truth, not self-report), exported from the
15+
private-repo agent-platform deployment (private ADR-013, ADR-014).
16+
TR-SEC-013 graduates the "Compartmentalization worked example" item
17+
roadmapped since the 2026-07-13 Zero-Trust-for-AI-Agents review (private
18+
ADR-031), now backed by a running, hands-on-verified implementation rather
19+
than a design-only ADR; TR-TEST-007 is new content, motivated by two real
20+
false passes in the ADR-014 spike where an isolation/memory-scoping check
21+
"passed" only because the question was answered by the wrong backend, not
22+
the mechanism actually under test
23+
- `examples/compartmentalized-agents/` — reference implementation:
24+
`ToolRegistry` (tool-registry scope) + `DataStore` (data-layer scope),
25+
with a test that deliberately misconfigures the tool layer and proves the
26+
data layer alone still blocks the resulting call (the defense-in-depth
27+
evidence, not just that both layers exist); `SelfReportingAgent`, with a
28+
test showing its self-report gives a false pass on a real isolation leak
29+
that `ToolRegistry.list_tools()` (ground truth) catches
30+
- `docs/ai-engineering-operating-model.md` — "Rollout Sequencing" section
31+
(the layering rule: foundational infrastructure ships first, every later
32+
phase immediately usable on arrival), also graduated from the 2026-07-13
33+
review, second exemplar from private ADR-013's phased rollout table
34+
- `templates/completion-checklist.md` — "Ground-truth verification for agent
35+
security claims" checklist item
36+
- `AGENTS.md` — "Compartmentalized Multi-Agent Isolation" and "Ground-Truth
37+
Verification for Agent Security Claims" sections
38+
- `docs/requirements-implementation-map.md` — rows for all three exports above
39+
- `README.md``examples/compartmentalized-agents/` added to the worked-traces
40+
list and "Enforced workflow" section
41+
42+
Reviewed by a fresh-context reviewer agent before release: 0 blocking
43+
findings, 2 advisory (the `README.md` gap above, and two added test cases
44+
for previously-untested `DataStore`/`ToolRegistry` default-permission edge
45+
cases) — both fixed prior to this release.
46+
847
## [0.7.0] - 2026-07-26
948

1049
### Added
@@ -265,7 +304,8 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
265304
- `CONTRIBUTING.md`, `SECURITY.md`, issue/PR templates, `release-check` CI workflow
266305
- Roadmap and changelog for intentional release cadence
267306

268-
[Unreleased]: https://github.com/onesimplecode/ai-engineering-standards/compare/v0.7.0...HEAD
307+
[Unreleased]: https://github.com/onesimplecode/ai-engineering-standards/compare/v0.8.0...HEAD
308+
[0.8.0]: https://github.com/onesimplecode/ai-engineering-standards/compare/v0.7.0...v0.8.0
269309
[0.7.0]: https://github.com/onesimplecode/ai-engineering-standards/compare/v0.6.0...v0.7.0
270310
[0.6.0]: https://github.com/onesimplecode/ai-engineering-standards/compare/v0.5.0...v0.6.0
271311
[0.5.0]: https://github.com/onesimplecode/ai-engineering-standards/compare/v0.4.0...v0.5.0

README.md

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,9 @@ A step-by-step path for pulling these standards into your own repo, not just thi
6363
5. **Study the worked traces**[`examples/worked-example/`](examples/worked-example/),
6464
[`examples/agent-permission-guard/`](examples/agent-permission-guard/),
6565
[`examples/spotlighting/`](examples/spotlighting/),
66-
[`examples/provenance-trust-tags/`](examples/provenance-trust-tags/), and
67-
[`examples/strict-output-schema/`](examples/strict-output-schema/) show
66+
[`examples/provenance-trust-tags/`](examples/provenance-trust-tags/),
67+
[`examples/strict-output-schema/`](examples/strict-output-schema/), and
68+
[`examples/compartmentalized-agents/`](examples/compartmentalized-agents/) show
6869
a requirement moving end-to-end: TR-ID → ADR → maturity row → script → CI gate.
6970
6. **Reconcile with tools you already use**[`docs/agent-skills-integration.md`](docs/agent-skills-integration.md)
7071
covers how this layers under AGENTS.md, agent-skills, and Cursor rules rather
@@ -100,6 +101,13 @@ from source type to trust level — and
100101
a live repro of the `bool("false") is True` fail-open coercion bug and the
101102
reject-never-coerce fix.
102103

104+
See [`examples/compartmentalized-agents/`](examples/compartmentalized-agents/)
105+
for the two-layer multi-agent isolation trace (TR-SEC-013) — a simulated
106+
tool-registry misconfiguration that a per-agent data-layer role alone still
107+
blocks — and the ground-truth-vs-self-report trace (TR-TEST-007): an agent's
108+
own claim about its tool access shown giving a false pass that only the tool
109+
registry's actual state catches.
110+
103111
## Public Evidence Map
104112

105113
- [`AGENTS.md`](AGENTS.md) — tool-neutral agent rules for data routing, loop contracts,

ROADMAP.md

Lines changed: 89 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -92,13 +92,15 @@ See `CHANGELOG.md` for shipped versions.
9292
examples, `docs/agent-skills-integration.md`) consolidating onboarding
9393
guidance that was previously scattered across the README and `docs/`
9494

95-
## v0.7 — Agentic security & operations patterns (current)
95+
## v0.7 — Agentic security & operations patterns
9696

97-
From the 2026-07-13 Zero-Trust-for-AI-Agents review (private ADRs: private-repo
98-
ADR-030/031/032, private-repo ADR-018, and a private-repo deployment proposal). Two
99-
maturity classes — this repo exports packaged practice, not aspirations.
97+
Released 2026-07-26 (`v0.7.0`).
10098

101-
**Export-ready (shipped + tested in the private monorepo, 2026-07-13):**
99+
From the 2026-07-13 Zero-Trust-for-AI-Agents review (private ADRs: private-repo
100+
ADR-030/031/032, private-repo ADR-018, and a private-repo deployment proposal).
101+
The review identified nine candidate exports; three were export-ready and
102+
shipped in this release, six were design-only and deferred — see v0.8 (two of
103+
the six, now with running evidence) and Backlog (the remaining four) below.
102104

103105
- [x] **Spotlighting at the reasoning boundary** (private ADR-030,
104106
private ADR-018): untrusted retrieved/external content is wrapped in
@@ -121,9 +123,88 @@ maturity classes — this repo exports packaged practice, not aspirations.
121123
single-source-of-truth convention
122124
(TR-SEC-012, `examples/strict-output-schema/`)
123125

124-
**Roadmapped — export after the private implementation proves them
125-
(design-stage as of 2026-07-13; promotion to export requires the same
126-
evidence TR-SEC-010 had — commits, tests, an operating track record):**
126+
## v0.8 — Verified isolation & ground-truth testing
127+
128+
Released 2026-07-31 (`v0.8.0`).
129+
130+
From a private-repo agent-platform deployment (private ADR-013, ADR-014;
131+
2026-07-25 to 2026-07-29) — the first case of a `compartmentalization`-shaped
132+
design (private ADR-031, v0.7's own roadmapped item above) actually built,
133+
running, and hands-on verified rather than design-only. Three exports, one of
134+
them genuinely new content rather than a graduation:
135+
136+
- [x] **Compartmentalization worked example** (graduates from v0.7's
137+
roadmapped item, private ADR-031 → private ADR-013/014). Two-layer
138+
isolation for a multi-agent system sharing one backing service: a
139+
tool-registry scope (what's *offered* to each agent's own reasoning —
140+
distinct credentials per agent, server-side authorization) sitting
141+
above a data-layer scope (what's *reachable* even if the authorization
142+
layer has a bug — e.g. per-agent DB roles). The two are defense in
143+
depth, not redundant: neither alone is the full mitigation, extending
144+
TR-SEC-010's least-agency framing from single-agent tool grants to
145+
multi-agent tool + data boundaries. Also carries the corrected version
146+
of the private ADR-031 promotion-gate story: a human-approval step was
147+
dropped after review found it protected an action that wasn't the
148+
actual security-relevant moment — kept in the worked example's README
149+
as a caution against copying a control's *conclusion* without
150+
re-checking whether its *reasoning* still holds.
151+
Shipped as a **new registry entry** (TR-SEC-013 — a new ID read better
152+
than amending TR-SEC-010, since multi-agent tool+data isolation is a
153+
distinct claim from single-agent tool-grant restriction, matching how
154+
TR-SEC-011/012 were each given their own entry rather than folded into
155+
an existing one): `registry/tr-registry.yaml`,
156+
`examples/compartmentalized-agents/` (`isolation.py` + a test proving
157+
the data layer blocks a deliberately misconfigured tool layer —
158+
the actual defense-in-depth proof, not just that both layers exist),
159+
`AGENTS.md` "Compartmentalized Multi-Agent Isolation" section,
160+
`docs/requirements-implementation-map.md` row.
161+
- [x] **Ground-truth verification for agent security-property claims** — new
162+
pattern, not previously roadmapped. A claim about an agent's own
163+
behavior, obtained only by asking the agent (chat transcript) — "do you
164+
have tool X," "do you remember Y" — is not verification evidence for a
165+
security-relevant property (isolation, permission boundary, memory
166+
scoping). Verify against the system's own ground truth instead (the
167+
target API's own list/read endpoint, a DB row, a server log line),
168+
independent of what the agent under test reports. Motivated by two real
169+
false passes in the ADR-014 spike: an isolation check that "passed" only
170+
because the test question was routed to the wrong backend entirely (not
171+
the one actually under test), caught only by querying the real memory
172+
store's API directly instead of trusting the chat reply. This is a
173+
sharper, agent-specific instance of the existing "verify before
174+
referencing" / zero-hallucination discipline, applied to runtime
175+
behavior claims rather than static code symbols.
176+
Shipped as **TR-TEST-007** (new entry — distinct from TR-TEST-006's
177+
write-effect verification, this covers self-report vs. ground truth for
178+
a behavioral/security claim) in the "Testing" section; a checklist line
179+
item in `templates/completion-checklist.md`; the
180+
compartmentalized-agents example extended with `SelfReportingAgent`
181+
(`isolation.py`) and a test showing its self-report gives a false pass
182+
on an isolation leak that `ToolRegistry.list_tools()` — ground truth —
183+
catches.
184+
- [x] **Layering rule** (graduates from v0.7's roadmapped item, second
185+
exemplar: private ADR-013's Phase A → A.5 → B → C → D rollout table,
186+
alongside the existing private deployment-proposal citation).
187+
Foundational/shared infrastructure ships first; every subsequent phase
188+
is immediately usable on arrival — no functionality idles behind an
189+
unmet dependency, and no phase is "mostly done" before the next starts.
190+
Shipped as a new "Rollout Sequencing" section in
191+
`docs/ai-engineering-operating-model.md` with a genericized phase-table
192+
shape, plus a `docs/requirements-implementation-map.md` row —
193+
documented pattern, no new TR-ID (matches other "Documented"-only rows
194+
in that map).
195+
196+
All three shipped. Promotion bar, consistent with v0.7's rule: exported only
197+
once the private implementation has *running, hands-on evidence* behind it,
198+
not just an accepted design ADR — met here by ADR-014's spike outcome
199+
(2026-07-29).
200+
201+
## Backlog — unscheduled
202+
203+
Deferred from the 2026-07-13 Zero-Trust-for-AI-Agents review, design-stage
204+
only as of 2026-07-13 with no running implementation cited since. Not
205+
attached to any version — promotion requires the same bar as v0.7/v0.8: an
206+
operating track record in the private monorepo (commits, tests, hands-on
207+
evidence), not just an accepted design ADR.
127208

128209
- [ ] **Disposition contract** — triage agents emit a structured disposition
129210
(query / think / report) as a loop-contract output field, extending
@@ -136,11 +217,6 @@ evidence TR-SEC-010 had — commits, tests, an operating track record):**
136217
coverage (fraction of agent outputs a human reviewed), and
137218
explainability-by-trigger-ID (every agent output cites the ID of its
138219
triggering event, a mandatory loop-contract field) (private-repo deployment proposal)
139-
- [ ] **Compartmentalization worked example** — the most-exposed agent gets
140-
the fewest permissions (write-only into a quarantine zone), the
141-
most-privileged agent gets no public egress, and promotion out of
142-
quarantine is human-gated: agent proposes + safety report, human
143-
approves, agent executes (private ADR-031)
144220
- [ ] **Human-gated model experimentation + dual-LLM review** — model
145221
adoption is a human judgment recorded as a reviewable config diff,
146222
never a runtime switch; critical calls may use a producer→reviewer
@@ -151,10 +227,6 @@ evidence TR-SEC-010 had — commits, tests, an operating track record):**
151227
keeping the dependency (Anthropic Zero-Trust eBook). **Unproven here**
152228
— export only after it has been practiced at least once in the private
153229
monorepo
154-
- [ ] **Layering rule** for agent/platform rollouts (operating-model doc):
155-
foundational ops/observability ships first; every subsequent phase is
156-
sized to be immediately usable — no functionality that idles behind
157-
unmet dependencies (private-repo deployment proposal)
158230

159231
## Non-goals
160232

docs/ai-engineering-operating-model.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,24 @@ by humans and other agents.
4141
- **ADR lifecycle** preserves why a decision was made and how it can be
4242
superseded later.
4343

44+
## Rollout Sequencing
45+
46+
Multi-phase agent or platform builds ship in **layers**, not a single
47+
big-bang release: foundational, shared infrastructure ships first, and every
48+
subsequent phase is immediately usable the moment it lands — no phase should
49+
sit "mostly done," idling behind a later phase that hasn't been built yet.
50+
51+
| Phase | Ships | Immediately usable as |
52+
|---|---|---|
53+
| Foundations | Shared infra (auth, storage, observability, backup) | The measurement/ops base every later phase is built on |
54+
| Capability A | First agent/workflow, fully wired end to end | A working, narrow slice — not a stub |
55+
| Capability B | Second agent/workflow, reusing Foundations | Independently usable even if a later Capability C is delayed |
56+
| Wrap-up | Docs, CI, reproducibility | A rebuildable system, not tribal knowledge |
57+
58+
Each phase's own tests pass before the next phase starts — no phase is
59+
"mostly done." Documentation updates land in the same change as the phase
60+
they describe, not batched at the end.
61+
4462
## Repo-Time Controls
4563

4664
- `scripts/check-config-consistency.py` catches retired model strings and

0 commit comments

Comments
 (0)