Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
6 changes: 5 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ name: CI

on:
push:
branches: [main]
pull_request:

permissions:
Expand All @@ -12,7 +13,7 @@ jobs:
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest]
os: [ubuntu-latest, macos-latest, windows-latest]
python: ["3.9", "3.13"]
runs-on: ${{ matrix.os }}
timeout-minutes: 20
Expand All @@ -24,8 +25,11 @@ jobs:
- name: Pack validation
run: python scripts/workflow.py check
- name: Runtime tests
if: success() || failure()
run: python scripts/test_session.py
- name: Installer tests
if: success() || failure()
run: python scripts/test_workflow.py
- name: Golden path integration tests (stub worker)
if: success() || failure()
run: python scripts/test_relay.py
119 changes: 72 additions & 47 deletions HANDOVER.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,74 +2,99 @@

## Current work

estafeta 3.1.0 adds cross-provider work (plan:
docs/plans/multi-provider.md).

- **Skill `agent-relay`.** Lets an orchestrator consult, cross-review with or
delegate a phase to another provider, and coordinate peer agents. It covers
T3 host tasks, Codex/Claude/Gemini CLIs and same-provider subagents.
- **Runtime command `delegate`.** Keeps a ledger beside the state, so schema 2
is unchanged. CLI workers run as supervised processes with a timeout. The
runtime checks a writer's claims against recorded checks and the observed
workspace.
- **Integrated.** Existing skills, docs and the 3.1.0 manifests know about
the skill. A CI workflow was added.
- **Testing approach (user request).** Golden path tests check a short
sequence of agent interactions, with an expected result at each step:
- every change, in CI: a deterministic stub worker
(`scripts/test_relay.py`);
- before a release or a provider/model change: live runs checked with
`--live-verify`.
3.1.0 (`agent-relay` and runtime `delegate`) is merged to main through PR #3.

Release 3.2.0 is in progress on branch `relay-hardening-3.1.1` (draft PR #5 to
main; plan docs/plans/relay-hardening.md). Done so far:

- **Windows.** Supported and verified in CI. Fixed: index file modes in
fingerprints, job-object supervision, and a file-based stop request for
nested checks.
- **Takeover guard.** A solo session-start no longer takes over a live thread
in the same folder. This was observed live with a parallel Codex thread in
T3.
- **Provider policy.** Projects get an "AI providers" table that session-start
asks for on first use and `delegate` enforces. This project allows every
available provider except the Claude (Pricefx) work account.
- **Live checks.** These passed:
- `codex exec` as a worker;
- Antigravity through T3;
- orchestrators in Claude Code and in Codex, each with the other's CLI and
with their own native subagents;
- the Gemini CLI failure mode without an API key.
- **Drivers.** `scripts/golden/live_cli.py` and `live_orchestrator.py` replay
the live golden paths.

PR #4 was merged only into its stale base branch `agent-relay-3.1.0`, so its
commits are not in main. PR #5 carries them.

## Next action

Merge the 3.1.0 pull request after its CI run passes. Optional follow-ups:
The work moves to another computer. There, follow docs/CONTINUING.md with
branch `relay-hardening-3.1.1` instead of `main`, and use session-start. The
runtime state (phases, checks, the delegation ledger) stays on this computer,
so import the open phases R4 and R5 from the plan.

- a third Codex review round;
- live `codex exec` and `gemini -p` runs where those CLIs are installed;
- the benchmark follow-up in docs/BENCHMARK-ROADMAP.md.
Then fix the 11 findings of Codex review round 3. They are listed in
docs/plans/relay-hardening.md, "Status at pause". Start with the
high-severity ones:

1. the policy parser;
2. the Windows job assignment race;
3. nested stop chaining;
4. the late-recorded host writer baseline.

Add a failing test for each, then rerun the suites and the affected live
paths. Have Codex re-review the fix delta. Then release 3.2.0 (R5) and mark PR
#5 ready.

## Validation

On October 15, 2026, on macOS with Python 3.9.6:

- runtime 70/70, installer 21/21, golden 5/5 scenarios (79 steps), pack check
and the Claude plugin validators passed;
- four deliberate regressions were caught by golden steps;
- live, all passing `--live-verify`:
- Codex gpt-6.1-sol through T3: a delegated write and two cross-review
rounds (12, then 5 findings, all fixed with tests);
- `claude -p` as a CLI worker: consult on Haiku 5.5, write on Sonnet 5.5
under the OS sandbox.

