Skip to content

PRD: the P3 and P4 phase exits (probe fix, baseline, phase-complete logs) - #52

Merged
compgeniuses merged 2 commits into
consolidationfrom
prd/phase-exit-p3-p4
Oct 25, 2026
Merged

compgeniuses merged 2 commits into
consolidationfrom
prd/phase-exit-p3-p4

Conversation

@compgeniuses

Copy link
Copy Markdown
Contributor

The P3 and P4 phase exits.

What this changes

  • scripts/audit/school-ops-probe.mjs — the probe drove two screens that had since been redesigned, so a quiet-machine phase gate failed: C11 looked for "Record payment" on the payments hub's default tab (it lives on the student-payments tab), and C12 looked for an "Assessment" picker that marks entry no longer has (it picks a period, then a teaching group). The probe now drives the real flows; it was not relaxed.
  • scripts/prd/gate-baseline.json — the probe floor goes from 0 to 14 of 16 (not 15: C13, the attendance roll-call, flaked once in four runs). failedFiles and typecheck are deliberately not tightened: the baseline is calibrated to the Linux CI runner, and the two files that fail in a full local Windows run differ from the four CI knows about.
  • P4-phase-complete-2026-10-25.md and an addendum to the P3 log.

Evidence

The final gate.mjs phase --probe on a quiet machine: GATE PASSED, 11 checks, 0 failed — typecheck 2306/2500, full suite 2 failed files against a baseline of 4 (6,203 tests), production build, probe 15 PASS + 1 SKIP.

Not claimed

P4 exit criterion 2 (installers verified on Windows, Ubuntu and Raspberry Pi) is only partly met: the Pi was a dry run. GP-8 is not in CI's Playwright job. RBAC does not cover /api/sync, /api/sequences, /api/health. No screen uses the hub yet. All are listed in the P4 log.

…try [P3]

