Conversation
The box is the authority: once Core accepts a schedule write without step-up, this app must not pretend a ceremony is required. The simulator matches that price. Login still uses a passkey. Closes #71. Signed-off-by: Fredrik Ahlgren <fredrik@sourceful-labs.com>
Deploying with
|
| Status | Name | Latest Commit | Preview URL | Updated (UTC) |
|---|---|---|---|---|
| ✅ Deployment successful! View logs |
ftw-webapp | a5d3d42 | Commit Preview URL | Sep 13 2026, 10:39 AM |
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
miravoss26
left a comment
There was a problem hiding this comment.
Removes the step-up (passkey/Face ID) ceremony for charging-schedule writes (PUT/DELETE /api/loadpoints/{id}/schedule), via a new noStepUp route flag. Role check (owner) is unchanged and still enforced — verified by the new passthrough test that a viewer is still E_SCOPE_DENIED.
Security note (authz change, flagging per the screen, not blocking): this narrows the ceremony requirement for exactly two routes, deliberately and narrowly scoped, and the tradeoff is documented in docs/protocol.md ("the session already proved who is asking, and a second Face ID is more friction than the table-phone risk is worth"). Worth a human eyeball since it's a real authn-friction/risk tradeoff, even though the implementation matches the stated intent precisely.
- Tests are thorough and were properly flipped (not just relaxed) — the "ceremony fails" test now asserts the write succeeds without calling stepUp at all, rather than being deleted or weakened.
- Depends on the paired Core-side change (
.changesetsays "pair with the Core change") — reviewing that one separately, this PR alone won't do anything if Core still requires the flag.
No correctness issues found. The authz relaxation is the one thing I'd want a teammate's eyes on before merge, everything else safe to merge from my read.
Why
Closes #71. On a signed-in phone, changing the car's ready time asked for a passkey again. Login already proved who is asking.
The box is the authority. This app still asks without
stepUpfirst and only prompts onE_NEEDS_STEP_UP. Once Core accepts the schedule write, the prompt goes away on its own. The simulator has to match that price or the tests keep demanding Face ID.What
PUT/DELETEare Configure withnoStepUp. Owner is enough. Viewer is still refused.Pair
Box change: srcfl/ftw#1228
An old app against a new box already saves without Face ID, because it never sends
stepUpuntil refused. This PR is the honest sim, the tests, and the docs.Tests
npx vitest run src/views/EvPanel.svelte.test.ts tests/api-passthrough.test.ts