# Dispo Import Implementation Tickets

**Date:** 2026-03-14
**Purpose:** Worker-ready implementation tickets for the clean-slate Dispo v2 import defined in [dispo-import-implementation.md](/home/hartmut/Documents/Copilot/planarchy/docs/dispo-import-implementation.md).

## How To Use This Ticket Pack

- Treat each ticket as a deliverable slice with its own acceptance criteria.
- Respect the dependency graph before starting downstream tickets.
- Parallel workers should only take tickets from the same phase when their touch points do not overlap heavily.
- `[tbd]` project resolution and ambiguous part-time patterns remain review-gated even after implementation.

## Dependency Summary

### Phase 0

- `DISPO-00` must finish first

### Phase 1

- `DISPO-10` depends on `DISPO-00`
- `DISPO-11` depends on `DISPO-00`
- `DISPO-12` depends on `DISPO-00`

### Phase 2

- `DISPO-20` depends on `DISPO-10`
- `DISPO-21` depends on `DISPO-10`, `DISPO-11`
- `DISPO-22` depends on `DISPO-10`, `DISPO-12`

### Phase 3

- `DISPO-30` depends on `DISPO-20`, `DISPO-21`, `DISPO-22`
- `DISPO-31` depends on `DISPO-20`, `DISPO-21`
- `DISPO-32` depends on `DISPO-20`, `DISPO-22`

### Phase 4

- `DISPO-40` depends on `DISPO-30`, `DISPO-31`, `DISPO-32`
- `DISPO-41` depends on `DISPO-10`, `DISPO-30`, `DISPO-32`
- `DISPO-42` depends on `DISPO-40`

## Parallel Worker Lanes

Recommended worker split after `DISPO-00`:

- Worker A: staging schema and import orchestration
- Worker B: reset/reseed and reference-data import
- Worker C: parser and token normalization
- Worker D: resource, role, chapter, and availability normalization
- Worker E: commit pipeline, vacations/public holidays, and reconciliation

## Tickets

### `DISPO-00` Canonical Decisions Lock

**Goal**

Freeze the implementation assumptions so multiple workers do not diverge.

**Scope**

- confirm canonical person ID strategy
- confirm auth reset scope
- confirm `[tbd]` commit policy
- confirm default part-time fallback policy
- confirm internal project bucket naming

**Deliverables**

- decision log appended to [dispo-import-implementation.md](/home/hartmut/Documents/Copilot/planarchy/docs/dispo-import-implementation.md)
- explicit list of values to seed for roles and internal project buckets

**Acceptance Criteria**

- no remaining ambiguous blocking decisions for schema work
- downstream workers can implement without inventing business rules

**Suggested Owner**

- architect / lead worker

**Estimated Effort**

- 0.5 day

### `DISPO-10` Staging Schema And Import Batch Model

**Goal**

Add durable staging persistence for workbook parsing and review.

**Scope**

- add Prisma models for import batches and staged records
- add statuses for parsed, unresolved, approved, committed, failed
- add source-trace fields
- add indexes for batch lookup and unresolved review

**Deliverables**

- Prisma schema changes
- migration
- shared types/schemas for staged entities

**Acceptance Criteria**

- an import batch can store staged resources, projects, assignments, vacations, availability rules, and unresolved rows
- all staged records keep workbook, sheet, row, and raw payload traceability
- migration applies cleanly

**Dependencies**

- `DISPO-00`

**Suggested Owner**

- Worker A

**Estimated Effort**

- 1 day

### `DISPO-11` Full Reset And Bootstrap Reseed

**Goal**

Provide a safe command that wipes the database and recreates the minimum viable platform baseline.

**Scope**

- add full reset script/command
- back up before destructive reset
- recreate admin/bootstrap access
- reseed required platform defaults

**Deliverables**

- reset command
- reseed command or combined bootstrap command
- operator documentation

**Acceptance Criteria**

- command wipes the intended database scope only
- command requires explicit force confirmation
- platform remains sign-in capable after reset
- rerunning in development is deterministic

**Dependencies**

- `DISPO-00`

**Suggested Owner**

- Worker B

**Estimated Effort**

- 1 day

### `DISPO-12` Canonical Identity And Role Seed Preparation

**Goal**

Prepare the canonical master-data rules required by all downstream importers.

**Scope**

- implement single-ID normalization rule for resources
- define role seed list
- define chapter normalization list
- define internal utilization bucket list

**Deliverables**

