Autonomous work contract
This document exists so agents and maintainers can make progress without re-asking project-direction questions.
Decision policy
Until alpha, continue without asking unless a change would alter architecture. Architecture changes include:
- a new JS runtime target or abstraction,
- a rendered frontend other than ADR-022's Flutter formatter/shell/automation host,
- a second render/paint path,
- a bridge that moves navigation, DOM/runtime, policy, persistence, web-event semantics, or accessibility meaning out of BrowserCore,
- a layout architecture outside ADR-022's mutation/commit ownership,
- a core dependency that changes binary-size or subsystem ownership materially,
- a security-policy change that makes behavior less fail-closed.
For ordinary implementation details, choose the safest path aligned with
PROJECT_DIRECTION.md, document assumptions briefly, and keep moving.
Commit and push policy
- Automatic commits are allowed when the batch is coherent and gates pass.
- Automatic pushes are allowed when hk pre-push gates pass.
- Prefer milestone commits over tiny churn commits.
- Do not bypass hk. If hk fails, fix the issue or report the blocker.
Gate policy
Linux agents and maintainers run on a host with the native packages documented
in docs/guidance/mise.md; a Distrobox is not required. Before reporting a
local Linux gate, record PRETTY_NAME from /etc/os-release and ensure Mise
was activated in the shell that ran it. Debian, Fedora, and Ubuntu 26.04 are
optional compatibility runs; release-builder recipes retain their separately
pinned environment.
- Inner loop: focused
cargo check/cargo test/just gate-phaseNas needed. - Before commit: hk pre-commit hook; it should stay quick and fix formatting.
- Before push: hk pre-push hook; long gates run here because iteration speed matters.
- Release:
ACCEPTANCE.mdgates plus measured size/compatibility reports.
The checked-in Linux Flutter slice uses an exact ignored SDK checkout and
just gate-flutter-shell; bootstrap it with just setup-flutter. Do not report
Rust/GTK checks as Flutter proof, or Dart/widget checks as Linux package proof.
Platform work follows ROADMAP.md and FLUTTER_SHELL.md: ADR-022 R1–R8 are
complete. Post-R7 compatibility/release/frame/GPU checkpoints and the real Linux
Mozc corridor are recorded. The official stable SDK migration preserves the
process-filtered AT-SPI name gate and native-pointer focus on GTK3; broader
role/state/bounds/action claims require fresh migrated evidence. Keep the
executable gates intact while shared-core reductions proceed one proven host
family at a time before broader shell/platform expansion. A2 static same-origin/file module
dependency graphs now use the shared resource loader; continue that family with
CORS enforced before V8 exposure and eligible HTTP(S) cache entries
conditionally revalidated under current policy. One bounded pre-module inline
import map now resolves through the same policy-bound loader. Page-module
dynamic imports retain bounded graph provenance and cancellation across later
roots/tasks. Parser classics and BrowserCore automation now also register exact
source/document policy before dynamic import, including accepted redirect URLs
and retained import maps. A shared bounded private-cache decision now gives page fetch/XHR and
module loads Date/Age plus max-age/Expires freshness, effective request
directives, simultaneous exact Vary variants, and bounded permanent
same-origin redirect aliases. The transport now performs bounded incremental
body reads and publishes progress/completion through ReadableStream, XHR,
BrowserCore/C ABI, and CDP. Page fetch/XHR now use a bounded asynchronous realm owner; active
AbortSignal, XHR abort, stop/deadline, and realm teardown drop transport without
late profile effects. Ordinary policy-accepted response heads now resolve before
body completion and feed an eight-message backpressured stream; abort after
resolution rejects body reads with the same JS reason, while integrity, 304
revalidation, and opaque responses remain buffered. Exact static/dynamic JSON
import attributes now use that source, policy, profile, limit, and cancellation
provenance plus strict JSON response typing; unsupported keys and types are
rejected before transport. External classic/module root SRI now verifies raw
bytes before V8, cookies, or cache insertion. Bounded import-map integrity now
applies exact normalized-URL metadata to root fallback and graph dependencies at
the same boundary. Up to 64 inline maps now merge first-wins under a 512 KiB
normalized-state cap and a 2,048-entry/1 MiB successful-resolution set; static
parser-position snapshots remain stable while later dynamic imports see the
latest map. Continue A2 by carrying authored script/module referrer policy and
fetch priority through roots, redirects, dependencies, and diagnostics.
The project owns hook definitions in hk.pkl. just owns command recipes; hk
owns when those recipes run in the git lifecycle.
Reporting format
Final handoff should be terse and evidence-first:
- objective completed,
- changed files,
- checks run and pass/fail status,
- commit hash and push status when applicable,
- remaining known gaps or next slice.
For large compatibility work, update COMPAT.md from actual fixture/WPT output
rather than prose guesses.
Documentation rule
Prefer ADR-style docs that explain why and point to code for how. Avoid parallel prose that must be maintained beside source unless it records product direction, architecture constraints, compatibility results, or gate policy.