Give the person planning leave a stable explanation for each final leave placement. The annual calendar shows the plan explanation by default, keeps the complete final plan visible, and lets the person move chronologically between placements while seeing the submitted balance and rule snapshot, placement provenance, supporting status, time-off-period contribution, and every final-result contribution already available from the planning outcome.
This slice also evolves the public planning module into one calculation context that owns the immutable submitted snapshot and outcome without exposing worker messages or mutable search state. Existing planning results remain unchanged.
Acceptance criteria
A successful calculation exposes an immutable snapshot containing the submitted horizon, balances, rules, identities, and human-readable labels together with its outcome.
Editing balances or rules after submission cannot change an existing explanation.
The annual calendar displays the plan explanation before any technical trace view.
One step represents one final leave placement, ordered chronologically.
First, previous, next, and last controls select placements without rebuilding or progressively replaying the final plan.
The complete final plan remains visible and the current placement is clearly highlighted.
The selected placement shows its consumed leave entitlement, every satisfied rule, supporting status, containing time-off period, remaining-balance context, and applicable final metrics.
No weighted or normalized scalar score is introduced.
Existing PlanningOutcome behavior and placement results remain unchanged through the public planning module seam.
Planner and rendered annual-calendar tests cover the calculation snapshot and visible explanation behavior without calling private planner helpers.
Blocked by
None — can start immediately.
## Parent
#46
## What to build
Give the person planning leave a stable explanation for each final leave placement. The annual calendar shows the plan explanation by default, keeps the complete final plan visible, and lets the person move chronologically between placements while seeing the submitted balance and rule snapshot, placement provenance, supporting status, time-off-period contribution, and every final-result contribution already available from the planning outcome.
This slice also evolves the public planning module into one calculation context that owns the immutable submitted snapshot and outcome without exposing worker messages or mutable search state. Existing planning results remain unchanged.
## Acceptance criteria
- [ ] A successful calculation exposes an immutable snapshot containing the submitted horizon, balances, rules, identities, and human-readable labels together with its outcome.
- [ ] Editing balances or rules after submission cannot change an existing explanation.
- [ ] The annual calendar displays the plan explanation before any technical trace view.
- [ ] One step represents one final leave placement, ordered chronologically.
- [ ] First, previous, next, and last controls select placements without rebuilding or progressively replaying the final plan.
- [ ] The complete final plan remains visible and the current placement is clearly highlighted.
- [ ] The selected placement shows its consumed leave entitlement, every satisfied rule, supporting status, containing time-off period, remaining-balance context, and applicable final metrics.
- [ ] No weighted or normalized scalar score is introduced.
- [ ] Existing `PlanningOutcome` behavior and placement results remain unchanged through the public planning module seam.
- [ ] Planner and rendered annual-calendar tests cover the calculation snapshot and visible explanation behavior without calling private planner helpers.
## Blocked by
- None — can start immediately.
Published code freezes the submitted snapshot and exposes chronological placement explanation and provenance. However, planDetailsOpen defaults to false and the explanation disclosure is closed, whereas this ticket requires the plan explanation by default. Local commit 51978f7 changes that behaviour, but it is unpublished, and current uncommitted UI edits change the interaction again. Verify the final intended default before closure.
Evidence: reviewed issue requirements/discussions and f1f0835 (published application source; live main 57a39c81 only adds Renovate configuration). Tested an isolated checkout of the published source: 20 test files, 157/157 tests passed, including the five benchmark scenarios. Local commit 51978f7 and uncommitted edits were inspected separately and are not evidence of published completion.
Completion audit — 2026-10-02
Published code freezes the submitted snapshot and exposes chronological placement explanation and provenance. However, planDetailsOpen defaults to false and the explanation disclosure is closed, whereas this ticket requires the plan explanation by default. Local commit 51978f7 changes that behaviour, but it is unpublished, and current uncommitted UI edits change the interaction again. Verify the final intended default before closure.
Evidence: reviewed issue requirements/discussions and f1f0835 (published application source; live main 57a39c81 only adds Renovate configuration). Tested an isolated checkout of the published source: 20 test files, 157/157 tests passed, including the five benchmark scenarios. Local commit 51978f7 and uncommitted edits were inspected separately and are not evidence of published completion.
Implemented with $luna-verified-implement and independently verified.
Frozen submitted input and stable default plan explanations now preserve provenance, contributions, and the full obligation-first comparison while navigating final placements chronologically.
Validation: 198/198 tests across 23 files, app/spec TypeScript checks, ESLint, and production build pass. Chromium keyboard, focus-restoration, background comparison, and responsive checks at 375/768/1440 pixels pass with no page errors. Original benchmark outcomes match the pre-change baseline in all five scenarios, with and without tracing.
The implementation is in the local working tree based on 0ce33cc9d6fe7381965a9162571abe205d0b7350; no commit or push has been made.
Implemented with $luna-verified-implement and independently verified.
Frozen submitted input and stable default plan explanations now preserve provenance, contributions, and the full obligation-first comparison while navigating final placements chronologically.
Validation: 198/198 tests across 23 files, app/spec TypeScript checks, ESLint, and production build pass. Chromium keyboard, focus-restoration, background comparison, and responsive checks at 375/768/1440 pixels pass with no page errors. Original benchmark outcomes match the pre-change baseline in all five scenarios, with and without tracing.
The implementation is in the local working tree based on 0ce33cc9d6fe7381965a9162571abe205d0b7350; no commit or push has been made.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Parent
#46
What to build
Give the person planning leave a stable explanation for each final leave placement. The annual calendar shows the plan explanation by default, keeps the complete final plan visible, and lets the person move chronologically between placements while seeing the submitted balance and rule snapshot, placement provenance, supporting status, time-off-period contribution, and every final-result contribution already available from the planning outcome.
This slice also evolves the public planning module into one calculation context that owns the immutable submitted snapshot and outcome without exposing worker messages or mutable search state. Existing planning results remain unchanged.
Acceptance criteria
PlanningOutcomebehavior and placement results remain unchanged through the public planning module seam.Blocked by
mentioned in issue #48
mentioned in issue #49
Completion audit — 2026-10-02
Published code freezes the submitted snapshot and exposes chronological placement explanation and provenance. However, planDetailsOpen defaults to false and the explanation disclosure is closed, whereas this ticket requires the plan explanation by default. Local commit 51978f7 changes that behaviour, but it is unpublished, and current uncommitted UI edits change the interaction again. Verify the final intended default before closure.
Evidence: reviewed issue requirements/discussions and
f1f0835(published application source; live main57a39c81only adds Renovate configuration). Tested an isolated checkout of the published source: 20 test files, 157/157 tests passed, including the five benchmark scenarios. Local commit 51978f7 and uncommitted edits were inspected separately and are not evidence of published completion.mentioned in issue #46
Implemented with $luna-verified-implement and independently verified.
Frozen submitted input and stable default plan explanations now preserve provenance, contributions, and the full obligation-first comparison while navigating final placements chronologically.
Validation: 198/198 tests across 23 files, app/spec TypeScript checks, ESLint, and production build pass. Chromium keyboard, focus-restoration, background comparison, and responsive checks at 375/768/1440 pixels pass with no page errors. Original benchmark outcomes match the pre-change baseline in all five scenarios, with and without tracing.
The implementation is in the local working tree based on 0ce33cc9d6fe7381965a9162571abe205d0b7350; no commit or push has been made.
Preserved GitLab #47 history: source attribution, exact timestamps, discussion grouping and review positions. Historical diff snapshots: 0; visible source notes: 5.
gitlab-35-issue-47.md (SHA-256
4f92a6ecedd35f66d0ce06caddea8d15d8782b460545ae03718cdcbeb3216ee5)gitlab-35-issue-47.json (SHA-256
01032b13cdd7c8ef8b100593a4748e3d562af3f94d0e6223874aa170e5527bc9)Old CI job execution and reports are omitted. Original source files and rollback backups remain protected.