The school-ops probe drove two screens that have since been redesigned. Recording a student payment now lives on the student-payments tab of the payments hub, so C11 timed out looking for the button on the default tab. Marks entry now picks a period and then a teaching group; there is no assessment picker, so C12 failed on a control that no longer exists. The probe now drives the real flows: C11 passes (RCT-000001, KES 500.00), and C12 skips, as it does for any fresh school with nothing to mark.
The quiet-machine phase gate passed (11 checks, 0 failed; probe 15 PASS and 1 SKIP) once the probe drove the redesigned payments and marks-entry screens. The probe floor goes from 0 to 14 of 16, leaving room for the one check that flaked. P4 exit criterion 2 is recorded as only partly met: the Raspberry Pi installer was a dry run.
@compgeniuses
compgeniuses merged commit 0f79749 into consolidation Oct 25, 2026
4 checks passed
compgeniuses added a commit that referenced this pull request Oct 27, 2026
… format, KE payroll pack, NG and UG packs (#53)

* chore(prd): record P5-W1 as done and open P5-W2 in the ledger, progress, wave map and handoff [P5-W2]

The ledger still showed P5-A01 and P5-A02 as todo although #47 and #50 merged them. They are done, with their
commits. P5-W2's four tasks are in progress on their own branches and worktrees. The wave map had gone stale
(it listed P4-W3 as in flight and P3 as owed a gate re-run); it now lists #49 to #52 as merged, P3 and P4 as
complete, and what P5-W2 has in flight. The handoff opens with where the work stands and how to resume it.

* chore(prd): record P5-A03 verified, P5-B01, B02 and C01 in review [P5-W2]

* feat(calendar): the Ethiopian calendar behind a calendar abstraction, in the date fields [P5-A03]

A calendar system converts to and from a Gregorian local day, names its months in a locale and steps through them:
the Gregorian calendar, unchanged, and the Ethiopian one (twelve months of 30 days and Pagume of 5 or 6), converted
through the Julian day number. Every day from 1900 to 2100 round-trips, every Ethiopian date of 1893 to 2092
round-trips, and every day from 1990 to 2060 matches the platform's ICU Ethiopic calendar.

DatePicker and DateField take a calendar, defaulting to the locale's own (Ethiopian for an ET locale), and show, type
and step through it while the value stays a Gregorian day. PageUp and PageDown on the Gregorian grid now stop at
the end of a shorter month instead of overflowing into the month after.

Requirements: FR-24
Gate: task PASS - tsc 2306/2500, missingNames 0/0, contracts 0, related tests 488 passed (34 files), eslint clean, secrets and dependencies clean

* feat(i18n): Kiswahili for the core flows and the Kenyan packs, with a completeness check [P5-B01]

Adds src/i18n/completeness.ts (missing, extra, empty, untranslated and placeholder checks against English), the
check-locales script wired into i18n:check, and a vitest suite over the real catalogue. Translates the common and
navigation namespaces to sw (draft, no native review), drops 21 stale navigation keys English no longer has, completes
the ke-844 sw pack locale, and records the term choices in docs/i18n/glossary.md.

Requirements: FR-24
Gate: task PASS - 8 checks, 0 failed; typecheck 2306/2500; related tests 24 passed

* feat(i18n): French for the core flows [P5-B02]

Adds fr to the locales the completeness check requires, translates the common and navigation namespaces to fr
(draft, no native review), repairs the mojibake and unaccented strings in fr navigation, drops 18 stale navigation
keys English no longer has, splits the English-identical allowlist into shared and per-locale lists so one locale
cannot hide an untranslated string behind another's cognates, and adds the French column to the glossary.

Requirements: FR-24
Gate: task PASS - 8 checks, 0 failed; typecheck 2306/2500; related tests 24 passed

* chore(prd): record P5-A03, B01 and B02 as done on the wave branch [P5-W2]

* feat(i18n): Portuguese and Arabic for the core flows [P5-B03]

Adds pt and ar to the supported locales and the locales the completeness check requires, registers both in the
language switcher (Português, the Arabic name in Arabic script; ar is right to left), and translates the common
and navigation namespaces to both (drafts, no native review). Allowlists the Portuguese "Portal", extends the
registry and RTL tests, and adds the Portuguese and Arabic columns to the glossary.

Requirements: FR-24
Gate: task PASS - 8 checks, 0 failed; typecheck 2306/2500; related tests 101 passed

* chore(prd): record P5-B03 done, P5-D01 in progress [P5-W2]

* feat(country): country pack format and the KE country pack [P5-C01]

Adds packs/country/schema.json (JSON Schema 2020-12) and the KE pack: identifier
schemes with validation, the 47 counties, public holidays with the Sunday rule and
statutory returns without rates, each datum marked verified or draft with its source.
src/domain/country loads the packs and serves schemes, validation, holidays and the
address hierarchy. The admission form's identifier lists and value validation, the KE
address schema and the county select of both application forms now come from the pack.

Requirements: FR-25
Gate: task PASS - typecheck 2306/2500, related tests 612 passed in 60 files, 8 test files changed, lint clean

* fix(packs): the KE pack cites Cap. 110 and the KRA housing-levy notice at addresses that resolve [P5-C01]

The independent verifier found both cited URLs dead (404 and a TLS failure); these are the working addresses of the same documents.

* chore(prd): record P5-C01 done; every P5-W2 task is integrated [P5-W2]

* docs(prd): the P5-W2 wave log [P5-W2]

* chore(prd): P5-D01 in review, P5-C02 and C03 in progress [P5-W3]

* docs(prd): handoff at the session-limit pause, with each stopped agent and how to resume it [P5-W3]

* feat(payroll): add the payroll pack interface and the Kenya payroll pack [P5-D01]

Payroll is an interface: src/domain/payroll loads a country payroll pack and
computes payslips and statutory return rows from it over the Money type, with
every rate, band and limit read from effective-dated pack data (no numeric
statutory literal exists in the code, a test enforces it). packs/payroll holds
the JSON Schema and the Kenya pack: PAYE bands and reliefs, NSSF years 1-4, SHIF,
the Affordable Housing Levy and the NITA levy, each entry with its fetched
official source; figures no official source confirmed stay verification: draft
and are listed in packs/payroll/ke/README.md, which says a payroll accountant
must confirm the pack before anyone is paid from it.

Requirements: FR-25
Gate: task PASS - 8 checks, 0 failed; typecheck 2306/2500, 72 related tests

* fix(payroll): the December 2024 PAYE entry is draft: it rests on a reading of KRA's notice that no source states [P5-D01]

The independent verifier found the entry marked verified while its NSSF-shares-the-pension-cap reading is an assumption. It is now draft and listed in the README; no figure changed.

* chore(prd): record P5-D01 done, P5-C03 in review [P5-W3]

* test(forms): the minDate DatePicker test no longer depends on today's date

It built a past day from a button's day number in the current month and skipped the assertion when none matched; with minDate in the future the picker opens on minDate's month, so the test failed from 2026-10-27 on consolidation too (it blocked every gate that selects it as a related test). It now uses fixed days, reads each button's data-date, asserts the day before minDate is disabled and minDate's own day is not, and fails when the picker ignores minDate. [P5-W2]

* feat(packs): Nigeria curriculum and country packs [P5-C03]

Adds ng-ube (Primary 1 to JSS 3, revised 9-year BEC subject lists) and ng-sss
(SS 1 to SS 3): two continuous assessments plus an exam, the WAEC-style A1 to
F9 scale, credit counts, class position and a terminal report with the
affective and psychomotor domains. Adds the NG country pack (NIN, states,
Public Holidays Act days, PAYE, pension and NSITF dates, no rates). The NG
address entry now comes from the pack. Unconfirmed rules stay draft.

Requirements: P5-C03
Gate: task PASS - tsc 2306/2500, missingNames 0/0, contracts all 0/0, related tests 615 passed (57 files), 2 test files, eslint clean

* chore(prd): record P5-C03 done [P5-W3]

* chore(prd): P5-C04 and C05 in progress [P5-W3]

* chore(prd): P5-C02 in review, P5-C06 in progress [P5-W3]

* feat(packs): uganda curriculum and country packs [P5-C02]

Adds ug-ple (P1-P7, PLE grades D1-F9 and divisions I-IV/U), ug-lsc (S1-S4
competency-based, UCE) and ug-uace (S5-S6, principal points and subsidiaries),
plus the UG country pack (identifiers, holidays, PAYE/NSSF returns). The UG
address entry now comes from the country pack.
Everything not confirmed from a fetched UNEB/NCDC/URA source stays draft and is
listed in each README: UNEB's live site was unreachable, so division ranges,
percent boundaries, UACE points and the Public Holidays Act text are unconfirmed.

Requirements: P5-C02
Gate: task PASS - 8/8 checks, typecheck 2306/2500, related tests 597 passed (57 files)

* chore(prd): record P5-C02 done [P5-W3]

* chore(prd): P5-C04 in review [P5-W3]

* feat(packs): Tanzania and Rwanda curriculum and country packs [P5-C04]

Adds tz-national (Standard I to VII, Form I to IV: PSLE paper grades, CSEE
grades, points and divisions over the seven core subjects) and rw-cbc (P1 to
P6, S1 to S3: the NESA seven-point scale and the PLE and O-level aggregates),
with the TZ and RW country packs (NIDA numbers, regions and provinces, public
holidays, PAYE, SDL and RSSB dates, no rates). The TZ and RW address entries
now come from the packs. Unconfirmed rules stay draft and are listed.

Requirements: P5-C04
Gate: pending

* chore(prd): record P5-C04 done, P5-C05 in review [P5-W3]

* ci: run the browser golden paths on Ubuntu 24.04, where Playwright 1.55 has a browser build

ubuntu-latest now gives 26.04 on the runners and 'playwright install --with-deps chromium' fails there with 'Playwright does not support chromium on ubuntu26.04-x64', failing PR #53's e2e job before any test runs. The other jobs keep ubuntu-latest. Revert when Playwright supports the newer image.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant