Files
workinf_Blender_Wasm/my-tools/AUTOPILOT.md
mes123456 edcf0fef9a
Some checks failed
M6 deployable RC / quick (push) Has been cancelled
M6 deployable RC / chromium (push) Has been cancelled
M6 deployable RC / release (push) Has been cancelled
feat(web): add source-first Python autopilot and optimize provider waits
2026-09-08 10:59:49 +08:00

169 lines
8.6 KiB
Markdown

# Python Blender Web Autopilot
This supervisor advances the authoritative `docs/EXECUTION_QUEUE.md` task toward
source-backed Blender Web behavior. Product backlog entries are bounded work
items inside that task, not a replacement queue. Blender source/Main remains the
specification. A task, route assignment, successful build or agent-written
`ready` result is never counted as completed migration.
## Commands
Run from the repository root with Python 3.11 or newer on Linux:
```bash
python3 my-tools/run_web_product_migration.py doctor
python3 my-tools/run_web_product_migration.py start
python3 my-tools/run_web_product_migration.py status
python3 my-tools/run_web_product_migration.py timings
python3 my-tools/run_web_product_migration.py pause
python3 my-tools/run_web_product_migration.py reconcile
python3 my-tools/run_web_product_migration.py resume
```
`start` detaches from the terminal and transfers an exclusive OS lock to its
child without an ownership gap. `run --once` performs at most one implementation
attempt in the foreground. `--max-cycles N` bounds a run; zero means unlimited
cycles within the token and failure budgets. The existing
`bash my-tools/start_unattended.sh` product entrypoint uses this supervisor.
`stop` aliases `pause`. It terminates the active process group and records the
outcome. Interrupted implementation/commit/push work enters `needs_reconcile`.
`reconcile` is read-only. After inspecting the referenced edits, process receipts
and remote HEAD where relevant, `resume --retry-blocked` explicitly acknowledges
that state and resets the affected failure budget. An unreadable checkpoint or
unknown write outcome is never silently replayed.
For login/boot service management:
```bash
python3 my-tools/run_web_product_migration.py service
systemctl --user daemon-reload
systemctl --user enable --now blender-web-autopilot
```
The generated service captures the executable search path and restarts unexpected
process failures. Exit codes 2/3/4 prevent restart loops for known blockers,
unknown outcomes and budget exhaustion. Unattended operation without a logged-in
user also requires the host's user-service lingering configuration.
## Execution Contract
1. Read and validate the current queue, parent manifest and compact context.
2. Select a bounded current-task workflow, prioritizing audited production gaps.
3. Run one noninteractive Codex CLI turn to implement source/protocol/UI code and
prepare focused tests. The configured model is inherited; no model override,
API credential or SSH password is embedded in the program.
4. Require actual process exit 0, `turn.completed` and schema-valid output.
Finding a result file alone never ends or accepts a worker.
5. Independently run source build, typecheck, lint, Chromium, positive/negative,
undo/redo, save/reopen and determinism checks. Duplicate argv/cwd pairs run
once. Build parallelism is capped at eight jobs.
6. Require fresh runtime case receipts, native Main state observations and
SHA-256-bound compiled/runtime artifacts. Bind the validation logs and input
files in a supervisor-generated receipt.
7. Reuse receipts only while every input and artifact hash still matches.
Complete untouched workflows before revisiting shared-file invalidations.
8. After all current workflows pass, run a separate handoff turn restricted to
repository generators and evidence files, then independently run governance
gates and verify the resulting manifest. Advance only to its `nextTask`.
9. Commit exact declared handoff paths using `git commit --only`, retaining
unrelated staged edits. Pre-existing dirty paths cannot be silently included.
Push without force and require remote `main` HEAD to equal the local commit.
A successor is generated through repository tools, never inferred from a task
number. With unverified source units and no valid successor, the supervisor
reports `planning_required`; it does not announce full desktop parity.
## Policy And Evidence
Configuration: `my-tools/wbv2_autopilot_policy.json`. Defaults are 30 minutes per
worker/check, three attempts per failing workflow, 500,000 reported input/output
tokens per run, 32 MiB per process log, eight build jobs, and six push retries.
The token limit is checked between turns, so the last turn can exceed it.
`autoCommit` and `autoPush` control repository publication. All mandatory runtime
check categories remain required even when policy is edited.
The supervisor uses the existing authenticated `codex exec` CLI with
`workspace-write` sandbox and no interactive approvals. Worker stdout is JSONL;
structured output is requested with `--output-schema` and
`--output-last-message`. Consult the installed `codex exec --help` for the
supported CLI flags in this environment.
State is under `tests/golden/WBV2/autopilot/`:
- `state.json`: atomic checkpoint, job states, PIDs and reasons.
- `owner.lock`: OS-backed exclusive ownership with process identity.
- `baseline.json`: initial HEAD and pre-existing dirty paths for publication.
- `events.jsonl`, `daemon.log`: concise lifecycle events and detached output.
- `runs/<attempt>/`: worker output, check logs, process exit receipts, fresh
behavioral receipts and the final verified receipt.
`node tools/web/print-wbv2-live-status.mjs --json` includes Python supervisor
state. The existing Python status display no longer infers completion from
34/34 implemented backlog entries.
Production implementation workers do not SSH, deploy or mutate the live website.
They verify new code against disposable local runtime fixtures. The production
origin is available as `WBV2_DEPLOYED_ORIGIN`; release deployment remains a
separate operation after tested artifacts and a rollback target exist. Configure
deployment credentials through the existing host credential facilities, never
inside this policy or logs.
## Verification
```bash
python3 -m unittest discover -s my-tools -p test_wbv2_autopilot.py -v
python3 -m py_compile my-tools/wbv2_autopilot.py my-tools/run_web_product_migration.py
node tools/web/run-wbv2-scheduler.mjs --preflight-only
git diff --check
```
The tests exercise supervisor behavior with synthetic fixtures and real child
processes. They are not Blender migration coverage. Actual coverage is earned
only by source-backed native/Chromium module validation and repository binding.
## Source-First Workflow Rule
Business modules and function routes drive implementation: module -> user
workflow -> function route -> native source/operator cases. Search the supplied
`blender-5.2.0` source and task-scoped references before editing Web behavior.
Use `search-wbv2-batch-source.mjs --unit <id> --pattern <symbol>` for a bounded
source search. Worker results must name `workflow`, exact catalog `routeIds`
and native `sourceReferences`; the independent receipt binds those files.
## Timing And Provider Backoff
Displayed time labels use Beijing time, `YYYY-MM-DD HH:MM`. Machine checkpoints
retain precise timestamps; reports express elapsed time in minutes.
```bash
python3 my-tools/run_web_product_migration.py timings
python3 my-tools/run_web_product_migration.py timings --json --write
python3 my-tools/benchmark_wbv2_autopilot.py
```
`timings` is read-only unless `--write` is given. It reports each completed step,
phase totals/shares, maximum durations and the current process. JSONL tool spans
separate provider wait, model response, reads, edits and command execution.
Nested spans are not added to process totals again. Old logs cannot reconstruct
per-item timestamps or unrecorded gaps.
Short commands wait for process completion directly. Heartbeats are written
every five seconds rather than on every poll. Provider events are read
incrementally with a default observation interval of 0.25 seconds. Shared
evidence paths are hashed once per fingerprint operation.
Before any agent action, overload/concurrency/rate-limit errors end the waiting
process promptly. No first action within 60 seconds also ends the request.
Automatic retry requires a known JSONL handshake, no actions or unknown output,
and unchanged source/protected fingerprints. Retry delays are 30, 60, 120 and
at most 240 seconds; four provider failures stop with `provider_blocked`.
Provider failures do not consume implementation attempts. Silence after actions
has a 180-second limit unless a tool is active; unknown outcomes require
reconciliation. Build/test limits and behavioral gates remain in force.
After a reviewed maintenance commit, `resume --retry-blocked --refresh-baseline`
can refresh the Git baseline only when no workflow edits or receipts are recorded.
It retains remaining dirty paths as protected pre-existing work, and cannot
absorb partially implemented or already verified workflow changes.