fix(m7): stamping executed_at no longer requires a prior state transition
User reported `HTTP 400 — executed_at can only be set when state is
executed/reviewed_by_blue` when typing the timestamp inline in the new
scenario table. The state-gate predates the simplified UX — it made
sense back when the workflow was "Mark executed button + override
toggle", but the user has since asked for a single freely-typeable
datetime input.
- update_mission_test_fields drops the state check. Stamping a non-null
executed_at while state ∈ {pending, skipped, blocked} now auto-promotes
the state to `executed` in the same write. The promotion is gated by
the same mission.write_red_fields perm that executed_at already
required — no privilege escalation.
- MissionTestPage.tsx drops the state-based UI gate on canEditExecutedAt;
red perm alone now unlocks the input regardless of state.
- Replaced the old "rejection while pending" test with two new tests:
pending→executed via inline stamp + blue 403, and skipped→executed via
inline stamp.
- 139 pytest green.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -228,8 +228,11 @@ function RedZone({ test, missionId, canWriteRed }: RedZoneProps) {
|
||||
}
|
||||
|
||||
const apiErr = save.error instanceof ApiError ? save.error : null;
|
||||
const canEditExecutedAt =
|
||||
canWriteRed && (test.state === 'executed' || test.state === 'reviewed_by_blue');
|
||||
// Post-amendement 2026-05-15: the backend auto-promotes the state from
|
||||
// pending/skipped/blocked when a non-null executed_at is stamped, so the
|
||||
// UI no longer needs to disable the input on those states. Red perm is
|
||||
// still required.
|
||||
const canEditExecutedAt = canWriteRed;
|
||||
|
||||
return (
|
||||
<Card accent="red" className="flex flex-col gap-3" data-testid="red-zone">
|
||||
|
||||
Reference in New Issue
Block a user