You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Converge Bookkeeping and Sponsors operator presentation
Status: accepted and committed locally — exact accepted commit 8c3b110c8aa138d95385a89fe3328749bdf47250; not merged, pushed, deployed, shipped, or closed
Tags: enhancement, portal, frontend, testing, design, P1
Depends on: satisfied — accepted containing commits #218 0c89588df809b2e84af02e796d1910a25eea0165, #219 9d204d208820e3d842a3d3fc83493c230bcadaa5, and #220 d334020ca5a582d31a81b371988169cab4e7f6b2
Blocks: #162 Wave C integrated acceptance
Starting inventory baseline: 78e91223203aa54376a318fd1a3214ce0242e0c3
Next owner: Orchestrator — when coordinated publication resumes, merge the accepted local Wave A chain in order, push main, then hand off to On-Call; no implementation or review rerun is pending for #221
Resume condition: local main is clean and the Orchestrator is ready to publish the accepted Wave A chain; #221 requires no rerun unless commit 8c3b110c8aa138d95385a89fe3328749bdf47250 changes
Product outcome
An authenticated operator can move through Bookkeeping's Ledger, Evidence, and Monthly package jobs and a Sponsor booking's Overview, Finance, Communications, and History without deciphering imported-tool layouts.
Each region leads with the current decision, exposes only actions valid under the existing authenticated contract, keeps successful information visible when another source fails, and states precisely what happened. Desktop uses intentional queue/detail or dominant-job composition. Mobile uses one readable decision pane at a time. No UI action claims that money moved or a provider message was sent.
This is presentation and honest-state convergence over existing APIs. It does not authorize a new route, endpoint, field, permission, provider integration, import, migration, or browser-only simulation.
Criterion-to-current-source/test inventory at baseline 78e9122
Already compliant — preserve
frontend/src/surfaces/finance/bookkeeping.js already renders the three canonical jobs, a semantic ledger table that becomes labeled cards on narrow screens, native form controls, private-evidence linking, explicit destructive confirmation, and the existing monthly snapshot/archive workflow.
frontend/src/surfaces/finance/sponsors.js, sponsor-layout.js, sponsor-finance.js, sponsor-communications.js, and sponsor-alerts.js already use the canonical /#/sponsors?bookingId=<id> route, authenticated Sponsor CRM projections, server-enforced role behavior, version conflicts, finance idempotency/recovery, exact-review revocation, provider-safe wording, and Overview/Finance/Communications/History data.
Current Sponsor finance links existing synthetic Bookkeeping evidence; it does not execute a payment. Reviewed communications queue through the existing guarded contract and never send inline. Those safety contracts are frozen.
Existing dialogs, confirmations, native labels, status/alert regions, selected-booking state, close/return behavior, light/dark tokens, responsive route styles, and 44px narrow-screen controls are current foundations, not a reason to rebuild the surfaces.
frontend/test/finance-surface.test.mjs covers Bookkeeping and Sponsor rendering, validation, mutations, finance recovery/idempotency, communications review safety, and route behavior.
backend/e2e/canonical-capability-behavior.spec.js provides real-server runtime evidence for the six current Bookkeeping states and eight current Sponsor role/state cases. The catalog in backend/e2e/frontend-capabilities.json already defines those durable identities.
backend/e2e/bookkeeping-production-portal.spec.js, sponsor-crm-production-portal.spec.js, and sponsor-crm-communications-production-portal.spec.js preserve additional real authenticated behavior. They remain regression owners.
Bookkeeping job navigation breaks the canonical hash route. The three controls use href="#bookkeeping-*" inside a hash-routed application. Activating one can replace /#/bookkeeping rather than preserving the workspace route. Replace this with route-preserving job navigation that exposes the current job, moves focus/scroll intentionally, and does not add history entries or a second router.
Bookkeeping loading is falsely all-or-nothing. Transactions load before Evidence accounts/documents/links inside one catch path. One failed source replaces unrelated successful regions with generic text. Ledger, Evidence, and Monthly package must settle independently: successful regions remain usable, unavailable regions are named, and retry is local and observable.
Bookkeeping mutation feedback can live behind an open modal or away from the initiating job. Save/delete/upload/report failures currently funnel through one page status. Dialog validation/conflict/failure must retain entered values, announce and focus useful in-dialog guidance, prevent duplicate submission, and leave the authoritative record unchanged. Job-level failures and success belong beside the initiating job.
Monthly package completion is under-specified. A global “Snapshot ready” or warning count does not make the durable result and selected month clear. Present the existing server result as a reviewable completion/warning state without exposing storage paths, inventing persisted fields, or changing the existing private-download contract.
Sponsor detail lacks a coherent responsive section contract. Overview, Finance, Communications, and History are one long stack controlled by scroll buttons. Provide an accessible selected-section model that preserves the booking URL and loaded state. Desktop may retain intentional detail composition; at 390×844 only the selected section is the active decision pane, with a reachable Return to bookings action and no loss of section context during rerender/retry.
Sponsor finance presents too many equal-weight actions. The existing permitted actions must be ordered around one state-valid next action, with secondary evidence operations quiet and unlink/void actions visibly separated and confirmed. Existing role, version, idempotency, outcome-unknown, reconciliation, and no-payment semantics remain exact.
Sponsor communication states are visually undifferentiated. Suggestions, drafts awaiting review, immutable attempts, disabled delivery, and recovery/history should be grouped and labeled by operator decision. Copy must continue to distinguish draft, exact review, queued, provider accepted, delivered, delayed, rejected, outcome unknown, and read receipt. No state may imply a provider send or recipient read that the API did not prove.
Sponsor history exposes implementation-shaped chronology. Render status history as a semantic chronological list with human labels and Europe/Berlin dates/times rather than raw timestamps. Keep the current safe projection only; do not surface private notes, addresses, raw IDs, provider codes, or hidden metadata.
The visual regression owner is not valid behavior evidence.backend/e2e/bookkeeping-sponsors-design-production-portal.spec.js intercepts application requests and uses palette/style assertions. Replace it in the same change with a dedicated Converge Bookkeeping and Sponsors operator surfaces #221 real-server journey that emits durable capability evidence. Do not leave old and new harnesses in parallel.
Existing Bookkeeping, Sponsor CRM, finance, and communications backend contracts/tests own authorization, concurrency, idempotency, safe projections, and provider boundaries. A missing contract stops this issue and requires a separately groomed backend issue.
Exact write ownership
Implementation may edit only these production paths:
backend/e2e/bookkeeping-sponsors-design-production-portal.spec.js may be replaced/renamed; the intercepted prototype owner must not remain
one replacement backend/e2e/issue-221-bookkeeping-sponsors.spec.js
backend/e2e/frontend-capabilities.json only for exact new Bookkeeping/Sponsor presentation states exercised by the normal real-server run
Existing canonical capability, Bookkeeping, Sponsor CRM, finance, and communications specs are read-only regression owners. #159 helpers/reporter/schema are read-only. Any newly required production or test path needs PM amendment before editing.
Because styles.css, all six finance modules, finance-surface.test.mjs, the capability catalog, and browser fixture capacity overlap #218, implementation is serialized after #218 by default. It may start earlier only if the Orchestrator and both issue owners prove exact disjoint paths and record that decision on both issues. Reconstruct from the accepted containing baseline; do not merge/replay a stale prototype or silently overwrite #218.
Acceptance criteria
Bounded implementation and no-backcompat boundary
Before editing, the engineer records the exact post-Converge Wave A surfaces on bounded shared UI primitives #218 starting SHA and posts a refreshed criterion-to-current-source/test inventory, classifying each item as already compliant, concrete gap, dependency-owned, or out of scope.
Only concrete gaps above are changed. Existing authenticated routes, request/response shapes, role projections, versions, idempotency keys, domain states, and provider safeguards remain unchanged.
The implementation consumes Converge Wave A surfaces on bounded shared UI primitives #218 primitives and deletes superseded route-specific declarations in the same change. No duplicate old/new classes, alias-only selectors, legacy fallback, compatibility shim, second route model, or parallel intercepted test harness remains.
No browser-only fake success, client-side authorization, new API/persisted field, migration/import path, private-data lookup, provider call, or broad CSS rewrite is introduced.
Bookkeeping
Ledger, Evidence, and Monthly package have route-preserving job controls. Activating a job leaves the canonical URL /#/bookkeeping, gives the selected control a programmatic state, moves focus to the owned heading or first useful recovery control, and does not corrupt Back/Forward behavior.
Ledger, accounts, documents, and links settle independently through the real local server. A deterministic single-source failure keeps successful regions and entered filters visible, names only the unavailable source, never reports a false zero/success, and provides a local retry.
Add/edit/delete validation, conflict, non-404 failure, and retry retain entered values and useful focus, announce the exact outcome in the initiating dialog/job, disable duplicate submission while pending, and produce at most one intended mutation.
Evidence upload/link/unlink keeps the selected file metadata, document type, account/month, and transaction context when a retry is safe; private download language remains truthful and no private URL/path appears in screenshots or logs.
Monthly package validation and completion identify the selected month, existing missing-evidence warning count, and whether the package is ready under the current response. The UI does not claim a download opened or a package completed before authoritative success.
Sponsors
Opening a synthetic booking preserves /#/sponsors?bookingId=<id>, exact selected booking, safe sponsor label, and Return to bookings behavior across refresh, section changes, Back, Forward, retry, and stale/not-found recovery.
Overview, Finance, Communications, and History use one programmatically selected section contract. At 1440×900 the booking queue/detail hierarchy remains intentional; at 390×844 only the selected section is the active decision pane and all section/return controls remain reachable.
Overview leads with current status and next relevant dates using human labels. It displays only fields already present in the authenticated safe projection; raw IDs, email addresses, private notes, artifact/provider/storage metadata, and reason codes are not introduced as routine presentation.
Finance exposes one state-valid primary action, quiet secondary evidence actions, and separately confirmed unlink/void actions. Operator/admin visibility, 409 reload, outcome-unknown same-operation retry, reconciliation, and idempotency behavior are preserved exactly.
Finance never claims money was paid by an operator action. Existing linked synthetic payment evidence may be displayed as recorded evidence only.
Communications distinguish suggestion, draft/review, queued/dispatch, provider fact, outcome-unknown, and disabled/recovery groups. Drafting and exact review never imply approval or send; queued never implies provider acceptance; delivered never implies read.
History is a semantic chronological list with humanized transitions and Europe/Berlin dates/times. Empty history is explicit. Existing safe notes may appear only when returned by the current authenticated projection and must be synthetic in evidence.
Partial Finance or Communications failure leaves Overview, History, and other successful sections usable. Retry belongs to the failed section and restores useful focus without changing booking identity.
Desktop, mobile, accessibility, and honest states
At 1440×900 each captured state has one dominant heading/decision region, readable content width, clear primary/secondary/destructive action hierarchy, and no equal-weight dashboard clutter.
At 390×844 jobs/sections reflow in reading order, every interactive target is at least 44×44 CSS pixels, the first meaningful record/state/recovery action is visible in the initial viewport for the selected job/section, and there is no page-level horizontal scroll, clipping, overlap, or unreachable action.
Both themes use existing tokens and retain semantic contrast. Reduced motion removes smooth section transitions without losing state, focus, or orientation.
Changed states preserve one main landmark, correctly nested headings, native labels, semantic table/list/description/dialog structure, accessible names/descriptions, visible focus, keyboard operation, modal focus containment/restoration, and useful focus after close/retry.
Loading/busy, empty, partial, unavailable, validation, conflict, success, and destructive states are textually and programmatically distinct. Blocking failures use an alert; progress/success use an appropriate status/live region; status meaning never relies on color alone.
Axe reports zero critical or serious WCAG A/AA findings for every captured changed state.
Real-server behavior, capability evidence, and parity
The intercepted design prototype spec is removed/replaced. The dedicated Converge Bookkeeping and Sponsors operator surfaces #221 journey uses the normal local TypeScript backend, authenticated synthetic fixtures, and real requests; it does not intercept core application API calls.
Existing Bookkeeping and Sponsor capability states still pass. New durable state IDs cover at least Bookkeeping partial-source recovery and Sponsor selected-section, Finance recovery, Communications disabled/review, and History presentation; every ID is emitted only by a passed real-server journey.
The successful full browser run accounts for every catalog state and role. Source and packaged SAM parity runs emit the same applicable Converge Bookkeeping and Sponsors operator surfaces #221 evidence, with no screenshot- or source-inspection-only state.
Every changed frontend asset is identical in source, backend/dist, and packaged SAM output.
Fixtures, screenshots, logs, comments, and capability payloads contain only synthetic public-safe records: .invalid contacts where unavoidable in private review UI, example domains, synthetic amounts, and no real sponsor, finance, contact, provider, private link, credential, operational note, or production identifier.
Test scenarios
Bookkeeping job route and partial Evidence outage
Given an authenticated synthetic operator, a populated ledger, linked evidence, and a deterministic documents or links failure through the real local server
When the operator activates Ledger, Evidence, and Monthly package in turn
Then the URL remains /#/bookkeeping, selected/focus state follows the active job, successful ledger data remains usable, only the failed Evidence source is unavailable, and local retry restores it without losing filters or selections
Bookkeeping validation, retry, and monthly completion
Given public-safe entered transaction and monthly-package values
When validation fails, a deterministic retryable mutation fails, and the same operation is retried
Then the dialog/job retains values and focus, announces the failure, prevents duplicate writes, and the eventual server success identifies the exact saved entry or selected package month without exposing a private URL
Sponsor responsive section journey
Given one authenticated synthetic booking with safe Overview, Finance, Communications, and History data
When it is opened directly, refreshed, each section is selected, Return is used, and Back/Forward revisits it at 1440×900 and 390×844
Then booking identity and URL stay synchronized, one mobile decision pane is active, section/return focus is useful, and no state is clipped or unreachable
Sponsor Finance recovery without payment
Given an admin-visible finance projection and an operator-safe projection
When a permitted local evidence action encounters 409 or outcome-unknown and is recovered
Then one state-valid action remains dominant, the original idempotency contract is preserved, the operator cannot mutate, destructive evidence actions require confirmation, and no UI text says that money moved
Sponsor Communications and History honesty
Given synthetic suggestions, an awaiting-review draft, disabled delivery, immutable attempt states, and booking history
When Communications and History are selected
Then each communication state is grouped with precise draft/queue/provider/read semantics, no provider call occurs, history is chronological with Europe/Berlin time, and a partial Communications failure leaves Overview/History usable
Source/SAM identity
Given one frozen candidate and clean source and SAM servers
When the dedicated #221 journeys run against both targets
Then the same routes, roles, durable states, focus outcomes, and synthetic records pass, all evidence is accounted for, and every changed frontend asset is identical
Synthetic screenshot inventory
Capture exactly these 14 untracked native-size PNGs under .tmp/screenshots/issue-221/; remove stale extras before review:
Use normal local backend behavior and synthetic public-safe records. Tester and Designer inspect every image at native resolution for decision hierarchy, wording, selected state, focus visibility, target sizing, theme/contrast, overflow, clipping, overlap, first-decision visibility, and absence of private facts. Screenshots are not committed, attached to the public issue, treated as behavior evidence, or compared as goldens.
Tester runs the complete relevant workflow on one frozen diff/status/content fingerprint and records commands, exit codes, observed test counts, behavior titles, capability-state/role accounting, and evidence/screenshot paths:
npm run test:frontend:unit
npm run test:frontend:coverage
npm --prefix backend test
npm --prefix backend run typecheck
npm --prefix backend run build
node backend/scripts/verify-frontend-artifact.mjs --source frontend --artifact backend/dist
npm --prefix backend run test:e2e -- --retries=0
npm --prefix backend run test:e2e:frontend-parity
make sam-validate
make sam-build
node backend/scripts/verify-frontend-artifact.mjs --source frontend --artifact .aws-sam/build/BackendFunction
make ci
git diff --check
Do not run raw Bookkeeping/Sponsor import, migration, restore, export, payment, provider-send, worker, SES-event, transaction shell, or one-off data-movement scripts for this issue.
Lifecycle gates
PM inventory completed read-only at 78e91223203aa54376a318fd1a3214ce0242e0c3
Converge Bookkeeping and Sponsors operator presentation
Status: accepted and committed locally — exact accepted commit 8c3b110c8aa138d95385a89fe3328749bdf47250; not merged, pushed, deployed, shipped, or closed
Tags:
enhancement,portal,frontend,testing,design,P1Depends on: satisfied — accepted containing commits #218 0c89588df809b2e84af02e796d1910a25eea0165, #219 9d204d208820e3d842a3d3fc83493c230bcadaa5, and #220 d334020ca5a582d31a81b371988169cab4e7f6b2
Blocks: #162 Wave C integrated acceptance
Starting inventory baseline:
78e91223203aa54376a318fd1a3214ce0242e0c3Next owner: Orchestrator — when coordinated publication resumes, merge the accepted local Wave A chain in order, push main, then hand off to On-Call; no implementation or review rerun is pending for #221
Resume condition: local main is clean and the Orchestrator is ready to publish the accepted Wave A chain; #221 requires no rerun unless commit 8c3b110c8aa138d95385a89fe3328749bdf47250 changes
Product outcome
An authenticated operator can move through Bookkeeping's Ledger, Evidence, and Monthly package jobs and a Sponsor booking's Overview, Finance, Communications, and History without deciphering imported-tool layouts.
Each region leads with the current decision, exposes only actions valid under the existing authenticated contract, keeps successful information visible when another source fails, and states precisely what happened. Desktop uses intentional queue/detail or dominant-job composition. Mobile uses one readable decision pane at a time. No UI action claims that money moved or a provider message was sent.
This is presentation and honest-state convergence over existing APIs. It does not authorize a new route, endpoint, field, permission, provider integration, import, migration, or browser-only simulation.
Criterion-to-current-source/test inventory at baseline 78e9122
Already compliant — preserve
frontend/src/surfaces/finance/bookkeeping.jsalready renders the three canonical jobs, a semantic ledger table that becomes labeled cards on narrow screens, native form controls, private-evidence linking, explicit destructive confirmation, and the existing monthly snapshot/archive workflow.frontend/src/surfaces/finance/sponsors.js,sponsor-layout.js,sponsor-finance.js,sponsor-communications.js, andsponsor-alerts.jsalready use the canonical/#/sponsors?bookingId=<id>route, authenticated Sponsor CRM projections, server-enforced role behavior, version conflicts, finance idempotency/recovery, exact-review revocation, provider-safe wording, and Overview/Finance/Communications/History data.frontend/test/finance-surface.test.mjscovers Bookkeeping and Sponsor rendering, validation, mutations, finance recovery/idempotency, communications review safety, and route behavior.backend/e2e/canonical-capability-behavior.spec.jsprovides real-server runtime evidence for the six current Bookkeeping states and eight current Sponsor role/state cases. The catalog inbackend/e2e/frontend-capabilities.jsonalready defines those durable identities.backend/e2e/bookkeeping-production-portal.spec.js,sponsor-crm-production-portal.spec.js, andsponsor-crm-communications-production-portal.spec.jspreserve additional real authenticated behavior. They remain regression owners.Concrete unmet gaps owned by #221
href="#bookkeeping-*"inside a hash-routed application. Activating one can replace/#/bookkeepingrather than preserving the workspace route. Replace this with route-preserving job navigation that exposes the current job, moves focus/scroll intentionally, and does not add history entries or a second router.backend/e2e/bookkeeping-sponsors-design-production-portal.spec.jsintercepts application requests and uses palette/style assertions. Replace it in the same change with a dedicated Converge Bookkeeping and Sponsors operator surfaces #221 real-server journey that emits durable capability evidence. Do not leave old and new harnesses in parallel.Dependency-owned — do not absorb
Exact write ownership
Implementation may edit only these production paths:
frontend/src/surfaces/finance/bookkeeping.jsfrontend/src/surfaces/finance/sponsors.jsfrontend/src/surfaces/finance/sponsor-layout.jsfrontend/src/surfaces/finance/sponsor-alerts.jsfrontend/src/surfaces/finance/sponsor-finance.jsfrontend/src/surfaces/finance/sponsor-communications.jsfrontend/src/styles.css— only route-specific Bookkeeping/Sponsor layout after Converge Wave A surfaces on bounded shared UI primitives #218; no shared primitive redefinitionAllowed test/evidence paths:
frontend/test/finance-surface.test.mjsbackend/e2e/bookkeeping-sponsors-design-production-portal.spec.jsmay be replaced/renamed; the intercepted prototype owner must not remainbackend/e2e/issue-221-bookkeeping-sponsors.spec.jsbackend/e2e/frontend-capabilities.jsononly for exact new Bookkeeping/Sponsor presentation states exercised by the normal real-server runExisting canonical capability, Bookkeeping, Sponsor CRM, finance, and communications specs are read-only regression owners. #159 helpers/reporter/schema are read-only. Any newly required production or test path needs PM amendment before editing.
Because
styles.css, all six finance modules,finance-surface.test.mjs, the capability catalog, and browser fixture capacity overlap #218, implementation is serialized after #218 by default. It may start earlier only if the Orchestrator and both issue owners prove exact disjoint paths and record that decision on both issues. Reconstruct from the accepted containing baseline; do not merge/replay a stale prototype or silently overwrite #218.Acceptance criteria
Bounded implementation and no-backcompat boundary
Bookkeeping
/#/bookkeeping, gives the selected control a programmatic state, moves focus to the owned heading or first useful recovery control, and does not corrupt Back/Forward behavior.Sponsors
/#/sponsors?bookingId=<id>, exact selected booking, safe sponsor label, and Return to bookings behavior across refresh, section changes, Back, Forward, retry, and stale/not-found recovery.Desktop, mobile, accessibility, and honest states
Real-server behavior, capability evidence, and parity
backend/dist, and packaged SAM output..invalidcontacts where unavoidable in private review UI, example domains, synthetic amounts, and no real sponsor, finance, contact, provider, private link, credential, operational note, or production identifier.Test scenarios
Bookkeeping job route and partial Evidence outage
Given an authenticated synthetic operator, a populated ledger, linked evidence, and a deterministic documents or links failure through the real local server
When the operator activates Ledger, Evidence, and Monthly package in turn
Then the URL remains
/#/bookkeeping, selected/focus state follows the active job, successful ledger data remains usable, only the failed Evidence source is unavailable, and local retry restores it without losing filters or selectionsBookkeeping validation, retry, and monthly completion
Given public-safe entered transaction and monthly-package values
When validation fails, a deterministic retryable mutation fails, and the same operation is retried
Then the dialog/job retains values and focus, announces the failure, prevents duplicate writes, and the eventual server success identifies the exact saved entry or selected package month without exposing a private URL
Sponsor responsive section journey
Given one authenticated synthetic booking with safe Overview, Finance, Communications, and History data
When it is opened directly, refreshed, each section is selected, Return is used, and Back/Forward revisits it at 1440×900 and 390×844
Then booking identity and URL stay synchronized, one mobile decision pane is active, section/return focus is useful, and no state is clipped or unreachable
Sponsor Finance recovery without payment
Given an admin-visible finance projection and an operator-safe projection
When a permitted local evidence action encounters 409 or outcome-unknown and is recovered
Then one state-valid action remains dominant, the original idempotency contract is preserved, the operator cannot mutate, destructive evidence actions require confirmation, and no UI text says that money moved
Sponsor Communications and History honesty
Given synthetic suggestions, an awaiting-review draft, disabled delivery, immutable attempt states, and booking history
When Communications and History are selected
Then each communication state is grouped with precise draft/queue/provider/read semantics, no provider call occurs, history is chronological with Europe/Berlin time, and a partial Communications failure leaves Overview/History usable
Source/SAM identity
Given one frozen candidate and clean source and SAM servers
When the dedicated #221 journeys run against both targets
Then the same routes, roles, durable states, focus outcomes, and synthetic records pass, all evidence is accounted for, and every changed frontend asset is identical
Synthetic screenshot inventory
Capture exactly these 14 untracked native-size PNGs under
.tmp/screenshots/issue-221/; remove stale extras before review:01-bookkeeping-ledger-ready-desktop-1440x900.png02-bookkeeping-ledger-ready-mobile-390x844.png03-bookkeeping-evidence-partial-desktop-1440x900.png04-bookkeeping-evidence-partial-mobile-390x844.png05-bookkeeping-monthly-complete-desktop-1440x900.png06-bookkeeping-monthly-complete-mobile-390x844.png07-sponsors-overview-ready-desktop-1440x900.png08-sponsors-overview-ready-mobile-390x844.png09-sponsors-finance-recovery-desktop-1440x900.png10-sponsors-finance-recovery-mobile-390x844.png11-sponsors-communications-disabled-desktop-1440x900.png12-sponsors-communications-disabled-mobile-390x844.png13-sponsors-history-ready-desktop-1440x900.png14-sponsors-history-ready-mobile-390x844.pngUse normal local backend behavior and synthetic public-safe records. Tester and Designer inspect every image at native resolution for decision hierarchy, wording, selected state, focus visibility, target sizing, theme/contrast, overflow, clipping, overlap, first-decision visibility, and absence of private facts. Screenshots are not committed, attached to the public issue, treated as behavior evidence, or compared as goldens.
Verification
Engineer may use focused tests while iterating:
Tester runs the complete relevant workflow on one frozen diff/status/content fingerprint and records commands, exit codes, observed test counts, behavior titles, capability-state/role accounting, and evidence/screenshot paths:
npm run test:frontend:unit npm run test:frontend:coverage npm --prefix backend test npm --prefix backend run typecheck npm --prefix backend run build node backend/scripts/verify-frontend-artifact.mjs --source frontend --artifact backend/dist npm --prefix backend run test:e2e -- --retries=0 npm --prefix backend run test:e2e:frontend-parity make sam-validate make sam-build node backend/scripts/verify-frontend-artifact.mjs --source frontend --artifact .aws-sam/build/BackendFunction make ci git diff --checkDo not run raw Bookkeeping/Sponsor import, migration, restore, export, payment, provider-send, worker, SES-event, transaction shell, or one-off data-movement scripts for this issue.
Lifecycle gates
78e91223203aa54376a318fd1a3214ce0242e0c3Closes #221No HUMAN gate is required: all accepted proof is local, synthetic, authenticated, provider-free, and non-production.
Explicit exclusions