Prepared for Adem ยท 14 September 2026

CDA dirty-change recovery and continuation roadmap

Recover the unfinished work, establish a tested OMP baseline, and complete the retained programme workflows. The roadmap below records what has started and what still needs a current product decision.

What moved forward

The first preparation work is complete. All ten repositories have recovery bundles. Their changed and nonignored untracked files restore with matching hashes and Git status. The original repositories remain intact.

An isolated OMP branch now contains the repaired academic-result existence check. Four focused runtime checks pass with dependency test doubles. The same checks fail against the original helper. Native Jest tests are ready, but the application dependencies, full build, and database suite have not been run.

The report experiment is preserved as text outside the application. The district query remains beside it as evidence. SQL, old cookie settings, and generated graphs remain in the private recovery set.

The next gate

Establish the isolated runtime baseline, run the native tests, and finish change classification. Inventory ignored configuration, uploads, and the system of record before cleanup or migration. Recovery of Git and dirty files does not establish a production-data backup.

Current evidence: CONTINUATION_PROGRESS.md, recovery/LATEST.txt, per-repository manifests, and scripts/verify_academic_result.cjs. Verified for this roadmap on 14 September 2026, Africa/Nairobi.

Repository decisions and evidence

RepositoryVerified snapshotCurrent role

omp-api

1b75249. One modified service and three untracked application artifacts before preservation.

Continuation candidate. Repair work now lives in implementation/omp-api on cda/dirty-change-stabilization.

omp-client

9565dff. Generated audit graph only.

Frontend continuation candidate. Runtime and product parity still need proof.

Latest orphan-database

df7ea1d. Six modified tracked files plus the audit graph.

Preserved reference for geography, uploads, role workflows, and reports.

Earlier orphan-database

0191323. Three modified tracked files plus the audit graph.

Historical evidence. Exclude its insecure cookie override from continuation.

Other six directories

Recovery bundles and restoration verified. Four contain audit graphs; two duplicate directories are clean.

Preserved history. No archive or deletion decision has been made.

Technical review is assigned to Adem for this working plan. Programme, finance, and data owners still need names. Dates for later milestones depend on those assignments and the baseline results; this plan makes no delivery-date commitment.

Milestone 0. Preserve and classify

Owner role: technical lead. Start here. Product questions can be gathered while preservation proceeds.

Gate 0

The recovery set can reconstruct all three dirty trees. Every application change and untracked artifact has a recorded destination. No original change is silently discarded. Runtime work uses isolated copies, with the originals preserved.

Milestone 1. Resolve the changes in reviewable pieces

Work itemProposed treatmentProof required

D1. Academic-result existence helper

Repaired in the isolated OMP copy. The helper awaits findOne and throws NotFoundException when no record exists. No callers of this newly added helper were found in the original source.

Four focused runtime checks pass for present, missing, rejected, and delayed results. Equivalent native Jest tests are added but await dependency setup. Full application validation remains open.

D2. Reporting experiment

Preserved as experiments/reporting/legacy-count-report.ts.txt outside application discovery. The district query is retained beside it. Replace the experiment only after its report contract is accepted.

The isolated application contains no copy of the experiment. A future implementation must await all operations, assert fixture totals, and propagate failures.

D3. District query and SQL session

Retain the GraphQL query only with its intended report or a labelled example. Inspect the SQL privately for useful queries, credentials, data, and mutations before moving anything into maintained code.

The SQL file has a documented disposition and has not been executed against an unknown database. Approved examples contain synthetic data and belong to a defined report contract.

D4. Geography registration

Port useful behaviour into OMP after comparing current forms and API rules. The legacy edits change region/zone/district selection, refresh options after creation, and make the village district required.

Switching parent selections clears stale descendants. Cancelling and reopening works. Duplicate names cannot select the wrong ID. The API rejects invalid parent-child relationships.

D5. Geography reassignment and project dates