Details are in packs/session-workflow/VALIDATION.md.
- runtime 76/76, installer 21/21 and golden 6/6 scenarios passed, and
`workflow.py check` passed.
- PR #5 CI was green on Linux, macOS and Windows at 29fb17e, the last code
change; this closed R1 on October 16.
- Live evidence for each transport and host is in
packs/session-workflow/VALIDATION.md.

## Boundaries

Not verified:

- live `codex exec` and `gemini -p` CLI transports;
- the Gemini/Antigravity route;
- native Linux and Windows.

The round 2 fixes were tested locally but not re-reviewed by Codex. The
fixtures in /private/tmp/relay-live and /private/tmp/relay-cli are disposable.
- **Unverified:**
- a live `gemini -p` answer (no API key);
- Codex orchestrating without network access (not run);
- native Windows beyond GitHub CI.
- **Machine-local:** the runtime state and the live-run fixtures under the
temp directory stay on the first computer. VALIDATION.md keeps the live
evidence.
- **Installs:** the global estafeta skills in the provider profiles are outdated
(2.4.1 or missing). Update them with `python3 scripts/workflow.py install
--all-detected` when convenient.

<!-- session-workflow:facts:start -->
## Session facts (generated)

State revision 109; HEAD 8559853e8949b0ef51d5ffb9c2351158fba23ff2.
State revision 162; HEAD 29fb17eaebe23d48326a73ee436093ce841035ab.

| Phase | State | Owner | Latest checks |
| --- | --- | --- | --- |
| P1 | DONE | - | unit-session: pass (executed, inputs match); golden-relay: pass (executed, inputs match); pack-check: pass (executed, inputs match) |
| P2 | DONE | - | pack-check: pass (executed, inputs match); unit-workflow: pass (executed, inputs match) |
| P3 | DONE | - | pack-check: pass (executed, inputs match); unit-workflow: pass (executed, inputs match); unit-session: pass (executed, inputs match); golden-relay: pass (executed, inputs match) |
| P4 | DONE | - | live-relay: pass (executed, inputs match); unit-session: pass (executed, inputs match); golden-relay: pass (executed, inputs match) |
| P5 | DONE | - | live-cli: pass (executed, inputs match); live-review-2: pass (executed, inputs match); golden-relay: pass (executed, inputs match); pack-check: pass (executed, inputs match) |
| P1 | DONE | - | unit-session: pass (executed, inputs changed); golden-relay: pass (executed, inputs changed); pack-check: pass (executed, inputs changed) |
| P2 | DONE | - | pack-check: pass (executed, inputs changed); unit-workflow: pass (executed, inputs changed) |
| P3 | DONE | - | pack-check: pass (executed, inputs changed); unit-workflow: pass (executed, inputs changed); unit-session: pass (executed, inputs changed); golden-relay: pass (executed, inputs changed) |
| P4 | DONE | - | live-relay: pass (executed, inputs changed); unit-session: pass (executed, inputs changed); golden-relay: pass (executed, inputs changed) |
| P5 | DONE | - | live-cli: pass (executed, inputs changed); live-review-2: pass (executed, inputs changed); golden-relay: pass (executed, inputs changed); pack-check: pass (executed, inputs changed) |
| R1 | DONE | - | unit-session: pass (executed, inputs match); unit-workflow: pass (executed, inputs match); golden-relay: pass (executed, inputs match); pack-check: pass (executed, inputs match); ci-windows: pass (executed, inputs match) |
| R2 | DONE | - | live-codex-cli: pass (executed, inputs match) |
| R3 | DONE | - | live-antigravity: pass (executed, inputs match); gemini-cli-failure: pass (executed, inputs match) |
| R4 | TODO | - | - |
| R5 | TODO | - | - |
| R6 | DONE | - | unit-session: pass (executed, inputs changed); golden-relay: pass (executed, inputs changed); pack-check: pass (executed, inputs changed) |
| R7 | DONE | - | unit-session: pass (executed, inputs match); golden-relay: pass (executed, inputs match) |
| R8 | DONE | - | live-orchestrators: pass (executed, inputs match) |

