Found by a docs/ staleness audit: - architecture.md: Claude no longer runs under tmux — it's driven over the stream-json control protocol with --resume (D-75/D-77/D-78); and the IPC socket server is implemented, not "currently unimplemented". - testing/README.md + claude-ui-workflow.md: drop the dissolved app/ two-package paths (D-56) — tests live at test/ and the web build at build/web/. - design/multitab-pane.md: the Claude pane spawns a stream-json session, not a tmux one; ClaudeSessionRef carries the session id. Frozen historical snapshots (initial-plan.md, the HISTORICAL pty docs, dated spikes/audits) left as-is. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Testing clide
Every layer of the test pyramid is wired. The suite is intentionally
designed to run client-side only — git clone && make push-check works
on any Linux or macOS dev box without network access or shared state.
Layers
| layer | location | runner | time | when |
|---|---|---|---|---|
| unit (Flutter-free core) | test/ipc/, test/daemon/, test/pty/ |
dart test |
~5s | make test-core |
| unit + widget + golden | test/ |
flutter test |
~30s | make test |
| a11y contract | test/a11y/ |
flutter test |
~5s | make test-a11y |
| integration (startup gate) | integration_test/ |
flutter test integration_test/ |
~60s | make test-integration |
| daemon E2E + web WASM smoke | test/daemon/ + tools/ui/tests/ |
dart test + Playwright |
~60s | make test-e2e |
| startup bundle smoke | ci/smoke_bundle.sh |
xvfb-run, 5s timeout | ~30s | make smoke-bundle |
Dev loop
make push-check # gate before `git push` (~90s)
make test-all # full pyramid (~3-5min)
A11y + i18n
A11y is a day-one contract, not a Tier-6 polish. Every interactive widget
emits a Semantics node with label + hint. The a11y suite enforces:
- semantic_coverage_test.dart — every built-in declares title + version and every interactive contribution carries the fields needed to build a Semantics node.
- contrast_test.dart — every bundled theme meets WCAG-AA on the token
pairs in
lib/kernel/src/theme/contrast.dart. Catches token-pair regressions (foreground-on-background, tab.active-on-bg, etc.). - i18n_coverage_test.dart — every i18n key referenced by Tier-0 built-ins exists in its en_US catalog. Asserts key presence directly (not "returned value == key" — that's ambiguous for keys that happen to equal their English translation).
- keyboard_traversal_test.dart — interactive widgets are focusable and expose tap actions to a11y.
See a11y-manual.md for the 15-minute manual
screen-reader checklist run at every tier cut.
Interacting with the app (Claude + humans)
Claude Code drives the Flutter WASM build through a Playwright harness
— not via screenshots. Semantics are the contract. See
claude-ui-workflow.md for the loop.
CI
.gitea/workflows/test.yml is ready to run but Gitea Actions is not
enabled on the instance yet. When the user flips it, four jobs kick off
per push: unit, integration, startup-bundle, e2e. The workflow
file is GitHub-Actions compatible — copying it to .github/workflows/
is the entire migration if the repo moves to GitHub.