2026-10-06 14:02:01 +02:00
|
|
|
|
# Use-case collection and regression infrastructure
|
|
|
|
|
|
|
|
|
|
|
|
This collection records the jobs people actually do in coulomb.social and keeps
|
|
|
|
|
|
established behavior working while it is rebuilt and moved off Bubble.
|
|
|
|
|
|
Start with **CSOC-UC-008, ReichelAg weekly founder calls**: duplicate the full
|
|
|
|
|
|
previous protocol, edit the new agenda/notes manually, copy for external email.
|
|
|
|
|
|
|
|
|
|
|
|
## Collection
|
|
|
|
|
|
|
|
|
|
|
|
- `catalog.md`: discovery backlog, including inferred candidates.
|
|
|
|
|
|
- `registry.json`: executable index of established journeys and required tests.
|
|
|
|
|
|
- `reichelag-weekly-call.md`: user-confirmed behavior and remaining manual review.
|
|
|
|
|
|
- `first-transfer-review.md`: real-user migration acceptance walkthrough.
|
2026-10-07 11:23:51 +02:00
|
|
|
|
- `platform-communication.md`: recovery/invitation/notification catalogue and
|
|
|
|
|
|
explicit owner-spanning regression gaps under WP-0010.
|
2026-10-06 14:02:01 +02:00
|
|
|
|
- `tests/usecases/fixtures/`: synthetic scenarios; never private protocol content.
|
|
|
|
|
|
|
|
|
|
|
|
Confirmation, regression protection and transfer acceptance are independent.
|
|
|
|
|
|
`established: true` means a user-confirmed behavior contract must keep passing;
|
|
|
|
|
|
it does **not** mean the use case has been accepted for productive transfer.
|
|
|
|
|
|
Only the user's review can grant that, with an explicit acceptance reference.
|
|
|
|
|
|
|
|
|
|
|
|
## Run the gate
|
|
|
|
|
|
|
|
|
|
|
|
Requires Python 3.12+, uv, Node 20+ and npm. Locked Python/Node dependencies are
|
|
|
|
|
|
tracked. First setup (Chromium OS libraries must be available):
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
uv sync --locked
|
|
|
|
|
|
make setup-usecases
|
|
|
|
|
|
# On a fresh Linux CI runner, install browser OS libraries too:
|
|
|
|
|
|
cd scripts && npx playwright install --with-deps chromium
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
From the repository root:
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
make test # Fast application checks; browser tests explicitly deselected
|
|
|
|
|
|
make test-usecases # All registered journey tests, including actual browser UI
|
|
|
|
|
|
make test-browser # Only browser journeys, still validates registry coverage
|
2026-10-07 11:23:51 +02:00
|
|
|
|
make check # Required lint + full application/use-case/browser gate
|
2026-10-06 14:02:01 +02:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
`make check` is the release/change validation command. Browser tests are required,
|
|
|
|
|
|
not conditionally skipped when Node, Playwright or Chromium is absent. A missing
|
|
|
|
|
|
dependency or test mapping fails the gate. JUnit results are written under
|
|
|
|
|
|
`var/test-results/` (gitignored). The ordinary `make test` is intentionally the
|
|
|
|
|
|
fast iteration command, not proof that all established journeys still work.
|
|
|
|
|
|
|
|
|
|
|
|
The registry validates **collected node IDs before deselection**: deleting or
|
|
|
|
|
|
renaming a protected test, removing its use-case marker, or giving it the wrong
|
|
|
|
|
|
browser/fast layer fails with `Use-case regression contract failed`. Disabling a
|
|
|
|
|
|
protected check with skip/xfail is also rejected. Update mappings deliberately
|
|
|
|
|
|
when refactoring; do not delete a required behavior to turn a failure green.
|
|
|
|
|
|
|
|
|
|
|
|
## What ReichelAg protection covers
|
|
|
|
|
|
|
|
|
|
|
|
Fast test: real application POSTs, full protocol duplication, edit/source
|
|
|
|
|
|
independence, rendered clipboard controls and reader access.
|
|
|
|
|
|
|
|
|
|
|
|
Browser test: isolated Django DB and temporary content root; synthetic writer,
|
|
|
|
|
|
reader and outsider; actual sign-in/list/page/duplicate/edit/save/reopen screens;
|
|
|
|
|
|
real static clipboard script; heading/list export as HTML/plain text; blocked
|
|
|
|
|
|
clipboard manual selection; sample rich email-editor consumption; reader mutation
|
|
|
|
|
|
and outsider read denial. It checks that browser writes persist and the original
|
|
|
|
|
|
protocol remains unchanged. Unexpected external browser requests are blocked.
|
|
|
|
|
|
|
|
|
|
|
|
Clipboard writes are intercepted using native browser ClipboardItem objects;
|
|
|
|
|
|
there is no OS clipboard export of private notes, external issuer or email send.
|
|
|
|
|
|
The test uses developer sign-in in its isolated test instance. It does **not**
|
|
|
|
|
|
prove production OIDC, restart/backup recovery, actual ReichelAg corpus fidelity,
|
2026-10-08 15:14:02 +02:00
|
|
|
|
or compatibility with the user's usual mail client. User acceptance separately
|
|
|
|
|
|
records the weekly-call/mail-client workflow on revision16. Remaining broader
|
|
|
|
|
|
recovery/content/cohort acceptance belongs to WP-0012–0014; WP-0008 is finished.
|
2026-10-06 14:02:01 +02:00
|
|
|
|
|
|
|
|
|
|
The smaller `node scripts/test-copy-content.mjs` check remains available for
|
|
|
|
|
|
clipboard component debugging; the required browser gate exercises the actual
|
|
|
|
|
|
Django screens instead of substituting a hand-built page.
|
|
|
|
|
|
|
2026-10-07 11:23:51 +02:00
|
|
|
|
Private local Visual protection also verifies owner/viewer image bytes and
|
|
|
|
|
|
denies outsider, cross-tenant, revoked and archived access. The real-browser
|
|
|
|
|
|
journey loads a synthetic one-pixel cover before/after duplication and for the
|
|
|
|
|
|
reader; direct outsider image access fails. Traversal, symlinks, disguised HTML
|
|
|
|
|
|
and asset overwrite are covered by fast tests. This is local implementation
|
2026-10-08 15:14:02 +02:00
|
|
|
|
evidence; weekly-call page/list visuals are user-accepted. Wider corpus
|
|
|
|
|
|
and content review remain WP-0014-T01 / WP-0013-T02.
|
2026-10-07 11:23:51 +02:00
|
|
|
|
|
2026-10-07 13:55:59 +02:00
|
|
|
|
The test database is a temporary SQLite file per run/worker. This gives the
|
|
|
|
|
|
live server separate database connections for concurrent cover requests rather
|
|
|
|
|
|
than sharing one in-memory connection across threads. It remains isolated from
|
|
|
|
|
|
developer and production databases; image requests are not serialized or skipped.
|
|
|
|
|
|
|
2026-10-06 14:02:01 +02:00
|
|
|
|
## Add the next established use case
|
|
|
|
|
|
|
|
|
|
|
|
1. Give it a stable `CSOC-UC-NNN` ID. Describe actor, goal, original steps,
|
|
|
|
|
|
expected outcome, evidence confidence, privacy and migration differences.
|
|
|
|
|
|
Keep an inferred case in the catalogue until the user confirms it.
|
|
|
|
|
|
2. Write a synthetic fixture with `synthetic: true` and matching `usecase_id`.
|
|
|
|
|
|
No real business content, member identifiers, tokens or recordings in fixtures.
|
|
|
|
|
|
3. Add fast and real-browser tests with `@pytest.mark.usecase("CSOC-UC-NNN")`;
|
|
|
|
|
|
browser tests also have `@pytest.mark.browser`. Use the isolated live-server
|
|
|
|
|
|
pattern; drive visible user steps rather than recreating app markup.
|
|
|
|
|
|
4. Register exact test node IDs, narrative/fixture paths and the preserved behavior
|
|
|
|
|
|
contract in `registry.json`; run `make check`. Established tests cannot skip.
|
|
|
|
|
|
5. Separately record real-user review/transfer acceptance with its receipt.
|
|
|
|
|
|
If behavior changes intentionally, update the user-approved contract and tests
|
|
|
|
|
|
together; keep unresolved gaps in live work records.
|
|
|
|
|
|
|
|
|
|
|
|
## CI and operational boundary
|
|
|
|
|
|
|
|
|
|
|
|
`.forgejo/workflows/usecases.yaml` requests the existing fleet ubuntu-latest
|
|
|
|
|
|
container runner on main pushes, pull requests and manual dispatch. It uses the
|
|
|
|
|
|
triggering SHA archive, locked installs, browser OS dependencies and `make check`.
|
|
|
|
|
|
It neither deploys the app nor imports production data. No credentials are
|
|
|
|
|
|
embedded; archive checkout needs existing public/read admission.
|
|
|
|
|
|
|
|
|
|
|
|
Local gate success is not a remote CI receipt. Confirm the runner label can run
|
|
|
|
|
|
the job and the repository has Actions enabled; preserve reports/artifacts and
|
|
|
|
|
|
make `usecase-regressions` a required merge check through the Forgejo owner lane.
|
|
|
|
|
|
That external admission/enforcement work is tracked as **CSOC-IN-0005**. Until
|
|
|
|
|
|
confirmed, the workflow is configured and the local gate is mandatory by this
|
|
|
|
|
|
repository's documented process; protected-branch enforcement is not claimed.
|
|
|
|
|
|
|
|
|
|
|
|
## Verification receipt — 2026-10-06
|
|
|
|
|
|
|
|
|
|
|
|
- `make check`: 88 passed, including the actual ReichelAg browser journey.
|
|
|
|
|
|
- `make test-usecases` equivalent command: 2 passed (fast + browser), 86 deselected.
|
|
|
|
|
|
- JUnit XML: `var/test-results/check.xml` (88 tests, 0 failures/errors) and
|
|
|
|
|
|
`usecases.xml` (2 tests, 0 failures/errors).
|
|
|
|
|
|
- Deliberately collecting only `tests/test_reichelag_workflow.py` with
|
|
|
|
|
|
`--verify-usecases` returns exit 4 and identifies the missing browser check.
|
|
|
|
|
|
- Ruff passes changed Python infrastructure/test files; whitespace check passes.
|
|
|
|
|
|
- Remote Forgejo run and merge enforcement are not asserted; CSOC-IN-0005 owns
|
|
|
|
|
|
those receipts. Existing repository-wide lint debt remains WP-0008-T07.
|