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.
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 main2026-10-12 06:20:05 +00:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
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
<form onSubmit>, htmlFor/id association, readonly username field, username/current-password/new-password autocomplete, error copy via the existinghumanChangePasswordError.settingInputAttrs(secret -> password/new-password, else text/off) consumed by SettingInput; mask/placeholder logic unchanged.changepw-form.playwright.ts(Enter submit, autocomplete trio, readonly username, classified error copy), driven by the dev-repo e2e.sh plain phase.Evidence
tsc -b && vite buildpass.Refs
2026-10-12 diagnostic report, increment 3. Stacked on frontend PR #65 (base = feature/rdm-audit-capability-gate); dev-repo stacked PR follows.