Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
155 commits
Select commit Hold shift + click to select a range
45f9785
Add channel and thread filtering to message broker (#293)
ptone Jun 2, 2026
d54278d
Fix test suite leaking Hub credentials, corrupting agent state (#296)
ptone Jun 2, 2026
e64a1a7
docs: document REGION and ZONE overrides in starter-hub README
ptone Jun 3, 2026
b2eaa59
fix: use sudo to check repository path existence in gce-demo-setup-re…
ptone Jun 3, 2026
5d21b25
cmd: fix nil-pointer panic in harness-config when Hub is disabled
ptone Jun 3, 2026
26caeb9
scripts/starter-hub: add MACHINE_TYPE override support to provision s…
ptone Jun 3, 2026
e4585dc
docs: add external channels, GCE hub setup, and multi-broker guides (…
zeroasterisk Jun 3, 2026
c5143bc
Add sort and filter to agent list view (#297)
ptone Jun 3, 2026
0ede010
Add prominent disconnected overlay to web terminal (#295)
ptone Jun 3, 2026
f7e0109
feat(store): Postgres backend — pgx driver, Ent schema parity, full s…
ptone Jun 5, 2026
b1f08a0
Restore contents of .scion as before the recent pull
ptone Jun 5, 2026
d1a01c7
Remove scratchpad markdown files as requested
ptone Jun 5, 2026
afaae9a
Organize developer tools into hack and fix build config
ptone Jun 5, 2026
36efc16
fix(sciontool/hub): prevent token-file test from clobbering live agen…
ptone Jun 5, 2026
eeee331
feat(hub): multi-node broker dispatch — affinity, durable intent, lif…
ptone Jun 5, 2026
02efd44
feat(runtime): NFS-coordinated workspace sharing across nodes (Model …
ptone Jun 5, 2026
3aab748
fix: prevent stale disconnect from marking reconnected broker offline…
ptone Jun 5, 2026
e04d431
feat: resource clone & delete with authz hardening (#301)
ptone Jun 5, 2026
0c5ba2d
fix: multi-node session fixes + Cloud Run deployment (#309)
ptone Jun 5, 2026
05ef2ba
Guard hub agent phase transitions against spurious session lifecycle …
ptone Jun 5, 2026
c177a86
Fix TestDeleteStopped_RequiresGroveContext failing in hub environment…
ptone Jun 5, 2026
2c3d45c
Fix agent list task overflow and unify action buttons (#311)
ptone Jun 5, 2026
ca7701b
feat(hub): auth proxy mode (Google IAP) (#310)
ptone Jun 5, 2026
6d2e868
fix: resolve workspace file browser to groves/ instead of projects/ (…
ptone Jun 5, 2026
59e7304
fix(hub): allow agents to create sub-agents (drop User FK on created_…
ptone Jun 6, 2026
fe5bc87
Add health-debug to sciontool and a feature to repair-inject auth int…
ptone Jun 6, 2026
41a40f1
Add Reset Auth button to agent detail page UI
Jun 6, 2026
9c6a131
fix: add more of the triage-remediation for broken auth during upgrad…
ptone Jun 6, 2026
87c0487
fix(hub): use deterministic UUID for plugin broker IDs to match α mig…
ptone Jun 6, 2026
a3a7530
fix(hub): address PR #319 review feedback (#319)
ptone Jun 6, 2026
a204880
fix(hub): multi-node session fixes — OAuth state_mismatch + shared si…
ptone Jun 6, 2026
e0d8fcb
build(deps-dev): bump postcss in /extras/agent-viz/web (#203)
dependabot[bot] Jun 6, 2026
6016dcd
fix(ci): apply gofmt to fix CI format check (#324)
ptone Jun 6, 2026
a12d276
feat: enforce unique agent slugs within a project (#325)
ptone Jun 6, 2026
d36ec50
feat: add project rename support (#326)
ptone Jun 6, 2026
69ca824
chore: remove spurious files and add commit guidelines (#329)
ptone Jun 6, 2026
1c74f56
fix: resolve hub auth token expiry deadlock after signing-key rotatio…
ptone Jun 6, 2026
a7aeb08
fix: update scion-env on GitHub token refresh to prevent gh CLI 401s …
ptone Jun 6, 2026
d9eb95c
docs: generate daily release notes for May 29 - June 5, 2026 (#331)
ptone Jun 6, 2026
056e8f6
Project visibility via membership (subtractive model) (#332)
ptone Jun 6, 2026
b232fbb
fix(ci): add missing !no_sqlite build tag to signing_key_shared_test.…
ptone Jun 6, 2026
2b71d8c
automation: add cloud run deploy pattern for hub (#330)
ptone Jun 7, 2026
003d2a0
Discord chat (#333)
ptone Jun 7, 2026
e01216e
feat: auto-prefix bare email recipients with user: in scion message (…
ptone Jun 7, 2026
ce31734
Scion/fix auth reset self heal (#337)
ptone Jun 7, 2026
5122e03
fix: align hubManagedProjectPath to prefer projects/ over groves/ (#338)
ptone Jun 7, 2026
050c65f
fix(scion-telegram): update group_links on supergroup migration inste…
ptone Jun 7, 2026
7e3c1db
Scion/harness refactor (#336)
ptone Jun 7, 2026
2c2db6f
fix: remove unused _linkedDiscordId property to fix typecheck CI (#340)
ptone Jun 7, 2026
b2b2ba2
fix(hub): carry channel and thread_id through outbound message API (#…
ptone Jun 7, 2026
c92d272
feat(agent-viz): add Agent Communications transcript panel (#342)
ngtanthanh-qc Jun 7, 2026
44b492f
Extract standalone provisionShared from nfsBackend.Provision
ptone Jun 7, 2026
3c4c97a
Remove Provision from WorkspaceBackend interface
ptone Jun 7, 2026
7928d2b
Retarget provisioning tests to call provisionShared directly
ptone Jun 7, 2026
f6f0913
Document Tier-3 mount-type seam for future vendor types
ptone Jun 7, 2026
7918a16
docs(runtime): drop stale Provision reference from localBackend comment
ptone Jun 7, 2026
3cee66c
Export provisionShared → ProvisionShared for CLI subcommand access
ptone Jun 7, 2026
552b52b
Add SentinelDir field to ProvisionInput for k8s mount constraint
ptone Jun 7, 2026
e5d440f
Add sciontool provision subcommand for k8s init container
ptone Jun 7, 2026
a719bae
Rewire buildPod init container to invoke sciontool provision
ptone Jun 7, 2026
d638b67
Delete retired shell scripts, update init-container tests
ptone Jun 7, 2026
6b7c6b3
Extract Tier-1 provisioning to config-free pkg/provision leaf package
ptone Jun 7, 2026
e28abcb
fix(provision): guard chown target against filesystem root in init-co…
ptone Jun 7, 2026
9db77e6
style(provision): rename stale 'nfsBackend.Provision:' log prefixes t…
ptone Jun 7, 2026
50c029e
fix(provision): propagate context.Context through provisioning path
ptone Jun 7, 2026
6029c60
fix(ci): resolve golangci-lint errcheck and gofmt failures (#346)
ptone Jun 7, 2026
0c1353e
Add cloudrun-volume and gke-shared-volume mount types (#169)
ptone Jun 7, 2026
6ecd613
Add Realize variants and backends for cloudrun-volume and gke-shared-…
ptone Jun 7, 2026
21d3743
Add Cloud Run runtime with broker-side direct provisioning (#169)
ptone Jun 7, 2026
4980b3b
docs(cloudrun): explain why SharingModeSharedPlain is fixed in provis…
ptone Jun 7, 2026
ba79900
fix: prevent test suite from leaking hub status updates and telemetry…
ptone Jun 7, 2026
00ddd69
feat(worktree): adapt Phase 1 onto pkg/provision (post-#169) (#350)
ptone Jun 7, 2026
1207bd7
Further work to support worktrees on hub (#351)
ptone Jun 8, 2026
24b2609
fix(worktree): accept .git file (not just dir) when detecting shared …
ptone Jun 8, 2026
b40cd05
Shared-worktree refcount / last-sharer teardown (#168) (#353)
ptone Jun 8, 2026
0150c38
Agent state & container lifecycle fixes (#354)
ptone Jun 8, 2026
5a61445
Worktree-per-agent on Kubernetes (#356)
ptone Jun 8, 2026
b78a7c9
feat(hub): configurable agent lifecycle hooks (#357)
ptone Jun 8, 2026
7111125
docs: Scion/docs state lifecycle (#358)
ptone Jun 8, 2026
6024213
hot-fix: add auto-suspend controls to admin (#359)
ptone Jun 8, 2026
495f682
Scion/hot fix resume auth (#360)
ptone Jun 8, 2026
aa1a0a5
Address PR #359 review feedback
ptone Jun 8, 2026
64cc8f2
fix: route metadata server GCP token requests through hub client
ptone Jun 8, 2026
127cc00
fix: remove unconditional auto-suspend handler that bypassed toggle
ptone Jun 8, 2026
5019de2
fix: initialize hub client before metadata server to eliminate data race
ptone Jun 8, 2026
4752f3e
Fix: Skip OIDC metadata mode when SCION_METADATA_MODE is set. (#367)
ptone Jun 8, 2026
2640353
fix: reclaim metadata server port from stale instance on resume (#368)
ptone Jun 8, 2026
65c0703
fix: make metadata server Stop() synchronous and add same-process rec…
ptone Jun 8, 2026
2ff1c52
fix: treat signal-killed child as clean exit during intentional shutd…
ptone Jun 8, 2026
b6f6d78
fix: route colocated docker agents to bridge networking via Caddy dom…
ptone Jun 8, 2026
4433025
Changelog june 6,7 (#372)
ptone Jun 9, 2026
5326d01
fix(ci): apply gofmt to 7 files failing format check on main (#373)
ptone Jun 9, 2026
29ab8ae
chore: update codex harness default model to gpt-5.5 (#374)
ptone Jun 9, 2026
8664cf2
fix: register missing harness-config import routes (#376)
ptone Jun 9, 2026
75d72cf
Support '!' prefix in broker messages as inline interrupt (#375)
ptone Jun 9, 2026
268638d
fix: unescape literal \n sequences in Telegram message formatting (#377)
ptone Jun 9, 2026
a987ac9
feat: enable scheduler write commands in agent mode, remove dispatch_…
ptone Jun 10, 2026
e10ee22
Add project/grove compatibility boundary (#380)
ptone Jun 10, 2026
3120fd7
fix: use recursive glob in sparse checkout to include home/ subdirect…
ptone Jun 10, 2026
882578a
fix: apply agent list UI improvements to project detail view (#383)
ptone Jun 10, 2026
942b510
feat: add test-login endpoint for integration testing (#382)
ptone Jun 10, 2026
39e6b8f
Use canonical project endpoints in integrations (#384)
ptone Jun 10, 2026
9758f9c
fix: use canonical project endpoints in remaining test fixtures and m…
ptone Jun 10, 2026
2dbbc3d
Centralize runtime project label compatibility (#386)
ptone Jun 10, 2026
387d827
fix: add legacy /groves route wrapper and request body compatibility …
ptone Jun 10, 2026
315f7ee
Centralize config project compatibility keys (#388)
ptone Jun 10, 2026
ee6ca4b
Fix file badge size inconsistency and missing settings page titles (#…
ptone Jun 10, 2026
3506eaa
tighten project compatibility literal guardrail and document contribu…
ptone Jun 10, 2026
343ec68
Fix harness config hydration pipeline: stamp ID/hash and thread to br…
ptone Jun 10, 2026
82a93be
Add challenge token auth to test-login endpoint (#392)
ptone Jun 10, 2026
93adda4
ci: enforce project compatibility literal guardrail in GitHub Actions…
ptone Jun 10, 2026
53b9623
Changelog updates (#396)
ptone Jun 10, 2026
c456a14
Fix compat-literals CI step failing due to missing ripgrep (#397)
ptone Jun 11, 2026
c3aa18e
feat: standalone Discord bot with gRPC for HA deployment (#395)
ptone Jun 11, 2026
bac7635
Scion/harness auth flow (#398)
ptone Jun 11, 2026
5542867
Scion/skill bank M1 (#399)
ptone Jun 11, 2026
69f80b4
fix(starter-hub): add project flag to gcloud iam service-accounts create
ptone Jun 11, 2026
76ffa9c
docs(discord): add guide for agent-led installation and setup
ptone Jun 11, 2026
904c5dc
docs(discord): improve agent-led installation with interactive detail…
ptone Jun 11, 2026
790f49c
docs(discord): fix configuration examples and add troubleshooting sec…
ptone Jun 11, 2026
bffaef0
docs(discord): refine agent prompt and add configuration checklist to…
ptone Jun 11, 2026
04b14a7
feat: add scion build CLI command for local harness container builds …
ptone Jun 11, 2026
722858d
Integration login endpoint followup pr (#400)
ptone Jun 11, 2026
5d47e7e
feat: wire hub OTel metrics pipeline with GCP Cloud Monitoring export…
ptone Jun 11, 2026
1efa5bd
fix: suppress commentary (TypeAssistantReply) messages in Discord (#405)
ptone Jun 11, 2026
8b93b43
harness-auth-flow Phase 2 (#404)
ptone Jun 12, 2026
d8b7fc6
Scion/harness local build p2 (#406)
ptone Jun 12, 2026
aa16b36
docs: add Observability section to glossary (infrastructure vs agent …
ptone Jun 12, 2026
5da221d
fix: correct runId JSON key mismatch in build polling (#410)
ptone Jun 12, 2026
f669f6d
Scion/skill bank m5 (#408)
ptone Jun 13, 2026
58f5d36
Scion/message improvements (#409)
ptone Jun 13, 2026
1edca56
fix: use net/mail.ParseAddress for stricter email validation (#411)
ptone Jun 13, 2026
c7e976d
build(deps): bump esbuild and vite in /web (#413)
dependabot[bot] Jun 13, 2026
d6e1ba1
skill-bank M5: fix SQLite pin compatibility and skill name validation…
ptone Jun 13, 2026
2afa0e4
Add filter/sort to project detail agent list (#414)
ptone Jun 13, 2026
fb67191
Fix duplicate no_auth keys and missing field schema attribute (#412)
ptone Jun 13, 2026
4d25bbf
fix(ci): add esbuild as explicit dev dependency for Vite 7 (#416)
ptone Jun 13, 2026
ff87bb3
style: gofmt all unformatted Go source files (#417)
ptone Jun 13, 2026
4b7a775
fix: regenerate ent client to remove stale discordpendinglink import …
ptone Jun 13, 2026
6937998
Fix secret API base64 handling and store decoded values (#418)
ptone Jun 13, 2026
96c873d
feat: restore harness-config build UI and executor (#420)
ptone Jun 13, 2026
1cbc955
feat(a2a-bridge): multi-turn task lifecycle
zeroasterisk Jun 5, 2026
3ac4ae7
test(a2a-bridge): add multi-turn lifecycle tests
zeroasterisk Jun 5, 2026
cff41f7
fix(a2a-bridge): handle dropped state-changes + prevent janitor reaping
zeroasterisk Jun 6, 2026
e077366
fix(a2a-bridge): refactor multi-turn dispatch + add tests from debug …
zeroasterisk Jun 6, 2026
07ff0be
feat(a2a-bridge): follow-up messages on existing tasks
zeroasterisk Jun 5, 2026
680d86c
test(a2a-bridge): add follow-up message tests + fix cleanup bugs
zeroasterisk Jun 5, 2026
cfafc60
fix(a2a-bridge): add missing state updates in sendFollowUp blocking path
zeroasterisk Jun 6, 2026
487a4d8
fix(a2a-bridge): 4 fixes in sendFollowUp from debug review
zeroasterisk Jun 6, 2026
508bcce
fix: add ResetAuth to mock after upstream interface change
zeroasterisk Jun 7, 2026
bfdcc66
feat(a2a-bridge): advertise multi-turn capabilities
zeroasterisk Jun 5, 2026
0ca9348
test(a2a-bridge): add capability advertisement tests
zeroasterisk Jun 5, 2026
abbb7ec
fix(a2a-bridge): preserve input-required state on content messages an…
ptone Jun 13, 2026
326e497
Protect metadata shutdown endpoint (#422)
ptone Jun 13, 2026
3c33638
feat: add image_pinned to skip registry rewrite for custom images
zeroasterisk Jun 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
48 changes: 0 additions & 48 deletions .coordinator-state.md

This file was deleted.

81 changes: 81 additions & 0 deletions .design/a2a-multi-turn-lifecycle.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
# A2A Bridge: Multi-Turn Task Lifecycle

**Status:** Implementing
**Created:** 2026-06-05
**Related:** [a2a-bridge-design.md](./a2a-bridge-design.md)

---

## 1. Problem

The A2A bridge treats the first content message from a Scion agent as the final
response and immediately marks the task as `completed`, closing all streaming and
push notification subscriptions. This breaks multi-turn agent interactions where:

- An agent asks a clarifying question (`waiting_for_input` → user replies → agent continues)
- An agent sends progress updates before the final answer
- An agent emits interim artifacts during a long-running task

The bridge's TODO at `bridge.go:633` explicitly acknowledges this: *"treats any
non-state-change message as a terminal response."*

## 2. Design

### Current behavior (bridge.go dispatchToActiveTask)

```
Agent content message → mark task completed → broadcast final event → close subscriptions
Agent state-change → map to A2A state → broadcast → close if terminal
```

### New behavior

```
Agent content message → broadcast as status update with message → keep task alive
Agent state-change → map to A2A state → broadcast → close only if terminal
```

The key insight: **task lifecycle should be driven by agent state changes, not by
content messages.** Content messages are data within a turn; state changes are
lifecycle events. The bridge already correctly handles state changes — it just
needs to stop prematurely closing on content.

### State mapping (unchanged, already correct)

| Scion Activity | A2A Task State | Terminal? |
|---|---|---|
| WORKING / THINKING / EXECUTING | working | No |
| WAITING_FOR_INPUT | input-required | No |
| COMPLETED | completed | Yes |
| ERROR / STALLED / LIMITS_EXCEEDED | failed | Yes |

### Changes required

**bridge.go — dispatchToActiveTask():**
Replace the `else` branch (lines ~633-675) that auto-completes on first content.
Instead:
1. Translate the message to A2A format
2. Broadcast as a `StatusUpdate` with state=working and the message attached
3. Broadcast any artifacts
4. Do NOT update task state or close subscriptions

**stream.go — StreamEvent:**
No changes needed. `StatusUpdate` already supports carrying a message payload with
`Final: false`.

**translate.go:**
No changes needed. `MapActivityToTaskState` already maps `WAITING_FOR_INPUT` →
`input-required` correctly.

## 3. Testing

- Test: agent sends content message → task stays in `working` state
- Test: agent sends two content messages → both are broadcast, task still alive
- Test: agent sends content then state-change to `completed` → task completes
- Test: agent goes `waiting_for_input` → task transitions to `input-required`
- Regression: single-turn blocking mode still works (waiter receives first content)

## 4. Scope

- In: dispatchToActiveTask content handling
- Out: follow-up message routing (PR 2), capability advertisement (PR 3)
69 changes: 69 additions & 0 deletions .design/a2a-task-followup.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
# A2A Bridge: Follow-Up Messages on Existing Tasks

**Status:** Implementing
**Created:** 2026-06-05
**Related:** [a2a-bridge-design.md](./a2a-bridge-design.md), [a2a-multi-turn-lifecycle.md](./a2a-multi-turn-lifecycle.md)

---

## 1. Problem

The A2A protocol supports multi-turn conversations via `contextId` (session) and
`taskId` (turn). A client should be able to:

1. Send an initial `message/send` → get a taskID back
2. Wait for the agent to respond (possibly with `input-required`)
3. Send a follow-up `message/send` with the same `taskID` → continue the conversation

Currently, `SendMessage` always creates a new task, even when `taskID` is provided
in the params. The `SendMessageParams` struct already has a `TaskID` field, but
it's unused in the dispatch logic.

## 2. Design

### Current behavior

```
message/send {taskId: "abc"} → ignored, creates new task → new taskID returned
```

### New behavior

```
message/send {taskId: "abc"} → look up task "abc" → verify not terminal →
resolve agent from task → send message to agent → return existing task
```

### Changes

**bridge.go — SendMessage():**
At the top of the function, before creating a new task:
1. Check if `taskID` is non-empty (from `SendMessageParams.TaskID`)
2. If set, look up the task from the store
3. Verify the task belongs to the requesting project/agent (authorization)
4. Verify the task is not in a terminal state
5. Resolve the agent from the task's stored `AgentID`
6. Send the message to the agent
7. Update task state to `working` if it was `input-required`
8. Return the existing task (not a new one)

### Context vs Task

The A2A spec uses `contextId` to group related tasks into a session, and `taskId`
to identify individual turns. For follow-ups:
- `taskID` provided → continue that specific task/turn
- Only `contextID` provided → new task within the existing session (current behavior works)
- Neither → new context + new task (current behavior works)

## 3. Testing

- Test: message/send with valid taskID routes to same agent
- Test: message/send with terminal-state taskID returns error
- Test: message/send with unknown taskID returns error
- Test: message/send with taskID from different project returns error
- Test: task state transitions from input-required to working on follow-up

## 4. Scope

- In: Follow-up routing via taskID in SendMessage
- Out: Multi-turn lifecycle changes (PR 1), capability updates (PR 3)
Loading
Loading