Active sessions: none.
Ended sessions: 5; latest s-xprov-1015 (next: Watch CI of the agent-relay-3.1.0 pull request and merge it when green. Optional: Codex review round 3, live codex exec / gemini -p runs where installed, benchmark follow-up.).
Ended sessions: 10; latest s-transfer-1016 (next: On another computer: follow docs/CONTINUING.md with branch relay-hardening-3.1.1, use session-start, import open phases R4 and R5 from docs/plans/relay-hardening.md, then fix the 11 Codex review round 3 findings (high severity first, each with a failing test), have Codex re-review the fix delta, release 3.2.0 (R5) and mark PR #5 ready).

Generated facts do not establish acceptance, explain intent or prove delivery.
<!-- session-workflow:facts:end -->
30 changes: 27 additions & 3 deletions PROJECT.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,40 @@ Do not publish credentials, local runtime state, or personal logs.

## Documentation map

- Plan: docs/plans/multi-provider.md (multi-provider relay).
- Plan: docs/plans/relay-hardening.md (3.1.1); previous: docs/plans/multi-provider.md.
- Handover: HANDOVER.md.
- Installation: docs/INSTALL.md; usage: docs/USAGE.md.
- Maintenance and checks: docs/MAINTAINING.md.
- Workflow: estafeta; machine state in .agent-state/session-workflow is local and ignored by Git.

## Current focus

- Multi-provider relay (3.1.0): skill `agent-relay` and runtime `delegate`; see docs/plans/multi-provider.md.
- On another computer, follow docs/CONTINUING.md, then use session-start.
- 3.1.0 (multi-provider relay) is merged to main. Release 3.2.0 is in progress
on branch `relay-hardening-3.1.1`, draft PR #5 to main (plan:
docs/plans/relay-hardening.md). PR #4 was merged only into the stale base
branch `agent-relay-3.1.0`, not into main.
- Paused 2026-10-15. Next: fix the 11 findings of Codex review round 3 (R4).
- On another computer, follow docs/CONTINUING.md with branch
`relay-hardening-3.1.1` instead of `main`, then use session-start. The
runtime state stays on the first computer: import the open phases R4 and R5
from the plan there.

## AI providers

Decided by the user on 2026-10-15: every available provider except the
Claude (Pricefx) work account. Agents ask before changing this table.
Providers not listed (for example Cursor, Grok or OpenCode, currently
disabled in T3) are refused until the user adds them.

<!-- estafeta:providers:start -->
| Provider | Allowed | Models | Notes |
| --- | --- | --- | --- |
| claude | orchestrate, consult, review, write | any | Personal account: T3 instance `claudeAgent`, Claude Code, `claude -p` |
| claude-pricefx | none | - | Work account (T3 instance `claude-pricefx`): not for this project |
| codex | orchestrate, consult, review, write | any | T3 tasks and `codex exec` (local login) |
| antigravity | orchestrate, consult, review, write | any | T3 tasks; Gemini models without an API key |
| gemini | consult, review, write | any | `gemini -p`; needs a paid API key, none on this host yet |
<!-- estafeta:providers:end -->

## Run and verify

Expand Down
10 changes: 8 additions & 2 deletions docs/USAGE.md
Original file line number Diff line number Diff line change
Expand Up @@ -66,8 +66,14 @@ transfer it together with its evidence.

- **Solo (default):** one writer per checkout. A new chat supersedes the earlier
chats in the same checkout and takes over their phase claims and preview
servers. A chat closed without session-end therefore blocks nothing. A chat that
is still running a check is detected as alive, and the takeover is refused.
servers, so a chat closed without session-end blocks nothing for long.
- **No takeover of live chats.** A new chat does not take over a chat that
may still be working: one running a check, one that acted in the last 30
minutes, or one with open delegations. It joins in parallel and says so.
This matters in hosts such as T3 Code, where several threads share one
folder.
- **Idle threshold.** `SESSION_WORKFLOW_TAKEOVER_IDLE_MINUTES` changes the 30
minutes.
- **Parallel:** tell a chat, in any language, that another agent works in the
same folder ("work in parallel", «работаем параллельно», «pracujeme
paralelně», «並行して作業する»), and it begins with `--parallel`. The agent goes
Expand Down
Loading
Loading