Skip to content

Promote integration to main - #350

Merged
rocklambros merged 7 commits into
mainfrom
integration
Oct 29, 2026
Merged

rocklambros merged 7 commits into
mainfrom
integration

Conversation

@bar-capsule

Copy link
Copy Markdown
Collaborator

7 commit(s) ahead. Merging publishes the site and every schema $id URI. Merge with a merge commit, not a squash: squashing flattens the specification history that makes a schema change reviewable later.

What this ships

This is not a release. version.txt stays 0.1.4, so no tag is created. Schema changes publish in place at the /schema/v0.1.0/ URIs.

#273 and #309 go out together, as #309 asks.

For implementers

session-end.json gains one optional field, so the schema change is additive. Two rules tighten:

Roadmap

Merging delivers #37, #93, #118 and #194, which the health issue (#209) lists as not on main.

aaronormerod and others added 7 commits October 18, 2026 20:07
Align §3’s envelope description with the existing request and response schemas and the common envelope example in `hooks.md`.

Closes #194

Signed-off-by: aaronormerod <137795541+aaronormerod@users.noreply.github.com>
Reviewed-by: Lrd0036 <lrd0036@auburn.edu>
…request_id_ref (#272)

Closes #118

Signed-off-by: rocklambros <rock@rockcyber.com>
Part of #252

Signed-off-by: Evgeny Kokuykin <artmaro@gmail.com>
Signed-off-by: rocklambros <rock@rockcyber.com>
Closes #37

Signed-off-by: Bar Kaduri <bar@capsule.security>
Signed-off-by: rocklambros <rock@rockcyber.com>
Closes #93

Signed-off-by: Mayur Agnihotri <mayur.agnihotri0021@gmail.com>
Signed-off-by: rocklambros <rock@rockcyber.com>
…oes (#323)

The ACS-Trace section, the Trace events page, and handshake.json all require Trace events under at least one of OTel or OCSF for every supported step. The quick-reference row was the one place that said both, since the v0.1.0 integration in f46d260. The row now matches the profile and names its other two requirements, decisions as events and provenance carried forward.

Signed-off-by: rocklambros <rock@rockcyber.com>
…never under its claimed ids (#309)

## What changed

PR #273 adds a rule to Trace Events: a Guardian MUST NOT emit
`acs.decision` or `acs.decision.failure` under the pair of a request it
rejects before trusting it. Our reference Guardian broke that rule. An
envelope that failed the schema, carrying a forged `request_id`, got an
`acs.decision` span under that `request_id`. This fixes the reference
Guardian, following @bar-capsule's ruling on issue #283: keep the
rejected request visible, under separate names, never under the genuine
request's ids.

- **Rejected requests get their own span.** A request the Guardian can't
vouch for becomes a `guardian.rejected_request` span. It carries no
`acs.session.id`, `acs.request_id`, step attribute, or `acs.decision`
event. The ids it claimed go under
`guardian.rejected.claimed_session_id` and
`guardian.rejected.claimed_request_id`, with `guardian.rejected.reason`
and the error code.
- **What counts as rejected:** an envelope that fails validation, a
request the Guardian couldn't check at all (`guardian_fault`, which
still records its `guardian_error`), and a step answered with
`SIGNATURE_INVALID`, `REPLAY_DETECTED` or `TIMESTAMP_OUT_OF_WINDOW`.
- **The pair is added last.** A trusted step's pair and step attributes
go on only when its span ends. `dispatch` now returns its trust verdict
next to the response. So a check that runs after the span opens can't
leak a rejected request's ids onto a step span, whether it answers with
an error or with a deny. That's where PR #229's checks will run.
- **Sample trace:** it now includes a forged request that reuses the
allowed call's ids. A test checks that the allowed call keeps the only
span under its pair.
- **Docs:** the READMEs and `extend_opentelemetry.md` say what a
rejected span carries. The known limits say plainly that this Guardian
checks nothing but the schema yet, so a well-formed forgery or replay is
still recorded as a step until PR #229 lands.

@sabasiddique1, this implements item 6 of issue #283, so you can skip
that item. Items 1 to 5 and 7 are still yours.

**Merge order:** this is safe to merge before PR #273. Before that rule
exists, the only effect is that a rejected request moves off the step
spans. Please don't promote it to `main` without PR #273, or the other
way round.

## Which issue does this implement

Part of #283
Refs #37

- [ ] This is an editorial correction (typo, grammar, link, formatting)
with no change in
      meaning, so it needs no issue

## Base branch

- [x] `integration`, because this touches the specification, schemas, a
reference
      implementation, an adapter, tests, or CI
- [ ] `main`, because every changed path is on the documentation lane
allowlist in
      CONTRIBUTING.md

## Type of change

- [ ] Specification change (schema, hooks, events, AgBOM)
- [x] Reference implementation or adapter
- [x] Documentation
- [ ] Tooling or CI
- [ ] Governance (licensing, security policy, contributor docs)

## Specification changes

No normative text changes. `docs/spec/trace/extend_opentelemetry.md`
changes only where it describes what the reference Guardian exports.

**Breaking for implementers?** No ACS change. Anyone reading the
reference Guardian's trace sees a schema-invalid envelope as a
`guardian.rejected_request` span. Before, it was a `gen_ai.tool.call`
with an `envelope_invalid` deny.

## I tested this

- [x] I synced my branch with the base branch before opening this
- [x] `uv run pytest -v` passes on my machine
- [x] `uv run mkdocs build --strict` passes on my machine

From `reference-implementations/agt/`, `bun run typecheck` is clean and
`bun test` passes (1245). I checked the new tests by breaking each
behavior on purpose. With trust always true, a late rejection ignored,
the pair attached early, `dispatch`'s verdict dropped, the fault event
removed, or the arrival time ignored, the matching tests fail. Before
writing this I ran a six-perspective premortem and a code review, and
their findings are fixed here.

## Checklist

- [x] Commits are signed off with `git commit -s` (required by the DCO)
- [x] Prose follows [STYLE.md](../STYLE.md)
- [x] No secrets, tokens, or internal URLs in the diff

## Security

- [ ] This change has no security impact

Without this, anyone who can reach the Guardian's port could write a
decision into the trace under a live session's ids by sending a
malformed envelope with those ids. A reader joining the Guardian's and
the host's streams by pair would then see a step that never happened. A
well-formed forgery or replay still gets through until PR #229 adds
signature, replay and timestamp checks. The README says so.

Signed-off-by: rocklambros <rock@rockcyber.com>

@rocklambros rocklambros left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seven commits match the body, checks are green, version stays 0.1.4. Merging with a merge commit.

@rocklambros
rocklambros merged commit b9e833a into main Oct 29, 2026
29 checks passed
@github-project-automation github-project-automation Bot moved this from In progress to Done in ACS Project Tracker Oct 29, 2026

This branch was successfully deployed

1 active deployment
board-automation — 599b1a33 Deployed Oct 29, 2026 by rocklambros via reconcile #44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

5 participants