- shared normalization helpers
- seed updates for roles and internal categories
- test coverage for token-to-role and token-to-chapter mapping

**Acceptance Criteria**

- one canonical person identifier is used throughout import logic
- role seeds exist for `2D Artist`, `3D Artist`, `Project Manager`, `Art Director`
- chapter mapping is deterministic

**Dependencies**

- `DISPO-00`

**Suggested Owner**

- Worker D

**Estimated Effort**

- 0.5 to 1 day

### `DISPO-20` Reference Data Importer

**Goal**

Import and normalize master/reference data from `MandatoryDispoCategories_V3.xlsx`.

**Scope**

- countries
- metro cities
- org units
- management level groups and levels
- client hierarchy
- utilization categories

**Deliverables**

- workbook reader/importer
- reference-data upsert logic
- validation report for unknown values

**Acceptance Criteria**

- importer creates the normalized reference graph without duplicate nodes
- re-run is idempotent
- unknown or unmapped values are surfaced clearly

**Dependencies**

- `DISPO-10`

**Suggested Owner**

- Worker B

**Estimated Effort**

- 1 to 1.5 days

### `DISPO-21` Resource, Chapter, Role, And Availability Staging

**Goal**

Build staged resource records from `ChgFC`, `EID-Attr`, and Dispo row metadata.

**Scope**

- canonical resource identity matching
- resource master field extraction
- chapter mapping
- resource role staging
- baseline FTE and availability staging

**Deliverables**

- resource staging service
- chapter/role mapping helper
- unresolved resource conflict handling

**Acceptance Criteria**

- staged resources deduplicate correctly by canonical ID
- resource chapter is derived consistently from agreed token rules
- project-capable roles are staged for later assignment commit
- unresolved missing person fields are flagged, not silently defaulted

**Dependencies**

- `DISPO-10`
- `DISPO-11`

**Suggested Owner**

- Worker D

**Estimated Effort**

- 1.5 days

### `DISPO-22` Dispo Matrix Parser And Token Normalization

**Goal**

Convert `DISPO_2026.xlsx` matrix cells into normalized staging records.

**Scope**

- parse day/slot structure
- detect project, internal work, absence, holiday, unassigned, weekend, and part-time markers
- extract client token, WBS, win probability, role token, ignore suffixes
- emit structured staged records

**Deliverables**

- parser module
- token normalization library
- parser tests with representative cell examples

**Acceptance Criteria**

- parser handles known token families: `CH`, `MO`, `MD`, `PD`, `AB`, `NA`, `UN`
- parser strips `_HB` and `_SB`
- parser extracts `[BMW]`, `[11035763]`, `{CH80}`, and role prefixes correctly
- unknown token shapes are routed into unresolved staging rows

**Dependencies**

- `DISPO-10`
- `DISPO-12`

**Suggested Owner**

- Worker C

**Estimated Effort**

- 1.5 to 2 days

### `DISPO-30` Staged Project Resolver And Internal Bucket Builder

**Goal**

Resolve staged project identities and create normalized internal planning buckets.

**Scope**

- create WBS-backed staged projects
- link clients to projects
- derive project names
- stage internal `M&O`, `MD&I`, `PD&R` projects/buckets
- keep `[tbd]` rows unresolved

**Deliverables**

- project resolver service
- internal project/bucket seed or creation logic
- unresolved project review list

**Acceptance Criteria**

- WBS-backed projects are unique and deterministic
- internal work records resolve to canonical internal buckets
- `[tbd]` rows do not auto-create final projects

**Dependencies**

- `DISPO-20`
- `DISPO-21`
- `DISPO-22`

**Suggested Owner**

- Worker C or E

**Estimated Effort**

- 1 day

### `DISPO-31` Vacation And Public Holiday Import

**Goal**

Normalize workbook absences and geography-driven holidays into the vacation planner.

**Scope**

- map `AB` rows to vacations
- map public holidays to approved `PUBLIC_HOLIDAY` vacations
- skip weekends as persisted vacation rows
- reconcile workbook holiday markers with generated holidays

**Deliverables**

- staged vacation importer
- holiday generation/commit integration
- tests covering holiday and absence cases

**Acceptance Criteria**

- absences appear as vacation rows
- public holidays are created through the vacation model
- weekends are not persisted as vacations
- duplicate holiday rows are prevented

**Dependencies**

- `DISPO-20`
- `DISPO-21`

**Suggested Owner**

- Worker E

