Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
163 commits
Select commit Hold shift + click to select a range
cfad676
Plan: one declaration per bus read (#3537)
trissim Oct 27, 2026
9c0c6ae
Merge branch 'refactor/one-declaration-per-bus-read' of https://githu…
trissim Oct 27, 2026
c57a747
Declare bus reads once: BusRead family, notifications migrated
trissim Oct 27, 2026
3c23ca2
Merge remote-tracking branch 'origin/main' into work/claude-nra--P872
trissim Oct 27, 2026
36694a5
Merge remote-tracking branch 'origin/main' into work/claude-nra--P872
trissim Oct 28, 2026
b97957a
Merge remote-tracking branch 'origin/main' into work/claude-nra--P872
trissim Oct 28, 2026
1ab89e0
Merge remote-tracking branch 'origin/main' into work/claude-nra--P872
trissim Oct 28, 2026
3d3a357
Type counts are measured each comparison, never stored by content (#3…
trissim Oct 28, 2026
7326056
One goal-history record answers every boundary (#3538)
trissim Oct 28, 2026
36611e2
Input delivery is one owner-live read; MCP no longer answers without …
trissim Oct 28, 2026
c0821f5
Owner-read tests derive their cases and run the delivery read against…
trissim Oct 28, 2026
e607be5
Merge remote-tracking branch 'origin/main' into work/claude-nra--P872
trissim Oct 28, 2026
a4702b1
Owner reads admit only native owners and keep the incarnation they we…
trissim Oct 28, 2026
08263a4
Owner reads are held to their owner's lifetime: real EOF, root, recre…
trissim Oct 28, 2026
5c26262
The runtime envelope owns the owner exchange; the read capability sto…
trissim Oct 28, 2026
9bb8b2e
Owner-read fixtures drive the real async observer and the real deleti…
trissim Oct 28, 2026
8d21db4
A stale owner is refused as identity-changed before its process is as…
trissim Oct 28, 2026
21b0755
Notification reads are root-free operations; the UI envelope carries …
trissim Oct 28, 2026
975e4c9
Separate source qualification from head promotion
trissim Oct 28, 2026
7bcb1ca
Notification activity holds only projected participants; HistorySourc…
trissim Oct 28, 2026
c1d46c7
Cover qualification without promotion through real review fixtures
trissim Oct 28, 2026
5bcc78d
Read-state fixture watches native recipients, not the whole team (#3538)
trissim Oct 28, 2026
3c9d127
Factor head-only review behavior into an abstract capability
trissim Oct 28, 2026
7b5c78a
Notification reads acquire only their viewer's claims; viewers receiv…
trissim Oct 28, 2026
2e8db82
Controls for viewer-scoped evidence and published-only thread present…
trissim Oct 28, 2026
5126bc6
Presentations construct from their declared fields inline; forced-bat…
trissim Oct 28, 2026
ef1ae76
Forced-batch control lowers the limit only as far as schema validatio…
trissim Oct 28, 2026
5a8d979
Bind review patch identity to immutable integration source metadata
trissim Oct 28, 2026
ed6ff38
Sent summaries aggregate at their owner; the changed accumulator keep…
trissim Oct 28, 2026
7fff19b
Merge remote-tracking branch 'origin/main' into work/claude-nra--P872
trissim Oct 28, 2026
ffe8bd2
BusRead owns apply once; the reply test reads a read's result from it…
trissim Oct 28, 2026
780b995
Commander detail is one root-free shared read, comms_commander_unit (…
trissim Oct 28, 2026
1c8b7e8
The owner's goal is one owner-live read, comms_owner_goal (#3538)
trissim Oct 28, 2026
d92c063
A transcript page is one root-free shared read, comms_transcript_page…
trissim Oct 28, 2026
d5b7376
MCP answers a commander-detail branch refusal as a failed call; share…
trissim Oct 28, 2026
f675fbe
MCP answers a corrupt transcript as a failed call; tests send tool ar…
trissim Oct 28, 2026
be79ae6
Capture matched source trees and guard final carrier review at their …
trissim Oct 28, 2026
09a506d
Merge remote-tracking branch 'origin/main' into work/checkout-caller-…
trissim Oct 28, 2026
c3c7912
Use the checkout lifecycle for matched source materialization
trissim Oct 28, 2026
701b587
TranscriptSnapshotUpdate.from_read declares its read and result
trissim Oct 28, 2026
5ed8ac7
debt ratchet: introduced occurrences are the one clean-lines gate; fi…
trissim Oct 28, 2026
908db01
debt ratchet: one lexical binding owner; a missing introduced report …
trissim Oct 28, 2026
13c7b05
Resolve actual CI source graphs and retain registered companion PR links
trissim Oct 28, 2026
1372658
debt ratchet: extracted field types compare by the owner they are bou…
trissim Oct 28, 2026
ebe43ce
Compare clients from their matched source cuts through the measure fa…
trissim Oct 28, 2026
1ea8ab3
debt ratchet: the held-class edge and Annotated strip read in class s…
trissim Oct 28, 2026
7577385
debt ratchet: ScopeNames decodes bindings; credit is keyed by the nod…
trissim Oct 28, 2026
037d6be
Build one checker environment for the captured source tuple in hosted CI
trissim Oct 28, 2026
1467ea1
Lock the TOML writer used by isolated checker preparation
trissim Oct 28, 2026
9a477db
Derive checker package contracts from standard backend wheel metadata
trissim Oct 28, 2026
e3d4ab0
Solve checker and runtime roots together with owned pin retention
trissim Oct 28, 2026
4fccef4
Retain locked Git package subdirectories through private resolution
trissim Oct 28, 2026
3707bf4
Seed source fixtures before publishing their main and PR history
trissim Oct 28, 2026
e85857b
Merge remote-tracking branch 'origin/main' into work/checkout-caller-…
trissim Oct 28, 2026
1753f48
Own checker UV, Git and CI input boundaries in their declarations
trissim Oct 28, 2026
a963f32
Merge commit '75773856d9fa346a9db6d5644c6a6d4401743f69' into work/che…
trissim Oct 28, 2026
b89b358
Preserve native UV source contracts and share proved decoder traversal
trissim Oct 28, 2026
f215c75
Merge remote-tracking branch 'origin/main' into work/checkout-caller-…
trissim Oct 28, 2026
19f7998
Validate retained UV options through their existing model boundary
trissim Oct 28, 2026
214fe3c
Merge remote-tracking branch 'origin/main' into work/checkout-caller-…
trissim Oct 28, 2026
e2416c2
Preserve explicit checker runtime and decorator evaluation position
trissim Oct 28, 2026
810c8c9
Acknowledge verified selected native context during the running turn
trissim Oct 28, 2026
1e2e8b5
Keep harness admission distinct from complete original context evidence
trissim Oct 28, 2026
d170348
Import ClassFact from its declaration
trissim Oct 28, 2026
1fd3f86
Keep wake-only Monitor observations outside original-body proof
trissim Oct 28, 2026
aa249db
Cover grouped context acknowledgement and foreign input refusal
trissim Oct 28, 2026
4ccbcf8
Remove unused changed-path contract from client source policy
trissim Oct 28, 2026
c332f12
Cover later corroborated requests retaining the first receipt
trissim Oct 28, 2026
47e0c03
Retain independently verified context on each actual following input
trissim Oct 29, 2026
3acb842
Cover live triage context before independent verdict and failure
trissim Oct 29, 2026
5f7ab48
Separate native input proof declarations from session execution
trissim Oct 29, 2026
3312938
Share verified input context across ordinary and selected native turns
trissim Oct 29, 2026
99f25a0
Merge remote-tracking branch 'origin/main' into work/checkout-caller-…
trissim Oct 29, 2026
6fba9a2
Derive client checker import roots from each captured project
trissim Oct 29, 2026
f38af5e
Bound notification recipients before claim proof and reply acquisition
trissim Oct 29, 2026
08b2149
Use retained receipt timing in historical notification controls
trissim Oct 29, 2026
67ffdb3
Merge remote-tracking branch 'origin/main' into work/checkout-caller-…
trissim Oct 29, 2026
29a5627
Join native proof fixture writes through the isolated worker
trissim Oct 29, 2026
04dce31
Separate reviewed source members from explicit combined-carrier promo…
trissim Oct 29, 2026
e7295c9
Project independent replies without context-taking claim eligibility
trissim Oct 29, 2026
fe0ca3c
Keep explicit merge permission out of persisted source-review records
trissim Oct 29, 2026
7fc1930
Project human read feedback from the captured display provenance
trissim Oct 29, 2026
2363746
Derive carrier gates, queue evidence and companion sources from their…
trissim Oct 29, 2026
c77254e
Declare real viewer fixture contracts and retain rename request identity
trissim Oct 29, 2026
87dabd8
Select the actual live bus in foreign display source controls
trissim Oct 29, 2026
02dd1ab
Derive contained orderless sources from saved root reviews
trissim Oct 29, 2026
d0a2e23
Merge remote-tracking branch 'origin/main' into work/message-state--P904
trissim Oct 29, 2026
0dd3db4
Own proof reads and notification types without execution import loops
trissim Oct 29, 2026
d333e46
Import Delivered for the annotations that name it
trissim Oct 29, 2026
3ca25ec
Merge origin/main
trissim Oct 29, 2026
820a40f
Merge origin/main into one-declaration-per-bus-read
trissim Oct 29, 2026
24a8c94
Merge one-declaration-per-bus-read (main merged)
trissim Oct 29, 2026
7645a30
A delivery decides who owes it an answer; read_basis imports Delivere…
trissim Oct 29, 2026
18a7b90
Integrate P904 #3572 into the P872/P883 read operations (queue-UI Cor…
trissim Oct 29, 2026
46bc60f
Merge origin/main
trissim Oct 29, 2026
d09fc16
Encode the native session entry id at its text column
trissim Oct 29, 2026
6e472d0
Declare transcript page bounds as PagePosition and PageLimit families
trissim Oct 29, 2026
6e5bdc2
Show model-consumed state for inputs a turn already took into context
trissim Oct 29, 2026
6c88a1d
Merge origin/main into the queue-core carrier
trissim Oct 29, 2026
13fec66
Integrate P924 #3581 into the queue carrier
trissim Oct 29, 2026
2a9693b
Keep #3581's one real P924 control and delete its restated ones
trissim Oct 29, 2026
22c0ef7
Own queue evidence, source selection and answer presentation in their…
trissim Oct 29, 2026
d06847a
Choose painted cursor work before opening the read transaction
trissim Oct 29, 2026
9021283
Put carrier construction and notification answers on their actual owners
trissim Oct 29, 2026
144d49e
Declare native journal membership on its proof file and reuse display…
trissim Oct 29, 2026
7fe707f
Keep native journal rows separate from their file family
trissim Oct 29, 2026
3a5e351
Merge remote-tracking branch 'origin/main' into fix/queue-core
trissim Oct 29, 2026
bca4494
Close notification selection and native proof ownership across consumers
trissim Oct 29, 2026
fcafb8e
Merge current main into queue carrier
trissim Oct 29, 2026
9da9af0
Let native values supply their recorded session without redecoding
trissim Oct 29, 2026
db0b3be
Merge current main into queue carrier
trissim Oct 29, 2026
6e17149
Watch every notification evidence store and keep session decoding on …
trissim Oct 29, 2026
4a27c24
Use Repo explicit commit acquisition across integration sources
trissim Oct 29, 2026
54f33ce
Merge remote-tracking branch 'origin/main' into fix/queue-core
trissim Oct 29, 2026
fed0de8
Merge remote-tracking branch 'origin/main' into fix/queue-core
trissim Oct 29, 2026
7035ada
Own source roles, verdict recording and repository acquisition
trissim Oct 29, 2026
61c119e
Merge remote-tracking branch 'origin/main' into fix/queue-core
trissim Oct 29, 2026
f8d56de
Use the real source remote path in integration fixtures
trissim Oct 29, 2026
d09e763
Prepare both captured heads before comparing companion identities
trissim Oct 30, 2026
a6af685
Merge origin/main into #3566: resolve 8 conflicts
trissim Oct 30, 2026
a974c0f
CI: debt_ratchet.py takes no --ci-inputs after #3606
trissim Oct 30, 2026
a7ab81e
Ratchet clients: pass uv, python and install commands to StackClient.…
trissim Oct 30, 2026
d58c89e
Merge remote-tracking branch 'origin/main' into HEAD
trissim Oct 30, 2026
0cbcd54
Merge remote-tracking branch 'origin/main' into fix/queue-core
trissim Oct 30, 2026
cf7aa55
Ratchet clients: the project owns its ClientSources; --ci-inputs read…
trissim Oct 30, 2026
88c2ea1
Merge pull request #3630 from OpenHCSDev/claude-nra/ratchet-ci-inputs
trissim Oct 30, 2026
b0b96ee
Merge remote-tracking branch 'origin/claude-nra/ratchet-ci-inputs' in…
trissim Oct 30, 2026
9e64e6c
Merge remote-tracking branch 'origin/main' into HEAD
trissim Oct 30, 2026
4bf4029
Ratchet clients: each cut declares the audit side it materializes
trissim Oct 30, 2026
30ad93b
RecipientLimit.schema answers the JsonValue schema its owner declares
trissim Oct 30, 2026
3d6c444
Merge remote-tracking branch 'origin/work/checkout-caller--P883' into…
trissim Oct 30, 2026
dd2a2bd
Publication context reads its ids from the tracked user it requires
trissim Oct 30, 2026
8ed16a7
Merge remote-tracking branch 'origin/work/checkout-caller--P883' into…
trissim Oct 30, 2026
c75293d
Ratchet cut keeps its typed tuple over the untyped client source
trissim Oct 30, 2026
20fbacd
ClientTypeErrors measures AgentCommsProject through the audit's proje…
trissim Oct 30, 2026
592b646
Merge pull request #3637 from OpenHCSDev/claude-nra/generic-client-me…
trissim Oct 30, 2026
01bbd22
Merge remote-tracking branch 'origin/work/checkout-caller--P883' into…
trissim Oct 30, 2026
d2bee31
Merge remote-tracking branch 'origin/main' into fix/queue-core
trissim Oct 30, 2026
7924d42
Move notification acquisition to its captured source window
trissim Oct 30, 2026
781df32
Merge remote-tracking branch 'origin/main' into fix/queue-core
trissim Oct 30, 2026
6da91b8
Merge remote-tracking branch 'origin/main' into fix/queue-core
trissim Oct 30, 2026
8ebfc1e
Expose native proof imports and use nominal recipient contracts
trissim Oct 30, 2026
07e2051
Merge current NRA migration without losing paired source cuts
trissim Oct 30, 2026
ba453b2
Finish runtime evidence imports after removing the event dependency
trissim Oct 30, 2026
e2685d9
Keep checker source identity independent of its executor and finish e…
trissim Oct 30, 2026
27fc891
Merge remote-tracking branch 'origin/main' into fix/queue-core
trissim Oct 30, 2026
01c9034
Compare detached evidence on both sides of the bounded capture control
trissim Oct 30, 2026
7561946
Merge main carry refusal through its verdict owner and existing fixtu…
trissim Oct 30, 2026
15e97d3
Merge missing-checkout detection without restoring removed Repo goal …
trissim Oct 30, 2026
94a2e41
Merge remote-tracking branch 'origin/main' into fix/queue-core
trissim Oct 30, 2026
a16eee9
Own metadata acquisition lifetime without carrying executors into mea…
trissim Oct 30, 2026
95fffc5
Merge remote-tracking branch 'origin/main' into fix/queue-core
trissim Oct 30, 2026
91926c9
Merge remote-tracking branch 'origin/main' into fork/integ-3566
trissim Oct 30, 2026
a201523
Compare frozen recipients by the dataclass they already are
trissim Oct 30, 2026
ce1d368
Declare the goal history reply and wake confirmation by their supertypes
trissim Oct 30, 2026
d6ab917
Merge remote-tracking branch 'origin/main' into fork/integ-3566
trissim Oct 30, 2026
0d2f372
Merge origin/main 2a9802399 into the queue carrier
trissim Oct 30, 2026
df94d17
Merge remote-tracking branch 'origin/main' into fork/integ-3566
trissim Oct 30, 2026
3ef392d
Merge remote-tracking branch 'origin/main' into fork/integ-3566
trissim Oct 30, 2026
b553ecc
Let a pull request's checks keep the bases they captured
trissim Oct 30, 2026
37a5230
Merge remote-tracking branch 'origin/main' into fork/integ-3566
trissim Oct 30, 2026
e568e33
Keep recipient lookups on the cycle-free identity type
trissim Oct 30, 2026
7686ece
Merge remote-tracking branch 'origin/main' into fork/integ-3566
trissim Oct 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 29 additions & 3 deletions .github/workflows/nra-gate-cache.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,18 @@ on:

permissions:
contents: read
pull-requests: read

# GitHub's actor supplies only Git object attribution, never merge permission.
# Process-scoped configuration reaches merge/commit-tree without changing any checkout.
env:
GIT_AUTHOR_NAME: ${{ github.actor }}
GIT_AUTHOR_EMAIL: ${{ github.actor_id }}+${{ github.actor }}@users.noreply.github.com
GIT_COMMITTER_NAME: ${{ github.actor }}
GIT_COMMITTER_EMAIL: ${{ github.actor_id }}+${{ github.actor }}@users.noreply.github.com
GIT_CONFIG_COUNT: "1"
GIT_CONFIG_KEY_0: commit.gpgsign
GIT_CONFIG_VALUE_0: "false"

concurrency:
group: nra-gate-cache
Expand All @@ -32,12 +44,20 @@ jobs:
with:
python-version-file: pyproject.toml

- name: Install agent-comms
- name: Bootstrap only Core and locked checker dependencies
run: |
python -m pip install packaging
python -m pip install "$(python -I src/agent_comms/installer/declared_uv.py pyproject.toml)"
uv sync --locked --all-extras
echo "$GITHUB_WORKSPACE/.venv/bin" >> "$GITHUB_PATH"
UV_PROJECT_ENVIRONMENT="$RUNNER_TEMP/checker-venv" uv sync --locked --all-extras
echo "$RUNNER_TEMP/checker-venv/bin" >> "$GITHUB_PATH"

- name: Resolve main's actual merged source tuple once
env:
GH_TOKEN: ${{ github.token }}
run: PYTHONPATH=src python -m agent_comms.integration --resolve-ci-inputs "$RUNNER_TEMP/paired-sources"

- name: Build the one common checker environment
run: PYTHONPATH=src:tools python tools/checker_stack.py --ci-inputs "$RUNNER_TEMP/paired-sources"

- uses: actions/cache/restore@v4
with:
Expand All @@ -49,8 +69,14 @@ jobs:
- name: Measure main against its parent
run: |
PYTHONPATH=src:tools python tools/nra_gate.py \
--ci-inputs "$RUNNER_TEMP/paired-sources" \
--root ${{ matrix.kind }} --base HEAD^1 --head HEAD || true

- name: The same sources are still current before saving cache
env:
GH_TOKEN: ${{ github.token }}
run: PYTHONPATH=src python -m agent_comms.integration --revalidate-ci-inputs "$RUNNER_TEMP/paired-sources"

- uses: actions/cache/save@v4
with:
path: ~/.cache/agent-comms
Expand Down
118 changes: 83 additions & 35 deletions .github/workflows/nra-gate.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,17 @@ on:
permissions:
contents: read

# Materialization merges and tree proofs create Git objects; every child inherits this
# process-only identity/signing policy. No global or shared repository config is written.
env:
GIT_AUTHOR_NAME: ${{ github.actor }}
GIT_AUTHOR_EMAIL: ${{ github.actor_id }}+${{ github.actor }}@users.noreply.github.com
GIT_COMMITTER_NAME: ${{ github.actor }}
GIT_COMMITTER_EMAIL: ${{ github.actor_id }}+${{ github.actor }}@users.noreply.github.com
GIT_CONFIG_COUNT: "1"
GIT_CONFIG_KEY_0: commit.gpgsign
GIT_CONFIG_VALUE_0: "false"

# A superseded push to a pull request stops its old run; queue groups never share a group.
# The draft state is part of the key: a draft run skips every job but the NRA gate, so one that
# starts in the same second as ready_for_review must not cancel the ready run (#3164 and #3154 lost
Expand All @@ -34,27 +45,36 @@ jobs:
- run: true
shell: bash

# The base every job measures from, drafts included. A pull request checks out its merge into
# current main, so the base is that merge's first parent; pull_request.base.sha is main when the
# PR was opened, and measuring from it charges the PR with everything main merged since.
# The native event/source reader owns both the comparison base and combined-job selection.
# Ordinary sources still get diagnostics; naming a branch batch/ grants nothing.
base:
runs-on: ubuntu-latest
timeout-minutes: 1
timeout-minutes: 5
permissions:
contents: read
pull-requests: read
outputs:
base: ${{ steps.base.outputs.base }}
base: ${{ steps.sources.outputs.base }}
combined: ${{ steps.sources.outputs.combined }}
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 2
- id: base
shell: bash
submodules: recursive
fetch-depth: 0
- uses: actions/setup-python@v5
with:
python-version-file: pyproject.toml
- name: Install the native source-input reader
run: python -m pip install -e .
- name: Derive job selection from the actual tested sources
id: sources
env:
QUEUE_BASE: ${{ github.event.merge_group.base_sha }}
run: echo "base=${QUEUE_BASE:-$(git rev-parse HEAD^1)}" >> "$GITHUB_OUTPUT"
GH_TOKEN: ${{ github.token }}
run: PYTHONPATH=src python -m agent_comms.integration --resolve-ci-inputs "$RUNNER_TEMP/job-sources" --workflow-output "$GITHUB_OUTPUT"

smoke:
needs: [ready, base]
if: github.event_name == 'merge_group' || startsWith(github.head_ref, 'batch/')
if: needs.base.outputs.combined == 'true'
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
Expand All @@ -64,8 +84,18 @@ jobs:
- uses: actions/setup-python@v5
with:
python-version-file: pyproject.toml
- name: Install agent-comms and test dependencies
run: python -m pip install -e '.[dev]'
- name: Bootstrap only Core and locked checker dependencies
run: |
python -m pip install packaging
python -m pip install "$(python -I src/agent_comms/installer/declared_uv.py pyproject.toml)"
UV_PROJECT_ENVIRONMENT="$RUNNER_TEMP/checker-venv" uv sync --locked --all-extras
echo "$RUNNER_TEMP/checker-venv/bin" >> "$GITHUB_PATH"
- name: Resolve the actual tested source tuple once
env:
GH_TOKEN: ${{ github.token }}
run: PYTHONPATH=src python -m agent_comms.integration --resolve-ci-inputs "$RUNNER_TEMP/paired-sources"
- name: Build the one common checker environment
run: PYTHONPATH=src:tools python tools/checker_stack.py --ci-inputs "$RUNNER_TEMP/paired-sources"
- name: Compile production and tools
run: python -m compileall -q src tools
- name: Import every Core and hook module
Expand All @@ -89,7 +119,11 @@ jobs:
- name: Stack clients import only names Core has; the outgoing wire matches the base
env:
BASE: ${{ needs.base.outputs.base }}
run: python tools/module_layers.py --check --base "$BASE" --report "$GITHUB_STEP_SUMMARY"
run: PYTHONPATH=src:tools python tools/module_layers.py --check --base "$BASE" --ci-inputs "$RUNNER_TEMP/paired-sources" --report "$GITHUB_STEP_SUMMARY"
- name: The same sources are still current before success
env:
GH_TOKEN: ${{ github.token }}
run: PYTHONPATH=src python -m agent_comms.integration --revalidate-ci-inputs "$RUNNER_TEMP/paired-sources"

native-scripts:
name: native-scripts
Expand All @@ -116,7 +150,7 @@ jobs:
install-rehearsal:
name: install-rehearsal
needs: [ready, base]
if: github.event_name == 'merge_group' || startsWith(github.head_ref, 'batch/')
if: needs.base.outputs.combined == 'true'
runs-on: ubuntu-latest
timeout-minutes: 15
env:
Expand Down Expand Up @@ -158,26 +192,28 @@ jobs:
name: review-verdict
needs: ready
runs-on: ubuntu-latest
timeout-minutes: 2
timeout-minutes: 5
permissions:
statuses: read
contents: read
statuses: write
pull-requests: read
env:
GH_TOKEN: ${{ github.token }}
QUEUE_REF: ${{ github.event.merge_group.head_ref }}
steps:
# A pull request is pushed before its verdict exists; the queue's group
# is where the commander's verdict on the head must already be success.
- name: The commander's verdict on the queued head is success
if: github.event_name == 'merge_group'
shell: bash
run: |
[[ $QUEUE_REF =~ /pr-([0-9]+)- ]]
head=$(gh api "repos/$GITHUB_REPOSITORY/pulls/${BASH_REMATCH[1]}" --jq .head.sha)
verdict=$(gh api "repos/$GITHUB_REPOSITORY/commits/$head/status" \
--jq '[.statuses[] | select(.context == "agent-comms/review")][0].state // "none"')
echo "PR #${BASH_REMATCH[1]} head $head: agent-comms/review=$verdict"
[[ $verdict == success ]]
- uses: actions/checkout@v4
with:
submodules: recursive
fetch-depth: 0
- uses: actions/setup-python@v5
with:
python-version-file: pyproject.toml
- name: Install the native source-input reader
run: python -m pip install -e .
# The PR check proves a separate combined carrier and exact reviewed members.
# The queue additionally requires the root's explicit promotion at this head.
# A hand gh auto-merge request cannot turn source acceptance into that permission.
- name: Only the captured combined carrier may merge
run: PYTHONPATH=src python -m agent_comms.integration --check-merge-inputs "$RUNNER_TEMP/merge-inputs"

nra-gate:
name: debt-${{ matrix.kind }}
Expand All @@ -200,14 +236,20 @@ jobs:
with:
python-version-file: pyproject.toml

- name: Install agent-comms
- name: Bootstrap only Core and locked checker dependencies
run: |
python -m pip install packaging
python -m pip install "$(python -I src/agent_comms/installer/declared_uv.py pyproject.toml)"
uv lock --project stack --upgrade
UV_PROJECT_ENVIRONMENT="$GITHUB_WORKSPACE/.venv" uv sync --project stack --locked
uv pip install --python "$GITHUB_WORKSPACE/.venv/bin/python" -e '.[dev]'
echo "$GITHUB_WORKSPACE/.venv/bin" >> "$GITHUB_PATH"
UV_PROJECT_ENVIRONMENT="$RUNNER_TEMP/checker-venv" uv sync --locked --all-extras
echo "$RUNNER_TEMP/checker-venv/bin" >> "$GITHUB_PATH"

- name: Resolve the actual tested source tuple once
env:
GH_TOKEN: ${{ github.token }}
run: PYTHONPATH=src python -m agent_comms.integration --resolve-ci-inputs "$RUNNER_TEMP/paired-sources"

- name: Build the one common checker environment
run: PYTHONPATH=src:tools python tools/checker_stack.py --ci-inputs "$RUNNER_TEMP/paired-sources"

# Saved by nra-gate-cache.yml on main; entries are keyed by content, so any
# older main's cache only misses where the code differs.
Expand All @@ -224,10 +266,16 @@ jobs:
set -o pipefail
gate_status=0
PYTHONPATH=src:tools python tools/nra_gate.py \
--ci-inputs "$RUNNER_TEMP/paired-sources" \
--root ${{ matrix.kind }} --base "$BASE" --head HEAD 2>gate-findings.txt | tee gate.txt || gate_status=$?
cat gate-findings.txt >&2
exit "$gate_status"

- name: The same sources are still current before success
env:
GH_TOKEN: ${{ github.token }}
run: PYTHONPATH=src python -m agent_comms.integration --revalidate-ci-inputs "$RUNNER_TEMP/paired-sources"

# Hosted annotations stop at ten per step, so a unit never saw a long list (88 findings
# on the bus batch, 2026-10-21). The whole list goes on the pull request, one comment per
# kind, replaced on every run.
Expand Down
1 change: 1 addition & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ dev = [
"ruff==0.16.0",
"mypy==2.3.0",
"uv==0.13.1",
"tomli-w==1.2.0",
]

[project.urls]
Expand Down
20 changes: 11 additions & 9 deletions src/agent_comms/acp_extension.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
"""Declared Comms facts carried by the external ACP metadata envelope.

These records are shared with the paired Toad client. They describe observations;
Expand All @@ -12,7 +12,7 @@

from abc import abstractmethod
from dataclasses import dataclass, field, replace
from typing import TYPE_CHECKING, Annotated, Callable, ClassVar
from typing import TYPE_CHECKING, Annotated, Callable, ClassVar, Self


from .acp_failure import (
Expand Down Expand Up @@ -52,8 +52,10 @@
from .reported_turn import ReportedTurn, ReportedTurnState
from .routing import MessageRoute, NoMessageRoute
from .thread_identity import ClaimScoped, ThreadIncarnation
from .tool_result import DeclaredReply
from .transcripts import NativeCommittedPrefix, TranscriptCursor, TranscriptPage, TranscriptReadIdentity
from .tool_result import ToolResult
from .transcripts import (
LivePageSource, NativeCommittedPrefix, PageSource, TranscriptCursor, TranscriptPage, TranscriptRead, TranscriptReadIdentity,
)
from .turn_context import ContextManifest
from .turn_lease import TurnState
from .working_memory_labels import ModelLabel
Expand Down Expand Up @@ -107,7 +109,7 @@

@dataclass(frozen=True)
class TranscriptChangedUpdate(AgentCommsUpdate):
cursor: TranscriptCursor | None
cursor: TranscriptCursor


class ClaimBlockedFailure(BackendDeliveryFailure):
Expand Down Expand Up @@ -138,7 +140,7 @@


@dataclass(frozen=True)
class GoalSnapshotReply(DeclaredReply, GoalSnapshot):
class GoalSnapshotReply(ToolResult, GoalSnapshot):
"""A goal request's reply: the owner's goal snapshot and its turn state."""

execution: Annotated[GoalExecution, WireName("goalExecution")]
Expand Down Expand Up @@ -698,20 +700,20 @@


@dataclass(frozen=True)
class TranscriptSnapshotUpdate(AgentCommsUpdate):
class TranscriptSnapshotUpdate(AgentCommsUpdate, ToolResult):
page: TranscriptPage
identity: TranscriptReadIdentity
draft: DraftRow | None = None

@classmethod
def from_read(cls, read):
def from_read(cls, read: TranscriptRead) -> Self:
page, draft = read.read_snapshot()
return cls(page, read.identity, draft.external_row())

@classmethod
def capture(cls, transcripts, name, *, historical_source=None):
def capture(cls, transcripts, name, *, page_source: PageSource = LivePageSource()):
"""Publish the page together with the source witness that read it."""
read = transcripts.capture_page_read(name, historical_source=historical_source)
read = transcripts.capture_page_read(name, page_source=page_source)
return cls.from_read(read)


Expand Down
4 changes: 2 additions & 2 deletions src/agent_comms/agent_activity.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
"""Activity, runtime metadata and local turn lease ownership."""

from __future__ import annotations
Expand Down Expand Up @@ -32,7 +32,7 @@
NoDrainDiagnostic,
ObservedActivity,
)
from .audience_manifest import FrozenRecipient
from .participant_identity import FrozenRecipientIdentity
from .coordinator import Coordination
from .declared_family import DeclaredFamily
from .errors import RelationViolationError
Expand Down Expand Up @@ -169,7 +169,7 @@
return ActivityCapture(observed, events.expires_at)

def observe_recipients(
self, recipients: Iterable[tuple[Delivered, FrozenRecipient]], *,
self, recipients: Iterable[tuple[Delivered, FrozenRecipientIdentity]], *,
snapshot: RegistrySnapshot,
) -> Mapping[ThreadLookup, RecipientActivity]:
"""Acquire one bounded window's recipients from the original sends."""
Expand Down
10 changes: 10 additions & 0 deletions src/agent_comms/agent_backend.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
"""Agent runtimes behind one interface: the AgentBackend family and its records.

A thread names its backend (``Thread.backend``). Core asks that backend for
Expand Down Expand Up @@ -29,6 +29,7 @@
from .declared_family import DeclaredFamily
from .field_codec import InputId
from .image_input import ImageInput
from .native_input_proof import NativeContextProof
from .pi_counts import PiCount
from .pi_vocabulary import CompactionReason, ThinkingLevelField
from .session_revision import NoSessionObservation, SessionObservation
Expand Down Expand Up @@ -316,6 +317,15 @@
def following(self, public_id: InputId, native_id: InputId, text: str) -> bool: ...


async def original_context_committed(self, sent_text: str, context: NativeContextProof) -> None:
"""An unowned input has no durable ordinary disposition to acknowledge."""

async def following_context_committed(
self, public_id: InputId, sent_text: str, context: NativeContextProof,
) -> None:
"""An unowned following input has no durable ordinary disposition."""


class NoInputStartListener(InputStartListener):
started_events = ()

Expand Down
Loading
Loading