Skip to content

fix(web): restore the settlement link and fade late panel content - #101

Closed
selezenart wants to merge 12 commits into
developfrom
fix/console-readability-and-layout
Closed

selezenart wants to merge 12 commits into
developfrom
fix/console-readability-and-layout

Conversation

@selezenart

@selezenart selezenart commented Sep 12, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

Two reported defects in the operator workspace: an ArcScan link that was invisible in the light theme, and tab panels whose content appeared without the intended fade.

  • The settlement box paints --os-panel inside .job-list li, which rebinds --os-accent-ink to the page ink for the lighter card around it. The ArcScan link therefore rendered forest ink on the forest box. It read correctly in dark, which is how it shipped. The box now rebinds the ink tokens its own descendants inherit, the same way .paid-api-status does for the lime field.
  • Panel content did not fade for two separate reasons. The console panel was never wrapped in .tab-fade and had no key at all. The cabinet panel was wrapped, but the request list arrives from the API after mount, so the 0.24s fade ran on the "Checking requests…" placeholder and finished before any row existed. The console panel is now keyed on its tab, and the list body on its loading state.

A lime #EAFFBC page ground and a matching tab surface were implemented and then withdrawn at the requester's instruction. The revert is complete: packages/brand/src/tokens.css is byte-identical to develop, the tab strip is unchanged, and the console strip's --os-panel-ink override is restored.

Scope and acceptance criteria

  • The change is limited to the stated milestone or issue.
  • Acceptance criteria are listed and satisfied.
  • No unrelated cleanup is included.
  1. The ArcScan transaction link inside a request's settlement box is legible in the light theme — --os-state-committed on --os-panel is ≈7.5:1, underlined so it reads as a link.
  2. Panel content behind a tab fades on switch, including request rows that arrive after the panel mounts.
  3. The light page ground and the tab strip are unchanged from develop.
  4. No payment, settlement, or API behaviour changes.

Product and security invariants

  • Tenant isolation remains fail-closed.
  • Sponsor authorization, auditability, and daily caps remain enforced where applicable.
  • Recipients cannot modify sponsor controls or access sponsor-only data.
  • No secret, token, production identifier, or personal data is committed or pasted into review prompts.
  • Any non-applicable invariant is explained below.

Invariant notes:

Presentation only. No change to api, worker, contracts, storage, or any settlement path; the one-intent/one-settlement invariant is untouched. The JSX changes are a wrapper element plus a key, confirmed by a whitespace-only semantic diff of JobWorkspace.tsx.

Validation

Commands and results:

pnpm format:check: PASS
pnpm lint: PASS
pnpm typecheck: PASS
pnpm check:generated: PASS - generated contracts are current
pnpm test: PASS - 83 files / 1082 tests, includes build
pnpm test:browser: PASS - 8 tests, light and dark at 390/1440 px, including the
  axe colour-contrast audits
markdownlint-cli2: PASS on every tracked Markdown file
Playwright screenshots of the test-mode build: ArcScan link legible in the
  light theme
Local Node 24.20.0 differs from the pinned 24.19.0; CI must validate the
  pinned runtime

Independent review evidence

Gate A — exact candidate tree before push

  • Base commit SHA: ff146e49407b078183ed619ff3f3b2e11b17da2c
  • Candidate tree SHA: d60472acfa2e945b7338424c38c13b6ebdd7993f
  • Candidate commit SHA (if already committed but unpushed): 9c30a4f03ed50549987e24288e9bb8709027b8c5
  • Reviewer tool: free-pi-cli
  • Reviewer model: not exposed by platform
  • Verdict: VERDICT: PASS
  • Findings or residual risks: BLOCKING_FINDINGS: None. Non-blocking: the local Node version differs from the pinned engine, so CI must validate the pinned runtime; and the late-row fade depends on the loading flag toggling, so a future polling change that updates rows without it would not replay the fade.

Two earlier Gate A runs passed on superseded trees: 140b7af… (included the withdrawn ground/tab work) and 238209cb… (before a markdownlint fix in the context record). The verdict above is the fresh review of the current tree.

  • The reviewed tree equals the committed tree.