**Estimated Effort**

- 1 day

### `DISPO-32` Part-Time Availability Overlay

**Goal**

Apply part-time logic to resource availability without creating fake bookings.

**Scope**

- parse staged part-time markers
- map percentage to available hours
- apply weekday reductions where explicit
- preserve unresolved patterns for manual review when not explicit

**Deliverables**

- availability overlay service
- unresolved availability pattern review states
- tests for 50%, 75%, 80%, and 100% examples

**Acceptance Criteria**

- 50% maps to 4 hours on a standard day
- 100% maps to 8 hours on a standard day
- explicit non-working weekdays reduce availability to zero on those days
- unresolved part-time patterns do not silently invent weekday schedules

**Dependencies**

- `DISPO-20`
- `DISPO-22`

**Suggested Owner**

- Worker D

**Estimated Effort**

- 1 day

### `DISPO-40` Commit Pipeline

**Goal**

Commit approved staged data into final Planarchy entities.

**Scope**

- create reference entities if missing
- create/update resources and resource roles
- create projects and internal buckets
- create assignments
- create vacations
- apply availability updates
- preserve staging-to-final traceability

**Deliverables**

- commit orchestration service
- commit transaction boundaries
- failure and rollback handling

**Acceptance Criteria**

- only approved/resolved staged rows are committed
- unassigned rows do not create assignments
- unresolved `[tbd]` rows block final project commit
- assignment roles are committed separately from resource chapters
- commit can be replayed safely for a batch

**Dependencies**

- `DISPO-30`
- `DISPO-31`
- `DISPO-32`

**Suggested Owner**

- Worker E

**Estimated Effort**

- 1.5 to 2 days

### `DISPO-41` Review UI Or Operator Workflow For Unresolved Rows

**Goal**

Provide a practical path for resolving staged conflicts and `[tbd]` rows.

**Scope**

- unresolved staged row listing
- filters by type: person, project, part-time pattern, token parse failure
- approve/reject/resolve actions
- batch review workflow or CLI operator tooling

**Deliverables**

- review UI or CLI workflow
- action handlers for staged resolution
- operator documentation

**Acceptance Criteria**

- reviewers can find all unresolved rows by batch
- `[tbd]` rows can be explicitly resolved before commit
- identity conflicts and part-time ambiguities can be reviewed without DB edits

**Dependencies**

- `DISPO-10`
- `DISPO-30`
- `DISPO-32`

**Suggested Owner**

- Worker A or frontend-focused worker

**Estimated Effort**

- 1 to 1.5 days

### `DISPO-42` Reconciliation And Acceptance Report

**Goal**

Validate committed data against the chargeability workbook and expected planning totals.

**Scope**

- resource count reconciliation
- FTE reconciliation
- management-group target reconciliation
- project/client/WBS consistency checks
- public-holiday/vacation visibility checks
- free-capacity vs assignment integrity checks

**Deliverables**

- reconciliation command/report
- machine-readable summary output
- human-readable discrepancy report

**Acceptance Criteria**

- system can produce a batch-level pass/fail report
- discrepancies identify the exact source rows or final entities involved
- report is repeatable for reimports

**Dependencies**

- `DISPO-40`

**Suggested Owner**

- Worker E

**Estimated Effort**

- 1 day

## Suggested Execution Rounds

### Round 1

- `DISPO-00`

### Round 2

- `DISPO-10`
- `DISPO-11`
- `DISPO-12`

### Round 3

- `DISPO-20`
- `DISPO-21`
- `DISPO-22`

### Round 4

- `DISPO-30`
- `DISPO-31`
- `DISPO-32`

### Round 5

- `DISPO-40`
- `DISPO-41`

### Round 6

- `DISPO-42`

## Critical Path

The likely critical path is:

1. `DISPO-00`
2. `DISPO-10`
3. `DISPO-22`
4. `DISPO-30`
5. `DISPO-40`
6. `DISPO-42`

If speed matters most, staff this path first.

## Suggested Definition Of Done

The Dispo import implementation is complete when:

- the database can be reset and bootstrapped safely
- the three source workbooks can be staged deterministically
- unresolved rows are surfaced for review
- approved staged rows can be committed into normalized planning data
- public holidays and absences appear correctly in the vacation planner
- part-time availability affects availability instead of creating fake bookings
- project bookings carry assignment roles
- unassigned time remains free capacity only
- reconciliation passes against the source workbooks within agreed tolerance
