axstack 0.54.0 → 0.56.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/docs/concepts.md +3 -1
- package/docs/installation.md +5 -2
- package/docs/workflows.md +3 -1
- package/package.json +1 -1
- package/profiles/presets/claude-only.json +9 -0
- package/profiles/presets/codex-only.json +9 -0
- package/profiles/presets/mixed.json +9 -0
- package/skills/axstack/references/fleet-dispatch.md +166 -0
- package/skills/axstack/references/fleet-route-schema.md +325 -0
- package/skills/axstack/references/fleet-verification.md +102 -0
- package/skills/axstack/references/lifecycle.md +19 -2
- package/skills/axstack/references/role-roster.md +11 -0
- package/skills/axstack/references/routing.md +14 -0
- package/skills/axstack/references/run-record.md +83 -0
- package/skills/axstack/references/t3-runtime.md +174 -7
- package/skills/axstack/references/ui-verification.md +67 -4
- package/skills/axstack/references/workspace-hygiene.md +8 -0
- package/skills/axstack/scripts/dispatch-plan.js +52 -8
- package/skills/axstack/scripts/fleet-config.js +78 -0
- package/skills/axstack/scripts/fleet-destination.js +39 -0
- package/skills/axstack/scripts/fleet-dispatch.js +47 -0
- package/skills/axstack/scripts/fleet-facts.js +161 -0
- package/skills/axstack/scripts/fleet-inventory.js +76 -0
- package/skills/axstack/scripts/fleet-proc.js +31 -0
- package/skills/axstack/scripts/fleet-receipt.js +130 -0
- package/skills/axstack/scripts/fleet-route-cli.js +78 -0
- package/skills/axstack/scripts/fleet-route.js +86 -0
- package/skills/axstack/scripts/fleet-sample-cli.js +81 -0
- package/skills/axstack/scripts/fleet-sample-io.js +59 -0
- package/skills/axstack/scripts/fleet-sample-manifest.js +34 -0
- package/skills/axstack/scripts/fleet-sample.js +48 -0
- package/skills/axstack/scripts/resolve-models.js +8 -4
- package/skills/axstack-cleanup/SKILL.md +21 -0
- package/skills/axstack-implement/SKILL.md +12 -5
- package/skills/axstack-review/references/review-candidate.md +1 -1
- package/skills/axstack-verify/SKILL.md +17 -6
- package/skills/axstack-watch/SKILL.md +3 -0
- package/skills/axstack-watch/references/watch-runtime.md +18 -5
- package/skills/voa/SKILL.md +96 -0
- package/skills/voa/references/observations.md +79 -0
- package/skills/voa/references/recovery.md +94 -0
- package/skills/voa/references/verification.md +35 -0
- package/skills/voa/scripts/cleanup.js +39 -0
- package/skills/voa/scripts/evaluate.js +122 -0
- package/skills/voa/scripts/observations.js +68 -0
- package/skills/voa/scripts/records.js +48 -0
- package/skills/voa/scripts/voa.js +43 -0
- package/src/installer.js +3 -2
- package/src/instructions.js +11 -3
- package/src/roles.js +2 -2
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# Bounded live fleet verification (later C3/C6)
|
|
2
|
+
|
|
3
|
+
Run only under the driver's recorded live/host authority. C3a ships this procedure;
|
|
4
|
+
it does not execute it or enable routing. Offline fixtures and source inspection
|
|
5
|
+
cannot establish live eligibility. Use [Fleet dispatch](fleet-dispatch.md) for
|
|
6
|
+
receipt fields, [T3 runtime](t3-runtime.md) for native lifecycle, and the repository
|
|
7
|
+
verify-axstack recipe for separate offline coverage. Never mix live credentials or
|
|
8
|
+
network into that isolated recipe.
|
|
9
|
+
|
|
10
|
+
## Prepare one owned attempt
|
|
11
|
+
|
|
12
|
+
Record run key, origin T3 thread link, operator, allowed origin/targets, role/model/
|
|
13
|
+
options/full-access, repository/project identities, exact candidate/base, explicit
|
|
14
|
+
start/end times and a maximum of one harmless nonwriter per distinct route config.
|
|
15
|
+
No overload stress, installation, global policy edits, raw provider CLI or production
|
|
16
|
+
writes belong to this procedure. Exclude any unverified route from enabled coverage.
|
|
17
|
+
No top-level thread without an explicit new-thread request.
|
|
18
|
+
|
|
19
|
+
Create a fresh 0700 scratch outside HOME on each participating host; record each
|
|
20
|
+
literal path with hostId/environmentId. Before use validate owner, realpath and
|
|
21
|
+
no symlink. Use a separately owned persistent evidence folder on origin and target,
|
|
22
|
+
outside scratch selected for deletion. Put only a tiny fixture README/candidate in
|
|
23
|
+
an explicitly provisioned test project. Record its root HEAD/status/all refs before
|
|
24
|
+
and after; no shared project or unknown ignored artifacts may be cleaned.
|
|
25
|
+
Use native T3 worktree isolation for candidate reviewers; no shell child checkouts.
|
|
26
|
+
|
|
27
|
+
Save a coverage row for every directed origin→target and materially distinct
|
|
28
|
+
provider/model/options/runtimeMode/project/isolation/browser/session configuration.
|
|
29
|
+
Record both endpoint T3/Axstack versions, exact installed skill hashes, config
|
|
30
|
+
schema/digest, native-balancer client setting and link expiry. Reuse evidence only
|
|
31
|
+
with a recorded equivalence argument; direction/version/project/session differences
|
|
32
|
+
require their own check. Do not expose credentials in this matrix.
|
|
33
|
+
|
|
34
|
+
## Actions, expected results and evidence
|
|
35
|
+
|
|
36
|
+
| Owned fixture / bounded action | Expected observation and retained evidence | Cleanup / failure disposition |
|
|
37
|
+
| --- | --- | --- |
|
|
38
|
+
| Native discovery, once per directed link/config | Save t3_environment_links on origin; forwarded environment/project/catalog reads on target, raw bytes/digests/time/expiry/access. Native project repository identity and selected env/project/model/options match independent expected values. Required session is authenticated on target. Missing effective fields stay UNKNOWN. | No link/settings mutation to make a check pass. Expired/unreachable/access/model gaps exclude the route. |
|
|
39
|
+
| One bounded telemetry batch per origin | C2 sample with explicit configured host↔environment manifest, interval 5000ms, timeout 10000ms. Save raw JSON, collector start/end and source/whole-host/duration/age. Directed telemetry origin×target matrix covers all configured hosts. A failed host is UNKNOWN, never fabricated zero. | Collector exits/reaps only owned processes. No daemon/timer or real overload. |
|
|
40
|
+
| Inventory + pending fixture batch | Save origin task identities, actual remoteChild and current descendants, complete collection provenance and pending clientRequestIds. Replay C1 with exact config/time. Observe 20/35/40 fixture oracle and harmless sequential dispatch spread without claiming reservations. | Reconcile ambiguous submissions in place; unknown inventory remains unknown. Never duplicate a task because a response was lost. |
|
|
41
|
+
| One read-only remote nonwriter | Build destination-bound plan from the actual target catalog, independently compare expected env/project/model/options/mode, then delegate_task with exact target and stable key/clientRequestId. Task writes only its named target evidence report with pinned candidate marker. Save requested arguments, submission and origin task_status. | Follow native next; no polling, SSH agent, permission/model substitution or top-level fallback. Driver owns native task cancellation if this exact owned attempt must stop. |
|
|
42
|
+
| Current terminal receipt | On completion wake, read origin task_status and target thread/current terminal run plus native pending-question list. Require completed/result_available/no children/questions/approval and exact final marker/run. Save latestTerminalRunId, thread latestRunId/ordinals, native terminal result and host-qualified evidence. If a provider continuation occurs, record the newer current run; old original summary is insufficient. | Unknown liveness or incomplete native read holds. No replacement until exact old attempt is reconciled. Failed/cancelled/waiting outcomes never become successes. |
|
|
43
|
+
| Target reviewer worktree (only when authorized/enabled) | Native isolation worktreePath differs from target project root. Verify exact candidate and base objects there, preserve host/path ownership and report digest; origin transport/readback matches exact SHA/base and bytes. Driver root HEAD/status remains unchanged. | Archive/read back evidence on origin, settle/read back owned child on actual target, then retire only its exact T3-created disposable checkout through cleanup ownership guards. |
|
|
44
|
+
| Required browser mode | For configurations requiring a browser, drive the harmless fixture in the requested headed/headless mode using the configured browser MCP; save actual mode/interaction evidence. | Close only the session/page created by this attempt. No mode equivalence inferred from catalog flags. |
|
|
45
|
+
| Helper failure + fallback fixture | An owned missing/malformed telemetry input produces UNKNOWN; no executable remote route falls back to a locally isolated author at the same pins, even when overloaded. Save recommendation→explicit destination→receipt trace. | No new helper state, automatic retry, model change or authority grant. |
|
|
46
|
+
| C6 installation/config parity and one rollback rehearsal | Under separately recorded deployment authority, all five hosts have identical reviewed config digest/schema and intended CLI/skill/global-source revisions. Roll back only one explicitly owned target, read back exact prior bytes/revision, then restore intended revision and verify. | Keep prior bytes private, never copy credentials. A partial host matrix remains incomplete C6. C3a changes none of these hosts. |
|
|
47
|
+
| iosatellite unattended claim | Before claiming closed-lid/unattended eligibility, verify a real closed-lid job, SSH and T3 operation under its actual configured AC/lid policy and retain logs. | Without that proof, label unattended UNKNOWN; attended reachable operation remains a separate eligible configuration. |
|
|
48
|
+
|
|
49
|
+
Suggested harmless nonwriter brief: name its key, target-only private evidence
|
|
50
|
+
path, pinned candidate/base, read-only fixture question and exact final
|
|
51
|
+
AXSTACK-DONE marker; forbid tracked/untracked project writes, children, forge,
|
|
52
|
+
install/config edits and html_render. No worktree author or coordinator is part
|
|
53
|
+
of the nonwriter check. Save the observed dispatch response rather than a worker's
|
|
54
|
+
claim about how it was launched.
|
|
55
|
+
|
|
56
|
+
For terminal negative controls use offline saved copies with one changed fact
|
|
57
|
+
(stale run, question, pending child, wrong env/project/settings/path). Do not create
|
|
58
|
+
real denied prompts, disconnected workers or orphaned production tasks just to
|
|
59
|
+
exercise a guard. Live submission ambiguity, cancellation, provider continuation
|
|
60
|
+
and question handling remain separate UNKNOWN rows unless actually observed in
|
|
61
|
+
an authorized owned context. Never infer their success from an offline negative.
|
|
62
|
+
|
|
63
|
+
## Remote authors stay disabled
|
|
64
|
+
|
|
65
|
+
C3b's all-refs-unchanged pilot failed on T3 checkpoint refs. Do not rerun, waive
|
|
66
|
+
or enable that coordinator in C3a/C6 nonwriter verification. Direct remote worktree
|
|
67
|
+
authors are ineligible on T3 v0.1.5. Local isolated authors remain the fallback.
|
|
68
|
+
Any future separately authorized C3b investigation must prove every F4 gate in the
|
|
69
|
+
approved baseline: target local isolation and exact base, nested completion,
|
|
70
|
+
same-author repair/new-run origin wake, question/answer/resume, approval boundary,
|
|
71
|
+
cancellation/failure/orphan propagation including owned disconnected cases,
|
|
72
|
+
unchanged root HEAD/status/all refs, exact retrieval and owned retirement. Record
|
|
73
|
+
all nested IDs and both versions. Unknown stop forbids replacement. No production
|
|
74
|
+
enablement without all gates and accepted scope; no silent all-refs exception.
|
|
75
|
+
|
|
76
|
+
## Cleanup and receipt
|
|
77
|
+
|
|
78
|
+
For each owned remote reviewer, read exact target thread/run/ownership again.
|
|
79
|
+
Archive evidence on origin, verify its digest and read it back, then settle on
|
|
80
|
+
target and verify settled:true before removing that recorded disposable checkout.
|
|
81
|
+
Retain user-taken-over, changed, active, unknown or ambiguously owned resources.
|
|
82
|
+
Driver alone owns forge publication, PR links/watch and merges. No worker watches.
|
|
83
|
+
|
|
84
|
+
For each scratch path, validation must succeed first: exact created literal path,
|
|
85
|
+
no symlink, realpath equality, current ownership and 0700 mode. Finish validation
|
|
86
|
+
successfully, then perform deletion in a separate sequential call on that same
|
|
87
|
+
host/path. Never parallel validation/deletion, ignore failures, glob shared paths,
|
|
88
|
+
clean by age or delete unknown ignored artifacts. Confirm scratch absence and
|
|
89
|
+
persistent evidence survival; record retained resources with a named hold.
|
|
90
|
+
|
|
91
|
+
Return rows as PASS/FAIL/UNKNOWN/N/A with command/native-call evidence and exact
|
|
92
|
+
versions/config/candidate hashes. Summaries are counts only, never aggregate
|
|
93
|
+
permission. List every omitted config/host/gate and its owning phase. C4 owns
|
|
94
|
+
personal routing policy/Haoshoku live changes; C6 owns deployment and the complete
|
|
95
|
+
live matrix. Nothing here declares a deployed routing switch.
|
|
96
|
+
|
|
97
|
+
Rerun affected rows after routing/helper/receipt releases, either endpoint's T3
|
|
98
|
+
version change, link replacement/expiry/access change, project/provider/model/
|
|
99
|
+
options/runtimeMode/session/browser change, config digest or policy change, and
|
|
100
|
+
before C6 acceptance. A failed bounded attempt retains evidence; reconcile and
|
|
101
|
+
repair within authority before one new explicit attempt. Never create a scheduler,
|
|
102
|
+
state machine or recurring task to make verification run itself.
|
|
@@ -4,6 +4,8 @@ Phases load through [Standing contracts](contracts.md).
|
|
|
4
4
|
Driver settlement follows [Workspace hygiene](workspace-hygiene.md).
|
|
5
5
|
Delegated or resumable work uses a driver-owned [Run record](run-record.md)
|
|
6
6
|
binding state and receipts to exact revisions.
|
|
7
|
+
For a logical Coordinator coordinating project drivers, follow
|
|
8
|
+
[Coordinating multiple drivers](t3-runtime.md#coordinating-multiple-drivers).
|
|
7
9
|
|
|
8
10
|
## Roster (compact)
|
|
9
11
|
|
|
@@ -80,10 +82,14 @@ Store receipt references, not raw output, in the [Run record](run-record.md).
|
|
|
80
82
|
- Audit receipt: scope, evidenced PASS/FAIL/UNKNOWN counts/denominators and
|
|
81
83
|
proposals. Only an authorized sanitized summary publishes.
|
|
82
84
|
|
|
85
|
+
Before ending a waiting turn or closing its condition, follow
|
|
86
|
+
[Waiting-turn and closing records](run-record.md#waiting-turn-and-closing-records).
|
|
87
|
+
|
|
83
88
|
## Execution tracking
|
|
84
89
|
|
|
85
90
|
Follow [T3 runtime](t3-runtime.md) for native completion, questions, launch
|
|
86
|
-
recovery and run-watch waits.
|
|
91
|
+
recovery and run-watch waits. Never status-check running delegate_task children on scheduled wakes.
|
|
92
|
+
Delegated notifications wake the driver; a launched
|
|
87
93
|
writer sends its marker with `t3_thread_send` using `mode: queue` to the recorded driver thread.
|
|
88
94
|
Delegated completion requires persisted `task_status` before `t3_thread_read`, terminal `completed`, `result_available`, `hasPendingChildRuns:false`, and final `AXSTACK-DONE`.
|
|
89
95
|
Delegated author completion requires delegated terminal checks plus candidate checks: non-empty diff, clean tree and named red/green logs.
|
|
@@ -120,7 +126,7 @@ ready. An unreachable predecessor holds. Update one `Next:` line on each
|
|
|
120
126
|
transition with owner, last receipt time, next action and hold; reconcile it for
|
|
121
127
|
status questions. Stale receipts remain evidence only.
|
|
122
128
|
|
|
123
|
-
End a driver turn with an unsettled launched thread only while the bound run watch is armed; each wake reconciles
|
|
129
|
+
End a driver turn with an unsettled launched thread only while the bound run watch is armed; each wake reconciles unsettled launched-fallback Writer runs.
|
|
124
130
|
Use terminal `t3_thread_wait` and the recorded watch as the runtime contract
|
|
125
131
|
requires, re-arming waits on timeout; sleep or poll loops are forbidden. Delete the watch by exact ID and
|
|
126
132
|
verify absence once nothing remains unsettled. After each delegated completion,
|
|
@@ -136,6 +142,17 @@ After accepting task or run completion, the driver invokes
|
|
|
136
142
|
Axstack creates no heartbeat or substitute scheduler.
|
|
137
143
|
Tracking grants no merge, release, model-substitution, or scope authority.
|
|
138
144
|
|
|
145
|
+
## Host-qualified fleet receipts
|
|
146
|
+
|
|
147
|
+
Fleet nonwriters use [Fleet dispatch and receipts](fleet-dispatch.md) in addition
|
|
148
|
+
to the local lifecycle. Origin taskId and destination environment/thread/current
|
|
149
|
+
run are separate identities; remote local-child IDs may be null. Keep exact
|
|
150
|
+
recommendation/config/catalog evidence, requested/effective settings and qualified
|
|
151
|
+
artifact/checkout paths. Read task_status on origin and terminal/question facts
|
|
152
|
+
on destination before advancement. Current completed/result_available with no
|
|
153
|
+
children/questions and an exact final marker is required; an old summary cannot
|
|
154
|
+
complete a provider continuation. Driver-only forge/cleanup ownership is unchanged.
|
|
155
|
+
|
|
139
156
|
## Deadline (one rule for every owned timer)
|
|
140
157
|
|
|
141
158
|
The default 24-hour deadline covers standalone task-owned timers. Stop them at
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# Role roster
|
|
2
2
|
|
|
3
|
+
Fleet nonwriter placement follows [Fleet dispatch and receipts](fleet-dispatch.md).
|
|
4
|
+
Roles retain exact configured provider/model/options/full-access on the selected
|
|
5
|
+
native destination. Remote reviewers require T3 worktree isolation; no shell child
|
|
6
|
+
checkout. Host names confer no role or permission. Remote authors/coordinator stay
|
|
7
|
+
disabled; local isolated authors remain supported even overloaded.
|
|
8
|
+
|
|
3
9
|
- Chat drives (no role ID); `axstack-owner` owns one PR and
|
|
4
10
|
`axstack-author` its sole writer.
|
|
5
11
|
For own PRs, automatic merge is the default under the
|
|
@@ -31,6 +37,11 @@
|
|
|
31
37
|
review round and bounded research, spec, ticket, receipt, and release claims.
|
|
32
38
|
- `axstack-ui-verifier`: owns the inline page interaction pass under [UI checks](ui-verification.md)
|
|
33
39
|
for every interactive page, bound to the exact bytes and SHA-256.
|
|
40
|
+
- `axstack-ui-verifier-sonnet`: `claude/sonnet` high in mixed, read-only;
|
|
41
|
+
independently drives Android and web/PWA run 2 under [UI checks](ui-verification.md#android-device-and-webpwa-dual-run).
|
|
42
|
+
`axstack-ui-verifier` (Terra high in mixed) drives run 1; the driver reconciles.
|
|
43
|
+
`axstack-ui-verifier-sonnet` is intentionally absent in both single-provider presets,
|
|
44
|
+
leaving dual-run verification unverified; record the absence without substitution.
|
|
34
45
|
- `axstack-research-requirements`/
|
|
35
46
|
`axstack-research-code`/`axstack-research-web`/
|
|
36
47
|
`axstack-explore-execution`:
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
Choose a route; load only the phase and references needed next.
|
|
4
4
|
Driver entry sweep follows [Workspace hygiene](workspace-hygiene.md).
|
|
5
|
+
For work spanning project drivers, follow
|
|
6
|
+
[Coordinating multiple drivers](t3-runtime.md#coordinating-multiple-drivers).
|
|
5
7
|
|
|
6
8
|
## Role routing
|
|
7
9
|
|
|
@@ -29,6 +31,8 @@ using saved T3 capabilities JSON; missing or malformed capabilities holds.
|
|
|
29
31
|
Claude exact IDs come from capabilities, replacing transcript read-back.
|
|
30
32
|
Use an explicit model as given; for `model:null` without a class, grok uses the
|
|
31
33
|
provider's first listed model from saved capabilities and records its exact ID.
|
|
34
|
+
A first listed ID without the `grok-` prefix holds that role with no substitution;
|
|
35
|
+
the prefix checks family, not X access or other live capability.
|
|
32
36
|
A Codex or Claude role with neither model nor class is an intentional absence
|
|
33
37
|
and holds.
|
|
34
38
|
Resume must reuse the saved capabilities and role snapshot with no re-resolution; changes require the user’s explicit decision.
|
|
@@ -55,6 +59,16 @@ infer from slot, driver, owner, or provider. Author and owner never review.
|
|
|
55
59
|
`axstack-implement` requires `mixed`; single-provider presets hold at
|
|
56
60
|
step (3) for user routing: no substitution or same-provider review.
|
|
57
61
|
|
|
62
|
+
## Fleet destinations (C3a)
|
|
63
|
+
|
|
64
|
+
For fleet nonwriters, follow [Fleet dispatch and receipts](fleet-dispatch.md):
|
|
65
|
+
C2 sampling and current native assignment inventory feed C1; the driver explicitly
|
|
66
|
+
binds the selected environment/project/settings to native T3 delegation and reads
|
|
67
|
+
terminal facts on the actual destination. Origin catalogs, SSH agent commands and
|
|
68
|
+
legacy worker/control-center host labels grant no execution route. Any configured
|
|
69
|
+
host may originate or receive proven nonwriter work; personal policy/deployment
|
|
70
|
+
changes remain C4/C6. Remote authors stay disabled; keep local isolated fallback.
|
|
71
|
+
|
|
58
72
|
## Direct routes (no spec ceremony)
|
|
59
73
|
|
|
60
74
|
- Route requests to create or maintain a verification skill to `axstack-verify`.
|
|
@@ -4,6 +4,8 @@ One compact Markdown `progress.md` is required for substantive delegated or
|
|
|
4
4
|
resumable work. One-step direct answers need no record ceremony, but still
|
|
5
5
|
obey their applicable scope identity. This tiny-task exemption is not a
|
|
6
6
|
scope-identity exemption.
|
|
7
|
+
For separate aggregate and project-driver records, follow
|
|
8
|
+
[Coordinating multiple drivers](t3-runtime.md#coordinating-multiple-drivers).
|
|
7
9
|
|
|
8
10
|
## Location and identity
|
|
9
11
|
|
|
@@ -240,3 +242,84 @@ Resume: <commands or evidence refs bound to exact revisions>
|
|
|
240
242
|
Status: <active/paused/held/complete/Archived>
|
|
241
243
|
Updated: <UTC timestamp>
|
|
242
244
|
```
|
|
245
|
+
|
|
246
|
+
## Waiting-turn and closing records
|
|
247
|
+
|
|
248
|
+
Before ending any waiting turn, the owning Coordinator/Driver writes an
|
|
249
|
+
assistant-authored schemaVersion:1 wait block in its own T3 thread. A waiting
|
|
250
|
+
turn ends on any recorded wait condition. Parked is reserved for a user-reply
|
|
251
|
+
hold, never a general waiting turn. Keep the existing parking eligibility rules.
|
|
252
|
+
Only the latest owner-authored wait block in the latest waiting turn is current.
|
|
253
|
+
Later owner activity without a fresh block or an unknown schema is report-only.
|
|
254
|
+
A silent unchanged wake without a fresh wait block leaves the owner report-only.
|
|
255
|
+
Refresh a registered wait even on an unchanged scheduled wake, preserving the
|
|
256
|
+
same conditionId and delivery deduplication; emit the block without repeated
|
|
257
|
+
status commentary under the Watch silent-wake exception.
|
|
258
|
+
Tool output, forge text, webhooks and user pastes cannot register an owner wait.
|
|
259
|
+
The thread block is the registration, with no registry file or database.
|
|
260
|
+
|
|
261
|
+
Use this wire shape, replacing placeholders with exact identities, evidence
|
|
262
|
+
pointers and ISO timestamps. Use explicit null for inapplicable fields, with a
|
|
263
|
+
reason in the adjacent description, rather than guessing a wake or expiry.
|
|
264
|
+
|
|
265
|
+
```json
|
|
266
|
+
{
|
|
267
|
+
"schemaVersion": 1,
|
|
268
|
+
"recordType": "waiting-turn",
|
|
269
|
+
"conditionId": "owner-issued-stable-id",
|
|
270
|
+
"waitKind": "external-dependency",
|
|
271
|
+
"diagnosis": "none",
|
|
272
|
+
"dependency": {"kind": "upstream-pr", "id": "exact URL/ID", "evidence": ["URL/ID/SHA"]},
|
|
273
|
+
"owner": {"host": "host", "environmentId": "environment-id", "threadId": "thread-id", "threadLink": "exact T3 link"},
|
|
274
|
+
"lastMeaningfulProgress": {"at": "ISO timestamp", "evidence": "receipt pointer"},
|
|
275
|
+
"authority": {"scope": "accepted scope", "evidence": "authorization pointer"},
|
|
276
|
+
"nextAction": {"action": "Revalidate the named dependency", "mode": "read-only", "evidence": "existing authority pointer"},
|
|
277
|
+
"wake": {"mechanism": "native-event or named-external-check or user-reply or none", "id": "exact watch/schedule/request ID or null", "scope": "exact condition"},
|
|
278
|
+
"nextEligibleCheck": "ISO timestamp or null",
|
|
279
|
+
"pause": false,
|
|
280
|
+
"snoozeUntil": null,
|
|
281
|
+
"lifetime": {"scope": "run or separately authorized shared service", "expiresAt": "ISO timestamp or explicit non-expiring service authority"},
|
|
282
|
+
"cleanupOwner": {"host": "host", "environmentId": "environment-id", "threadId": "thread-id", "threadLink": "exact T3 link"}
|
|
283
|
+
}
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
Classify `waitKind` as active-worker, own-pr-ci-review, external-dependency,
|
|
287
|
+
human-approval, explicit-pause, failed-interrupted, completed-cleanup or unknown.
|
|
288
|
+
Record the exact PR/check/dependency or decision, including downstream human
|
|
289
|
+
holds. Diagnosis is the evidenced cause or literal `none` for a specific
|
|
290
|
+
unexplained blocker. Missing diagnosis is incomplete, not equivalent to `none`.
|
|
291
|
+
Wake IDs identify actual registrations, not promised support. Record every
|
|
292
|
+
watch/schedule's exact ID, scope, owner and lifetime when created.
|
|
293
|
+
|
|
294
|
+
The recovery key is (owner host, owner threadId, conditionId). Rewriting the
|
|
295
|
+
same conditionId never resets delivery deduplication. Keep that ID through
|
|
296
|
+
revalidation, PR-head changes, native events, passes and restarts while the
|
|
297
|
+
condition remains unresolved. Read history and queue plus prior delivery
|
|
298
|
+
receipts before any eligible send. Ambiguous delivery or unavailable history
|
|
299
|
+
or queue is report-only. An accepted unacknowledged continuation gets no resend.
|
|
300
|
+
A distinct condition uses a new owner-issued ID, never one invented by recovery.
|
|
301
|
+
Bind queued/running wake receipts to the recovery key and exact queue/run IDs.
|
|
302
|
+
An armed registration alone is insufficient delivery evidence; nextEligibleCheck
|
|
303
|
+
and current same-key queue/run delivery determine wake precedence.
|
|
304
|
+
|
|
305
|
+
To end the registration, the owner writes an assistant-authored closing block
|
|
306
|
+
with the same conditionId. Bind closure to evidence, including scoped cleanup
|
|
307
|
+
still pending; settled metadata alone never proves completed product delivery.
|
|
308
|
+
|
|
309
|
+
```json
|
|
310
|
+
{
|
|
311
|
+
"schemaVersion": 1,
|
|
312
|
+
"recordType": "closing",
|
|
313
|
+
"conditionId": "owner-issued-stable-id",
|
|
314
|
+
"diagnosis": "evidenced resolution or disposition",
|
|
315
|
+
"owner": {"host": "host", "environmentId": "environment-id", "threadId": "thread-id", "threadLink": "exact T3 link"},
|
|
316
|
+
"authority": {"scope": "accepted scope", "evidence": "authorization pointer"},
|
|
317
|
+
"nextAction": {"action": "none or bounded remaining cleanup", "mode": "none or cleanup", "evidence": "receipt pointer"},
|
|
318
|
+
"wake": {"mechanism": "none", "id": null, "scope": "closed registration"},
|
|
319
|
+
"lifetime": {"scope": "registration closed", "expiresAt": "closure ISO timestamp"},
|
|
320
|
+
"cleanupOwner": {"host": "host", "environmentId": "environment-id", "threadId": "thread-id", "threadLink": "exact T3 link"},
|
|
321
|
+
"outcome": "resolved or completed or cancelled or accepted-handoff",
|
|
322
|
+
"evidence": ["exact revision/terminal/acceptance pointers"],
|
|
323
|
+
"cleanup": [{"id": "exact resource ID", "scope": "owned run or shared service registration", "state": "absent or stopped or preserved-shared or unknown", "receipt": "readback pointer"}]
|
|
324
|
+
}
|
|
325
|
+
```
|
|
@@ -71,12 +71,131 @@ The first dispatch for each (provider, model, effort) must reach a running or
|
|
|
71
71
|
completed run before its siblings launch. Rejection stops siblings of that
|
|
72
72
|
configuration; unrelated configurations remain eligible.
|
|
73
73
|
|
|
74
|
+
## Coordinating multiple drivers
|
|
75
|
+
|
|
76
|
+
The Coordinator owns the overall outcome and coordinates work across projects.
|
|
77
|
+
A Driver owns delivery within one project: implementation, review, merge and deployment.
|
|
78
|
+
A Worker performs a bounded task for a Driver, including authoring, research or review.
|
|
79
|
+
Parent describes a relationship, not a role name.
|
|
80
|
+
|
|
81
|
+
A logical Coordinator can coordinate multiple project-bound
|
|
82
|
+
drivers, each using T3 delegation for multiple scoped Workers. Reuse a suitable
|
|
83
|
+
current Coordinator. Suggest a new Coordinator only when useful.
|
|
84
|
+
Every top-level thread launch requires an explicit user request, including a
|
|
85
|
+
new Coordinator, project driver or launch fallback. On resume, preserve existing
|
|
86
|
+
explicit accepted authorization within its scope. This skill never grants
|
|
87
|
+
blanket launch permission. Missing launch authorization holds only the affected
|
|
88
|
+
launch. After a blocked launch, continue independent authorized work, subject
|
|
89
|
+
to its dependencies and scoped holds under [Autopilot](autopilot.md#advance-and-hold).
|
|
90
|
+
|
|
91
|
+
For cross-project work, use the correct project-bound driver, selecting the
|
|
92
|
+
projectId and workspaceStrategy in t3_thread_launch when an authorized launch
|
|
93
|
+
is needed. Reuse an existing appropriate driver after reconciling its ownership
|
|
94
|
+
and scope, and verify the resulting project/worktree binding before dispatch.
|
|
95
|
+
A local delegate_task cannot select another project. Never retry the same
|
|
96
|
+
invalid project request. A routing failure holds that route and its dependent
|
|
97
|
+
work, rather than the whole authorized run.
|
|
98
|
+
|
|
99
|
+
Record the logical coordinator link separately from native parentThreadId,
|
|
100
|
+
including when null. The Coordinator remains the logical role when T3 records project Drivers as
|
|
101
|
+
separate top-level threads with null parentThreadId; native ancestry does not
|
|
102
|
+
change the recorded coordination ownership. For each driver, record its
|
|
103
|
+
exact link, project, worktree, scope, owner and record pointer. Record acceptance
|
|
104
|
+
and completion handbacks, dependencies, held state and resume condition. An
|
|
105
|
+
acceptance handback binds the driver identity to accepted scope and authority;
|
|
106
|
+
completion handbacks carry exact revisions and verified receipt pointers under
|
|
107
|
+
[Lifecycle](lifecycle.md#receipts-bind-each-decision-to-evidence). Reconcile native
|
|
108
|
+
state before advancing dependencies, rather than accepting a message alone.
|
|
109
|
+
|
|
110
|
+
Each driver owns its own PR mutations and watches and is the sole writer of its
|
|
111
|
+
own run record. The Coordinator owns aggregate coordination and its aggregate record,
|
|
112
|
+
using driver handbacks rather than editing their records or taking over their PRs.
|
|
113
|
+
Never allow competing writers for a candidate or record across drivers.
|
|
114
|
+
Existing author exclusivity and accepted-transfer rules still apply.
|
|
115
|
+
|
|
116
|
+
This is an optional coordination shape: single-driver runs remain unchanged.
|
|
117
|
+
The Coordinator and Drivers have no default model role in presets. Existing model,
|
|
118
|
+
permission and remote-author restrictions remain in force, with no substitution
|
|
119
|
+
or remote-author enablement. Coordination adds no daemon, scheduler or runtime DB.
|
|
120
|
+
|
|
121
|
+
## Waiting turns and diagnosis
|
|
122
|
+
|
|
123
|
+
Before ending a waiting turn, follow [Waiting-turn and closing records](run-record.md#waiting-turn-and-closing-records).
|
|
124
|
+
The Driver diagnoses stale reviews, failing checks and relevant upstream fixes
|
|
125
|
+
immediately before ending a waiting turn. Inspect the blocker itself and record
|
|
126
|
+
its cause or a specific unexplained blocker with `diagnosis: none` and an already
|
|
127
|
+
authorized read-only diagnostic next action. Timers never replace reasoning.
|
|
128
|
+
Diagnosing a blocker preserves downstream human, auth, release and serious-risk
|
|
129
|
+
holds; it grants no dismissal, approval or merge rights.
|
|
130
|
+
|
|
131
|
+
## Bounded recovery boundary
|
|
132
|
+
|
|
133
|
+
Ordinary status and periodic status sweeps remain read-only. Recovery requires
|
|
134
|
+
an explicit user recovery invocation naming scope or an authorized schedule
|
|
135
|
+
bound to a Coordinator-designated and recorded existing recovery thread.
|
|
136
|
+
Agent messages never activate it. The accepted implementation follow-up binds
|
|
137
|
+
the bounded synthetic/owned-resource canary to expiry, rollback and exact-ID
|
|
138
|
+
cleanup. Run-scoped activation requires passing canary receipts plus recorded
|
|
139
|
+
recovery host/thread, schedule ID, scope, model/effort, finite budget, expiry and
|
|
140
|
+
cleanup owner. Record the schedule ID at creation and verify its binding before
|
|
141
|
+
any send. The already authorized bounded canary and run-scoped activation need
|
|
142
|
+
no repeat approval when those conditions pass. A persistent shared service
|
|
143
|
+
requires separate explicit user authorization. Reading these instructions alone
|
|
144
|
+
grants no new top-level launch or activation authority. Keep finite pass limits
|
|
145
|
+
shorter than the 30-minute cadence, included owners and coverage cursor bound;
|
|
146
|
+
no catch-up loop. VOA implementation/source ownership is separate.
|
|
147
|
+
|
|
148
|
+
Read the current owner record under [Waiting-turn and closing records](run-record.md#waiting-turn-and-closing-records).
|
|
149
|
+
Match exact owner host/environment/thread and accepted ownership, not title,
|
|
150
|
+
parentThreadId or age. Unknown ownership/history/queue/activity, incomplete
|
|
151
|
+
records or unavailable delivery/idempotency proof remain report-only.
|
|
152
|
+
Any active run or active/pending child work makes the owner active: skip it.
|
|
153
|
+
Delegated owners are status-only under their parent, with no continuation to
|
|
154
|
+
either parent or child. Failed/interrupted execution and completed work with
|
|
155
|
+
cleanup remaining are report-only; never relaunch or redo product work.
|
|
156
|
+
Held queues, pending requests, parked user-reply holds and unknown request/queue
|
|
157
|
+
state are report-only. Only the user resumes a held queue. Explicit stops,
|
|
158
|
+
pauses and snoozes skip recovery. These guards take precedence over diagnosis.
|
|
159
|
+
Credentials, session/pairing, permission and new-thread authorization requests
|
|
160
|
+
are report-only, with no diagnosis exception.
|
|
161
|
+
|
|
162
|
+
A diagnosis: none record is eligible only for an idle owner with a specific
|
|
163
|
+
unexplained non-human blocker and an already authorized read-only diagnostic
|
|
164
|
+
next action. This may coexist with a downstream forge-resolved user-merge,
|
|
165
|
+
npm-stage or human-review hold, including an auth-code PR. A human gate alone
|
|
166
|
+
or an already diagnosed human-only hold receives zero continuations. Diagnosis
|
|
167
|
+
never clears or answers that gate. The other eligible case is a named external
|
|
168
|
+
dependency proven cleared, with the owner's authorized next action revalidated.
|
|
169
|
+
Inspect the blocker itself; silence and a completed turn prove neither stall
|
|
170
|
+
nor completion. Verify native PR watch support for the exact external dependency
|
|
171
|
+
before promising its wake. Prefer native events. An owner wake suppresses
|
|
172
|
+
recovery only before the recorded nextEligibleCheck or while same-key wake
|
|
173
|
+
delivery is queued or running in the owner thread. An armed unfired watch or
|
|
174
|
+
schedule, or one unable to observe the named blocker, never suppresses eligible
|
|
175
|
+
recovery. Unsupported events permit checking only the named external condition
|
|
176
|
+
under the recorded canary and activation conditions.
|
|
177
|
+
|
|
178
|
+
Send one bounded continuation with its condition key to the exact existing
|
|
179
|
+
top-level owning Coordinator/Driver. Revalidate all guards, owner history,
|
|
180
|
+
queue and deduplication receipts immediately before delivery. Include structured
|
|
181
|
+
evidence references by URL/ID/SHA and a recovery summary, with the recorded next
|
|
182
|
+
action: “Revalidate; act only within your existing authorized next action.”
|
|
183
|
+
Exclude quoted third-party/tool/webhook text. A recovery continuation is never
|
|
184
|
+
a user reply, answer, approval or authorization. The receiving owner independently
|
|
185
|
+
revalidates evidence and retains its original authority and holds. Recovery
|
|
186
|
+
never answers pending questions or performs forge mutations, delegation,
|
|
187
|
+
thread creation/settlement/cancel/interrupt, settings changes, or other owners'
|
|
188
|
+
queue/watch/schedule edits. Its writes are bounded continuations, own-thread
|
|
189
|
+
receipts and only its separately authorized schedule/duplicate-message cleanup.
|
|
190
|
+
Cross-host sends remain report-only until installed C4 instructions and current
|
|
191
|
+
directed C5 write-link proof exist; never redirect or relay outside native T3.
|
|
192
|
+
|
|
74
193
|
## Role dispatch by permitted writes
|
|
75
194
|
|
|
76
195
|
| Roles | Mechanism and permitted workspace | Completion |
|
|
77
196
|
|---|---|---|
|
|
78
197
|
| Advisers, research, read-only explorers, explainers, diligence, checker, auditor, arena prose candidates and judges, escalation | Must use async `delegate_task` in the driver worktree, title = role-labelled dispatch key; tracked and untracked files stay untouched; writes only `<run>/evidence/<key>/` | Native notification followed by persisted `task_status` |
|
|
79
|
-
| Reviewers (peer/authored), release checks, debug investigators, execution investigators (`axstack-explore-execution`), UI verifier candidate checks (`axstack-ui-verifier`) | Must use async `delegate_task`, title = role-labelled dispatch key; driver makes a disposable detached checkout of candidate SHA and pinned base with `git worktree add --detach <run>/checkouts/<key> <sha>` (plus pinned debug patch); brief requires `cd` into it; only disposable probes write there, outputs go to `<run>/evidence/<key>/` | Same delegated terminal checks |
|
|
198
|
+
| Reviewers (peer/authored), release checks, debug investigators, execution investigators (`axstack-explore-execution`), UI verifier candidate checks (`axstack-ui-verifier`, `axstack-ui-verifier-sonnet`) | Must use async `delegate_task`, title = role-labelled dispatch key; driver makes a disposable detached checkout of candidate SHA and pinned base with `git worktree add --detach <run>/checkouts/<key> <sha>` (plus pinned debug patch); brief requires `cd` into it; only disposable probes write there, outputs go to `<run>/evidence/<key>/` | Same delegated terminal checks |
|
|
80
199
|
| Author and repairs | Fresh authors must use async `delegate_task` with `isolation:"worktree"`, title = role-labelled dispatch key, stable `clientRequestId` in their own worktree, kept until PR merges or closes; repairs use `t3_thread_send` to the same child | Delegated terminal checks plus verified candidate |
|
|
81
200
|
| Owner | Driver thread in Driver worktree; never writes tracked candidate source or tests; planning artifacts allowed only for repository Markdown; scope, integration, forge mutations and record | No worker launch |
|
|
82
201
|
|
|
@@ -183,6 +302,13 @@ After each delegated completion the driver must check its own `HEAD` and
|
|
|
183
302
|
`git status --porcelain` against their pre-dispatch values: both stay unchanged,
|
|
184
303
|
including untracked entries. Any change is a hold before advancing that work.
|
|
185
304
|
|
|
305
|
+
Native delegate completion owns the wake for `delegate_task` children. Never
|
|
306
|
+
status-check running delegate_task children on scheduled wakes. Never create a
|
|
307
|
+
schedule merely because delegate_task children exist. A lost completion wake
|
|
308
|
+
remains active/unknown in read-only status, rather than triggering polling,
|
|
309
|
+
silence-based cancellation or a replacement author. Native completion receipts
|
|
310
|
+
are reconciled on delivery, not sought through hourly status checks.
|
|
311
|
+
|
|
186
312
|
## Launch recovery, repairs and questions
|
|
187
313
|
|
|
188
314
|
For a lost delegated dispatch or repair response, retry with the same stable
|
|
@@ -233,12 +359,13 @@ A replacement after terminal failure must use `a<n+1>`, a new branch and title;
|
|
|
233
359
|
the failed attempt's branch is kept until salvage. Unknown liveness holds
|
|
234
360
|
replacement; reconcile the old writer before admitting another.
|
|
235
361
|
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
`
|
|
362
|
+
The bound lifecycle rule below applies only to owned launched-fallback Writers
|
|
363
|
+
awaiting completion. With an unsettled launched thread, the driver turn must end only while a bound
|
|
364
|
+
`schedule_task` with `bindToCurrentThread:true` is armed at the 5-minute lifecycle
|
|
365
|
+
cadence `everyMs:300000` under
|
|
239
366
|
[Chat-run watch runtime](../../axstack-watch/references/watch-runtime.md#chat-run-watch),
|
|
240
|
-
with its ID recorded. Each wake must reconcile
|
|
241
|
-
writer that died without sending; failed runs hold incomplete work. The watch
|
|
367
|
+
with its ID recorded. Each wake must reconcile unsettled launched-fallback Writer
|
|
368
|
+
runs, including a writer that died without sending; failed runs hold incomplete work. The watch
|
|
242
369
|
inherits the driver model/workspace and adds no runtime of Axstack's own.
|
|
243
370
|
T3 queues a scheduled wake even while the driver is busy, so copies pile up.
|
|
244
371
|
After a provider error, server restart or Stop, T3 holds the queue: held
|
|
@@ -324,7 +451,7 @@ An open PR left unwatched by a user Stop never triggers the 5-minute recovery ca
|
|
|
324
451
|
After T3 auto-settles a multi-PR driver on one PR merge, it re-arms remaining
|
|
325
452
|
open members through the recovery steps before ending the turn.
|
|
326
453
|
If rate-limited, use the 5-minute schedule and next-wake recovery above.
|
|
327
|
-
The schedule
|
|
454
|
+
The schedule reconciles delivered receipts, readiness and release, plus launched-fallback Writer runs.
|
|
328
455
|
When a PR merges or closes, or its watch is torn down, call `unwatch_pull_request`
|
|
329
456
|
and keep its link.
|
|
330
457
|
|
|
@@ -409,3 +536,43 @@ For own PRs, automatic merge is the default under the
|
|
|
409
536
|
[watch predicate](../../axstack-watch/SKILL.md#5-state-readiness-precisely).
|
|
410
537
|
The recorded owning watch thread merges; a missing or idle owner requires
|
|
411
538
|
lifecycle reconciliation and explicit transfer first.
|
|
539
|
+
|
|
540
|
+
## Fleet nonwriter boundary (C3a)
|
|
541
|
+
|
|
542
|
+
Before dispatch, the driver must capture capability, project, settings and access
|
|
543
|
+
through native forwarded APIs on the selected destination, following
|
|
544
|
+
[Fleet dispatch and receipts](fleet-dispatch.md). Origin catalogs and caller
|
|
545
|
+
assertions alone cannot establish destination readiness. Preserve exact catalog
|
|
546
|
+
bytes/digest, explicit observation/evaluation times, config digest and recommendation.
|
|
547
|
+
|
|
548
|
+
`t3_thread_configuration` is currently unavailable in the advertised tools.
|
|
549
|
+
Unavailable effective fields remain unknown; the driver must not invent an API,
|
|
550
|
+
readiness or effective settings. Use advertised dispatch/thread facts, keep requested
|
|
551
|
+
and effective values separate, and hold any required unobserved field.
|
|
552
|
+
|
|
553
|
+
For ambiguous submission, reconcile the exact clientRequestId/attempt and remote task
|
|
554
|
+
before any retry. Unknown liveness prohibits replacement. A confirmed not-submitted
|
|
555
|
+
failure may exclude that route and recompute from current facts; it never permits
|
|
556
|
+
model or permission substitution. No hidden SSH agent or new top-level thread is
|
|
557
|
+
an execution fallback; a new thread requires an explicit user request.
|
|
558
|
+
|
|
559
|
+
The driver must read task_status on the origin and terminal/thread facts on the
|
|
560
|
+
actual destination for the latest run. Pending children or an unanswered question
|
|
561
|
+
prevent success even after a completed turn. Read the native pending-question list
|
|
562
|
+
with `t3_pending_request` action `list` on that destination; the older
|
|
563
|
+
`t3_pending_request_list` spelling above is not an advertised callable tool.
|
|
564
|
+
A null local childThreadId, idle state, silence or old summary proves no completion.
|
|
565
|
+
|
|
566
|
+
The remote author coordinator remains DISABLED: C3b's all-refs-unchanged pilot
|
|
567
|
+
failed because of T3 checkpoint refs. Drivers must not enable or rerun the pilot
|
|
568
|
+
under C3a. Direct remote worktree authors remain ineligible on T3 v0.1.5;
|
|
569
|
+
local isolated authors remain the fallback even when overloaded. C4 personal
|
|
570
|
+
policy/Haoshoku changes and C6 deployment/live acceptance remain later phases.
|
|
571
|
+
|
|
572
|
+
Remote nonwriters use native `delegate_task` with exact selected target.environmentId,
|
|
573
|
+
projectId, providerInstanceId, model, target.options and runtimeMode. Remote reviewers
|
|
574
|
+
use T3 `isolation:"worktree"`; never make their child checkouts in the shell.
|
|
575
|
+
Use no raw agent CLI over SSH. SSH is restricted to telemetry and authorized
|
|
576
|
+
artifact/commit transport. Follow host-qualified archive/readback/retirement in
|
|
577
|
+
[Fleet dispatch and receipts](fleet-dispatch.md#retrieval-and-retirement).
|
|
578
|
+
Only the driver publishes, links, watches or merges PRs.
|
|
@@ -2,8 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
Every Playwright, browser, or rendered-UI check outside the two named browser
|
|
4
4
|
exceptions, including a "confirm it in the browser" step, goes through async
|
|
5
|
-
`delegate_task` to
|
|
6
|
-
|
|
5
|
+
`delegate_task` to a configured UI verifier role.
|
|
6
|
+
The configured UI verifier roles are `axstack-ui-verifier` and
|
|
7
|
+
`axstack-ui-verifier-sonnet` from the role snapshot; select them under the
|
|
8
|
+
[dual-run trigger](#android-device-and-webpwa-dual-run) below.
|
|
9
|
+
Give each verifier the exact build, URL, or artifact and the private dispatch's evidence folder. The verifier is read-only: it never edits source.
|
|
7
10
|
The PR writer remains the sole writer.
|
|
8
11
|
|
|
9
12
|
Before using a PR preview URL, the UI verifier must read [PR previews](preview.md).
|
|
@@ -17,12 +20,12 @@ The second named browser exception permits dispatched roles to use
|
|
|
17
20
|
`html_preview` as a non-publishing self-check.
|
|
18
21
|
Dispatched-role self-checks never replace the driver's two previews or the `axstack-ui-verifier` pass.
|
|
19
22
|
Dispatched roles never call `html_render`.
|
|
20
|
-
All other browser checks outside the two named exceptions remain delegated to
|
|
23
|
+
All other browser checks outside the two named exceptions remain delegated to configured UI verifier roles under the dual-run trigger below.
|
|
21
24
|
|
|
22
25
|
Read the [T3 runtime boundary](t3-runtime.md) before dispatch; for candidate
|
|
23
26
|
checks use its driver-made disposable detached checkout at the pinned candidate SHA.
|
|
24
27
|
Use the configured verifier browser and honor the user browser-tool policy.
|
|
25
|
-
Candidate browser and visual checks must run in
|
|
28
|
+
Candidate browser and visual checks must run in a delegated UI verifier role in its own detached checkout; outputs go to its private evidence folder, never the driver worktree.
|
|
26
29
|
|
|
27
30
|
For every interactive page, require a real-browser `axstack-ui-verifier` interaction pass.
|
|
28
31
|
Give the evidence path and SHA-256 of the exact bytes in the verifier brief.
|
|
@@ -47,6 +50,66 @@ Report a broken or stale recipe as a `low` finding naming `axstack-verify mainta
|
|
|
47
50
|
Never let a broken or stale recipe waive existing acceptance obligations.
|
|
48
51
|
Keep browser recipes tool-neutral for the verifier.
|
|
49
52
|
|
|
53
|
+
## Android device and web/PWA dual run
|
|
54
|
+
|
|
55
|
+
Apply the dual run to Android device verification or explicitly requested
|
|
56
|
+
PWA/app feature verification, such as a `verify-<app>` device recipe or a user request.
|
|
57
|
+
Ordinary review and watch browser checks use one `axstack-ui-verifier` pass by default.
|
|
58
|
+
For these Android and web/PWA runs, assign run 1 to
|
|
59
|
+
`axstack-ui-verifier` (Terra high).
|
|
60
|
+
Dispatch independent run 2 to `axstack-ui-verifier-sonnet` with the same brief
|
|
61
|
+
and the same pinned build.
|
|
62
|
+
Never show run 2 the run 1 results.
|
|
63
|
+
Start run 2 only after run 1 completes shutdown; use a fresh delegated session
|
|
64
|
+
and a separate private evidence folder.
|
|
65
|
+
The two-provider check requires the mixed preset; an intentional single-provider
|
|
66
|
+
absence leaves dual-run verification unverified, without substitution.
|
|
67
|
+
This dual run does not add a second pass to the inline-page exception above.
|
|
68
|
+
|
|
69
|
+
Before run 1, record APK SHA-256 (or build SHA) and PWA deploy SHA in the brief.
|
|
70
|
+
Include feature files, prerequisites, target URL and per-feature acceptance checks.
|
|
71
|
+
Select the host through fleet routing using account-local configuration and
|
|
72
|
+
[capability examples](fleet-route-schema.md#device-and-browser-examples).
|
|
73
|
+
When `desktop:user` status is missing or unknown, treat the host as a user desktop.
|
|
74
|
+
On a `desktop:user` host, including that safe default, use only a headless browser and a windowless emulator.
|
|
75
|
+
Never focus windows or switch workspaces on a user desktop.
|
|
76
|
+
Allow only one emulator per host at a time.
|
|
77
|
+
Run a thermal precheck before starting on hosts that declare one; honor their
|
|
78
|
+
account-local start/stop thresholds and hold or route elsewhere if unsafe.
|
|
79
|
+
For iOS without a capable host, report unverified.
|
|
80
|
+
|
|
81
|
+
Each run follows the same lifecycle:
|
|
82
|
+
|
|
83
|
+
1. Call `device_list` and confirm `agentDeviceInstalled: true` before `device_open`.
|
|
84
|
+
Pass the selected device's `hostId` and `id` to `device_open`.
|
|
85
|
+
2. Use `device_open` and its returned `agent-device` command to install, launch
|
|
86
|
+
and drive the pinned APK; open the app before snapshots or input.
|
|
87
|
+
Use the returned command's help for supported operations; report unavailable
|
|
88
|
+
install/build capabilities as unverified rather than inventing commands.
|
|
89
|
+
3. Save a snapshot and `device_screenshot` for each feature end state in private
|
|
90
|
+
evidence; capture actions, resulting states and side effects.
|
|
91
|
+
4. For web/PWA, use Playwright MCP at 390×844 and 1440×900, driving the same features.
|
|
92
|
+
Capture console errors as route template and code only.
|
|
93
|
+
5. Return pass, fail or blocked per feature, pinned build identities and evidence
|
|
94
|
+
paths; keep secrets, recovery phrases, tokens and addresses out of reports.
|
|
95
|
+
Follow the app's production-testing policy; unattended production money paths
|
|
96
|
+
stop at read-only actions.
|
|
97
|
+
6. After each run, including failed attempts, use `device_close` with
|
|
98
|
+
`shutdown: true` and `browser_close` for owned sessions; preserve evidence.
|
|
99
|
+
|
|
100
|
+
The driver reconciles each feature:
|
|
101
|
+
|
|
102
|
+
- When both runs pass, the driver records pass.
|
|
103
|
+
- When both runs fail a feature, the driver records fail and routes it to `axstack-debug`.
|
|
104
|
+
- If runs disagree, the driver holds and requests one Sonnet rerun of that feature.
|
|
105
|
+
Use a fresh delegated session and a separate private evidence folder for the
|
|
106
|
+
Sonnet rerun, with the same brief and same pinned build.
|
|
107
|
+
Never show the Sonnet rerun run 1 or run 2 results.
|
|
108
|
+
If the rerun still disagrees with run 1, report flaky/unverified with all observations.
|
|
109
|
+
If the rerun agrees with run 1, the agreed result stands while the driver records
|
|
110
|
+
the initial disagreement in evidence; an agreed failure routes to `axstack-debug`.
|
|
111
|
+
- Blocked or missing coverage remains unverified, never a pass.
|
|
112
|
+
|
|
50
113
|
## Proof standards
|
|
51
114
|
|
|
52
115
|
Apply these standards wherever referenced, including the verifier's candidate checks
|