Fix password form semantics and typed setting inputs #66

Merged
weichen merged 2 commits from feature/rdm-audit-capability-gate-changepw-form into main 2026-10-12 06:20:05 +00:00
Owner

Why

The change-password modal rendered loose password inputs outside any form with no autocomplete or username association (browser password-form warnings, Enter dead), and its 401 handling collapsed every cause into "wrong current password". SettingInput masked ALL free-text config values as password fields. (2026-10-12 diagnostic, increment 3.)

What

  • ChangePasswordModal: <form onSubmit>, htmlFor/id association, readonly username field, username/current-password/new-password autocomplete, error copy via the existing humanChangePasswordError.
  • SettingsModal: new pure settingInputAttrs (secret -> password/new-password, else text/off) consumed by SettingInput; mask/placeholder logic unchanged.
  • New e2e spec changepw-form.playwright.ts (Enter submit, autocomplete trio, readonly username, classified error copy), driven by the dev-repo e2e.sh plain phase.

Evidence

  • vitest 24 files / 116 tests incl. the settingInputAttrs matrix; knip; tsc -b && vite build pass.
  • e2e full run: RDM combo 4/4 + plain-base & changepw-form 2/2. Receipts in the dev-repo task card.

Refs

2026-10-12 diagnostic report, increment 3. Stacked on frontend PR #65 (base = feature/rdm-audit-capability-gate); dev-repo stacked PR follows.

### Why The change-password modal rendered loose password inputs outside any form with no autocomplete or username association (browser password-form warnings, Enter dead), and its 401 handling collapsed every cause into "wrong current password". SettingInput masked ALL free-text config values as password fields. (2026-10-12 diagnostic, increment 3.) ### What - ChangePasswordModal: `<form onSubmit>`, htmlFor/id association, readonly username field, username/current-password/new-password autocomplete, error copy via the existing `humanChangePasswordError`. - SettingsModal: new pure `settingInputAttrs` (secret -> password/new-password, else text/off) consumed by SettingInput; mask/placeholder logic unchanged. - New e2e spec `changepw-form.playwright.ts` (Enter submit, autocomplete trio, readonly username, classified error copy), driven by the dev-repo e2e.sh plain phase. ### Evidence - vitest 24 files / 116 tests incl. the settingInputAttrs matrix; knip; `tsc -b && vite build` pass. - e2e full run: RDM combo 4/4 + plain-base & changepw-form 2/2. Receipts in the dev-repo task card. ### Refs 2026-10-12 diagnostic report, increment 3. Stacked on frontend PR #65 (base = feature/rdm-audit-capability-gate); dev-repo stacked PR follows.
weichen changed target branch from feature/rdm-audit-capability-gate to main 2026-10-12 06:10:53 +00:00
weichen added 7 commits 2026-10-12 06:10:53 +00:00
Why: the rdm-audit entry was an unconditional builtin, so on a plain base
without any rdm.inspect.* commands the workspace opened straight into a
rejected receipt (400) - diagnosed 2026-10-12. The page also rendered raw
receipt JSON instead of a readable error.

Evidence: vitest 23 files / 112 tests pass incl. the new contract matrix
(workspaces.test.ts, rdm-errors.test.ts) and design-guard; tsc -b &&
vite build pass; e2e plain-base scenario added (driven by dev-repo
scripts/e2e.sh phase 4).

Impact: audit entry shows only when GET /api/commands lists all seven
rdm.inspect.* commands enabled (store.rdmAuditAvailable, refreshed with
the workspace list); audit errors classify into capability-missing /
auth-expired / query-failed with the raw receipt kept in a Collapsible.

Refs: 2026-10-12 diagnostic report, increment 2.
Why: the phase-3 playwright run scans the whole e2e/ directory, so the
plain-base assertions ran against the RDM combo where the audit entry is
legitimately visible and failed.

Evidence: phase-3 rerun shows 4 rdm-audit tests passing with plain-base
failing out of place; the spec now skips unless E2E_PLAIN_BASE=1, which
scripts/e2e.sh phase 4 injects.

Impact: plain-base scenario only executes against the plain base serve.

Refs: 2026-10-12 diagnostic report, increment 2.
Why: phase 4 runs after the RDM phase already forced the password change,
so the initial-password attempt 401s and the sidebar never renders.

Evidence: phase-4 failure log shows the login form still up at the
15s .tsb-tool timeout; rdm-audit spec already carries this branch.

Impact: plain-base login helper mirrors rdm-audit's gate-aware login.

Refs: 2026-10-12 diagnostic report, increment 2.
Why: BuildWorkspaceOptions / RdmErrorKind / RdmErrorView are only consumed
inside their own modules, so exporting them pushed unused exports 45 over
the knip baseline 43 and failed make test.

Evidence: npx vitest run 23 files / 112 tests pass; node scripts/check-knip.mjs
passes at 42 <= 43.

Impact: no API change - consumers pass object literals and consume the
classified error structurally.

Refs: 2026-10-12 diagnostic report, increment 2.
Why: dev-repo main advanced the frontend pin to d01a3eb (admin-zone
section hosting), diverging from the gating branch; the task-sync gitlink
conflict requires the component-level merge first.

Evidence: post-merge vitest 23 files / 112 tests, knip 42 <= 43, and
tsc -b && vite build all pass; store.ts conflict resolved by keeping both
rdmAuditAvailable and adminSections state.

Impact: gating branch now contains frontend main d01a3eb.

Refs: 2026-10-12 diagnostic report, increment 2; frontend #63/#64.
Why: the change-password modal rendered loose password inputs outside any
<form> with no autocomplete or username association (browser password-form
warnings; Enter did not submit), and its 401 handling collapsed every
cause into "wrong current password". SettingInput masked ALL free-text
config values as password fields.

Evidence: vitest 24 files / 116 tests incl. new settingInputAttrs matrix;
knip and tsc -b && vite build pass; e2e changepw-form spec (driven by the
dev-repo e2e.sh plain phase) covers form submit via Enter, autocomplete
trio, readonly username and the classified error copy.

Impact: ChangePasswordModal uses form onSubmit, htmlFor/id association,
username/current-password/new-password autocomplete and reuses
humanChangePasswordError; SettingInput renders text inputs unless the
field is secret.

Refs: 2026-10-12 diagnostic report, increment 3.
Why: the repo's @playwright/test version has no toBeReadOnly matcher.

Evidence: failing run shows TypeError at the matcher; the attribute
assertion works across versions.

Impact: none beyond the spec assertion.

Refs: 2026-10-12 diagnostic report, increment 3.
weichen merged commit a45a4d8652 into main 2026-10-12 06:20:05 +00:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: weichen/Agent-System-Frontend#66