# Workflow - `git pull` `next` and cut a branch from it — one branch per issue, named `issue--`. Never branch from `main`. - Do the work as one commit whose title ends with ` (closes #N)`, with the `TODO.md` update in that same commit. - Move Next Step to the top of Completed Steps; move the top item of Future Steps into Next Step. - Run `make fmt`, then `make check`. A feature branch may be red; `next` and `main` may not. - Rebase onto current `next` immediately before pushing — other branches land on `next` continuously — and re-run `make check` after resolving, because a clean textual merge can still break the build. - Push the branch and open one PR per issue with base `next`. Never base `main`. - An independent reviewer who did not write the change gates the merge. On a passed review the PR is squash-merged into `next`. - `next` is the branch for the next milestone. It is kept green and mergeable to `main` at any moment, without notice. - `main` receives exactly one PR per milestone, from `next`. Releases are tagged from `main`. # Status pre-1.0, working towards the 1.0.0 milestone. Tagged v0.1.0 on 2026-02-27. The milestone is in flight on `next`; its `next` -> `main` PR is [#190](https://git.eeqj.de/sneak/AutistMask/pulls/190). `make check` verified green on `next` at `e9fa8be` on 2026-08-10, and `make build` produces `dist/chrome/` and `dist/firefox/` with every bundle verified to have `DEBUG` compiled off. The backlog lives on the [Gitea tracker](https://git.eeqj.de/sneak/AutistMask/issues), which is authoritative; this file does not duplicate it. Full policy file set present. Real-browser end-to-end suites (`make test-e2e` for Chrome, `make test-e2e-firefox` for Firefox) now sit alongside `make check`, which cannot see a runtime `ReferenceError` in a popup view, and `.gitea/workflows/e2e.yml` runs both of them on every push. # Next Step Land [#152](https://git.eeqj.de/sneak/AutistMask/issues/152): add ESLint to `script/lint`. `make check` is `prettier --check` only today and cannot catch undefined identifiers, which is how [#150](https://git.eeqj.de/sneak/AutistMask/issues/150) and [#151](https://git.eeqj.de/sneak/AutistMask/issues/151) shipped. # Completed Steps - 2026-08-17: The Settings screen is driven in a browser, and every element id the popup looks up is checked statically. Nothing exercised Settings in the e2e suite, and jest runs with no DOM, so the densest run of `$("...")` lookups in the codebase was unverified at runtime. Seven new cases in `tests/e2e/run.js` reach Settings, assert the About well and the wallet list were actually written, assert the four Token Spam Protection checkboxes are real checkboxes defaulted on, and assert the theme and network selectors offer the choices `src/shared/networks.js` and `index.html` define. The selectors are then driven to `dark` and `sepolia` — neither is the first `