Decide the rule before implementation. The GraphQL diff deprecates district reassignment arguments; a deprecation label does not enforce a restriction. The UI also removes project start-date limits.

Direct API calls enforce the agreed reassignment policy. Programme reviewers accept historical and future project-date cases.

D6. Upload filenames

Replace the legacy filename helper with a reviewed storage rule in OMP if needed. The dirty helper replaces characters and truncates names; preserve original display names separately.

Long names, Unicode, duplicate names, extension preservation, and invalid uploads have defined outcomes. Stored attachment references remain valid.

D7. Local ports and formatting

Keep local port choices in environment configuration. Exclude whitespace and formatting-only hunks from functional patches after preservation.

Frontend endpoint, API listener, and allowed development origins agree. The change can be reviewed without unrelated formatting.

D8. Old startup and dependency edits

Preserve as historical evidence. Replace any still-useful startup convention in the maintained OMP deployment. Do not transplant the old Prisma version bump into OMP.

Lockfile and manifest agree in the chosen baseline. Documented startup works in a clean environment.

D9. Old session-cookie changes

Retire the insecure override from future code. The older clone sets httpOnly and secure to false. Keep the original diff only in the recovery archive.

The retained application's production session configuration has the required cookie protections and works behind its actual deployment proxy.

D10. Generated audit directories

Keep useful domain graphs with supporting documentation or exclude them from application tracking through a deliberate repository decision.

No generated audit artifact is mistaken for an unfinished product feature. The originals remain recoverable.

Order the review as D1 to D3, D4 to D7, then D8 to D10. Keep commits separated by behaviour. The legacy fixes are requirements evidence for OMP, not an instruction to merge unrelated repository histories.

Gate 1

All ten items have an accepted disposition. Retained OMP changes pass their focused checks. Deferred experiments have a location and owner. The isolated continuation baseline has no unexplained changes; the preserved originals may remain dirty.

Milestone 2. Prove the baseline and close access gaps

Owner role: technical lead, with programme input on permissions. Depends on Gate 0 and the relevant Milestone 1 decisions.

Gate 2

A new checkout starts from documented steps with synthetic data. Builds and required checks pass, or each nonblocking inherited failure has a written reason and owner. Unauthorized reads and writes fail at the API. No access or session blocker remains for the chosen release scope.

Milestones 3 to 6. Finish the programme workflow

Milestone and dependencyDeliverable and role ownerCompletion gate

3. Case operations and product decisions. After Gate 2.

Programme owner and technical lead agree the retained roles, then finish intake, geography, assignment, education, health, documents, photos, and letters. Resolve validation and duplicate-handling rules.

Representative staff complete intake, correction, reassignment, and an education or field update. Required validations and record permissions pass.

4. Sponsorship and finance. After agreed roles and case rules.

Programme and finance owners define donor selection, plans, transition dates/reasons, expiry, receipts, exchange rates, fee basis, precision, rounding, allocation, approval, and corrections.

One complete registration-to-sponsorship-to-payment cycle reconciles. Tests cover retries, donor mismatch, partial funds, rejected approval, reversals, and invalid transitions.

5. Reports and migration. Contracts start during Milestone 3; acceptance follows stable workflow rules.

Programme, finance, and data owners accept Payment History, Status, and Education contracts. Technical lead implements reports and a repeatable legacy-ID-to-OMP-ID importer.

Report fixtures match the approved layouts and totals. Two migration rehearsals reconcile records, relationships, money, dated history, and attachments. No unexplained difference remains.

6. Pilot, cutover, and archive. After Gate 5 and release checks.

Operational reviewers complete a bounded programme cycle. Technical and data owners rehearse final backup, edit freeze, import, reconciliation, switch, and rollback.

Owners accept pilot results and a tested rollback. Support and backup ownership are assigned. Archive restoration and unique-data checks precede duplicate removal.

Report contracts to settle early