Gate B — exact remote PR head

  • Pull request URL/number: this PR

  • Remote head commit SHA: 9c30a4f03ed50549987e24288e9bb8709027b8c5

  • Remote head tree SHA: d60472acfa2e945b7338424c38c13b6ebdd7993f

  • Reviewer tool: free-pi-cli

  • Reviewer model: not run

  • Verdict: skipped at the requester's explicit instruction

  • Findings or residual risks: Gate B was deliberately skipped for this change. This is a recorded deviation from .agent/IMPLEMENTATION_LOOP.md §7, not a pass. The human merger should treat the independent-review evidence as Gate A only.

  • Gate B reviewed the current remote head and matches Gate A's approved tree, or a fresh Gate A was run for the changed tree.

  • Agent policy / repository-policy and all applicable CI checks pass.

Risk and rollback

  • Residual risks: presentation-only change. The fade on late-arriving rows depends on the list's loading flag toggling; a future change that refreshes rows without it would not replay the fade. Gate B was not run.
  • Rollback or recovery plan: revert the commits on this branch; no data, schema, or settlement state is involved.

Human merge

  • A human owner has reviewed the evidence and will perform the merge.

selezenart and others added 9 commits September 12, 2026 07:23
The console shipped unreadable text in both themes from one mistake made in
two directions. --os-panel and --os-field are the same colour in light and
dark and carry their own fixed inks; --os-ground and --os-surface flip with
the theme. Pairing one family's ink with the other family's surface is
invisible in exactly one theme, so each instance survived review done in the
other one: the tab strip used panel ink on the page ground, and the quote and
paid-API summaries used panel ink on the lime field.

Pair each surface with the ink family that owns it, and add a structural guard
that resolves every rule's nearest painting ancestor and fails on any fixed ink
over a flipping surface. Verified against the previous stylesheet: it reports
all six pairings that existed there.

Also in the cabinet:

- Remove the Wallet & permissions and Developer access sections. Both were
  read-only restatements of facts the other sections already show, and neither
  had a control behind it.
- Give .panel-heading a rule. It had none, so every panel that pairs a title
  with an action stacked them flush.
- Let the hero copy sit in normal flow and set its own height, measured and fed
  to the clip paths, instead of overflowing a fixed 268px box by an amount that
  varied with the viewport. Drop the 820px cap so the hero spans the shell like
  the nav and tabs around it.
- Lay the x402 and recovery controls out on a grid so label, field and help
  text each get a row, and style a.secondary, which was only ever styled for
  button.
- Scale type once at the root rather than per component, so the console is not
  set at laptop sizes on a large display.
- Fade surfaces on theme change and panels on tab switch, under
  prefers-reduced-motion: no-preference.

Adds --os-on-field-muted and --os-field-line: a surface that does not flip
needs a muted ink and a border line that do not flip either.
Merging develop left the branch uncompilable: Hero carried both a `height`
prop and a `height` state, and the cabinet kept this branch's narrowed section
union while still rendering develop's panels, so four section names had no
type to belong to.

Reconcile rather than pick a side:

- Hero measures itself by default, which is what stops the workspace copy
  clipping at widths where the headline wraps. The `height` prop stays as an
  explicit override for the landing page, which sizes its hero to a layout
  rather than to its copy. Only a pinned hero gets an inline height; feeding
  the measured value back would rebuild the fixed box the measurement exists
  to avoid.
- Take develop's cabinet vocabulary, then apply this branch's request to it.
  The two sections asked to be removed were not gone, they were renamed:
  Spending rules was Wallet & permissions, Team & access was Developer access.
  Both are read-only restatements with no control behind them, so the cabinet
  is Overview, API services, Requests and Payment proof, and the two panels
  behind them are deleted rather than left unreferenced.
- Drop this branch's enumerated ink overrides. Develop solved the same problem
  more generally by rebinding --os-panel-ink and --os-accent-ink at each
  surface boundary, so descendants inherit the right ink instead of every
  descendant being listed; its version also gets `.quote-panel` right, which
  moved onto --os-surface in the redesign. Only the --os-field-line border,
  which develop lacks, is kept.

The structural guard survives and is what caught the regressions above. One of
its assertions was wrong rather than the stylesheet: `.console-container .tabs
button` legitimately takes panel ink because that container paints --os-panel,
and an unanchored regex was matching it as a substring.
The browser contrast checks run immediately after navigation. With motion
enabled, axe samples while the cabinet panel is still fading in and reads every
colour composited against what is behind it: panel ink measured as #bdd1c2 on
#4d6b64 rather than #a9c4b2 on #0b332c, and page ink as #728876 on #f4f7f1
rather than #3f5c46 on #edf1e9. Ninety-eight reported violations, none of them
real.

All motion in styles.css sits behind prefers-reduced-motion: no-preference, so
emulating a reduced-motion viewer settles the page before the audit instead of
suppressing a genuine failure.
The browser acceptance spec iterated a six-label list and clicked each one.
Spending rules and Team & access are gone, so the click timed out on a tab that
no longer renders.

Note the markdownlint findings under .superpowers/ are pre-existing and outside
this branch.
Gate A caught this: taking develop's redesigned JobWorkspace.tsx wholesale also
took back `<section className="panel">`, dropping the `paid-api-panel` class.
The grid rules stayed in the stylesheet with nothing wearing them, so the x402
request key rendered inline with the text before it and its help text ran on
after it — criterion 7 undone, while every check stayed green.

Nothing caught it because the style tests assert stylesheet text and the
browser specs never look at that field. So add the structural guard: every
class this stylesheet declares must be rendered by some component. It resolves
names built by interpolation (`state-${...}`) and ignores classes the read-only
slices declare. Verified against the defect — dropping the class again fails
with exactly ['paid-api-panel'].

Also from the same review:

- Remove the .recovery-panel rules. They targeted a cabinet section develop
  replaced with PaymentProtectionPanel, which lays its own controls out; the
  markup they addressed no longer exists.
- Bind --os-on-field-muted. It was defined and audited for contrast but had no
  consumer once the enumerated overrides gave way to token rebinding, so the
  lime field had no muted ink. .paid-api-status now rebinds to it.

Four classes dead before this branch (brand-logo, fixture-toolbar, meta-code,
workspace-fact-grid) are recorded in the guard rather than removed here, so it
ratchets instead of pulling unrelated rules into this change.
…ility-and-layout

# Conflicts:
#	apps/web/src/App.tsx
…the light ground

Three light-theme and motion defects reported from the workspace.

The ArcScan link in a request's settlement box was invisible in the light
theme. `.job-list li` rebinds --os-accent-ink to the page ink for the card
around it, but the settlement box inside repaints --os-panel, so the link
rendered forest ink on the forest box. It read correctly in dark, which is how
it shipped. The box now rebinds the ink tokens its own descendants inherit, the
same way .paid-api-status does for the lime field.

Tab panels appeared instantly while the strip above them faded, for two
separate reasons. The console panel was never wrapped in `.tab-fade` and had no
key at all. The cabinet panel was wrapped, but the request list arrives from the
API after mount, so the 0.24s fade ran on the "Checking requests…" placeholder
and was over before any row existed. The console panel is now keyed on its tab,
and the list body is keyed on its loading state, so the fade runs on the content
the operator actually waited for.

The light page ground moves to the lime #EAFFBC from the design canvas.
Contrast holds: ink 12.81:1, ink-muted 6.90:1, accent-ink 5.09:1 (up from
4.79:1). Unselected tabs now paint --os-surface rather than letting that ground
show through, so the strip reads as a row of cards; with their own flipping
surface they take the flipping page ink, which makes the console strip's
--os-panel-ink override both wrong and unnecessary.
@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Sep 12, 2026 •

Copy link
Copy Markdown

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Updated (UTC)
✅ Deployment successful!
View logs
oneshot 9c30a4f Sep 12 2026, 06:00 PM

…ility-and-layout

# Conflicts:
#	apps/web/src/styles.css
#	apps/web/test/styles.test.ts
The light --os-ground returns to #edf1e9 and unselected tabs are transparent
again, restoring the console strip's panel-ink override that only became wrong
while those tabs carried their own surface. The settlement-link ink fix and the
tab-panel fades are unaffected.
@selezenart selezenart changed the title fix(web): restore the settlement link, fade late panel content, lift the light ground fix(web): restore the settlement link and fade late panel content Sep 12, 2026
@selezenart

Copy link
Copy Markdown
Collaborator Author

Superseded: reopening the two workspace fixes on a fresh branch cut from current develop, without the withdrawn ground and tab changes.

@selezenart selezenart closed this Sep 12, 2026
@selezenart
selezenart deleted the fix/console-readability-and-layout branch September 12, 2026 18:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant