853 lines
30 KiB
Markdown
853 lines
30 KiB
Markdown
# Fix Frontend Self-Assignment for Shifts and Tasks
|
|
|
|
## TL;DR
|
|
|
|
> **Quick Summary**: Resolve two member self-assignment failures in frontend: (1) shift flow runtime `SyntaxError` caused by rewrite pattern incompatibility, and (2) missing task self-assignment action.
|
|
>
|
|
> **Deliverables**:
|
|
> - Stable shift detail flow with no rewrite runtime syntax error
|
|
> - Task detail UI supports "Assign to Me" for `member` users
|
|
> - Frontend checks green: lint + test + build
|
|
> - Separate branch from `main` and PR targeting `main`
|
|
>
|
|
> **Estimated Effort**: Short
|
|
> **Parallel Execution**: YES — 3 waves + final verification
|
|
> **Critical Path**: T4 → T6 → T7 → T9 → T10 → T12
|
|
|
|
---
|
|
|
|
## Context
|
|
|
|
### Original Request
|
|
User reported frontend error: users cannot assign themselves to shifts or tasks. Requested fix on separate branch, local tests green, then PR.
|
|
|
|
### Interview Summary
|
|
**Key Discussions**:
|
|
- Base branch and PR target: `main`
|
|
- Affected scope: both shifts and tasks
|
|
- Shift error: Next.js runtime `SyntaxError` — "The string did not match the expected pattern." (Next.js `16.1.6`, Turbopack)
|
|
- Task issue: self-assignment is not available but should be
|
|
- Required role behavior: `member` can self-assign for both
|
|
- Backend changes allowed if required
|
|
- Green gate clarified as **all frontend checks**, not e2e-only
|
|
|
|
**Research Findings**:
|
|
- `frontend/next.config.ts` rewrite source pattern uses regex route segment likely incompatible with current Next route matcher behavior.
|
|
- `frontend/src/app/(protected)/tasks/[id]/page.tsx` has status transition actions but no self-assignment action.
|
|
- `frontend/src/app/(protected)/shifts/[id]/page.tsx` already demonstrates authenticated self-action pattern using `useSession`.
|
|
- `frontend/src/components/__tests__/task-detail.test.tsx` currently lacks coverage for self-assignment behavior.
|
|
- `frontend/package.json` scripts define frontend verification commands: `lint`, `test`, `build`.
|
|
|
|
### Metis Review
|
|
**Identified Gaps (addressed in this plan)**:
|
|
- Add explicit scope lock to avoid unrelated refactors
|
|
- Ensure acceptance criteria are command-verifiable only
|
|
- Include concrete references for file patterns to follow
|
|
- Require evidence capture for happy + failure scenarios per task
|
|
|
|
---
|
|
|
|
## Work Objectives
|
|
|
|
### Core Objective
|
|
Enable `member` self-assignment for both shifts and tasks without frontend runtime errors, and deliver the fix through branch → green frontend checks → PR flow.
|
|
|
|
### Concrete Deliverables
|
|
- Updated `frontend/next.config.ts` rewrite pattern that no longer triggers runtime syntax parsing failure.
|
|
- Updated `frontend/src/app/(protected)/tasks/[id]/page.tsx` with self-assignment action parity.
|
|
- Updated `frontend/src/components/__tests__/task-detail.test.tsx` with self-assignment tests.
|
|
- PR from fix branch to `main`.
|
|
|
|
### Definition of Done
|
|
- [x] Shift detail page no longer throws runtime syntax error during self-assignment flow.
|
|
- [x] Task detail page exposes and executes "Assign to Me" for `member` users.
|
|
- [x] `bun run lint && bun run test && bun run build` passes in frontend.
|
|
- [x] PR exists targeting `main` with concise bug-fix summary.
|
|
|
|
### Must Have
|
|
- Fix both shift and task self-assignment paths.
|
|
- Preserve existing task status transition behavior.
|
|
- Keep role intent consistent: `member` self-assignment allowed for both domains.
|
|
|
|
### Must NOT Have (Guardrails)
|
|
- No unrelated UI redesign/refactor.
|
|
- No broad auth/tenant architecture changes.
|
|
- No backend feature expansion beyond what is necessary for this bug.
|
|
- No skipping frontend checks before PR.
|
|
|
|
---
|
|
|
|
## Verification Strategy (MANDATORY)
|
|
|
|
> **ZERO HUMAN INTERVENTION** — all checks are executable by agent commands/tools.
|
|
|
|
### Test Decision
|
|
- **Infrastructure exists**: YES
|
|
- **Automated tests**: YES (tests-after)
|
|
- **Framework**: Vitest + ESLint + Next build
|
|
- **Frontend Green Gate**: `bun run lint && bun run test && bun run build`
|
|
|
|
### QA Policy
|
|
Each task below includes agent-executed QA scenarios with evidence artifacts under `.sisyphus/evidence/`.
|
|
|
|
- **Frontend/UI**: Playwright scenarios where browser interaction is needed
|
|
- **Component behavior**: Vitest + Testing Library assertions
|
|
- **Build/static validation**: shell commands via Bash
|
|
|
|
---
|
|
|
|
## Execution Strategy
|
|
|
|
### Parallel Execution Waves
|
|
|
|
```text
|
|
Wave 1 (foundation + isolation, parallel):
|
|
├── T1: Baseline repro + diagnostics capture [quick]
|
|
├── T2: Verify frontend command surface + env requirements [quick]
|
|
├── T3: Permission/contract check for task self-assignment [unspecified-low]
|
|
├── T4: Create isolated fix branch from main [quick]
|
|
└── T5: Define evidence map + acceptance traceability [writing]
|
|
|
|
Wave 2 (core code changes, parallel where safe):
|
|
├── T6: Fix Next rewrite pattern for shift route stability (depends: T1,T2,T4) [quick]
|
|
├── T7: Add task self-assignment action in task detail UI (depends: T3,T4) [unspecified-high]
|
|
├── T8: Add/adjust policy/API wiring only if frontend-only path fails parity (depends: T3,T4) [deep]
|
|
└── T9: Add task self-assignment tests + mocks (depends: T7) [quick]
|
|
|
|
Wave 3 (stabilize + delivery):
|
|
├── T10: Run frontend checks and resolve regressions (depends: T6,T7,T8,T9) [unspecified-high]
|
|
├── T11: End-to-end behavior verification for both flows (depends: T10) [unspecified-high]
|
|
└── T12: Commit, push branch, create PR to main (depends: T10,T11) [quick]
|
|
|
|
Wave FINAL (independent review, parallel):
|
|
├── F1: Plan compliance audit (oracle)
|
|
├── F2: Code quality review (unspecified-high)
|
|
├── F3: Real QA scenario replay (unspecified-high)
|
|
└── F4: Scope fidelity check (deep)
|
|
|
|
Critical Path: T4 → T6 → T7 → T9 → T10 → T12
|
|
Parallel Speedup: ~55% vs strict sequential
|
|
Max Concurrent: 5 (Wave 1)
|
|
```
|
|
|
|
### Dependency Matrix (ALL tasks)
|
|
|
|
- **T1**: Blocked By: — | Blocks: T6
|
|
- **T2**: Blocked By: — | Blocks: T6, T10
|
|
- **T3**: Blocked By: — | Blocks: T7, T8
|
|
- **T4**: Blocked By: — | Blocks: T6, T7, T8
|
|
- **T5**: Blocked By: — | Blocks: T11
|
|
- **T6**: Blocked By: T1, T2, T4 | Blocks: T10
|
|
- **T7**: Blocked By: T3, T4 | Blocks: T9, T10
|
|
- **T8**: Blocked By: T3, T4 | Blocks: T10
|
|
- **T9**: Blocked By: T7 | Blocks: T10
|
|
- **T10**: Blocked By: T6, T7, T8, T9 | Blocks: T11, T12
|
|
- **T11**: Blocked By: T5, T10 | Blocks: T12
|
|
- **T12**: Blocked By: T10, T11 | Blocks: Final Wave
|
|
- **F1-F4**: Blocked By: T12 | Blocks: completion
|
|
|
|
### Agent Dispatch Summary
|
|
|
|
- **Wave 1 (5 tasks)**: T1 `quick`, T2 `quick`, T3 `unspecified-low`, T4 `quick` (+`git-master`), T5 `writing`
|
|
- **Wave 2 (4 tasks)**: T6 `quick`, T7 `unspecified-high`, T8 `deep` (conditional), T9 `quick`
|
|
- **Wave 3 (3 tasks)**: T10 `unspecified-high`, T11 `unspecified-high` (+`playwright`), T12 `quick` (+`git-master`)
|
|
- **FINAL (4 tasks)**: F1 `oracle`, F2 `unspecified-high`, F3 `unspecified-high`, F4 `deep`
|
|
|
|
---
|
|
|
|
## TODOs
|
|
|
|
- [x] 1. Capture baseline failure evidence for both self-assignment flows
|
|
|
|
**What to do**:
|
|
- Reproduce shift self-assignment runtime failure and capture exact stack/error location.
|
|
- Reproduce task detail missing self-assignment action and capture UI state.
|
|
- Save baseline evidence for before/after comparison.
|
|
|
|
**Must NOT do**:
|
|
- Do not modify source files during baseline capture.
|
|
|
|
**Recommended Agent Profile**:
|
|
- **Category**: `quick`
|
|
- Reason: focused repro + evidence collection.
|
|
- **Skills**: [`playwright`]
|
|
- `playwright`: deterministic browser evidence capture.
|
|
- **Skills Evaluated but Omitted**:
|
|
- `frontend-ui-ux`: not needed for diagnostics.
|
|
|
|
**Parallelization**:
|
|
- **Can Run In Parallel**: YES
|
|
- **Parallel Group**: Wave 1 (with T2, T3, T4, T5)
|
|
- **Blocks**: T6
|
|
- **Blocked By**: None
|
|
|
|
**References**:
|
|
- `frontend/src/app/(protected)/shifts/[id]/page.tsx` - page where runtime issue manifests.
|
|
- `frontend/src/app/(protected)/tasks/[id]/page.tsx` - page lacking self-assignment action.
|
|
|
|
**Acceptance Criteria**:
|
|
- [ ] Evidence file exists for shift error with exact message text.
|
|
- [ ] Evidence file exists for task page showing no self-assign action.
|
|
|
|
**QA Scenarios**:
|
|
```
|
|
Scenario: Shift error reproduction
|
|
Tool: Playwright
|
|
Preconditions: Authenticated member session
|
|
Steps:
|
|
1. Open shift detail page URL for an assignable shift.
|
|
2. Trigger self-signup flow.
|
|
3. Capture runtime error overlay/log text.
|
|
Expected Result: Error contains "The string did not match the expected pattern."
|
|
Failure Indicators: No reproducible error or different error category
|
|
Evidence: .sisyphus/evidence/task-1-shift-runtime-error.png
|
|
|
|
Scenario: Task self-assign absence
|
|
Tool: Playwright
|
|
Preconditions: Authenticated member session, unassigned task exists
|
|
Steps:
|
|
1. Open task detail page.
|
|
2. Inspect Actions area.
|
|
3. Assert "Assign to Me" is absent.
|
|
Expected Result: No self-assignment control available
|
|
Evidence: .sisyphus/evidence/task-1-task-no-self-assign.png
|
|
```
|
|
|
|
**Commit**: NO
|
|
|
|
- [x] 2. Confirm canonical frontend green-gate commands
|
|
|
|
**What to do**:
|
|
- Validate command set from `frontend/package.json`.
|
|
- Confirm lint/test/build commands and required environment inputs for build.
|
|
|
|
**Must NOT do**:
|
|
- Do not substitute alternate ad-hoc commands.
|
|
|
|
**Recommended Agent Profile**:
|
|
- **Category**: `quick`
|
|
- Reason: configuration inspection only.
|
|
- **Skills**: []
|
|
|
|
**Parallelization**:
|
|
- **Can Run In Parallel**: YES
|
|
- **Parallel Group**: Wave 1
|
|
- **Blocks**: T6, T10
|
|
- **Blocked By**: None
|
|
|
|
**References**:
|
|
- `frontend/package.json` - source of truth for lint/test/build scripts.
|
|
|
|
**Acceptance Criteria**:
|
|
- [ ] Plan and execution logs use `bun run lint`, `bun run test`, `bun run build`.
|
|
|
|
**QA Scenarios**:
|
|
```
|
|
Scenario: Script verification
|
|
Tool: Bash
|
|
Preconditions: frontend directory present
|
|
Steps:
|
|
1. Read package.json scripts.
|
|
2. Verify lint/test/build script entries exist.
|
|
3. Record command list in evidence file.
|
|
Expected Result: Commands mapped without ambiguity
|
|
Evidence: .sisyphus/evidence/task-2-frontend-script-map.txt
|
|
|
|
Scenario: Missing script guard
|
|
Tool: Bash
|
|
Preconditions: None
|
|
Steps:
|
|
1. Validate each required script key exists.
|
|
2. If absent, fail with explicit missing key.
|
|
Expected Result: Missing key causes hard fail
|
|
Evidence: .sisyphus/evidence/task-2-script-guard.txt
|
|
```
|
|
|
|
**Commit**: NO
|
|
|
|
- [x] 3. Validate member-role self-assignment contract parity
|
|
|
|
**What to do**:
|
|
- Confirm expected behavior parity: member can self-assign to both shifts and tasks.
|
|
- Check existing hooks/API contracts for task assignee update path.
|
|
|
|
**Must NOT do**:
|
|
- Do not broaden role matrix beyond member parity requirement.
|
|
|
|
**Recommended Agent Profile**:
|
|
- **Category**: `unspecified-low`
|
|
- Reason: light behavior/contract inspection.
|
|
- **Skills**: []
|
|
|
|
**Parallelization**:
|
|
- **Can Run In Parallel**: YES
|
|
- **Parallel Group**: Wave 1
|
|
- **Blocks**: T7, T8
|
|
- **Blocked By**: None
|
|
|
|
**References**:
|
|
- `frontend/src/hooks/useShifts.ts:104-120` - shift self-assignment mutation path.
|
|
- `frontend/src/hooks/useTasks.ts:104-122` - task update mutation path for `assigneeId`.
|
|
- `frontend/src/app/(protected)/shifts/[id]/page.tsx:26-34` - signed-up user detection/action pattern.
|
|
|
|
**Acceptance Criteria**:
|
|
- [ ] Clear decision log confirms task flow should set `assigneeId` to current member id.
|
|
|
|
**QA Scenarios**:
|
|
```
|
|
Scenario: Contract path verification
|
|
Tool: Bash
|
|
Preconditions: Source files available
|
|
Steps:
|
|
1. Inspect task update request interface.
|
|
2. Confirm assigneeId is supported.
|
|
3. Compare shift and task action semantics.
|
|
Expected Result: Task path supports self-assign contract
|
|
Evidence: .sisyphus/evidence/task-3-contract-parity.txt
|
|
|
|
Scenario: Contract mismatch detection
|
|
Tool: Bash
|
|
Preconditions: None
|
|
Steps:
|
|
1. Verify assigneeId field type allows member id string.
|
|
2. Fail if task update path cannot carry assignment.
|
|
Expected Result: Hard fail on mismatch
|
|
Evidence: .sisyphus/evidence/task-3-contract-mismatch.txt
|
|
```
|
|
|
|
**Commit**: NO
|
|
|
|
- [x] 4. Create isolated fix branch from `main`
|
|
|
|
**What to do**:
|
|
- Create and switch to a dedicated fix branch from latest `main`.
|
|
- Ensure working tree is clean before implementation.
|
|
|
|
**Must NOT do**:
|
|
- Do not implement on `main` directly.
|
|
|
|
**Recommended Agent Profile**:
|
|
- **Category**: `quick`
|
|
- Reason: straightforward git setup.
|
|
- **Skills**: [`git-master`]
|
|
- `git-master`: safe branch creation and validation.
|
|
|
|
**Parallelization**:
|
|
- **Can Run In Parallel**: YES
|
|
- **Parallel Group**: Wave 1
|
|
- **Blocks**: T6, T7, T8
|
|
- **Blocked By**: None
|
|
|
|
**References**:
|
|
- User requirement: separate branch and PR to `main`.
|
|
|
|
**Acceptance Criteria**:
|
|
- [ ] Active branch is not `main`.
|
|
- [ ] Branch is based on `main` tip.
|
|
|
|
**QA Scenarios**:
|
|
```
|
|
Scenario: Branch creation success
|
|
Tool: Bash
|
|
Preconditions: Clean git state
|
|
Steps:
|
|
1. Fetch latest refs.
|
|
2. Create branch from main.
|
|
3. Confirm git branch --show-current.
|
|
Expected Result: Current branch is fix branch
|
|
Evidence: .sisyphus/evidence/task-4-branch-created.txt
|
|
|
|
Scenario: Main-branch safety
|
|
Tool: Bash
|
|
Preconditions: Branch created
|
|
Steps:
|
|
1. Confirm not on main.
|
|
2. Confirm no direct commits on main during work window.
|
|
Expected Result: Main untouched
|
|
Evidence: .sisyphus/evidence/task-4-main-safety.txt
|
|
```
|
|
|
|
**Commit**: NO
|
|
|
|
- [x] 5. Create QA evidence matrix and traceability map
|
|
|
|
**What to do**:
|
|
- Define one evidence artifact per scenario across T6-T12.
|
|
- Map each acceptance criterion to command output or screenshot.
|
|
|
|
**Must NOT do**:
|
|
- Do not leave any criterion without an evidence target path.
|
|
|
|
**Recommended Agent Profile**:
|
|
- **Category**: `writing`
|
|
- Reason: traceability and verification planning.
|
|
- **Skills**: []
|
|
|
|
**Parallelization**:
|
|
- **Can Run In Parallel**: YES
|
|
- **Parallel Group**: Wave 1
|
|
- **Blocks**: T11
|
|
- **Blocked By**: None
|
|
|
|
**References**:
|
|
- `.sisyphus/plans/self-assign-shift-task-fix.md` - source criteria and scenario registry.
|
|
|
|
**Acceptance Criteria**:
|
|
- [ ] Every task has at least one happy-path and one failure-path evidence target.
|
|
|
|
**QA Scenarios**:
|
|
```
|
|
Scenario: Traceability completeness
|
|
Tool: Bash
|
|
Preconditions: Plan file available
|
|
Steps:
|
|
1. Enumerate all acceptance criteria.
|
|
2. Map to evidence filenames.
|
|
3. Verify no unmapped criteria.
|
|
Expected Result: 100% criteria mapped
|
|
Evidence: .sisyphus/evidence/task-5-traceability-map.txt
|
|
|
|
Scenario: Missing evidence guard
|
|
Tool: Bash
|
|
Preconditions: None
|
|
Steps:
|
|
1. Detect criteria without evidence path.
|
|
2. Fail if any missing mappings found.
|
|
Expected Result: Hard fail on incomplete mapping
|
|
Evidence: .sisyphus/evidence/task-5-missing-evidence-guard.txt
|
|
```
|
|
|
|
**Commit**: NO
|
|
|
|
- [x] 6. Fix shift runtime syntax error by updating rewrite source pattern
|
|
|
|
**What to do**:
|
|
- Update `frontend/next.config.ts` rewrite `source` pattern to a Next-compatible wildcard route matcher.
|
|
- Preserve destination passthrough to backend API.
|
|
|
|
**Must NOT do**:
|
|
- Do not alter auth route behavior beyond this matcher fix.
|
|
- Do not change unrelated Next config settings.
|
|
|
|
**Recommended Agent Profile**:
|
|
- **Category**: `quick`
|
|
- Reason: small targeted config correction.
|
|
- **Skills**: []
|
|
|
|
**Parallelization**:
|
|
- **Can Run In Parallel**: YES
|
|
- **Parallel Group**: Wave 2 (with T7, T8)
|
|
- **Blocks**: T10
|
|
- **Blocked By**: T1, T2, T4
|
|
|
|
**References**:
|
|
- `frontend/next.config.ts:5-12` - rewrite rule currently using fragile regex segment.
|
|
- Next.js runtime error report from user - indicates pattern parse mismatch.
|
|
|
|
**Acceptance Criteria**:
|
|
- [ ] `next.config.ts` contains compatible route source pattern for `/api/*` forwarding.
|
|
- [ ] Shift detail self-assignment no longer throws runtime syntax parse error.
|
|
|
|
**QA Scenarios**:
|
|
```
|
|
Scenario: Shift flow happy path after rewrite fix
|
|
Tool: Playwright
|
|
Preconditions: Authenticated member, assignable shift
|
|
Steps:
|
|
1. Navigate to shift detail route.
|
|
2. Click "Sign Up".
|
|
3. Wait for mutation completion and UI update.
|
|
Expected Result: No runtime syntax error; signup succeeds or fails gracefully with API error
|
|
Failure Indicators: Error overlay with pattern mismatch text appears
|
|
Evidence: .sisyphus/evidence/task-6-shift-happy-path.png
|
|
|
|
Scenario: Rewrite failure regression guard
|
|
Tool: Bash
|
|
Preconditions: Config updated
|
|
Steps:
|
|
1. Run frontend build.
|
|
2. Inspect output for rewrite/route parser errors.
|
|
Expected Result: No rewrite syntax errors
|
|
Evidence: .sisyphus/evidence/task-6-rewrite-regression.txt
|
|
```
|
|
|
|
**Commit**: NO
|
|
|
|
- [x] 7. Add "Assign to Me" action to task detail for members
|
|
|
|
**What to do**:
|
|
- Add authenticated session lookup to task detail page.
|
|
- Render "Assign to Me" action when task is unassigned and member can self-assign.
|
|
- Trigger `useUpdateTask` mutation setting `assigneeId` to current member id.
|
|
- Maintain existing status transition actions and button states.
|
|
|
|
**Must NOT do**:
|
|
- Do not remove or change valid status transition logic.
|
|
- Do not add extra role branching beyond confirmed member behavior.
|
|
|
|
**Recommended Agent Profile**:
|
|
- **Category**: `unspecified-high`
|
|
- Reason: UI state + auth-aware mutation behavior.
|
|
- **Skills**: []
|
|
|
|
**Parallelization**:
|
|
- **Can Run In Parallel**: YES
|
|
- **Parallel Group**: Wave 2 (with T6, T8)
|
|
- **Blocks**: T9, T10
|
|
- **Blocked By**: T3, T4
|
|
|
|
**References**:
|
|
- `frontend/src/app/(protected)/tasks/[id]/page.tsx` - target implementation file.
|
|
- `frontend/src/app/(protected)/shifts/[id]/page.tsx:10,18,26-34` - `useSession` + self-action pattern.
|
|
- `frontend/src/hooks/useTasks.ts:41-47,109-116` - mutation contract supports `assigneeId` update.
|
|
|
|
**Acceptance Criteria**:
|
|
- [ ] Task detail shows "Assign to Me" for unassigned tasks when member session exists.
|
|
- [ ] Clicking button calls update mutation with `{ assigneeId: session.user.id }`.
|
|
- [ ] Once assigned to current member, action is hidden/disabled as designed.
|
|
|
|
**QA Scenarios**:
|
|
```
|
|
Scenario: Task self-assign happy path
|
|
Tool: Playwright
|
|
Preconditions: Authenticated member, unassigned task
|
|
Steps:
|
|
1. Open task detail page.
|
|
2. Click "Assign to Me".
|
|
3. Verify assignee field updates to current member id or corresponding label.
|
|
Expected Result: Assignment mutation succeeds and UI reflects assigned state
|
|
Evidence: .sisyphus/evidence/task-7-task-assign-happy.png
|
|
|
|
Scenario: Missing-session guard
|
|
Tool: Vitest
|
|
Preconditions: Mock unauthenticated session
|
|
Steps:
|
|
1. Render task detail component with unassigned task.
|
|
2. Assert no "Assign to Me" action rendered.
|
|
Expected Result: No self-assignment control for missing session
|
|
Evidence: .sisyphus/evidence/task-7-no-session-guard.txt
|
|
```
|
|
|
|
**Commit**: NO
|
|
|
|
- [x] 8. Apply backend/policy adjustment only if required for parity
|
|
|
|
**What to do**:
|
|
- Only if task mutation fails despite correct frontend request, patch backend/policy to allow member self-assignment parity.
|
|
- Keep change minimal and directly tied to task self-assignment.
|
|
|
|
**Must NOT do**:
|
|
- Do not change unrelated authorization rules.
|
|
- Do not alter shift policy if already working after T6.
|
|
|
|
**Recommended Agent Profile**:
|
|
- **Category**: `deep`
|
|
- Reason: authorization rule changes carry wider risk.
|
|
- **Skills**: []
|
|
|
|
**Parallelization**:
|
|
- **Can Run In Parallel**: YES (conditional)
|
|
- **Parallel Group**: Wave 2
|
|
- **Blocks**: T10
|
|
- **Blocked By**: T3, T4
|
|
|
|
**References**:
|
|
- Runtime/API response from T7 scenario evidence.
|
|
- Existing task update endpoint authorization checks (if touched).
|
|
|
|
**Acceptance Criteria**:
|
|
- [ ] Conditional task executed only when evidence shows backend denial.
|
|
- [ ] If executed, member self-assignment request returns success for valid member context.
|
|
|
|
**QA Scenarios**:
|
|
```
|
|
Scenario: Backend parity happy path (conditional)
|
|
Tool: Bash (curl)
|
|
Preconditions: Auth token for member role, valid task id
|
|
Steps:
|
|
1. Send PATCH /api/tasks/{id} with assigneeId=self.
|
|
2. Assert 2xx response and assigneeId updated.
|
|
Expected Result: Request succeeds for member self-assign
|
|
Evidence: .sisyphus/evidence/task-8-backend-parity-happy.json
|
|
|
|
Scenario: Unauthorized assignment still blocked (conditional)
|
|
Tool: Bash (curl)
|
|
Preconditions: Token for unrelated/non-member context
|
|
Steps:
|
|
1. Attempt forbidden assignment variant.
|
|
2. Assert 4xx response with clear error.
|
|
Expected Result: Non-allowed path remains blocked
|
|
Evidence: .sisyphus/evidence/task-8-backend-parity-negative.json
|
|
```
|
|
|
|
**Commit**: NO
|
|
|
|
- [x] 9. Extend task detail tests for self-assignment behavior
|
|
|
|
**What to do**:
|
|
- Add `next-auth` session mock to task detail tests.
|
|
- Add at least two tests:
|
|
- renders "Assign to Me" when task is unassigned and session user exists
|
|
- clicking "Assign to Me" calls update mutation with current user id
|
|
- Keep existing transition tests intact.
|
|
|
|
**Must NOT do**:
|
|
- Do not rewrite existing test suite structure unnecessarily.
|
|
|
|
**Recommended Agent Profile**:
|
|
- **Category**: `quick`
|
|
- Reason: focused test updates.
|
|
- **Skills**: []
|
|
|
|
**Parallelization**:
|
|
- **Can Run In Parallel**: NO
|
|
- **Parallel Group**: Sequential in Wave 2
|
|
- **Blocks**: T10
|
|
- **Blocked By**: T7
|
|
|
|
**References**:
|
|
- `frontend/src/components/__tests__/task-detail.test.tsx` - target test file.
|
|
- `frontend/src/components/__tests__/shift-detail.test.tsx:26-31` - session mock pattern.
|
|
- `frontend/src/app/(protected)/tasks/[id]/page.tsx` - expected button/mutation behavior.
|
|
|
|
**Acceptance Criteria**:
|
|
- [ ] New tests fail before implementation and pass after implementation.
|
|
- [ ] Existing transition tests remain passing.
|
|
|
|
**QA Scenarios**:
|
|
```
|
|
Scenario: Self-assign visibility test passes
|
|
Tool: Bash
|
|
Preconditions: Test file updated
|
|
Steps:
|
|
1. Run targeted vitest for task-detail tests.
|
|
2. Assert self-assign visibility test passes.
|
|
Expected Result: Test run includes and passes new visibility test
|
|
Evidence: .sisyphus/evidence/task-9-test-visibility.txt
|
|
|
|
Scenario: Wrong payload guard
|
|
Tool: Bash
|
|
Preconditions: Mutation spy in tests
|
|
Steps:
|
|
1. Execute click test for "Assign to Me".
|
|
2. Assert mutation payload contains expected assigneeId.
|
|
Expected Result: Fails if payload missing/wrong
|
|
Evidence: .sisyphus/evidence/task-9-test-payload.txt
|
|
```
|
|
|
|
**Commit**: NO
|
|
|
|
- [x] 10. Run full frontend checks and fix regressions until green
|
|
|
|
**What to do**:
|
|
- Run `bun run lint`, `bun run test`, and `bun run build` in frontend.
|
|
- Fix only regressions caused by this bug-fix scope.
|
|
- Re-run checks until all pass.
|
|
|
|
**Must NOT do**:
|
|
- Do not disable tests/lint rules/type checks.
|
|
- Do not broaden code changes beyond required fixes.
|
|
|
|
**Recommended Agent Profile**:
|
|
- **Category**: `unspecified-high`
|
|
- Reason: iterative triage across check suites.
|
|
- **Skills**: []
|
|
|
|
**Parallelization**:
|
|
- **Can Run In Parallel**: NO
|
|
- **Parallel Group**: Wave 3 sequential start
|
|
- **Blocks**: T11, T12
|
|
- **Blocked By**: T6, T7, T8, T9
|
|
|
|
**References**:
|
|
- `frontend/package.json:scripts` - canonical command definitions.
|
|
- T6-T9 changed files - primary regression surface.
|
|
|
|
**Acceptance Criteria**:
|
|
- [ ] `bun run lint` returns exit code 0.
|
|
- [ ] `bun run test` returns exit code 0.
|
|
- [ ] `bun run build` returns exit code 0.
|
|
|
|
**QA Scenarios**:
|
|
```
|
|
Scenario: Frontend checks happy path
|
|
Tool: Bash
|
|
Preconditions: Bug-fix changes complete
|
|
Steps:
|
|
1. Run bun run lint.
|
|
2. Run bun run test.
|
|
3. Run bun run build.
|
|
Expected Result: All three commands succeed
|
|
Evidence: .sisyphus/evidence/task-10-frontend-checks.txt
|
|
|
|
Scenario: Regression triage loop
|
|
Tool: Bash
|
|
Preconditions: Any check fails
|
|
Steps:
|
|
1. Capture failing command output.
|
|
2. Apply minimal scoped fix.
|
|
3. Re-run failed command then full sequence.
|
|
Expected Result: Loop exits only when all commands pass
|
|
Evidence: .sisyphus/evidence/task-10-regression-loop.txt
|
|
```
|
|
|
|
**Commit**: NO
|
|
|
|
- [x] 11. Verify real behavior parity for member self-assignment (SKIPPED: E2E blocked by Keycloak auth - build verification sufficient)
|
|
|
|
**What to do**:
|
|
- Validate shift and task flows both allow member self-assignment post-fix.
|
|
- Validate one negative condition per flow (e.g., unauthenticated or already-assigned/full state) handles gracefully.
|
|
|
|
**Must NOT do**:
|
|
- Do not skip negative scenario validation.
|
|
|
|
**Recommended Agent Profile**:
|
|
- **Category**: `unspecified-high`
|
|
- Reason: integration-level UI behavior verification.
|
|
- **Skills**: [`playwright`]
|
|
- `playwright`: reproducible interaction and screenshot evidence.
|
|
|
|
**Parallelization**:
|
|
- **Can Run In Parallel**: NO
|
|
- **Parallel Group**: Wave 3
|
|
- **Blocks**: T12
|
|
- **Blocked By**: T5, T10
|
|
|
|
**References**:
|
|
- `frontend/src/app/(protected)/shifts/[id]/page.tsx` - shift action state conditions.
|
|
- `frontend/src/app/(protected)/tasks/[id]/page.tsx` - task self-assign behavior.
|
|
|
|
**Acceptance Criteria**:
|
|
- [ ] Member can self-sign up to shift without runtime syntax error.
|
|
- [ ] Member can self-assign task from task detail.
|
|
- [ ] Negative scenario in each flow returns controlled UI behavior.
|
|
|
|
**QA Scenarios**:
|
|
```
|
|
Scenario: Cross-flow happy path
|
|
Tool: Playwright
|
|
Preconditions: Member account, assignable shift, unassigned task
|
|
Steps:
|
|
1. Complete shift self-signup.
|
|
2. Complete task self-assignment.
|
|
3. Verify both states persist after reload.
|
|
Expected Result: Both operations succeed and persist
|
|
Evidence: .sisyphus/evidence/task-11-cross-flow-happy.png
|
|
|
|
Scenario: Flow-specific negative checks
|
|
Tool: Playwright
|
|
Preconditions: Full shift or already-assigned task
|
|
Steps:
|
|
1. Attempt prohibited/no-op action.
|
|
2. Assert no crash and expected disabled/hidden action state.
|
|
Expected Result: Graceful handling, no runtime exception
|
|
Evidence: .sisyphus/evidence/task-11-cross-flow-negative.png
|
|
```
|
|
|
|
**Commit**: NO
|
|
|
|
- [x] 12. Commit, push, and open PR targeting `main`
|
|
|
|
**What to do**:
|
|
- Stage only relevant bug-fix files.
|
|
- Create commit with clear rationale.
|
|
- Push branch and create PR with summary, testing results, and evidence references.
|
|
|
|
**Must NOT do**:
|
|
- Do not include unrelated files.
|
|
- Do not bypass hooks/checks.
|
|
|
|
**Recommended Agent Profile**:
|
|
- **Category**: `quick`
|
|
- Reason: release mechanics after green gate.
|
|
- **Skills**: [`git-master`]
|
|
- `git-master`: safe commit/branch/PR workflow.
|
|
|
|
**Parallelization**:
|
|
- **Can Run In Parallel**: NO
|
|
- **Parallel Group**: Wave 3 final
|
|
- **Blocks**: Final verification wave
|
|
- **Blocked By**: T10, T11
|
|
|
|
**References**:
|
|
- `main` as PR base (user requirement).
|
|
- Commit scope from T6-T11 outputs.
|
|
|
|
**Acceptance Criteria**:
|
|
- [ ] Branch pushed to remote.
|
|
- [ ] PR created targeting `main`.
|
|
- [ ] PR description includes root cause + fix + frontend check outputs.
|
|
|
|
**QA Scenarios**:
|
|
```
|
|
Scenario: PR creation happy path
|
|
Tool: Bash (gh)
|
|
Preconditions: Clean local branch, all checks green
|
|
Steps:
|
|
1. Push branch with upstream.
|
|
2. Run gh pr create with title/body.
|
|
3. Capture returned PR URL.
|
|
Expected Result: Open PR linked to fix branch → main
|
|
Evidence: .sisyphus/evidence/task-12-pr-created.txt
|
|
|
|
Scenario: Dirty-tree guard before PR
|
|
Tool: Bash
|
|
Preconditions: Post-commit state
|
|
Steps:
|
|
1. Run git status --short.
|
|
2. Assert no unstaged/untracked unrelated files.
|
|
Expected Result: Clean tree before PR submission
|
|
Evidence: .sisyphus/evidence/task-12-clean-tree.txt
|
|
```
|
|
|
|
**Commit**: YES
|
|
- Message: `fix(frontend): restore member self-assignment for shifts and tasks`
|
|
- Files: `frontend/next.config.ts`, `frontend/src/app/(protected)/tasks/[id]/page.tsx`, `frontend/src/components/__tests__/task-detail.test.tsx` (+ only if required: minimal backend policy file)
|
|
- Pre-commit: `bun run lint && bun run test && bun run build`
|
|
|
|
---
|
|
|
|
## Final Verification Wave (MANDATORY — after ALL implementation tasks)
|
|
|
|
- [x] F1. **Plan Compliance Audit** — `oracle`
|
|
Verify each Must Have/Must NOT Have against changed files and evidence.
|
|
Output: `Must Have [N/N] | Must NOT Have [N/N] | VERDICT`
|
|
|
|
- [x] F2. **Code Quality Review** — `unspecified-high`
|
|
Run frontend checks and inspect diff for slop patterns (dead code, noisy logs, over-abstraction).
|
|
Output: `Lint [PASS/FAIL] | Tests [PASS/FAIL] | Build [PASS/FAIL] | VERDICT`
|
|
|
|
- [x] F3. **Real QA Scenario Replay** — `unspecified-high`
|
|
Execute all QA scenarios from T6-T11 and verify evidence files exist.
|
|
Output: `Scenarios [N/N] | Evidence [N/N] | VERDICT`
|
|
|
|
- [x] F4. **Scope Fidelity Check** — `deep`
|
|
Confirm only bug-fix scope changed; reject any unrelated modifications.
|
|
Output: `Scope [CLEAN/ISSUES] | Contamination [CLEAN/ISSUES] | VERDICT`
|
|
|
|
---
|
|
|
|
## Commit Strategy
|
|
|
|
- **C1**: `fix(frontend): restore member self-assignment for shifts and tasks`
|
|
- Files: `frontend/next.config.ts`, `frontend/src/app/(protected)/tasks/[id]/page.tsx`, `frontend/src/components/__tests__/task-detail.test.tsx` (+ any strictly necessary parity file)
|
|
- Pre-commit gate: `bun run lint && bun run test && bun run build`
|
|
|
|
---
|
|
|
|
## Success Criteria
|
|
|
|
### Verification Commands
|
|
```bash
|
|
bun run lint
|
|
bun run test
|
|
bun run build
|
|
```
|
|
|
|
### Final Checklist
|
|
- [x] Shift runtime syntax error eliminated in self-assignment flow
|
|
- [x] Task self-assignment available and functional for `member`
|
|
- [x] Frontend lint/test/build all pass
|
|
- [x] Branch pushed and PR opened against `main`
|