Payment History needs orphan, donor, and project views with the specified currency, fee, and total columns. Status needs a decision between termination-only output and general status history. Education needs location, donor, and project groupings plus an academic-period rule and repeat-count definition. The workbook does not settle filter semantics or permissions.

Start read-only data discovery and report examples alongside baseline work. Confirm whether the authoritative database and document store survive before schema migration or archival decisions. If no usable source survives, replace import work with a documented re-entry and reconciliation plan.

Prefer application-native outputs for the three fixed report families as a proposal for review. Defer exploratory analytics until those contracts pass. Do not interpret the unfinished count experiment as delivery of the required reports.

Legacy capabilities need current decisions

These are proposed dispositions, not approved retirements. Port preserves a business capability in OMP. Replace preserves its purpose through an agreed alternative. Retire removes it from maintained scope while keeping required historical records.

CapabilityProposed dispositionDecision owner and deadline

Donor and Social Worker tasks

Port the required tasks. A staff-assisted replacement is an option if direct access is no longer needed.

Programme owner, before Milestone 3 scope is accepted.

Sponsorship transitions and history

Port with allowed actors, effective dates, and reasons.

Programme and finance owners, before Milestone 4.

Financial records and IGA records/photos

Replace overlapping finance records with the agreed model. Decide port or retire for active IGA work after usage review; retain its history either way.

Programme, finance, and data owners, before finance and migration mapping.

Project and daily activities

Propose port if still required for the operating cycle. Otherwise record an explicit retire decision before excluding them.

Programme owner, before pilot scope.

Account-maintenance approvals

Replace with controlled account recovery and separately governed payment-detail changes.

Programme and technical owners, before Gate 2.

Current/latest condition snapshots

Replace with dated history and an explicit current-record rule.

Programme and data owners, before reports and migration.

Payment, status, and education reports

Port the agreed workbook contracts and required exports.

Programme and finance owners, define during Milestone 3.

Other historical suggestions and custom analytics

Defer pending a current requirement. Decide replace or retire individually when reviewed.

Programme owner, before adding any item to the release backlog.

Trello Done labels, checklist counts, and historical suggestions do not establish present scope. If a decision depends on comment, checklist, or attachment content absent from the dumps, inspect that specific card in the signed-in board before accepting the requirement.

Source traceability and decision limits

SourceRoadmap commitments it supports

ORPHAN_PRODUCT_CHAIN_REPORT.md. Proven lineage, capability parity, and decisions required before implementation resumes.

OMP remains the continuation candidate. Preserve the latest legacy reference. Close authorization gaps, stabilize invariants, decide parity, map IDs and histories, then prove migration and cutover.

TRELLO_BOARD_CONTEXT.md. Role-specific operations and intended end-to-end workflow.

Decide Department Manager, Coordinator, Donor, and Social Worker responsibilities. Test intake, donor selection, pending sponsorship, finance calculations, approval, activation, and assignment as one workflow.

TRELLO_BOARD_CONTEXT.md. Exact report layouts and later reporting board.

Payment History by orphan, donor, and project. Status by donor and project. Education by location, donor, and project. Settle newly sponsored, support history, periods, filters, and repeat-count meaning before implementation.

DIRTY_CHANGE_INVENTORY.md. Earlier snapshot dated 12 September 2026.

D1 through D10 retain their identifiers. Current recovery manifests confirm local repository states. The progress record distinguishes actual repairs from proposed treatments.

Historical Trello dumps and the report workbook, as summarized in TRELLO_BOARD_CONTEXT.md.

Descriptions and layouts are requirements evidence. Badge counts do not reveal comments, checklist text, or attachment contents. The workbook defines empty layouts, not production output.

This run used the supplied reports and fresh local repository evidence. It did not refresh the signed-in Trello board, reopen the workbook, fetch remote branches, or inspect production data. Open relevant live cards when a current product decision needs missing card-level detail. Historical completion is not approval for implementation.