# Project-Month Plan Specification ## Overview This capability defines explicit manager-entered monthly planning per project. It replaces derived monthly budget assumptions and becomes the planning source of truth for allocation variance. ## ADDED 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 ## MODIFIED Requirements ### Requirement: Monthly budget derivation **Original behavior (rejected):** monthly budget derived from `approved_estimate / 12`. **Updated behavior:** monthly plan values are explicit manager-entered project-month values; no derivation formula is used for planning behavior.