docs(openspec): archive completed changes and sync main specs

Archive three completed changes to archive/:
- api-resource-standard (70 tasks, 14 resource classes)
- capacity-expert-mode (68 tasks, expert mode planning grid)
- enhanced-allocation (62 tasks, planning fidelity + reporting)

Sync all delta specs to main specs/:
- api-resource-standard: API response standardization
- capacity-expert-mode: Expert mode toggle, grid, KPIs, batch API
- resource-allocation: Month execution comparison, bulk, untracked
- untracked-allocation: Null team member support
- allocation-indicators: Variance indicators (red/amber/neutral)
- monthly-budget: Explicit project-month planning

All changes verified and tested (157 tests passing).
This commit is contained in:
2026-03-08 19:13:28 -04:00
parent ec15386b52
commit b8262bbcaf
26 changed files with 2949 additions and 0 deletions

View File

@@ -0,0 +1,81 @@
# Purpose
TBD
# Requirements
## Requirement: Manager enters explicit monthly plan per project
The system SHALL allow managers to set planned hours for each project-month cell.
### Scenario: Set monthly plan across multiple months
- **GIVEN** project `PROJ-001` has `approved_estimate = 3000`
- **WHEN** manager sets Jan=1200, Feb=1400, Mar=400
- **THEN** the system stores those exact values
- **AND** no derived monthly average is applied
### Scenario: Edit monthly plan cell inline
- **GIVEN** a month-plan grid cell contains 1200
- **WHEN** manager edits the cell to 1100 and commits
- **THEN** the system persists 1100
- **AND** reconciliation status recalculates immediately
## Requirement: Reconcile month-plan sum against lifecycle approved estimate
The system SHALL compute reconciliation status per project based on:
`sum(non-null monthly planned hours)` vs `approved_estimate`.
### Scenario: OVER reconciliation
- **GIVEN** `approved_estimate = 3000`
- **AND** month-plan sum is 3200
- **THEN** status is `OVER`
### Scenario: UNDER reconciliation
- **GIVEN** `approved_estimate = 3000`
- **AND** month-plan sum is 2800
- **THEN** status is `UNDER`
### Scenario: MATCH reconciliation
- **GIVEN** `approved_estimate = 3000`
- **AND** month-plan sum is 3000
- **THEN** status is `MATCH`
## Requirement: Preserve blank month semantics
The planning grid SHALL keep unset months visually blank and semantically distinct from explicit zero.
### Scenario: Blank remains blank
- **GIVEN** no plan exists for April
- **WHEN** manager views planning grid
- **THEN** April cell is blank (no `0` shown)
### Scenario: Clear cell sets blank semantics
- **GIVEN** a month cell has planned value
- **WHEN** manager clears the cell and commits
- **THEN** the month is stored as blank/unset semantics
- **AND** planning UI displays blank
## Requirement: Allocation variance uses blank plan as zero
For allocation variance computation only, missing month plan SHALL be treated as planned `0`.
### Scenario: Allocate against blank plan month
- **GIVEN** no plan is set for selected month
- **AND** project allocations total 40h
- **WHEN** variance is computed
- **THEN** planned value used is 0
- **AND** row variance is +40
- **AND** allocation operation remains allowed
## Requirement: Grid-first planning interaction
Project-month planning SHALL be managed in a grid-first interface.
### Scenario: Keyboard-first editing
- **WHEN** manager navigates month-plan grid with keyboard
- **THEN** inline cell editing and commit are supported
- **AND** modal interaction is not required for normal edits
## Requirement: Monthly budget derivation
Monthly plan values SHALL be explicit manager-entered project-month values; no derivation formula is used for planning behavior (rejected: `approved_estimate / 12`).