diff --git a/.github/actions/ward-setup/action.yml b/.github/actions/ward-setup/action.yml new file mode 100644 index 0000000000..c916ddb725 --- /dev/null +++ b/.github/actions/ward-setup/action.yml @@ -0,0 +1,36 @@ +# The shared Node setup for the Ward Flow CI jobs that need installed packages +# (.github/workflows/ward-flow.yml). The job checks out the repository first, so this local action exists. +# Contracts: scripts/ward-ci-public/check-contracts.mjs. Every step is unconditional and pinned by commit. +name: Ward Flow setup +description: Select the pinned Node, provision the pinned npm, then restore and attest the locked install. +outputs: + cache-hit: + description: Whether the exact installed-packages key was restored. + value: ${{ steps.node-modules.outputs.cache-hit }} + cache-primary-key: + description: The exact installed-packages key, for the main-only save in the build job. + value: ${{ steps.node-modules.outputs.cache-primary-key }} +runs: + using: composite + steps: + - uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 + with: + node-version-file: .nvmrc + cache: npm + - name: Install and record the pinned npm toolchain + shell: bash + run: npm install --global --ignore-scripts --no-audit --no-fund "$(node -p "require('./package.json').packageManager")" && node --version && npm --version + # Installed packages come from a cache saved on main only (build job), straight after an attested + # install; install-locked-dependencies.mjs reuses an exact hit only when its post-install stamp matches. + - name: Restore installed packages + id: node-modules + uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 + with: + path: node_modules + key: ward-node-modules-${{ runner.os }}-${{ hashFiles('.nvmrc', 'package.json', 'package-lock.json') }} + - name: Install locked dependencies + id: install + shell: bash + env: + WARD_INSTALL_RESTORED: ${{ steps.node-modules.outputs.cache-hit }} + run: node scripts/install-locked-dependencies.mjs diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 084d4692d1..15fb2f180b 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -35,8 +35,9 @@ updates: applies-to: security-updates patterns: ["*"] + # The local composite actions under .github/actions/ hold action pins too. - package-ecosystem: github-actions - directory: / + directories: ["/", "/.github/actions/*"] schedule: interval: weekly day: monday diff --git a/.github/workflows/ward-flow.yml b/.github/workflows/ward-flow.yml index c7ce0b48c1..4658c46957 100644 --- a/.github/workflows/ward-flow.yml +++ b/.github/workflows/ward-flow.yml @@ -326,23 +326,11 @@ jobs: with: persist-credentials: false fetch-depth: 0 - - uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 - with: - node-version-file: .nvmrc - cache: npm - - name: Install and record the pinned npm toolchain - run: npm install --global --ignore-scripts --no-audit --no-fund "$(node -p "require('./package.json').packageManager")" && node --version && npm --version - - name: Restore installed packages - id: node-modules - uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 - with: - path: node_modules - key: ward-node-modules-${{ runner.os }}-${{ hashFiles('.nvmrc', 'package.json', 'package-lock.json') }} - - name: Install locked dependencies + # Node, the pinned npm, the exact installed-packages restore and the attested install + # (.github/actions/ward-setup); the checkout above provides the local action. + - name: Set up Node and install locked dependencies id: install - env: - WARD_INSTALL_RESTORED: ${{ steps.node-modules.outputs.cache-hit }} - run: node scripts/install-locked-dependencies.mjs + uses: ./.github/actions/ward-setup - name: Install locked Ward backend dependencies id: backend-install if: ${{ !cancelled() && steps.install.outcome == 'success' }} @@ -436,23 +424,11 @@ jobs: with: persist-credentials: false fetch-depth: 0 - - uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 - with: - node-version-file: .nvmrc - cache: npm - - name: Install and record the pinned npm toolchain - run: npm install --global --ignore-scripts --no-audit --no-fund "$(node -p "require('./package.json').packageManager")" && node --version && npm --version - - name: Restore installed packages - id: node-modules - uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 - with: - path: node_modules - key: ward-node-modules-${{ runner.os }}-${{ hashFiles('.nvmrc', 'package.json', 'package-lock.json') }} - - name: Install locked dependencies + # Node, the pinned npm, the exact installed-packages restore and the attested install + # (.github/actions/ward-setup); the checkout above provides the local action. + - name: Set up Node and install locked dependencies id: install - env: - WARD_INSTALL_RESTORED: ${{ steps.node-modules.outputs.cache-hit }} - run: node scripts/install-locked-dependencies.mjs + uses: ./.github/actions/ward-setup - name: Select reproducible nightly fuzz window if: ${{ github.event_name == 'schedule' && steps.install.outcome == 'success' }} run: node scripts/ward-flow/engine-fuzz-window.mjs --output "$RUNNER_TEMP/ward-profile/fuzz-window.json" --github-env "$GITHUB_ENV" @@ -534,23 +510,11 @@ jobs: with: persist-credentials: false fetch-depth: 0 - - uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 - with: - node-version-file: .nvmrc - cache: npm - - name: Install and record the pinned npm toolchain - run: npm install --global --ignore-scripts --no-audit --no-fund "$(node -p "require('./package.json').packageManager")" && node --version && npm --version - - name: Restore installed packages - id: node-modules - uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 - with: - path: node_modules - key: ward-node-modules-${{ runner.os }}-${{ hashFiles('.nvmrc', 'package.json', 'package-lock.json') }} - - name: Install locked dependencies + # Node, the pinned npm, the exact installed-packages restore and the attested install + # (.github/actions/ward-setup); the checkout above provides the local action. + - name: Set up Node and install locked dependencies id: install - env: - WARD_INSTALL_RESTORED: ${{ steps.node-modules.outputs.cache-hit }} - run: node scripts/install-locked-dependencies.mjs + uses: ./.github/actions/ward-setup - name: Restore Next build cache id: next-cache if: ${{ !cancelled() && steps.install.outcome == 'success' }} @@ -597,23 +561,11 @@ jobs: with: persist-credentials: false fetch-depth: 0 - - uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 - with: - node-version-file: .nvmrc - cache: npm - - name: Install and record the pinned npm toolchain - run: npm install --global --ignore-scripts --no-audit --no-fund "$(node -p "require('./package.json').packageManager")" && node --version && npm --version - - name: Restore installed packages - id: node-modules - uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 - with: - path: node_modules - key: ward-node-modules-${{ runner.os }}-${{ hashFiles('.nvmrc', 'package.json', 'package-lock.json') }} - - name: Install locked dependencies + # Node, the pinned npm, the exact installed-packages restore and the attested install + # (.github/actions/ward-setup); the checkout above provides the local action. + - name: Set up Node and install locked dependencies id: install - env: - WARD_INSTALL_RESTORED: ${{ steps.node-modules.outputs.cache-hit }} - run: node scripts/install-locked-dependencies.mjs + uses: ./.github/actions/ward-setup - name: Download the verified browser build if: ${{ !cancelled() && needs.browser-build.result == 'success' && steps.install.outcome == 'success' }} uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 @@ -728,23 +680,11 @@ jobs: with: persist-credentials: false fetch-depth: 0 - - uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 - with: - node-version-file: .nvmrc - cache: npm - - name: Install and record the pinned npm toolchain - run: npm install --global --ignore-scripts --no-audit --no-fund "$(node -p "require('./package.json').packageManager")" && node --version && npm --version - - name: Restore installed packages - id: node-modules - uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 - with: - path: node_modules - key: ward-node-modules-${{ runner.os }}-${{ hashFiles('.nvmrc', 'package.json', 'package-lock.json') }} - - name: Install locked dependencies + # Node, the pinned npm, the exact installed-packages restore and the attested install + # (.github/actions/ward-setup); the checkout above provides the local action. + - name: Set up Node and install locked dependencies id: install - env: - WARD_INSTALL_RESTORED: ${{ steps.node-modules.outputs.cache-hit }} - run: node scripts/install-locked-dependencies.mjs + uses: ./.github/actions/ward-setup - name: Download the verified browser build if: ${{ !cancelled() && needs.browser-build.result == 'success' && steps.install.outcome == 'success' }} uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 @@ -914,32 +854,20 @@ jobs: - name: Record the measured main if: ${{ github.event_name == 'pull_request' }} run: echo "::notice title=Ward budget main::$(git rev-parse refs/remotes/origin/main)" - - uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 - with: - node-version-file: .nvmrc - cache: npm - - name: Install and record the pinned npm toolchain - run: npm install --global --ignore-scripts --no-audit --no-fund "$(node -p "require('./package.json').packageManager")" && node --version && npm --version - - name: Restore installed packages - id: node-modules - uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 - with: - path: node_modules - key: ward-node-modules-${{ runner.os }}-${{ hashFiles('.nvmrc', 'package.json', 'package-lock.json') }} - - name: Install locked dependencies + # Node, the pinned npm, the exact installed-packages restore and the attested install + # (.github/actions/ward-setup); the checkout above provides the local action. + - name: Set up Node and install locked dependencies id: install - env: - WARD_INSTALL_RESTORED: ${{ steps.node-modules.outputs.cache-hit }} - run: node scripts/install-locked-dependencies.mjs + uses: ./.github/actions/ward-setup # The clean tree is saved straight after its attested install, from main only, before any step # writes into node_modules; pull requests restore it and install-locked-dependencies.mjs reuses # it only when its post-install stamp still matches the lock and the files. - name: Save installed packages on main - if: ${{ !cancelled() && github.ref == 'refs/heads/main' && github.event_name != 'pull_request' && steps.install.outcome == 'success' && steps.node-modules.outputs.cache-hit != 'true' }} + if: ${{ !cancelled() && github.ref == 'refs/heads/main' && github.event_name != 'pull_request' && steps.install.outcome == 'success' && steps.install.outputs.cache-hit != 'true' }} uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 with: path: node_modules - key: ${{ steps.node-modules.outputs.cache-primary-key }} + key: ${{ steps.install.outputs.cache-primary-key }} - name: Restore Next build cache id: production-cache if: ${{ !cancelled() && steps.install.outcome == 'success' }} @@ -990,23 +918,11 @@ jobs: with: persist-credentials: false fetch-depth: 0 - - uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 - with: - node-version-file: .nvmrc - cache: npm - - name: Install and record the pinned npm toolchain - run: npm install --global --ignore-scripts --no-audit --no-fund "$(node -p "require('./package.json').packageManager")" && node --version && npm --version - - name: Restore installed packages - id: node-modules - uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 - with: - path: node_modules - key: ward-node-modules-${{ runner.os }}-${{ hashFiles('.nvmrc', 'package.json', 'package-lock.json') }} - - name: Install locked dependencies + # Node, the pinned npm, the exact installed-packages restore and the attested install + # (.github/actions/ward-setup); the checkout above provides the local action. + - name: Set up Node and install locked dependencies id: install - env: - WARD_INSTALL_RESTORED: ${{ steps.node-modules.outputs.cache-hit }} - run: node scripts/install-locked-dependencies.mjs + uses: ./.github/actions/ward-setup - name: Download shard coverage blobs if: ${{ !cancelled() && steps.install.outcome == 'success' }} uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 diff --git a/backend/ward-flow/command-schemas.ts b/backend/ward-flow/command-schemas.ts index 35ca807d4a..ba78815231 100644 --- a/backend/ward-flow/command-schemas.ts +++ b/backend/ward-flow/command-schemas.ts @@ -129,6 +129,8 @@ const SCHEMAS: Partial> = { FLAG_RETURN_EARLY: z.looseObject({ admissionId: id, homeHospital: id }), RECORD_MEDICAL_CLEARANCE: z.looseObject({ referralId: id, cleared: z.boolean() }), REQUEST_CAPACITY_REFRESH: z.looseObject({ unitId: id }), + // Staff needed: the shift start the desk chose, when sent. The reducer checks it against now. + REQUEST_WARD_STAFF: z.looseObject({ shiftStartAt: instant.optional() }), // H-0978: one exact bed closed or reopened. The reducer checks the bed and the reason list. SET_BED_CLOSED: z.looseObject({ unitId: id, actingUnitId: id, bedNumber: count, closed: z.boolean() }), CONFIRM_CAPACITY: z.looseObject({ diff --git a/backend/ward-flow/package-lock.json b/backend/ward-flow/package-lock.json index d19f5bdf3d..bd253477e2 100644 --- a/backend/ward-flow/package-lock.json +++ b/backend/ward-flow/package-lock.json @@ -16,7 +16,7 @@ "esbuild": "0.28.2" }, "engines": { - "node": ">=22" + "node": ">=24.22.1 <25" } }, "node_modules/@esbuild/aix-ppc64": { diff --git a/backend/ward-flow/package.json b/backend/ward-flow/package.json index 5cdd3f51dd..56488ad99f 100644 --- a/backend/ward-flow/package.json +++ b/backend/ward-flow/package.json @@ -4,7 +4,7 @@ "private": true, "type": "module", "engines": { - "node": ">=22" + "node": ">=24.22.1 <25" }, "scripts": { "start": "node --env-file-if-exists=.env server.mjs", @@ -13,8 +13,6 @@ "typecheck": "node ../../node_modules/typescript/bin/tsc -p tsconfig.json", "migrate:postgres": "node --env-file-if-exists=.env migrate-postgres.mjs", "migrate:supabase": "node --env-file-if-exists=.env migrate-supabase.mjs", - "prune:postgres": "node --env-file-if-exists=.env prune-receipts.mjs postgres", - "prune:supabase": "node --env-file-if-exists=.env prune-receipts.mjs supabase", "prune:receipts:postgres": "node --env-file-if-exists=.env prune-receipts.mjs postgres", "prune:receipts:supabase": "node --env-file-if-exists=.env prune-receipts.mjs supabase", "prune:receipts:supabase-pruner": "node --env-file-if-exists=.env prune-receipts.mjs supabase-pruner", diff --git a/docs/script-budget-history/2026-11-11-pr1623-repository-review.md b/docs/script-budget-history/2026-11-11-pr1623-repository-review.md new file mode 100644 index 0000000000..4d449f14cf --- /dev/null +++ b/docs/script-budget-history/2026-11-11-pr1623-repository-review.md @@ -0,0 +1,31 @@ +# 11 Nov 2026, Repository review fixes and features (PR #1623) + +Changed on top of `main` at `35c7ccd`: movements `/ward-flow/movements/WF-001` raised 609.8 to 610.3; statistics `/ward-flow/statistics` raised 632.6 to 632.9. Each raise is under 1 KB, within the 5 KB per-screen allowance in HOW-WE-WORK section 6. + +Measured on hosted CI (production build of the PR head `883a3c1`, merged with main): movements 610.0 KB, statistics 632.6 KB, both over their limit after rounding. Main alone could not be measured because this PR updates patch-level dependencies. Each new limit is the measurement plus about 0.3. + +Why it changed: Movements gained Print and spreadsheet Export (D-145 item 3). The CSV download helper moved to the ward root (`ward-csv.ts`) so Legal forms and Movements can share it without importing from the Statistics screen; Statistics now loads it through a thin wrapper. + +Trim tried: the export code only runs on a tap but is small and shares the existing download helper; splitting it into a lazy chunk would add more than it saves. No other safe trim was found. + +Later the same day (merged with main `c21e99a`, which had raised every route): the same two raises applied on top of main's values, so movements is 610.9 + 0.5 = 611.4 and statistics 633.6 + 0.3 = 633.9. Every other route takes main's value. + +Then (PR head `9c7302e`, merged with main `c21e99a`): ED `/ward-flow/ed` raised 536.3 to 536.6. Hosted CI measured 536.3 KB, level with the limit after rounding; main alone could not be measured because of the dependency updates. The growth is most likely the shared helpers from D-145 item 2 (typed-time reader, pull-hold lapse check) that the ED screen loads; this was not measured route by route. Same trim reasoning as above. + +Merged again with main `cc755fa`, which raised every route: the same three raises sit on main's values, so ED is 537.8 + 0.3 = 538.1, movements 612.6 + 0.5 = 613.1 and statistics 635.1 + 0.3 = 635.4. + +Merged again after #1607 and #1628 (main `daacf218e`): main's values taken, plus this PR's deltas, giving ED 538.8, Movements 613.6 and Statistics 636.0. + +Then Home `/ward-flow` raised 580.5 to 581.1: hosted CI measured 580.8 KB on this merge (head `1190d68`), 0.3 KB over main's value. Main alone could not be measured because this PR changes dependencies. The likely source is the same shared helpers plus the new "leave" search entry; this was not measured route by route. Well within the 5 KB allowance. + +Merged again after #1603 (main `30abc7aee`): main's values taken, plus this PR's deltas, giving Home 584.1, ED 540.9, Movements 615.8 and Statistics 638.3. + +Merged again after #1624 and #1629 (main `51a474537`, which raised the ward route to 622.0): main's values taken, plus this PR's deltas, giving Home 584.1, ED 540.9, Movements 615.8 and Statistics 638.3. Main left those four routes unchanged since the last merge, so the totals are the same. + +Merged again after #1608 (main `0e2478133`): main's values taken, plus this PR's deltas, giving Home 586.6, ED 543.1, Movements 618.4 and Statistics 640.6. Then Referrals `/ward-flow/referrals` raised 593.4 to 593.8: hosted CI measured 593.5 KB on this merge (head `54dd212f6`), 0.1 KB over main's value. Main alone could not be measured because this PR changes dependencies. The likely source is the same shared helpers (typed-time reader, pull-hold lapse check) now also loaded by Referrals; this was not measured route by route. Same trim reasoning as above, and well within the 5 KB allowance. + +Merged again after #1606 (main `0b657ad3f`): main's values taken, plus this PR's deltas, giving Home 588.3, Referrals 594.7, ED 543.7, Movements 619.2 and Statistics 640.8. + +Merged again after #1632 (main `02817bbd6`, which raised six routes): main's values taken, plus this PR's deltas, giving Home 588.9, Referrals 594.7, ED 544.2, Movements 619.5 and Statistics 641.3. + +Hosted CI on that merge (head `986e9dfa9`) measured, in KB: Home 589.2, Movements 619.8 and Capacity 666.4, and `main` alone could not be built, so it could not be compared. Builds vary by a few tenths, so these three limits are now the measurement plus 0.5: Home 589.7 (+1.4 over `main`), Movements 620.3 (+1.3) and Capacity 666.9 (+1.0), each within the 5 KB allowance. diff --git a/docs/ward-flow/OPERATIONS-RUNBOOK.md b/docs/ward-flow/OPERATIONS-RUNBOOK.md index 741328e626..6d8c63616c 100644 --- a/docs/ward-flow/OPERATIONS-RUNBOOK.md +++ b/docs/ward-flow/OPERATIONS-RUNBOOK.md @@ -56,11 +56,12 @@ so changing them needs a restart, not a rebuild: stays shut and `/sign-in` says sign-in is not set up. Changing it signs everyone out. - `WARD_DEMO_CODE` (public demo only) is the code `/sign-in` asks for. Josh chose a demo code over the open demo of 28 September 2026 ([D-88](decisions.md)). Share it only with people meant to - see the demo. + see the demo. It must be at least 12 characters, not counting spaces and dashes; a shorter code + counts as no code and the demo stays shut (D-145). With it on, a page without a pass goes to `/sign-in` and an API call gets 401. On the signed-in site the pass lasts until the 12-hour sign-in limit and ends at sign-out. A demo code pass lasts 8 -hours. `/api/health`, the offline page and the alert worker stay open. To switch it off, set +hours, and ends at once when `WARD_DEMO_CODE` changes. `/api/health`, the offline page and the alert worker stay open. To switch it off, set `WARD_FRONT_DOOR=off` and restart. Code: `src/lib/front-door-pass.ts`, `src/proxy.ts`, `src/app/api/session/route.ts`. @@ -106,7 +107,7 @@ Weekly, or before a demonstration. All read-only. 5. **Receipts.** Command receipts older than 7 days are pruned every Monday at 03:00 Perth by `.github/workflows/prune-receipts.yml`. Until the owner adds the repository secret `WARD_SUPABASE_PRUNE_DATABASE_URL`, the weekly run fails on purpose; check it succeeded. To prune by hand, run - `npm --prefix backend/ward-flow run prune:supabase`. It needs the private administrator + `npm --prefix backend/ward-flow run prune:receipts:supabase`. It needs the private administrator environment, so it is a live change. The audit history is never pruned. 6. **Quiet periods.** Two things stop by themselves when nobody is working on Ward Flow: - GitHub turns off every scheduled workflow after 60 days without repository activity: diff --git a/docs/ward-flow/OWNER-RULINGS.md b/docs/ward-flow/OWNER-RULINGS.md index 48eb3ec0c6..b049f3bbb5 100644 --- a/docs/ward-flow/OWNER-RULINGS.md +++ b/docs/ward-flow/OWNER-RULINGS.md @@ -9,7 +9,7 @@ Scanned `docs/ward-flow/decisions.md`, `docs/ward-flow/owner-*.md` and `docs/his One file matches `*owner*` but not `owner-*` and is deliberately excluded: `how-to-write-to-the-owner.md` — it is instructions for writing TO the owner, not a record of what he ruled. -**711 rulings/items extracted, across 43 of 44 files.** +**712 rulings/items extracted, across 43 of 44 files.** **0 file(s) UNPARSED** — no recognised ruling structure found; listed, not dropped. See below. **1 file(s) recorded as holding no ruling of their own**, each with its reason. See below. @@ -32,7 +32,7 @@ line, in the order discovered — confirm which instance you mean before citing --- -## ID index — 461 distinct IDs +## ID index — 462 distinct IDs So an ID like `D-9` or `O-17.1` can be looked up directly, without knowing which file it lives in. Bare numbered rulings (files that number "1., 2., 3. …" with no owner-issued letter code) are @@ -72,254 +72,255 @@ safe global key across 30 files. | `D-1` ⚠️ **3 occurrences in 3 files — not unique** | | | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-12-four-answers.md`:16 | D-1 · Legal forms: split the list in two | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-1x.md`:85 | D-1 — 🔴 The screen is called **Patient**, not "Patient Now" | -| ↳ | `decisions.md`:178 | D-1. Ward Flow is local only, with no linked repository (Replaced by D-27) | +| ↳ | `decisions.md`:179 | D-1. Ward Flow is local only, with no linked repository (Replaced by D-27) | | `D-2` ⚠️ **3 occurrences in 3 files — not unique** | | | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-12-four-answers.md`:57 | D-2 · Raise the three unbindable table thresholds | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-1x.md`:108 | D-2 — 🔴 Communication: BUILD IT. The system must be able to tell someone something. | -| ↳ | `decisions.md`:188 | D-2. Railway is disconnected | +| ↳ | `decisions.md`:189 | D-2. Railway is disconnected | | `D-3` ⚠️ **2 occurrences in 2 files — not unique** | | | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-1x.md`:215 | D-3 — 🔴 The 12px floor is ADOPTED. Screen by screen, not as a sweep. | -| ↳ | `decisions.md`:199 | D-3. The PsychSift and Database code is being retired from Ward Flow | +| ↳ | `decisions.md`:200 | D-3. The PsychSift and Database code is being retired from Ward Flow | | `D-3b` | `../history/archive/dated-notes/owner-decisions-2026-09-12-four-answers.md`:77 | D-3b · The data-conditional absence sweep is DEFERRED | | `D-4` ⚠️ **4 occurrences in 3 files — not unique** | | | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-12-four-answers.md`:97 | D-4 · The deliberate sub-12px exception stands if its reasoning is sound | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-1x.md`:263 | D-4 · WARD LEAD RULING, not the owner's — the Access record's false assurance | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-1x.md`:390 | D-4 ADDENDUM, 2026-09-11 — 🔴 the OTHER half of that sentence, found by Lane C after the fix | -| ↳ | `decisions.md`:207 | D-4. Synthetic patients only | +| ↳ | `decisions.md`:208 | D-4. Synthetic patients only | | `D-5` ⚠️ **4 occurrences in 3 files — not unique** | | | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-12-routing-and-nine-flags.md`:15 | D-5 · 🔴 A NEW STANDING RULE: PROTECTED-WORK DELETIONS COME TO WARD VERIFIER FIRST | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-1x.md`:340 | D-5 · WARD LEAD RULING, not the owner's — gender reaches BOTH bed gates or neither | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-1x.md`:431 | D-5 MEASUREMENT, 2026-09-11 — the wiring task handed back, and the arithmetic is starker than I expected | -| ↳ | `decisions.md`:215 | D-5. Parallel threads in separate worktrees, folded one at a time | +| ↳ | `decisions.md`:216 | D-5. Parallel threads in separate worktrees, folded one at a time | | `D-6` ⚠️ **3 occurrences in 3 files — not unique** | | | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-12-routing-and-nine-flags.md`:52 | D-6 · 🟢 THE `--t-0` COLLISION — amend the brief in the same change | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-1x.md`:472 | D-6 · WARD LEAD RULING — "Not recorded" and "Not yet recorded" are BOTH used, deliberately | -| ↳ | `decisions.md`:226 | D-6. Aboriginal cultural safety review deferred | +| ↳ | `decisions.md`:227 | D-6. Aboriginal cultural safety review deferred | | `D-7` ⚠️ **3 occurrences in 3 files — not unique** | | | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-12-routing-and-nine-flags.md`:72 | D-7 · 🟢 THE REMAINING SEVEN ARE FLAGGED TO WARD LEAD | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-1x.md`:499 | D-7 · WARD LEAD RULING — the Patient screen SHOWS gender, and the addition is logged as an addition | -| ↳ | `decisions.md`:234 | D-7. The first four milestones, in this order | +| ↳ | `decisions.md`:235 | D-7. The first four milestones, in this order | | `D-8` ⚠️ **3 occurrences in 3 files — not unique** | | | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-12-fold-and-authorisation.md`:9 | D-8 · 🔴 "FOLD INTO MAIN" ALWAYS MEANS THE LOCAL WARD FLOW LINE | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-1x.md`:545 | D-8 · WARD LEAD RULING — the announced marker says "invented NAMES", never "invented people" | -| ↳ | `decisions.md`:246 | D-8. Josh's standing rulings, numbered R1 to R16, for every session and tool | +| ↳ | `decisions.md`:247 | D-8. Josh's standing rulings, numbered R1 to R16, for every session and tool | | `D-9` ⚠️ **3 occurrences in 3 files — not unique** | | | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-12-fold-and-authorisation.md`:51 | D-9 · 🟢 THE MENTAL HEALTH ACT AUTHORISATION GATE IS OVERRIDABLE — with the owner's clinical reason | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-1x.md`:589 | D-9 · WARD LEAD RULING — the referral board's table MAY scroll sideways; the missing thing is the affordance | -| ↳ | `decisions.md`:278 | D-9. Josh's rulings of 25 September, 11:43 to 12:00 (R17 to R21) | +| ↳ | `decisions.md`:279 | D-9. Josh's rulings of 25 September, 11:43 to 12:00 (R17 to R21) | | `D-10` ⚠️ **3 occurrences in 3 files — not unique** | | | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-12-fold-and-authorisation.md`:91 | D-10 · ⏸️ THE SMALL-TEXT RAISE IS DEFERRED — with the triggers written down, because a deferral without one is a drop | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-1x.md`:618 | D-10 · WARD LEAD RULING — the overflow affordance is a SENTENCE first and a measured border second, not the standard's shade | -| ↳ | `decisions.md`:292 | D-10. Gate build type check (R22) | +| ↳ | `decisions.md`:293 | D-10. Gate build type check (R22) | | `D-11` ⚠️ **3 occurrences in 3 files — not unique** | | | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-12-fold-and-authorisation.md`:129 | D-11 · 🔴 TWO LEDGERS IS CORRECT AND INTENDED — WARD FLOW TASKS GO ON THE WARD FLOW LEDGER, AND THE MAIN PROJECT'S IS DISREGARDED FOR THIS PROJECT | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-1x.md`:685 | D-11 · A-1 — the half-written referral history WARNS, and is never stored | -| ↳ | `decisions.md`:301 | D-11. Rulings of 25 September, 12:41 (R23 to R25) | +| ↳ | `decisions.md`:302 | D-11. Rulings of 25 September, 12:41 (R23 to R25) | | `D-12` ⚠️ **2 occurrences in 2 files — not unique** | | | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-1x.md`:704 | D-12 · A-2 — the referrer is the RECORDED SOURCE, and a person only if the record carries one | -| ↳ | `decisions.md`:317 | D-12. Rulings of 25 September, 12:43 (R26 to R31) | +| ↳ | `decisions.md`:318 | D-12. Rulings of 25 September, 12:43 (R26 to R31) | | `D-13` ⚠️ **2 occurrences in 2 files — not unique** | | | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-1x.md`:720 | D-13 · A-3 and A-4 — both resolve FOR THE CODE; the drawings change | -| ↳ | `decisions.md`:336 | D-13. Tooling tests in batch gates (R32) | +| ↳ | `decisions.md`:337 | D-13. Tooling tests in batch gates (R32) | | `D-14` ⚠️ **2 occurrences in 2 files — not unique** | | | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-1x.md`:739 | D-14 · A-6 and A-8 — ADD THE LINK, AND MAKE THE GUARD ENFORCE IN THE SAME CHANGE. Never one without the other. | -| ↳ | `decisions.md`:346 | D-14. Standing defaults: decide small things without asking | +| ↳ | `decisions.md`:347 | D-14. Standing defaults: decide small things without asking | | `D-15` ⚠️ **2 occurrences in 2 files — not unique** | | | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-1x.md`:778 | D-15 · A-7 — the figure NAMES ITS OWN CLOCK, or it does not ship | -| ↳ | `decisions.md`:358 | D-15. Rulings of 25 September, 13:26 (R33 to R35) | +| ↳ | `decisions.md`:359 | D-15. Rulings of 25 September, 13:26 (R33 to R35) | | `D-16` ⚠️ **2 occurrences in 2 files — not unique** | | | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-1x.md`:799 | D-16 · WARD LEAD RULING — the unwired primary actions use §8.6's EXISTING sentence; nothing new is invented | -| ↳ | `decisions.md`:371 | D-16. Legal overrides and form receipts, 25 September 13:51 UTC | +| ↳ | `decisions.md`:372 | D-16. Legal overrides and form receipts, 25 September 13:51 UTC | | `D-17` ⚠️ **2 occurrences in 2 files — not unique** | | | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-1x.md`:843 | D-17 · WARD LEAD RULING — A-8: FD-23 wins. The Patient screen never shows where else a patient has been. | -| ↳ | `decisions.md`:384 | D-17. Morning roll-up time is Josh's own default (25 September) | +| ↳ | `decisions.md`:385 | D-17. Morning roll-up time is Josh's own default (25 September) | | `D-18` ⚠️ **2 occurrences in 2 files — not unique** | | | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-1x.md`:878 | D-18 · WARD LEAD RULING — the referral query contract carries MODEL values; and `gp` is a question for the owner, not a mapping for me | -| ↳ | `decisions.md`:395 | D-18. The privacy lock stops saving only for typed text (25 September) | +| ↳ | `decisions.md`:396 | D-18. The privacy lock stops saving only for typed text (25 September) | | `D-19` ⚠️ **2 occurrences in 2 files — not unique** | | | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-1x.md`:922 | D-19 · WARD LEAD RULING — "something is already open for this person" is PERMITTED; "where" never is | -| ↳ | `decisions.md`:406 | D-19. Rulings of 25 September, evening (walkthrough, leave beds, PsychSift, gender display) | +| ↳ | `decisions.md`:407 | D-19. Rulings of 25 September, evening (walkthrough, leave beds, PsychSift, gender display) | | `D-20` ⚠️ **3 occurrences in 2 files — not unique** | | | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-1x.md`:967 | D-20 · WARD LEAD RULING — the drawing wins; the vocabulary anchor was never the heading | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-1x.md`:1010 | D-20-REVISED · the drawing renames BOTH, so neither side is taken whole | -| ↳ | `decisions.md`:436 | D-20. One high-contrast colour check retired (26 September) | +| ↳ | `decisions.md`:437 | D-20. One high-contrast colour check retired (26 September) | | `D-21` ⚠️ **2 occurrences in 2 files — not unique** | | | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-1x.md`:1058 | D-21 · WARD LEAD RULING — tasks 10 and 12 are CLOSED, not deferred, and not built as callerless modules | -| ↳ | `decisions.md`:449 | D-21. Coordinator bed board: all nine recommended answers (26 September) | +| ↳ | `decisions.md`:450 | D-21. Coordinator bed board: all nine recommended answers (26 September) | | `D-22` ⚠️ **2 occurrences in 2 files — not unique** | | | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-1x.md`:1084 | D-22 · SHAPE 2 — the landmark label and the heading stop being two strings | -| ↳ | `decisions.md`:461 | D-22. No legal limits in hour rules; the rest are labelled defaults (26 September) | +| ↳ | `decisions.md`:462 | D-22. No legal limits in hour rules; the rest are labelled defaults (26 September) | | `D-23` ⚠️ **2 occurrences in 2 files — not unique** | | | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-1x.md`:1121 | D-23 · The bed board passes an empty leave-bed list into three capacity figures, and says nothing | -| ↳ | `decisions.md`:477 | D-23. Leave-bed fields kept; patient search stops matching by ward (26 September) | +| ↳ | `decisions.md`:478 | D-23. Leave-bed fields kept; patient search stops matching by ward (26 September) | | `D-24` ⚠️ **2 occurrences in 2 files — not unique** | | | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-1x.md`:1142 | D-24 · The raw `1.2` line-height — token it, and accept that community no longer matches | -| ↳ | `decisions.md`:491 | D-24. Hour-rules morning list: all A (26 September) | +| ↳ | `decisions.md`:492 | D-24. Hour-rules morning list: all A (26 September) | | `D-25` ⚠️ **2 occurrences in 2 files — not unique** | | | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-1x.md`:1161 | D-25 · Command's `deadlineLine` sentence is not built — and this DEFERS the R-5 question rather than answering it | -| ↳ | `decisions.md`:515 | D-25. The lone-patient check counts free beds on both matching paths (26 September) | +| ↳ | `decisions.md`:516 | D-25. The lone-patient check counts free beds on both matching paths (26 September) | | `D-26` ⚠️ **2 occurrences in 2 files — not unique** | | | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-1x.md`:1184 | D-26 · `edPressure` becomes a projection of `edHomeSummaries` — the two screens stop being able to disagree | -| ↳ | `decisions.md`:523 | D-26. Select fold checks by changed risk (27 September) | +| ↳ | `decisions.md`:524 | D-26. Select fold checks by changed risk (27 September) | | `D-27` ⚠️ **2 occurrences in 2 files — not unique** | | | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-1x.md`:1213 | D-27 · The word for a free bed is READY — and the ruling is about the WORD, not the identifier | -| ↳ | `decisions.md`:541 | D-27. Ward Flow uses its dedicated repository (28 September) | -| `D-28` | `decisions.md`:554 | D-28. Design Modernization & Anti-Box Architecture (30 September 2026) | -| `D-29` | `decisions.md`:568 | D-29. Act time limits shown as a labelled synthetic demo (4 October 2026) | +| ↳ | `decisions.md`:542 | D-27. Ward Flow uses its dedicated repository (28 September) | +| `D-28` | `decisions.md`:555 | D-28. Design Modernization & Anti-Box Architecture (30 September 2026) | +| `D-29` | `decisions.md`:569 | D-29. Act time limits shown as a labelled synthetic demo (4 October 2026) | | `D-30` ⚠️ **2 occurrences in 2 files — not unique** | | | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-1x.md`:1238 | D-30 · `Unit.forensic` is a WARD flag, and every rendered string says so | -| ↳ | `decisions.md`:583 | D-30. Central Coordinator Approval for Inter-Ward Bed Transfers (6 October 2026) | +| ↳ | `decisions.md`:584 | D-30. Central Coordinator Approval for Inter-Ward Bed Transfers (6 October 2026) | | `D-31` ⚠️ **2 occurrences in 2 files — not unique** | | | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-1x.md`:1367 | D-31 · The plan's disposition — delete one half, re-derive the other | -| ↳ | `decisions.md`:590 | D-31. Gender-Diverse Bed Placement Policy & Clinical Override Safety (6 October 2026) | +| ↳ | `decisions.md`:591 | D-31. Gender-Diverse Bed Placement Policy & Clinical Override Safety (6 October 2026) | | `D-32` ⚠️ **2 occurrences in 2 files — not unique** | | | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-1x.md`:1289 | D-32 · D-6 is restated: ONE WORDING PER STATE, and the states are named | -| ↳ | `decisions.md`:597 | D-32. FIFO Waiting Time with Clinical Triage Badging vs Algorithmic Urgency Sorting (6 October 2026) | +| ↳ | `decisions.md`:598 | D-32. FIFO Waiting Time with Clinical Triage Badging vs Algorithmic Urgency Sorting (6 October 2026) | | `D-33` ⚠️ **2 occurrences in 2 files — not unique** | | | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-1x.md`:1322 | D-33 · "Nothing outstanding" does three jobs, and only one of them may keep the words | -| ↳ | `decisions.md`:604 | D-33. Separation of Local Ward Shift Notes from Statewide Coordinator Telemetry (6 October 2026) | +| ↳ | `decisions.md`:605 | D-33. Separation of Local Ward Shift Notes from Statewide Coordinator Telemetry (6 October 2026) | | `D-34` ⚠️ **2 occurrences in 2 files — not unique** | | | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-1x.md`:1347 | D-34 · A hypothetical destination row may not use obligation vocabulary at all | -| ↳ | `decisions.md`:611 | D-34. Acute Medical Deterioration Bed Release and Escalation Protocol (6 October 2026) | +| ↳ | `decisions.md`:612 | D-34. Acute Medical Deterioration Bed Release and Escalation Protocol (6 October 2026) | | `D-35` ⚠️ **2 occurrences in 2 files — not unique** | | | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-1x.md`:1388 | D-35 · The ED pressure strip does not narrow to the selected service, and #6 is CLOSED | -| ↳ | `decisions.md`:618 | D-35. Deferral of Regional Multi-Leg Transport & RFDS Repatriation (6 October 2026) | +| ↳ | `decisions.md`:619 | D-35. Deferral of Regional Multi-Leg Transport & RFDS Repatriation (6 October 2026) | | `D-36` ⚠️ **2 occurrences in 2 files — not unique** | | | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-1x.md`:1405 | D-36 · _Referrals into this ward_ / _into the team_ — PRESENTATION, with a condition | -| ↳ | `decisions.md`:625 | D-36. Affirmation of External Governance & Clinical Safety Hard Gates (6 October 2026) (Replaced by D-87) | +| ↳ | `decisions.md`:626 | D-36. Affirmation of External Governance & Clinical Safety Hard Gates (6 October 2026) (Replaced by D-87) | | `D-37` ⚠️ **2 occurrences in 2 files — not unique** | | | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-1x.md`:1411 | D-37 · _Clinically ready, not yet gone_ — PRESENTATION, and the heading must name its subject | -| ↳ | `decisions.md`:640 | D-37. External Governance Hard Gate Operational Postures & Resolution Roadmap (6 October 2026) (Replaced by D-87) | +| ↳ | `decisions.md`:641 | D-37. External Governance Hard Gate Operational Postures & Resolution Roadmap (6 October 2026) (Replaced by D-87) | | `D-38` ⚠️ **2 occurrences in 2 files — not unique** | | | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-1x.md`:1417 | D-38 · _People currently in a hospital bed_ on community team statistics — an aggregate that identifies at small N | -| ↳ | `decisions.md`:667 | D-38. Leave, absent without leave and CTO on the Patient page (9 October 2026) | +| ↳ | `decisions.md`:668 | D-38. Leave, absent without leave and CTO on the Patient page (9 October 2026) | | `D-39` ⚠️ **2 occurrences in 2 files — not unique** | | | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-1x.md`:1437 | D-39 · _Contacts_ and _Time to first contact_ — HELD, build neither | -| ↳ | `decisions.md`:685 | D-39. Patients are identified by UMRN, never by a WF number (9 October 2026) | +| ↳ | `decisions.md`:686 | D-39. Patients are identified by UMRN, never by a WF number (9 October 2026) | | `D-40` ⚠️ **2 occurrences in 2 files — not unique** | | | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-1x.md`:1445 | D-40 · An empty check array never claims reconciliation — on either shell surface | -| ↳ | `decisions.md`:729 | D-40. A second community treatment order keeps the first (9 October 2026) | +| ↳ | `decisions.md`:730 | D-40. A second community treatment order keeps the first (9 October 2026) | | `D-41` ⚠️ **2 occurrences in 2 files — not unique** | | | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-1x.md`:1478 | D-41 · `corridorCounts` is extended, and its POPULATION changes | -| ↳ | `decisions.md`:740 | D-41. Delays board filters narrow the table and state the hidden count (9 October 2026) | +| ↳ | `decisions.md`:741 | D-41. Delays board filters narrow the table and state the hidden count (9 October 2026) | | `D-42` ⚠️ **2 occurrences in 2 files — not unique** | | | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-1x.md`:1490 | D-42 · _Referrals into this ward_ renders bare counts. No share. | -| ↳ | `decisions.md`:753 | D-42. 12px typography floor with no uppercase exception reaffirmed in Design System v9 (9–10 October 2026) | +| ↳ | `decisions.md`:754 | D-42. 12px typography floor with no uppercase exception reaffirmed in Design System v9 (9–10 October 2026) | | `D-43` ⚠️ **2 occurrences in 2 files — not unique** | | | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-1x.md`:1724 | D-43 · Ward Lead ruling — the bed board's ordinal contradiction is a LANE TASK | -| ↳ | `decisions.md`:759 | D-43. Colour lives in glyphs and the hero; red means act now with a thin 1px edge, never a fill (9 October 2026) | +| ↳ | `decisions.md`:760 | D-43. Colour lives in glyphs and the hero; red means act now with a thin 1px edge, never a fill (9 October 2026) | | `D-44` ⚠️ **2 occurrences in 2 files — not unique** | | | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-1x.md`:1791 | D-44 · The community scope note is reworded and the comparison panel stays | -| ↳ | `decisions.md`:766 | D-44. Compact sizing, white cards and smaller text retained over expression-test card tints (9 October 2026) | +| ↳ | `decisions.md`:767 | D-44. Compact sizing, white cards and smaller text retained over expression-test card tints (9 October 2026) | | `D-45` ⚠️ **2 occurrences in 2 files — not unique** | | | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-1x.md`:1803 | D-45 · 🔴 THE SEED DECISION — the fixture gains BOTH, as ONE change, after the statistics screens | -| ↳ | `decisions.md`:772 | D-45. Phone is its own 390×844 design, never a desktop reflow (9 October 2026) | +| ↳ | `decisions.md`:773 | D-45. Phone is its own 390×844 design, never a desktop reflow (9 October 2026) | | `D-46` ⚠️ **2 occurrences in 2 files — not unique** | | | | ↳ | `../history/archive/dated-notes/owner-decisions-2026-09-1x.md`:1984 | D-46 · A guard that fails whenever the machine is busy | -| ↳ | `decisions.md`:779 | D-46. Every page has a focal part, a part of its own, a page-specific hero and command-bar action rules (9 October 2026) | -| `D-47` | `decisions.md`:785 | D-47. Glass stays about 80% opaque with the top sheen kept (10 October 2026) | -| `D-48` | `decisions.md`:791 | D-48. Figures stay in Geist Mono with tabular digits while chart axes use Geist Sans (10 October 2026) | -| `D-49` | `decisions.md`:797 | D-49. Ward Flow 44px default row target (dense 36px, touch 52px) vs retired 48px PsychSift tap knob (10 October 2026) | -| `D-50` | `decisions.md`:803 | D-50. Neutral T1 urgency pill vs Form 1A amber statutory warning badge (10 October 2026) | -| `D-51` | `decisions.md`:809 | D-51. Delays filters hide rows with a stated hidden count while other queues highlight by default (10 October 2026) | -| `D-52` | `decisions.md`:816 | D-52. 10 October page review rulings: time-axis overdue zone, 15px/20px strip figures, 8px people pips and incremental shared parts (10 October 2026) | -| `D-53` | `decisions.md`:822 | D-53. Elevate design language and Glare mode adopted for Design System v9 (10 October 2026) | -| `D-54` | `decisions.md`:829 | D-54. Tier time thresholds remain synthetic demo values requiring clinical sign-off (10 October 2026) | -| `D-55` | `decisions.md`:837 | D-55. Supabase is Ward Flow's database and sign-in provider, and Azure is retired (15 October 2026) | -| `D-56` | `decisions.md`:843 | D-56. Josh signs the clinical values that have a recorded source, for the prototype (15 October 2026) | -| `D-57` | `decisions.md`:849 | D-57. Twenty Top 25 items move from the showcase into the real screens, each behind its own flag (15 October 2026) | -| `D-58` | `decisions.md`:876 | D-58. Josh signs three more clinical values that have a national source, for the prototype (15 October 2026) | -| `D-59` | `decisions.md`:882 | D-59. Each role sees only what it needs, from one access table (15 October 2026) | -| `D-60` | `decisions.md`:888 | D-60. Criteria led discharge, for voluntary patients only (15 October 2026) | -| `D-61` | `decisions.md`:897 | D-61. Tasks and Alerts are one queue called Alerts (16 October 2026) | -| `D-62` | `decisions.md`:903 | D-62. The one Alerts queue is signed off and its flag removed (16 October 2026) | -| `D-63` | `decisions.md`:909 | D-63. Josh signs the remaining clinical values and the criteria list, for the prototype (16 October 2026) | -| `D-64` | `decisions.md`:917 | D-64. Criteria led discharge shows on the boards and warns at departure (16 October 2026) | -| `D-65` | `decisions.md`:924 | D-65. Criteria led discharge on in production, typed patient specific criteria, and the AWOL bed hold review paused (17 October 2026) | -| `D-66` | `decisions.md`:940 | D-66. Granted roles work without a second approval (17 October 2026) | -| `D-67` | `decisions.md`:948 | D-67. Recover synthetic form drafts within the browser session (17 October 2026) | -| `D-68` | `decisions.md`:955 | D-68. Bed meeting TV content and access (19 October 2026) | -| `D-69` | `decisions.md`:963 | D-69. A referral with no legal status: "Needs an involuntary-capable bed until status is set." (20 October 2026) | -| `D-70` | `decisions.md`:970 | D-70. No computed Mental Health Act periods: show only the recorded due time (20 October 2026) | -| `D-71` | `decisions.md`:976 | D-71. Audit 1 clinical safety fixes: no suggested wards, wait-order queues, recorded facts only (20 October 2026) | -| `D-72` | `decisions.md`:989 | D-72. Seven product decisions for the 21 October fix plan (21 October 2026) | -| `D-73` | `decisions.md`:1005 | D-73. Batch merge safeguards (21 October 2026) | -| `D-74` | `decisions.md`:1021 | D-74. Owner answers to the 21 October open questions (21 October 2026) | -| `D-75` | `decisions.md`:1042 | D-75. UX audit follow-up, page caching, community gaps and the extra-travel bed hold (21 October 2026) | -| `D-76` | `decisions.md`:1055 | D-76. Community referral gaps: the full move journey and asking more wards (21 October 2026) | -| `D-77` | `decisions.md`:1064 | D-77. The ten bigger UX changes approved for build (22 October 2026) | -| `D-78` | `decisions.md`:1084 | D-78. One decline list for wards and coordinators (22 October 2026) | -| `D-79` | `decisions.md`:1095 | D-79. Wards see the full referral, with name and UMRN, before they answer (23 October 2026) | -| `D-80` | `decisions.md`:1106 | D-80. Role access plan version 2: all 17 recommendations (23 October 2026) | -| `D-81` | `decisions.md`:1121 | D-81. Pulled, with a pull time limit, for a bed kept for an incoming patient (24 October 2026) | -| `D-82` | `decisions.md`:1128 | D-82. A PR may raise a phone size limit by up to 5 KB per screen without asking (26 October 2026) | -| `D-83` | `decisions.md`:1136 | D-83. Patient names stay in full on every screen, copy and TV; privacy work must not make the app less useful (26 October 2026) | -| `D-84` | `decisions.md`:1147 | D-84. The live app stays on Railway Singapore for now, and there is no server-side TV account yet (26 October 2026) | -| `D-85` | `decisions.md`:1155 | D-85. "Held" only for a bed kept for its own patient; "pulled" for an incoming bed; "held up" for a delay (26 October 2026) | -| `D-86` | `decisions.md`:1162 | D-86. No second approver for role grants, at pilot or otherwise (27 October 2026) | -| `D-87` | `decisions.md`:1169 | D-87. D-36 and D-37 are replaced by the real-data gate (27 October 2026) | -| `D-88` | `decisions.md`:1181 | D-88. The public demo opens with a demo code once the front door is on (27 October 2026) | -| `D-89` | `decisions.md`:1188 | D-89. Redesign mock-up copies of large screens may pass the 1,500-line cap (30 October 2026) | -| `D-90` | `decisions.md`:1196 | D-90. Help gets How do I…, Show me runs everywhere, and Help is built without a separate mock-up step (30 October 2026) | -| `D-91` | `decisions.md`:1207 | D-91. One design home for the redesign, and Josh's answers on Help, Settings, search and notifications (31 October 2026) | -| `D-92` | `decisions.md`:1242 | D-92. Help goes live before its mock-up review, one search box on Capacity, and referral rows on Home open the panel (31 October 2026) | -| `D-93` | `decisions.md`:1252 | D-93. Legal form times show only as typed, never as a countdown (31 October 2026) | -| `D-94` | `decisions.md`:1260 | D-94. Design rulings of 31 October 2026 | -| `D-95` | `decisions.md`:1273 | D-95. One page scroll, and a click outside closes a drawer (3 November 2026) | -| `D-96` | `decisions.md`:1283 | D-96. A named bed is pulled, and its patient is not also waiting (8 November 2026) | -| `D-97` | `decisions.md`:1293 | D-97. Owner answers on seven open items: N21, N25, N26, N29, N40, N41 and WF-B008 (8 November 2026) | -| `D-98` | `decisions.md`:1306 | D-98. Friction pass: Quick bar, Patient peek and Ward peek (8 November 2026) | -| `D-99` | `decisions.md`:1315 | D-99. "Real details" in the referral drawer's sample patients (25 September 2026) | -| `D-100` | `decisions.md`:1321 | D-100. "Under a form" means one rule everywhere (9 November 2026) | -| `D-101` | `decisions.md`:1328 | D-101. Clinically ready for discharge, with one delay reason (9 November 2026) | -| `D-102` | `decisions.md`:1337 | D-102. Report-a-problem screenshots are blurred, and patient-table exports carry no names (9 November 2026) | -| `D-103` | `decisions.md`:1346 | D-103. Any coordinator on shift may mark a bed override reviewed (9 November 2026) | -| `D-104` | `decisions.md`:1353 | D-104. Care plans and safety flags: five defaults (9 November 2026) | -| `D-105` | `decisions.md`:1365 | D-105. Optional clerk details on the patient record (8 November 2026) | -| `D-106` | `decisions.md`:1372 | D-106. Clinical values from the 9 November 2026 documentation audit (9 November 2026) | -| `D-107` | `decisions.md`:1384 | D-107. Working rules and documentation from the 9 November 2026 audit (9 November 2026) | -| `D-108` | `decisions.md`:1398 | D-108. Six bed-flow features: keep D-93 and D-72, ED long-wait next steps (9 November 2026) | -| `D-109` | `decisions.md`:1407 | D-109. Home's bed alert line tests the whole number shown (9 November 2026) | -| `D-110` | `decisions.md`:1414 | D-110. ED and referral flow: neutral fit line, clearance timing and alternatives to admission (9 November 2026) | -| `D-111` | `decisions.md`:1424 | D-111. Review and audit plan: first guards and four open answers (9 November 2026) | -| `D-112` | `decisions.md`:1438 | D-112. Phone bottom bar: the floating bar (9 November 2026) | -| `D-113` | `decisions.md`:1447 | D-113. Second patient identifier on accept and Mark done; no initials search (9 November 2026) | -| `D-114` | `decisions.md`:1457 | D-114. Allow pull_request_target for three workflows only (9 November 2026) | -| `D-115` | `decisions.md`:1465 | D-115. One count on every screen, and a missing patient shown everywhere (9 November 2026) | -| `D-116` | `decisions.md`:1479 | D-116. Page tops: the PR #1581 recommendations stand (9 November 2026) | -| `D-117` | `decisions.md`:1496 | D-117. Care plans follow-up: frequent presenter count, tribunal date and ward flags (10 November 2026) | -| `D-118` | `decisions.md`:1505 | D-118. Page tops: Referrals and Ward phone limits up to 8 KB above main (10 November 2026) | -| `D-119` | `decisions.md`:1511 | D-119. Page tops: phone limits raised to measured sizes, trim after merge (10 November 2026) | -| `D-120` | `decisions.md`:1518 | D-120. Discharge and capacity values: pull limit, transport delay and discharge date slip (9 November 2026) | -| `D-121` | `decisions.md`:1527 | D-121. Working rules, guards and your PC from the 10 November 2026 audit (10 November 2026) | -| `D-122` | `decisions.md`:1541 | D-122. Clinical and privacy answers from the 10 November 2026 audit (10 November 2026) | -| `D-123` | `decisions.md`:1554 | D-123. Master audit list answers: two clinical fixes and five working rules (10 November 2026) | -| `D-124` | `decisions.md`:1568 | D-124. Offline saves whose record changed are refused and shown (10 November 2026) | -| `D-125` | `decisions.md`:1575 | D-125. Top 10 audit follow-ups approved (10 November 2026) | -| `D-126` | `decisions.md`:1587 | D-126. Ranked lists: neutral orders approved (10 November 2026) | -| `D-127` | `decisions.md`:1606 | D-127. Neutral wording for a community treatment order at arrival (10 November 2026) | -| `D-128` | `decisions.md`:1613 | D-128. Final master audit: nine answers (10 November 2026) | -| `D-129` | `decisions.md`:1628 | D-129. Master audit findings: every recommendation approved (10 November 2026) | -| `D-130` | `decisions.md`:1678 | D-130. Audit follow-ups: every remaining recommendation approved (10 November 2026) | -| `D-131` | `decisions.md`:1694 | D-131. Hard-case demo data allowed, and the movement diagram follows the engine (10 November 2026) | -| `D-132` | `decisions.md`:1703 | D-132. Audit fixes group 1: docs and CI guards (10 November 2026) | -| `D-133` | `decisions.md`:1713 | D-133. Batch 1 (ED and referral flow): three answers (10 November 2026) | -| `D-134` | `decisions.md`:1723 | D-134. Ward arrival and beds batch: how to hold, advocate line, night list and the feature freeze (10 November 2026) | -| `D-135` | `decisions.md`:1746 | D-135. Batch 4, outages and pilot control: pack age and plan answers (10 November 2026) | -| `D-136` | `decisions.md`:1755 | D-136. Feature batch 3 (shift change and follow-up): two signed values (10 November 2026) | -| `D-137` | `decisions.md`:1767 | D-137. Feature build batch 5: count leak first, TV change mark and QR library (10 November 2026) | -| `D-138` | `decisions.md`:1783 | D-138. Phone alert urgency by kind (10 November 2026) | -| `D-139` | `decisions.md`:1789 | D-139. Phone Statistics ward list A to Z, and leave return times as typed (10 November 2026) | -| `D-140` | `decisions.md`:1799 | D-140. Feature list adopted, and Wave 1 begins (10 November 2026) | -| `D-141` | `decisions.md`:1812 | D-141. Batch 1 (ED and referral flow) design approved, with eleven answers (11 November 2026) | -| `D-142` | `decisions.md`:1830 | D-142. Batch 4: design review and all twelve answers approved, D-80 amended for site features (11 November 2026) | -| `D-143` | `decisions.md`:1842 | D-143. MHERT is MHERL in the glossary; SMHMR deferred (11 November 2026) | -| `D-144` | `decisions.md`:1850 | D-144. Chip rows move only sideways on a phone (11 November 2026) | -| `D-146` | `decisions.md`:1856 | D-146. Performance audit fixes and the phone speed target (11 November 2026) | -| `D-147` | `decisions.md`:1862 | D-147. Demo-code tries keep per-address keying until a trusted proxy is set (11 November 2026) | -| `D-152` | `decisions.md`:1868 | D-152. Returned to ED prompt sees every return in shared mode (11 November 2026) | -| `D-153` | `decisions.md`:1876 | D-153. Keep the drawn-time settle check, and defer a separate agent GitHub identity (11 November 2026) | -| `D-154` | `decisions.md`:1884 | D-154. The community desk's ED heads-up reads a narrow scoped list (11 November 2026) | +| ↳ | `decisions.md`:780 | D-46. Every page has a focal part, a part of its own, a page-specific hero and command-bar action rules (9 October 2026) | +| `D-47` | `decisions.md`:786 | D-47. Glass stays about 80% opaque with the top sheen kept (10 October 2026) | +| `D-48` | `decisions.md`:792 | D-48. Figures stay in Geist Mono with tabular digits while chart axes use Geist Sans (10 October 2026) | +| `D-49` | `decisions.md`:798 | D-49. Ward Flow 44px default row target (dense 36px, touch 52px) vs retired 48px PsychSift tap knob (10 October 2026) | +| `D-50` | `decisions.md`:804 | D-50. Neutral T1 urgency pill vs Form 1A amber statutory warning badge (10 October 2026) | +| `D-51` | `decisions.md`:810 | D-51. Delays filters hide rows with a stated hidden count while other queues highlight by default (10 October 2026) | +| `D-52` | `decisions.md`:817 | D-52. 10 October page review rulings: time-axis overdue zone, 15px/20px strip figures, 8px people pips and incremental shared parts (10 October 2026) | +| `D-53` | `decisions.md`:823 | D-53. Elevate design language and Glare mode adopted for Design System v9 (10 October 2026) | +| `D-54` | `decisions.md`:830 | D-54. Tier time thresholds remain synthetic demo values requiring clinical sign-off (10 October 2026) | +| `D-55` | `decisions.md`:838 | D-55. Supabase is Ward Flow's database and sign-in provider, and Azure is retired (15 October 2026) | +| `D-56` | `decisions.md`:844 | D-56. Josh signs the clinical values that have a recorded source, for the prototype (15 October 2026) | +| `D-57` | `decisions.md`:850 | D-57. Twenty Top 25 items move from the showcase into the real screens, each behind its own flag (15 October 2026) | +| `D-58` | `decisions.md`:877 | D-58. Josh signs three more clinical values that have a national source, for the prototype (15 October 2026) | +| `D-59` | `decisions.md`:883 | D-59. Each role sees only what it needs, from one access table (15 October 2026) | +| `D-60` | `decisions.md`:889 | D-60. Criteria led discharge, for voluntary patients only (15 October 2026) | +| `D-61` | `decisions.md`:898 | D-61. Tasks and Alerts are one queue called Alerts (16 October 2026) | +| `D-62` | `decisions.md`:904 | D-62. The one Alerts queue is signed off and its flag removed (16 October 2026) | +| `D-63` | `decisions.md`:910 | D-63. Josh signs the remaining clinical values and the criteria list, for the prototype (16 October 2026) | +| `D-64` | `decisions.md`:918 | D-64. Criteria led discharge shows on the boards and warns at departure (16 October 2026) | +| `D-65` | `decisions.md`:925 | D-65. Criteria led discharge on in production, typed patient specific criteria, and the AWOL bed hold review paused (17 October 2026) | +| `D-66` | `decisions.md`:941 | D-66. Granted roles work without a second approval (17 October 2026) | +| `D-67` | `decisions.md`:949 | D-67. Recover synthetic form drafts within the browser session (17 October 2026) | +| `D-68` | `decisions.md`:956 | D-68. Bed meeting TV content and access (19 October 2026) | +| `D-69` | `decisions.md`:964 | D-69. A referral with no legal status: "Needs an involuntary-capable bed until status is set." (20 October 2026) | +| `D-70` | `decisions.md`:971 | D-70. No computed Mental Health Act periods: show only the recorded due time (20 October 2026) | +| `D-71` | `decisions.md`:977 | D-71. Audit 1 clinical safety fixes: no suggested wards, wait-order queues, recorded facts only (20 October 2026) | +| `D-72` | `decisions.md`:990 | D-72. Seven product decisions for the 21 October fix plan (21 October 2026) | +| `D-73` | `decisions.md`:1006 | D-73. Batch merge safeguards (21 October 2026) | +| `D-74` | `decisions.md`:1022 | D-74. Owner answers to the 21 October open questions (21 October 2026) | +| `D-75` | `decisions.md`:1043 | D-75. UX audit follow-up, page caching, community gaps and the extra-travel bed hold (21 October 2026) | +| `D-76` | `decisions.md`:1056 | D-76. Community referral gaps: the full move journey and asking more wards (21 October 2026) | +| `D-77` | `decisions.md`:1065 | D-77. The ten bigger UX changes approved for build (22 October 2026) | +| `D-78` | `decisions.md`:1085 | D-78. One decline list for wards and coordinators (22 October 2026) | +| `D-79` | `decisions.md`:1096 | D-79. Wards see the full referral, with name and UMRN, before they answer (23 October 2026) | +| `D-80` | `decisions.md`:1107 | D-80. Role access plan version 2: all 17 recommendations (23 October 2026) | +| `D-81` | `decisions.md`:1122 | D-81. Pulled, with a pull time limit, for a bed kept for an incoming patient (24 October 2026) | +| `D-82` | `decisions.md`:1129 | D-82. A PR may raise a phone size limit by up to 5 KB per screen without asking (26 October 2026) | +| `D-83` | `decisions.md`:1137 | D-83. Patient names stay in full on every screen, copy and TV; privacy work must not make the app less useful (26 October 2026) | +| `D-84` | `decisions.md`:1148 | D-84. The live app stays on Railway Singapore for now, and there is no server-side TV account yet (26 October 2026) | +| `D-85` | `decisions.md`:1156 | D-85. "Held" only for a bed kept for its own patient; "pulled" for an incoming bed; "held up" for a delay (26 October 2026) | +| `D-86` | `decisions.md`:1163 | D-86. No second approver for role grants, at pilot or otherwise (27 October 2026) | +| `D-87` | `decisions.md`:1170 | D-87. D-36 and D-37 are replaced by the real-data gate (27 October 2026) | +| `D-88` | `decisions.md`:1182 | D-88. The public demo opens with a demo code once the front door is on (27 October 2026) | +| `D-89` | `decisions.md`:1189 | D-89. Redesign mock-up copies of large screens may pass the 1,500-line cap (30 October 2026) | +| `D-90` | `decisions.md`:1197 | D-90. Help gets How do I…, Show me runs everywhere, and Help is built without a separate mock-up step (30 October 2026) | +| `D-91` | `decisions.md`:1208 | D-91. One design home for the redesign, and Josh's answers on Help, Settings, search and notifications (31 October 2026) | +| `D-92` | `decisions.md`:1243 | D-92. Help goes live before its mock-up review, one search box on Capacity, and referral rows on Home open the panel (31 October 2026) | +| `D-93` | `decisions.md`:1253 | D-93. Legal form times show only as typed, never as a countdown (31 October 2026) | +| `D-94` | `decisions.md`:1261 | D-94. Design rulings of 31 October 2026 | +| `D-95` | `decisions.md`:1274 | D-95. One page scroll, and a click outside closes a drawer (3 November 2026) | +| `D-96` | `decisions.md`:1284 | D-96. A named bed is pulled, and its patient is not also waiting (8 November 2026) | +| `D-97` | `decisions.md`:1294 | D-97. Owner answers on seven open items: N21, N25, N26, N29, N40, N41 and WF-B008 (8 November 2026) | +| `D-98` | `decisions.md`:1307 | D-98. Friction pass: Quick bar, Patient peek and Ward peek (8 November 2026) | +| `D-99` | `decisions.md`:1316 | D-99. "Real details" in the referral drawer's sample patients (25 September 2026) | +| `D-100` | `decisions.md`:1322 | D-100. "Under a form" means one rule everywhere (9 November 2026) | +| `D-101` | `decisions.md`:1329 | D-101. Clinically ready for discharge, with one delay reason (9 November 2026) | +| `D-102` | `decisions.md`:1338 | D-102. Report-a-problem screenshots are blurred, and patient-table exports carry no names (9 November 2026) | +| `D-103` | `decisions.md`:1347 | D-103. Any coordinator on shift may mark a bed override reviewed (9 November 2026) | +| `D-104` | `decisions.md`:1354 | D-104. Care plans and safety flags: five defaults (9 November 2026) | +| `D-105` | `decisions.md`:1366 | D-105. Optional clerk details on the patient record (8 November 2026) | +| `D-106` | `decisions.md`:1373 | D-106. Clinical values from the 9 November 2026 documentation audit (9 November 2026) | +| `D-107` | `decisions.md`:1385 | D-107. Working rules and documentation from the 9 November 2026 audit (9 November 2026) | +| `D-108` | `decisions.md`:1399 | D-108. Six bed-flow features: keep D-93 and D-72, ED long-wait next steps (9 November 2026) | +| `D-109` | `decisions.md`:1408 | D-109. Home's bed alert line tests the whole number shown (9 November 2026) | +| `D-110` | `decisions.md`:1415 | D-110. ED and referral flow: neutral fit line, clearance timing and alternatives to admission (9 November 2026) | +| `D-111` | `decisions.md`:1425 | D-111. Review and audit plan: first guards and four open answers (9 November 2026) | +| `D-112` | `decisions.md`:1439 | D-112. Phone bottom bar: the floating bar (9 November 2026) | +| `D-113` | `decisions.md`:1448 | D-113. Second patient identifier on accept and Mark done; no initials search (9 November 2026) | +| `D-114` | `decisions.md`:1458 | D-114. Allow pull_request_target for three workflows only (9 November 2026) | +| `D-115` | `decisions.md`:1466 | D-115. One count on every screen, and a missing patient shown everywhere (9 November 2026) | +| `D-116` | `decisions.md`:1480 | D-116. Page tops: the PR #1581 recommendations stand (9 November 2026) | +| `D-117` | `decisions.md`:1497 | D-117. Care plans follow-up: frequent presenter count, tribunal date and ward flags (10 November 2026) | +| `D-118` | `decisions.md`:1506 | D-118. Page tops: Referrals and Ward phone limits up to 8 KB above main (10 November 2026) | +| `D-119` | `decisions.md`:1512 | D-119. Page tops: phone limits raised to measured sizes, trim after merge (10 November 2026) | +| `D-120` | `decisions.md`:1519 | D-120. Discharge and capacity values: pull limit, transport delay and discharge date slip (9 November 2026) | +| `D-121` | `decisions.md`:1528 | D-121. Working rules, guards and your PC from the 10 November 2026 audit (10 November 2026) | +| `D-122` | `decisions.md`:1542 | D-122. Clinical and privacy answers from the 10 November 2026 audit (10 November 2026) | +| `D-123` | `decisions.md`:1555 | D-123. Master audit list answers: two clinical fixes and five working rules (10 November 2026) | +| `D-124` | `decisions.md`:1569 | D-124. Offline saves whose record changed are refused and shown (10 November 2026) | +| `D-125` | `decisions.md`:1576 | D-125. Top 10 audit follow-ups approved (10 November 2026) | +| `D-126` | `decisions.md`:1588 | D-126. Ranked lists: neutral orders approved (10 November 2026) | +| `D-127` | `decisions.md`:1607 | D-127. Neutral wording for a community treatment order at arrival (10 November 2026) | +| `D-128` | `decisions.md`:1614 | D-128. Final master audit: nine answers (10 November 2026) | +| `D-129` | `decisions.md`:1629 | D-129. Master audit findings: every recommendation approved (10 November 2026) | +| `D-130` | `decisions.md`:1679 | D-130. Audit follow-ups: every remaining recommendation approved (10 November 2026) | +| `D-131` | `decisions.md`:1695 | D-131. Hard-case demo data allowed, and the movement diagram follows the engine (10 November 2026) | +| `D-132` | `decisions.md`:1704 | D-132. Audit fixes group 1: docs and CI guards (10 November 2026) | +| `D-133` | `decisions.md`:1714 | D-133. Batch 1 (ED and referral flow): three answers (10 November 2026) | +| `D-134` | `decisions.md`:1724 | D-134. Ward arrival and beds batch: how to hold, advocate line, night list and the feature freeze (10 November 2026) | +| `D-135` | `decisions.md`:1747 | D-135. Batch 4, outages and pilot control: pack age and plan answers (10 November 2026) | +| `D-136` | `decisions.md`:1756 | D-136. Feature batch 3 (shift change and follow-up): two signed values (10 November 2026) | +| `D-137` | `decisions.md`:1768 | D-137. Feature build batch 5: count leak first, TV change mark and QR library (10 November 2026) | +| `D-138` | `decisions.md`:1784 | D-138. Phone alert urgency by kind (10 November 2026) | +| `D-139` | `decisions.md`:1790 | D-139. Phone Statistics ward list A to Z, and leave return times as typed (10 November 2026) | +| `D-140` | `decisions.md`:1800 | D-140. Feature list adopted, and Wave 1 begins (10 November 2026) | +| `D-141` | `decisions.md`:1813 | D-141. Batch 1 (ED and referral flow) design approved, with eleven answers (11 November 2026) | +| `D-142` | `decisions.md`:1831 | D-142. Batch 4: design review and all twelve answers approved, D-80 amended for site features (11 November 2026) | +| `D-143` | `decisions.md`:1843 | D-143. MHERT is MHERL in the glossary; SMHMR deferred (11 November 2026) | +| `D-144` | `decisions.md`:1851 | D-144. Chip rows move only sideways on a phone (11 November 2026) | +| `D-145` | `decisions.md`:1857 | D-145. Repository review: fixes, features and code health approved (11 November 2026) | +| `D-146` | `decisions.md`:1871 | D-146. Performance audit fixes and the phone speed target (11 November 2026) | +| `D-147` | `decisions.md`:1877 | D-147. Demo-code tries keep per-address keying until a trusted proxy is set (11 November 2026) | +| `D-152` | `decisions.md`:1883 | D-152. Returned to ED prompt sees every return in shared mode (11 November 2026) | +| `D-153` | `decisions.md`:1891 | D-153. Keep the drawn-time settle check, and defer a separate agent GitHub identity (11 November 2026) | +| `D-154` | `decisions.md`:1899 | D-154. The community desk's ED heads-up reads a narrow scoped list (11 November 2026) | | `D9-1` | `../history/archive/dated-notes/ward-flow-phase-9-decisions.md`:62 | D9-1 — The wait becomes prominent, and its ceiling is removed; it never outranks urgency (SESSION) | | `D9-2` | `../history/archive/dated-notes/ward-flow-phase-9-decisions.md`:102 | D9-2 — Declaring escalation records it and marks the screens, and changes nothing else (SESSION, and partly blocked) | | `D9-3` | `../history/archive/dated-notes/ward-flow-phase-9-decisions.md`:126 | D9-3 — The retrospective is one person's journey replayed, plus the ward prediction track record last (SESSION) | @@ -628,157 +629,158 @@ safe global key across 30 files. **Title:** Ward Flow — decision log -149 item(s): - -- `D-1` — line 178, heading: "D-1. Ward Flow is local only, with no linked repository (Replaced by D-27)" -- `D-2` — line 188, heading: "D-2. Railway is disconnected" -- `D-3` — line 199, heading: "D-3. The PsychSift and Database code is being retired from Ward Flow" -- `D-4` — line 207, heading: "D-4. Synthetic patients only" -- `D-5` — line 215, heading: "D-5. Parallel threads in separate worktrees, folded one at a time" -- `D-6` — line 226, heading: "D-6. Aboriginal cultural safety review deferred" -- `D-7` — line 234, heading: "D-7. The first four milestones, in this order" -- `D-8` — line 246, heading: "D-8. Josh's standing rulings, numbered R1 to R16, for every session and tool" -- `D-9` — line 278, heading: "D-9. Josh's rulings of 25 September, 11:43 to 12:00 (R17 to R21)" -- `D-10` — line 292, heading: "D-10. Gate build type check (R22)" -- `D-11` — line 301, heading: "D-11. Rulings of 25 September, 12:41 (R23 to R25)" -- `D-12` — line 317, heading: "D-12. Rulings of 25 September, 12:43 (R26 to R31)" -- `D-13` — line 336, heading: "D-13. Tooling tests in batch gates (R32)" -- `D-14` — line 346, heading: "D-14. Standing defaults: decide small things without asking" -- `D-15` — line 358, heading: "D-15. Rulings of 25 September, 13:26 (R33 to R35)" -- `D-16` — line 371, heading: "D-16. Legal overrides and form receipts, 25 September 13:51 UTC" -- `D-17` — line 384, heading: "D-17. Morning roll-up time is Josh's own default (25 September)" -- `D-18` — line 395, heading: "D-18. The privacy lock stops saving only for typed text (25 September)" -- `D-19` — line 406, heading: "D-19. Rulings of 25 September, evening (walkthrough, leave beds, PsychSift, gender display)" -- `D-20` — line 436, heading: "D-20. One high-contrast colour check retired (26 September)" -- `D-21` — line 449, heading: "D-21. Coordinator bed board: all nine recommended answers (26 September)" -- `D-22` — line 461, heading: "D-22. No legal limits in hour rules; the rest are labelled defaults (26 September)" -- `D-23` — line 477, heading: "D-23. Leave-bed fields kept; patient search stops matching by ward (26 September)" -- `D-24` — line 491, heading: "D-24. Hour-rules morning list: all A (26 September)" -- `D-25` — line 515, heading: "D-25. The lone-patient check counts free beds on both matching paths (26 September)" -- `D-26` — line 523, heading: "D-26. Select fold checks by changed risk (27 September)" -- `D-27` — line 541, heading: "D-27. Ward Flow uses its dedicated repository (28 September)" -- `D-28` — line 554, heading: "D-28. Design Modernization & Anti-Box Architecture (30 September 2026)" -- `D-29` — line 568, heading: "D-29. Act time limits shown as a labelled synthetic demo (4 October 2026)" -- `D-30` — line 583, heading: "D-30. Central Coordinator Approval for Inter-Ward Bed Transfers (6 October 2026)" -- `D-31` — line 590, heading: "D-31. Gender-Diverse Bed Placement Policy & Clinical Override Safety (6 October 2026)" -- `D-32` — line 597, heading: "D-32. FIFO Waiting Time with Clinical Triage Badging vs Algorithmic Urgency Sorting (6 October 2026)" -- `D-33` — line 604, heading: "D-33. Separation of Local Ward Shift Notes from Statewide Coordinator Telemetry (6 October 2026)" -- `D-34` — line 611, heading: "D-34. Acute Medical Deterioration Bed Release and Escalation Protocol (6 October 2026)" -- `D-35` — line 618, heading: "D-35. Deferral of Regional Multi-Leg Transport & RFDS Repatriation (6 October 2026)" -- `D-36` — line 625, heading: "D-36. Affirmation of External Governance & Clinical Safety Hard Gates (6 October 2026) (Replaced by D-87)" -- `D-37` — line 640, heading: "D-37. External Governance Hard Gate Operational Postures & Resolution Roadmap (6 October 2026) (Replaced by D-87)" -- `D-38` — line 667, heading: "D-38. Leave, absent without leave and CTO on the Patient page (9 October 2026)" -- `D-39` — line 685, heading: "D-39. Patients are identified by UMRN, never by a WF number (9 October 2026)" -- `D-40` — line 729, heading: "D-40. A second community treatment order keeps the first (9 October 2026)" -- `D-41` — line 740, heading: "D-41. Delays board filters narrow the table and state the hidden count (9 October 2026)" -- `D-42` — line 753, heading: "D-42. 12px typography floor with no uppercase exception reaffirmed in Design System v9 (9–10 October 2026)" -- `D-43` — line 759, heading: "D-43. Colour lives in glyphs and the hero; red means act now with a thin 1px edge, never a fill (9 October 2026)" -- `D-44` — line 766, heading: "D-44. Compact sizing, white cards and smaller text retained over expression-test card tints (9 October 2026)" -- `D-45` — line 772, heading: "D-45. Phone is its own 390×844 design, never a desktop reflow (9 October 2026)" -- `D-46` — line 779, heading: "D-46. Every page has a focal part, a part of its own, a page-specific hero and command-bar action rules (9 October 2026)" -- `D-47` — line 785, heading: "D-47. Glass stays about 80% opaque with the top sheen kept (10 October 2026)" -- `D-48` — line 791, heading: "D-48. Figures stay in Geist Mono with tabular digits while chart axes use Geist Sans (10 October 2026)" -- `D-49` — line 797, heading: "D-49. Ward Flow 44px default row target (dense 36px, touch 52px) vs retired 48px PsychSift tap knob (10 October 2026)" -- `D-50` — line 803, heading: "D-50. Neutral T1 urgency pill vs Form 1A amber statutory warning badge (10 October 2026)" -- `D-51` — line 809, heading: "D-51. Delays filters hide rows with a stated hidden count while other queues highlight by default (10 October 2026)" -- `D-52` — line 816, heading: "D-52. 10 October page review rulings: time-axis overdue zone, 15px/20px strip figures, 8px people pips and incremental shared parts (10 October 2026)" -- `D-53` — line 822, heading: "D-53. Elevate design language and Glare mode adopted for Design System v9 (10 October 2026)" -- `D-54` — line 829, heading: "D-54. Tier time thresholds remain synthetic demo values requiring clinical sign-off (10 October 2026)" -- `D-55` — line 837, heading: "D-55. Supabase is Ward Flow's database and sign-in provider, and Azure is retired (15 October 2026)" -- `D-56` — line 843, heading: "D-56. Josh signs the clinical values that have a recorded source, for the prototype (15 October 2026)" -- `D-57` — line 849, heading: "D-57. Twenty Top 25 items move from the showcase into the real screens, each behind its own flag (15 October 2026)" -- `D-58` — line 876, heading: "D-58. Josh signs three more clinical values that have a national source, for the prototype (15 October 2026)" -- `D-59` — line 882, heading: "D-59. Each role sees only what it needs, from one access table (15 October 2026)" -- `D-60` — line 888, heading: "D-60. Criteria led discharge, for voluntary patients only (15 October 2026)" -- `D-61` — line 897, heading: "D-61. Tasks and Alerts are one queue called Alerts (16 October 2026)" -- `D-62` — line 903, heading: "D-62. The one Alerts queue is signed off and its flag removed (16 October 2026)" -- `D-63` — line 909, heading: "D-63. Josh signs the remaining clinical values and the criteria list, for the prototype (16 October 2026)" -- `D-64` — line 917, heading: "D-64. Criteria led discharge shows on the boards and warns at departure (16 October 2026)" -- `D-65` — line 924, heading: "D-65. Criteria led discharge on in production, typed patient specific criteria, and the AWOL bed hold review paused (17 October 2026)" -- `D-66` — line 940, heading: "D-66. Granted roles work without a second approval (17 October 2026)" -- `D-67` — line 948, heading: "D-67. Recover synthetic form drafts within the browser session (17 October 2026)" -- `D-68` — line 955, heading: "D-68. Bed meeting TV content and access (19 October 2026)" -- `D-69` — line 963, heading: "D-69. A referral with no legal status: "Needs an involuntary-capable bed until status is set." (20 October 2026)" -- `D-70` — line 970, heading: "D-70. No computed Mental Health Act periods: show only the recorded due time (20 October 2026)" -- `D-71` — line 976, heading: "D-71. Audit 1 clinical safety fixes: no suggested wards, wait-order queues, recorded facts only (20 October 2026)" -- `D-72` — line 989, heading: "D-72. Seven product decisions for the 21 October fix plan (21 October 2026)" -- `D-73` — line 1005, heading: "D-73. Batch merge safeguards (21 October 2026)" -- `D-74` — line 1021, heading: "D-74. Owner answers to the 21 October open questions (21 October 2026)" -- `D-75` — line 1042, heading: "D-75. UX audit follow-up, page caching, community gaps and the extra-travel bed hold (21 October 2026)" -- `D-76` — line 1055, heading: "D-76. Community referral gaps: the full move journey and asking more wards (21 October 2026)" -- `D-77` — line 1064, heading: "D-77. The ten bigger UX changes approved for build (22 October 2026)" -- `D-78` — line 1084, heading: "D-78. One decline list for wards and coordinators (22 October 2026)" -- `D-79` — line 1095, heading: "D-79. Wards see the full referral, with name and UMRN, before they answer (23 October 2026)" -- `D-80` — line 1106, heading: "D-80. Role access plan version 2: all 17 recommendations (23 October 2026)" -- `D-81` — line 1121, heading: "D-81. Pulled, with a pull time limit, for a bed kept for an incoming patient (24 October 2026)" -- `D-82` — line 1128, heading: "D-82. A PR may raise a phone size limit by up to 5 KB per screen without asking (26 October 2026)" -- `D-83` — line 1136, heading: "D-83. Patient names stay in full on every screen, copy and TV; privacy work must not make the app less useful (26 October 2026)" -- `D-84` — line 1147, heading: "D-84. The live app stays on Railway Singapore for now, and there is no server-side TV account yet (26 October 2026)" -- `D-85` — line 1155, heading: "D-85. "Held" only for a bed kept for its own patient; "pulled" for an incoming bed; "held up" for a delay (26 October 2026)" -- `D-86` — line 1162, heading: "D-86. No second approver for role grants, at pilot or otherwise (27 October 2026)" -- `D-87` — line 1169, heading: "D-87. D-36 and D-37 are replaced by the real-data gate (27 October 2026)" -- `D-88` — line 1181, heading: "D-88. The public demo opens with a demo code once the front door is on (27 October 2026)" -- `D-89` — line 1188, heading: "D-89. Redesign mock-up copies of large screens may pass the 1,500-line cap (30 October 2026)" -- `D-90` — line 1196, heading: "D-90. Help gets How do I…, Show me runs everywhere, and Help is built without a separate mock-up step (30 October 2026)" -- `D-91` — line 1207, heading: "D-91. One design home for the redesign, and Josh's answers on Help, Settings, search and notifications (31 October 2026)" -- `D-92` — line 1242, heading: "D-92. Help goes live before its mock-up review, one search box on Capacity, and referral rows on Home open the panel (31 October 2026)" -- `D-93` — line 1252, heading: "D-93. Legal form times show only as typed, never as a countdown (31 October 2026)" -- `D-94` — line 1260, heading: "D-94. Design rulings of 31 October 2026" -- `D-95` — line 1273, heading: "D-95. One page scroll, and a click outside closes a drawer (3 November 2026)" -- `D-96` — line 1283, heading: "D-96. A named bed is pulled, and its patient is not also waiting (8 November 2026)" -- `D-97` — line 1293, heading: "D-97. Owner answers on seven open items: N21, N25, N26, N29, N40, N41 and WF-B008 (8 November 2026)" -- `D-98` — line 1306, heading: "D-98. Friction pass: Quick bar, Patient peek and Ward peek (8 November 2026)" -- `D-99` — line 1315, heading: "D-99. "Real details" in the referral drawer's sample patients (25 September 2026)" -- `D-100` — line 1321, heading: "D-100. "Under a form" means one rule everywhere (9 November 2026)" -- `D-101` — line 1328, heading: "D-101. Clinically ready for discharge, with one delay reason (9 November 2026)" -- `D-102` — line 1337, heading: "D-102. Report-a-problem screenshots are blurred, and patient-table exports carry no names (9 November 2026)" -- `D-103` — line 1346, heading: "D-103. Any coordinator on shift may mark a bed override reviewed (9 November 2026)" -- `D-104` — line 1353, heading: "D-104. Care plans and safety flags: five defaults (9 November 2026)" -- `D-105` — line 1365, heading: "D-105. Optional clerk details on the patient record (8 November 2026)" -- `D-106` — line 1372, heading: "D-106. Clinical values from the 9 November 2026 documentation audit (9 November 2026)" -- `D-107` — line 1384, heading: "D-107. Working rules and documentation from the 9 November 2026 audit (9 November 2026)" -- `D-108` — line 1398, heading: "D-108. Six bed-flow features: keep D-93 and D-72, ED long-wait next steps (9 November 2026)" -- `D-109` — line 1407, heading: "D-109. Home's bed alert line tests the whole number shown (9 November 2026)" -- `D-110` — line 1414, heading: "D-110. ED and referral flow: neutral fit line, clearance timing and alternatives to admission (9 November 2026)" -- `D-111` — line 1424, heading: "D-111. Review and audit plan: first guards and four open answers (9 November 2026)" -- `D-112` — line 1438, heading: "D-112. Phone bottom bar: the floating bar (9 November 2026)" -- `D-113` — line 1447, heading: "D-113. Second patient identifier on accept and Mark done; no initials search (9 November 2026)" -- `D-114` — line 1457, heading: "D-114. Allow pull_request_target for three workflows only (9 November 2026)" -- `D-115` — line 1465, heading: "D-115. One count on every screen, and a missing patient shown everywhere (9 November 2026)" -- `D-116` — line 1479, heading: "D-116. Page tops: the PR #1581 recommendations stand (9 November 2026)" -- `D-117` — line 1496, heading: "D-117. Care plans follow-up: frequent presenter count, tribunal date and ward flags (10 November 2026)" -- `D-118` — line 1505, heading: "D-118. Page tops: Referrals and Ward phone limits up to 8 KB above main (10 November 2026)" -- `D-119` — line 1511, heading: "D-119. Page tops: phone limits raised to measured sizes, trim after merge (10 November 2026)" -- `D-120` — line 1518, heading: "D-120. Discharge and capacity values: pull limit, transport delay and discharge date slip (9 November 2026)" -- `D-121` — line 1527, heading: "D-121. Working rules, guards and your PC from the 10 November 2026 audit (10 November 2026)" -- `D-122` — line 1541, heading: "D-122. Clinical and privacy answers from the 10 November 2026 audit (10 November 2026)" -- `D-123` — line 1554, heading: "D-123. Master audit list answers: two clinical fixes and five working rules (10 November 2026)" -- `D-124` — line 1568, heading: "D-124. Offline saves whose record changed are refused and shown (10 November 2026)" -- `D-125` — line 1575, heading: "D-125. Top 10 audit follow-ups approved (10 November 2026)" -- `D-126` — line 1587, heading: "D-126. Ranked lists: neutral orders approved (10 November 2026)" -- `D-127` — line 1606, heading: "D-127. Neutral wording for a community treatment order at arrival (10 November 2026)" -- `D-128` — line 1613, heading: "D-128. Final master audit: nine answers (10 November 2026)" -- `D-129` — line 1628, heading: "D-129. Master audit findings: every recommendation approved (10 November 2026)" -- `D-130` — line 1678, heading: "D-130. Audit follow-ups: every remaining recommendation approved (10 November 2026)" -- `D-131` — line 1694, heading: "D-131. Hard-case demo data allowed, and the movement diagram follows the engine (10 November 2026)" -- `D-132` — line 1703, heading: "D-132. Audit fixes group 1: docs and CI guards (10 November 2026)" -- `D-133` — line 1713, heading: "D-133. Batch 1 (ED and referral flow): three answers (10 November 2026)" -- `D-134` — line 1723, heading: "D-134. Ward arrival and beds batch: how to hold, advocate line, night list and the feature freeze (10 November 2026)" -- `D-135` — line 1746, heading: "D-135. Batch 4, outages and pilot control: pack age and plan answers (10 November 2026)" -- `D-136` — line 1755, heading: "D-136. Feature batch 3 (shift change and follow-up): two signed values (10 November 2026)" -- `D-137` — line 1767, heading: "D-137. Feature build batch 5: count leak first, TV change mark and QR library (10 November 2026)" -- `D-138` — line 1783, heading: "D-138. Phone alert urgency by kind (10 November 2026)" -- `D-139` — line 1789, heading: "D-139. Phone Statistics ward list A to Z, and leave return times as typed (10 November 2026)" -- `D-140` — line 1799, heading: "D-140. Feature list adopted, and Wave 1 begins (10 November 2026)" -- `D-141` — line 1812, heading: "D-141. Batch 1 (ED and referral flow) design approved, with eleven answers (11 November 2026)" -- `D-142` — line 1830, heading: "D-142. Batch 4: design review and all twelve answers approved, D-80 amended for site features (11 November 2026)" -- `D-143` — line 1842, heading: "D-143. MHERT is MHERL in the glossary; SMHMR deferred (11 November 2026)" -- `D-144` — line 1850, heading: "D-144. Chip rows move only sideways on a phone (11 November 2026)" -- `D-146` — line 1856, heading: "D-146. Performance audit fixes and the phone speed target (11 November 2026)" -- `D-147` — line 1862, heading: "D-147. Demo-code tries keep per-address keying until a trusted proxy is set (11 November 2026)" -- `D-152` — line 1868, heading: "D-152. Returned to ED prompt sees every return in shared mode (11 November 2026)" -- `D-153` — line 1876, heading: "D-153. Keep the drawn-time settle check, and defer a separate agent GitHub identity (11 November 2026)" -- `D-154` — line 1884, heading: "D-154. The community desk's ED heads-up reads a narrow scoped list (11 November 2026)" +150 item(s): + +- `D-1` — line 179, heading: "D-1. Ward Flow is local only, with no linked repository (Replaced by D-27)" +- `D-2` — line 189, heading: "D-2. Railway is disconnected" +- `D-3` — line 200, heading: "D-3. The PsychSift and Database code is being retired from Ward Flow" +- `D-4` — line 208, heading: "D-4. Synthetic patients only" +- `D-5` — line 216, heading: "D-5. Parallel threads in separate worktrees, folded one at a time" +- `D-6` — line 227, heading: "D-6. Aboriginal cultural safety review deferred" +- `D-7` — line 235, heading: "D-7. The first four milestones, in this order" +- `D-8` — line 247, heading: "D-8. Josh's standing rulings, numbered R1 to R16, for every session and tool" +- `D-9` — line 279, heading: "D-9. Josh's rulings of 25 September, 11:43 to 12:00 (R17 to R21)" +- `D-10` — line 293, heading: "D-10. Gate build type check (R22)" +- `D-11` — line 302, heading: "D-11. Rulings of 25 September, 12:41 (R23 to R25)" +- `D-12` — line 318, heading: "D-12. Rulings of 25 September, 12:43 (R26 to R31)" +- `D-13` — line 337, heading: "D-13. Tooling tests in batch gates (R32)" +- `D-14` — line 347, heading: "D-14. Standing defaults: decide small things without asking" +- `D-15` — line 359, heading: "D-15. Rulings of 25 September, 13:26 (R33 to R35)" +- `D-16` — line 372, heading: "D-16. Legal overrides and form receipts, 25 September 13:51 UTC" +- `D-17` — line 385, heading: "D-17. Morning roll-up time is Josh's own default (25 September)" +- `D-18` — line 396, heading: "D-18. The privacy lock stops saving only for typed text (25 September)" +- `D-19` — line 407, heading: "D-19. Rulings of 25 September, evening (walkthrough, leave beds, PsychSift, gender display)" +- `D-20` — line 437, heading: "D-20. One high-contrast colour check retired (26 September)" +- `D-21` — line 450, heading: "D-21. Coordinator bed board: all nine recommended answers (26 September)" +- `D-22` — line 462, heading: "D-22. No legal limits in hour rules; the rest are labelled defaults (26 September)" +- `D-23` — line 478, heading: "D-23. Leave-bed fields kept; patient search stops matching by ward (26 September)" +- `D-24` — line 492, heading: "D-24. Hour-rules morning list: all A (26 September)" +- `D-25` — line 516, heading: "D-25. The lone-patient check counts free beds on both matching paths (26 September)" +- `D-26` — line 524, heading: "D-26. Select fold checks by changed risk (27 September)" +- `D-27` — line 542, heading: "D-27. Ward Flow uses its dedicated repository (28 September)" +- `D-28` — line 555, heading: "D-28. Design Modernization & Anti-Box Architecture (30 September 2026)" +- `D-29` — line 569, heading: "D-29. Act time limits shown as a labelled synthetic demo (4 October 2026)" +- `D-30` — line 584, heading: "D-30. Central Coordinator Approval for Inter-Ward Bed Transfers (6 October 2026)" +- `D-31` — line 591, heading: "D-31. Gender-Diverse Bed Placement Policy & Clinical Override Safety (6 October 2026)" +- `D-32` — line 598, heading: "D-32. FIFO Waiting Time with Clinical Triage Badging vs Algorithmic Urgency Sorting (6 October 2026)" +- `D-33` — line 605, heading: "D-33. Separation of Local Ward Shift Notes from Statewide Coordinator Telemetry (6 October 2026)" +- `D-34` — line 612, heading: "D-34. Acute Medical Deterioration Bed Release and Escalation Protocol (6 October 2026)" +- `D-35` — line 619, heading: "D-35. Deferral of Regional Multi-Leg Transport & RFDS Repatriation (6 October 2026)" +- `D-36` — line 626, heading: "D-36. Affirmation of External Governance & Clinical Safety Hard Gates (6 October 2026) (Replaced by D-87)" +- `D-37` — line 641, heading: "D-37. External Governance Hard Gate Operational Postures & Resolution Roadmap (6 October 2026) (Replaced by D-87)" +- `D-38` — line 668, heading: "D-38. Leave, absent without leave and CTO on the Patient page (9 October 2026)" +- `D-39` — line 686, heading: "D-39. Patients are identified by UMRN, never by a WF number (9 October 2026)" +- `D-40` — line 730, heading: "D-40. A second community treatment order keeps the first (9 October 2026)" +- `D-41` — line 741, heading: "D-41. Delays board filters narrow the table and state the hidden count (9 October 2026)" +- `D-42` — line 754, heading: "D-42. 12px typography floor with no uppercase exception reaffirmed in Design System v9 (9–10 October 2026)" +- `D-43` — line 760, heading: "D-43. Colour lives in glyphs and the hero; red means act now with a thin 1px edge, never a fill (9 October 2026)" +- `D-44` — line 767, heading: "D-44. Compact sizing, white cards and smaller text retained over expression-test card tints (9 October 2026)" +- `D-45` — line 773, heading: "D-45. Phone is its own 390×844 design, never a desktop reflow (9 October 2026)" +- `D-46` — line 780, heading: "D-46. Every page has a focal part, a part of its own, a page-specific hero and command-bar action rules (9 October 2026)" +- `D-47` — line 786, heading: "D-47. Glass stays about 80% opaque with the top sheen kept (10 October 2026)" +- `D-48` — line 792, heading: "D-48. Figures stay in Geist Mono with tabular digits while chart axes use Geist Sans (10 October 2026)" +- `D-49` — line 798, heading: "D-49. Ward Flow 44px default row target (dense 36px, touch 52px) vs retired 48px PsychSift tap knob (10 October 2026)" +- `D-50` — line 804, heading: "D-50. Neutral T1 urgency pill vs Form 1A amber statutory warning badge (10 October 2026)" +- `D-51` — line 810, heading: "D-51. Delays filters hide rows with a stated hidden count while other queues highlight by default (10 October 2026)" +- `D-52` — line 817, heading: "D-52. 10 October page review rulings: time-axis overdue zone, 15px/20px strip figures, 8px people pips and incremental shared parts (10 October 2026)" +- `D-53` — line 823, heading: "D-53. Elevate design language and Glare mode adopted for Design System v9 (10 October 2026)" +- `D-54` — line 830, heading: "D-54. Tier time thresholds remain synthetic demo values requiring clinical sign-off (10 October 2026)" +- `D-55` — line 838, heading: "D-55. Supabase is Ward Flow's database and sign-in provider, and Azure is retired (15 October 2026)" +- `D-56` — line 844, heading: "D-56. Josh signs the clinical values that have a recorded source, for the prototype (15 October 2026)" +- `D-57` — line 850, heading: "D-57. Twenty Top 25 items move from the showcase into the real screens, each behind its own flag (15 October 2026)" +- `D-58` — line 877, heading: "D-58. Josh signs three more clinical values that have a national source, for the prototype (15 October 2026)" +- `D-59` — line 883, heading: "D-59. Each role sees only what it needs, from one access table (15 October 2026)" +- `D-60` — line 889, heading: "D-60. Criteria led discharge, for voluntary patients only (15 October 2026)" +- `D-61` — line 898, heading: "D-61. Tasks and Alerts are one queue called Alerts (16 October 2026)" +- `D-62` — line 904, heading: "D-62. The one Alerts queue is signed off and its flag removed (16 October 2026)" +- `D-63` — line 910, heading: "D-63. Josh signs the remaining clinical values and the criteria list, for the prototype (16 October 2026)" +- `D-64` — line 918, heading: "D-64. Criteria led discharge shows on the boards and warns at departure (16 October 2026)" +- `D-65` — line 925, heading: "D-65. Criteria led discharge on in production, typed patient specific criteria, and the AWOL bed hold review paused (17 October 2026)" +- `D-66` — line 941, heading: "D-66. Granted roles work without a second approval (17 October 2026)" +- `D-67` — line 949, heading: "D-67. Recover synthetic form drafts within the browser session (17 October 2026)" +- `D-68` — line 956, heading: "D-68. Bed meeting TV content and access (19 October 2026)" +- `D-69` — line 964, heading: "D-69. A referral with no legal status: "Needs an involuntary-capable bed until status is set." (20 October 2026)" +- `D-70` — line 971, heading: "D-70. No computed Mental Health Act periods: show only the recorded due time (20 October 2026)" +- `D-71` — line 977, heading: "D-71. Audit 1 clinical safety fixes: no suggested wards, wait-order queues, recorded facts only (20 October 2026)" +- `D-72` — line 990, heading: "D-72. Seven product decisions for the 21 October fix plan (21 October 2026)" +- `D-73` — line 1006, heading: "D-73. Batch merge safeguards (21 October 2026)" +- `D-74` — line 1022, heading: "D-74. Owner answers to the 21 October open questions (21 October 2026)" +- `D-75` — line 1043, heading: "D-75. UX audit follow-up, page caching, community gaps and the extra-travel bed hold (21 October 2026)" +- `D-76` — line 1056, heading: "D-76. Community referral gaps: the full move journey and asking more wards (21 October 2026)" +- `D-77` — line 1065, heading: "D-77. The ten bigger UX changes approved for build (22 October 2026)" +- `D-78` — line 1085, heading: "D-78. One decline list for wards and coordinators (22 October 2026)" +- `D-79` — line 1096, heading: "D-79. Wards see the full referral, with name and UMRN, before they answer (23 October 2026)" +- `D-80` — line 1107, heading: "D-80. Role access plan version 2: all 17 recommendations (23 October 2026)" +- `D-81` — line 1122, heading: "D-81. Pulled, with a pull time limit, for a bed kept for an incoming patient (24 October 2026)" +- `D-82` — line 1129, heading: "D-82. A PR may raise a phone size limit by up to 5 KB per screen without asking (26 October 2026)" +- `D-83` — line 1137, heading: "D-83. Patient names stay in full on every screen, copy and TV; privacy work must not make the app less useful (26 October 2026)" +- `D-84` — line 1148, heading: "D-84. The live app stays on Railway Singapore for now, and there is no server-side TV account yet (26 October 2026)" +- `D-85` — line 1156, heading: "D-85. "Held" only for a bed kept for its own patient; "pulled" for an incoming bed; "held up" for a delay (26 October 2026)" +- `D-86` — line 1163, heading: "D-86. No second approver for role grants, at pilot or otherwise (27 October 2026)" +- `D-87` — line 1170, heading: "D-87. D-36 and D-37 are replaced by the real-data gate (27 October 2026)" +- `D-88` — line 1182, heading: "D-88. The public demo opens with a demo code once the front door is on (27 October 2026)" +- `D-89` — line 1189, heading: "D-89. Redesign mock-up copies of large screens may pass the 1,500-line cap (30 October 2026)" +- `D-90` — line 1197, heading: "D-90. Help gets How do I…, Show me runs everywhere, and Help is built without a separate mock-up step (30 October 2026)" +- `D-91` — line 1208, heading: "D-91. One design home for the redesign, and Josh's answers on Help, Settings, search and notifications (31 October 2026)" +- `D-92` — line 1243, heading: "D-92. Help goes live before its mock-up review, one search box on Capacity, and referral rows on Home open the panel (31 October 2026)" +- `D-93` — line 1253, heading: "D-93. Legal form times show only as typed, never as a countdown (31 October 2026)" +- `D-94` — line 1261, heading: "D-94. Design rulings of 31 October 2026" +- `D-95` — line 1274, heading: "D-95. One page scroll, and a click outside closes a drawer (3 November 2026)" +- `D-96` — line 1284, heading: "D-96. A named bed is pulled, and its patient is not also waiting (8 November 2026)" +- `D-97` — line 1294, heading: "D-97. Owner answers on seven open items: N21, N25, N26, N29, N40, N41 and WF-B008 (8 November 2026)" +- `D-98` — line 1307, heading: "D-98. Friction pass: Quick bar, Patient peek and Ward peek (8 November 2026)" +- `D-99` — line 1316, heading: "D-99. "Real details" in the referral drawer's sample patients (25 September 2026)" +- `D-100` — line 1322, heading: "D-100. "Under a form" means one rule everywhere (9 November 2026)" +- `D-101` — line 1329, heading: "D-101. Clinically ready for discharge, with one delay reason (9 November 2026)" +- `D-102` — line 1338, heading: "D-102. Report-a-problem screenshots are blurred, and patient-table exports carry no names (9 November 2026)" +- `D-103` — line 1347, heading: "D-103. Any coordinator on shift may mark a bed override reviewed (9 November 2026)" +- `D-104` — line 1354, heading: "D-104. Care plans and safety flags: five defaults (9 November 2026)" +- `D-105` — line 1366, heading: "D-105. Optional clerk details on the patient record (8 November 2026)" +- `D-106` — line 1373, heading: "D-106. Clinical values from the 9 November 2026 documentation audit (9 November 2026)" +- `D-107` — line 1385, heading: "D-107. Working rules and documentation from the 9 November 2026 audit (9 November 2026)" +- `D-108` — line 1399, heading: "D-108. Six bed-flow features: keep D-93 and D-72, ED long-wait next steps (9 November 2026)" +- `D-109` — line 1408, heading: "D-109. Home's bed alert line tests the whole number shown (9 November 2026)" +- `D-110` — line 1415, heading: "D-110. ED and referral flow: neutral fit line, clearance timing and alternatives to admission (9 November 2026)" +- `D-111` — line 1425, heading: "D-111. Review and audit plan: first guards and four open answers (9 November 2026)" +- `D-112` — line 1439, heading: "D-112. Phone bottom bar: the floating bar (9 November 2026)" +- `D-113` — line 1448, heading: "D-113. Second patient identifier on accept and Mark done; no initials search (9 November 2026)" +- `D-114` — line 1458, heading: "D-114. Allow pull_request_target for three workflows only (9 November 2026)" +- `D-115` — line 1466, heading: "D-115. One count on every screen, and a missing patient shown everywhere (9 November 2026)" +- `D-116` — line 1480, heading: "D-116. Page tops: the PR #1581 recommendations stand (9 November 2026)" +- `D-117` — line 1497, heading: "D-117. Care plans follow-up: frequent presenter count, tribunal date and ward flags (10 November 2026)" +- `D-118` — line 1506, heading: "D-118. Page tops: Referrals and Ward phone limits up to 8 KB above main (10 November 2026)" +- `D-119` — line 1512, heading: "D-119. Page tops: phone limits raised to measured sizes, trim after merge (10 November 2026)" +- `D-120` — line 1519, heading: "D-120. Discharge and capacity values: pull limit, transport delay and discharge date slip (9 November 2026)" +- `D-121` — line 1528, heading: "D-121. Working rules, guards and your PC from the 10 November 2026 audit (10 November 2026)" +- `D-122` — line 1542, heading: "D-122. Clinical and privacy answers from the 10 November 2026 audit (10 November 2026)" +- `D-123` — line 1555, heading: "D-123. Master audit list answers: two clinical fixes and five working rules (10 November 2026)" +- `D-124` — line 1569, heading: "D-124. Offline saves whose record changed are refused and shown (10 November 2026)" +- `D-125` — line 1576, heading: "D-125. Top 10 audit follow-ups approved (10 November 2026)" +- `D-126` — line 1588, heading: "D-126. Ranked lists: neutral orders approved (10 November 2026)" +- `D-127` — line 1607, heading: "D-127. Neutral wording for a community treatment order at arrival (10 November 2026)" +- `D-128` — line 1614, heading: "D-128. Final master audit: nine answers (10 November 2026)" +- `D-129` — line 1629, heading: "D-129. Master audit findings: every recommendation approved (10 November 2026)" +- `D-130` — line 1679, heading: "D-130. Audit follow-ups: every remaining recommendation approved (10 November 2026)" +- `D-131` — line 1695, heading: "D-131. Hard-case demo data allowed, and the movement diagram follows the engine (10 November 2026)" +- `D-132` — line 1704, heading: "D-132. Audit fixes group 1: docs and CI guards (10 November 2026)" +- `D-133` — line 1714, heading: "D-133. Batch 1 (ED and referral flow): three answers (10 November 2026)" +- `D-134` — line 1724, heading: "D-134. Ward arrival and beds batch: how to hold, advocate line, night list and the feature freeze (10 November 2026)" +- `D-135` — line 1747, heading: "D-135. Batch 4, outages and pilot control: pack age and plan answers (10 November 2026)" +- `D-136` — line 1756, heading: "D-136. Feature batch 3 (shift change and follow-up): two signed values (10 November 2026)" +- `D-137` — line 1768, heading: "D-137. Feature build batch 5: count leak first, TV change mark and QR library (10 November 2026)" +- `D-138` — line 1784, heading: "D-138. Phone alert urgency by kind (10 November 2026)" +- `D-139` — line 1790, heading: "D-139. Phone Statistics ward list A to Z, and leave return times as typed (10 November 2026)" +- `D-140` — line 1800, heading: "D-140. Feature list adopted, and Wave 1 begins (10 November 2026)" +- `D-141` — line 1813, heading: "D-141. Batch 1 (ED and referral flow) design approved, with eleven answers (11 November 2026)" +- `D-142` — line 1831, heading: "D-142. Batch 4: design review and all twelve answers approved, D-80 amended for site features (11 November 2026)" +- `D-143` — line 1843, heading: "D-143. MHERT is MHERL in the glossary; SMHMR deferred (11 November 2026)" +- `D-144` — line 1851, heading: "D-144. Chip rows move only sideways on a phone (11 November 2026)" +- `D-145` — line 1857, heading: "D-145. Repository review: fixes, features and code health approved (11 November 2026)" +- `D-146` — line 1871, heading: "D-146. Performance audit fixes and the phone speed target (11 November 2026)" +- `D-147` — line 1877, heading: "D-147. Demo-code tries keep per-address keying until a trusted proxy is set (11 November 2026)" +- `D-152` — line 1883, heading: "D-152. Returned to ED prompt sees every return in shared mode (11 November 2026)" +- `D-153` — line 1891, heading: "D-153. Keep the drawn-time settle check, and defer a separate agent GitHub identity (11 November 2026)" +- `D-154` — line 1899, heading: "D-154. The community desk's ED heads-up reads a narrow scoped list (11 November 2026)" ### `../history/archive/dated-notes/ward-management-decisions.md` (2026-08-18 – 2026-10-24 (mixed, see file)) diff --git a/docs/ward-flow/decisions.md b/docs/ward-flow/decisions.md index 29c942bc78..947507579f 100644 --- a/docs/ward-flow/decisions.md +++ b/docs/ward-flow/decisions.md @@ -167,6 +167,7 @@ Checked 9 November 2026 (D-107 audit). "Partly replaced" means part of the entry | [D-142](#d-142-batch-4-design-review-and-all-twelve-answers-approved-d-80-amended-for-site-features-11-november-2026) | Batch 4: design review and all twelve answers approved, D-80 amended for site features | Active | | [D-143](#d-143-mhert-is-mherl-in-the-glossary-smhmr-deferred-11-november-2026) | MHERT is MHERL in the glossary; SMHMR deferred | Active | | [D-144](#d-144-chip-rows-move-only-sideways-on-a-phone-11-november-2026) | Chip rows move only sideways on a phone | Active | +| [D-145](#d-145-repository-review-fixes-features-and-code-health-approved-11-november-2026) | Repository review: fixes, features and code health approved | Active | | [D-146](#d-146-performance-audit-fixes-and-the-phone-speed-target-11-november-2026) | Performance audit fixes and the phone speed target | Active | | [D-147](#d-147-demo-code-tries-keep-per-address-keying-until-a-trusted-proxy-is-set-11-november-2026) | Demo-code tries keep per-address keying until a trusted proxy is set | Active | | [D-152](#d-152-returned-to-ed-prompt-sees-every-return-in-shared-mode-11-november-2026) | Returned to ED prompt sees every return in shared mode | Active | @@ -1853,6 +1854,20 @@ is inferred. - **Decision:** on a phone, the page-top quick-link chip rows, the Home quick bar, the shared phone chip row and Home's "Waiting in ED" strip take `touch-action: pan-x`. A finger on one of these rows can only move it sideways. The accepted trade-off is that a vertical swipe starting on one of these rows does not scroll the page. Reason: iPhone still slid the rows up and down after three layout fixes (#1596, #1602, #1610), and the cause could not be reproduced off the device. - **Boundary:** presentation only, synthetic data. Changes no clinical value or rule, and approves no merge or release. +## D-145. Repository review: fixes, features and code health approved (11 November 2026) + +- **Date:** 11 November 2026 (`2026-11-11`). **Decided by:** Josh, in the Ward Flow project thread "Review repository for issues and new features": "Go ahead with all these recommendations please" (03:55 UTC), answering the review doc "Ward Flow repository review, 11 November 2026". Numbered D-145 because D-133 to D-144 belong to other threads. D-139 is claimed by open PR #1600, D-140 is claimed by open PR #1606, D-141 is claimed by open PR #1606, D-142 is claimed by open PR #1603, D-143 is claimed by open PR #1612, and D-144 is claimed by open PR #1617. +- **Decision:** + 1. **Clinical display fixes, one held PR:** a ward's expected occupancy no longer counts a patient twice when they hold a named bed and also have a booked planned admission to that ward; an ended legal form says it ended and gives the expiry only as it was typed; the ED screen flags a long wait at 24 hours or more, like every other screen. + 2. **Non-clinical fixes:** one lapse check for pull holds, staff requests keep the shift the person chose, one reader for typed times, one length-of-stay calculation, a demo code shorter than 12 characters counts as no code (added after PR #1615 merged; spaces and dashes not counted), and a demo pass stops working when the code changes. Two lines added to the real-data go/no-go list (record ids never built from UMRNs; a check of the push library). + 3. **Features that finish existing screens** (not covered by the D-128 item 9 pause): Leave page links, print and entry point; Help for pages that had none; print and spreadsheet export on Legal forms and Movements. Triage risk reviews due waits until #1564 to #1577 close and needs its own clinical sign-off. + 4. **Code health:** the file line cap counts code lines, not comments or blank lines; one shared CI setup step; shared helpers for the forked side rail; reasons or fixes for unexplained React hook rule switch-offs; patch-level dependency updates. + 5. **Josh's own action:** turn off Supabase open sign-up before real data. +- **Screens approved (11 November 2026, 05:46 UTC):** after the design review page "Leave and export review", Josh chose "Yes, add them" on the decision card. This approves the item 3 screens and two new patterns: an icon-only Print button on phones, and the Export status line hidden until it has something to say (this affects every list with Export). +- **Clinical sign-off (11 November 2026, 05:51 UTC):** Josh wrote "I approve all of them to remove labels" in the thread "Get all open PRs merged", approving the item 1 fixes in PR #1621 as built, including the Legal forms wording "Form ended; expiry as typed was HH:MM". +- **Why:** findings from the 11 November review, each checked against source; the clinical items were display bugs, not changes to signed values. +- **Boundary:** synthetic data only. Changes no signed clinical value; clinical items merge only after Josh checks the held PR. Approves no release. + ## D-146. Performance audit fixes and the phone speed target (11 November 2026) - **Date:** 11 November 2026 (`2026-11-11`). **Decided by:** Josh, in the Ward Flow project thread "Audit Ward Flow performance" ("Go ahead with all the issues and fixes for all the findings please", 03:55 UTC), approving every recommendation in the performance audit report. Numbered D-146 because D-139 to D-144 are claimed by open PRs #1600, #1606, #1603, #1612 and #1617, and D-145 is claimed by open PR #1623 (the repository review thread). diff --git a/docs/ward-flow/governance/REAL-DATA-GO-NO-GO.md b/docs/ward-flow/governance/REAL-DATA-GO-NO-GO.md index 7d87d08c8b..72deba8169 100644 --- a/docs/ward-flow/governance/REAL-DATA-GO-NO-GO.md +++ b/docs/ward-flow/governance/REAL-DATA-GO-NO-GO.md @@ -1,5 +1,7 @@ # Real patient data: go/no-go checklist +_Updated 2026-11-11 - section 1 adds C8 (record ids never from a medical record number) and C9 (web push library check); open sign-up off is already the Supabase row in section 4 (M49); Documentation owns._ + _Updated 2026-11-10 - audit M127: section 0 makes this page the one real-data gate tracker for D-87 and D-111 item 8, with owners and the File A to master-list crosswalk; Documentation owns._ _Updated 2026-11-10 - section 4 rechecked against repository records and the Sentry row corrected (audit item M61); drafts linked under sections 2 and 3; Documentation owns._ @@ -57,6 +59,8 @@ list renumbered them. Use the M number in new work. | C5 | **Sign-in token storage.** The Supabase refresh token sits in sessionStorage, readable by page scripts, because the backend is on another site (H-0044). | `ward-flow:auth::v1` in `ward-auth-session.ts` | Either the token moves to an HttpOnly cookie on a same-site backend, or the PIA accepts the risk with a session time limit and the strict content security policy kept. | | C6 | **Data-mode lock opened on purpose.** Migration 7 limits the database to `prototype`, and the backend refuses any other `WARD_DATA_MODE`. | `migrations/007-prototype-only.sql`, `backend/ward-flow/config.mjs` | A new decision and migration allow `live`, only after sections 2 to 5 are complete. Never by hand in the console. | | C7 | **Logs and error reports.** Sentry is server-side, off unless `SENTRY_DSN` is set, and scrubbed. | `src/lib/sentry-server.ts` (`scrubSentryEvent`) | A test sends an event containing synthetic names and free text and shows none of it leaves the server. Railway and Supabase logs checked for request bodies. | +| C8 | **Record ids never from a medical record number.** Record ids (`WF-`, `PT-`, `RF-`, `AD-`) are made up inside Ward Flow. The record-address code only hides an id in the address bar: it is a fixed XOR with a key in the source, so anyone can reverse it. An id built from a UMRN or other medical record number would put that number in every address. | `encodeRecordAddress` in `src/components/ward-management/shell/ward-record-address.ts` | A written rule and a test show no record id is derived from a UMRN or medical record number, or addresses carry an opaque server-issued key instead. | +| C9 | **Web push library checked.** Alerts are sent with the `web-push` package on the backend. It has had no vendor or security review. | `web-push` in `backend/ward-flow/package.json` | A vendor and security check of the package (maintenance, known issues, what it sends to push services) is recorded, or push is turned off for live workspaces. | Already in place, checked 3 Nov 2026: sign-out, expiry and a refused session clear every Ward Flow key from browser storage (`ward-browser-data.ts`); the service worker caches static files diff --git a/docs/ward-flow/journey/MAP-INVENTORY.md b/docs/ward-flow/journey/MAP-INVENTORY.md index 01e4730c06..93d97ca9b5 100644 --- a/docs/ward-flow/journey/MAP-INVENTORY.md +++ b/docs/ward-flow/journey/MAP-INVENTORY.md @@ -1694,13 +1694,14 @@ Source-contract SHA256: 7cfda9a71c556b4d10a573977f0ef64456a4f9bb9890c7a236952cd7 Scope: Ward, coordinator or site bed manager in EVENT_ROLE; a ward acts only for its own ward (actingUnitId must equal unitId). Executive changes nothing (D-80). Shared authenticated command scope additionally checks the permitted place and stored record; EVENT_ROLE alone is not place authority. payload: unitId; shift this or next; count 1, 2, 3 or 4 or more payload: reasons: one or more distinct items from STAFF_REQUEST_REASONS; actingUnitId for ward callers; role and now + payload: optional shiftStartAt: the start of the shift the person chose; kept only when it is that shift's start at now or 5 minutes earlier, otherwise the shift at now is used guards: Known unit; shift and count from their lists guards: Reject empty, duplicate or unlisted reasons, and a ward naming another ward effects: Appends a record, or updates count, reasons and updatedAt on the open one; never names a patient effects: Does not change beds, placement, movements or any patient stage tests: tests/ward-staff-requests.test.ts Reviewed source: src/components/ward-management/ward-flow-reducer.ts:2268; SHA256 ff62a01c308a19a3cd2f6ea39a1502194855812ad15c7599a441bc8c9e32c4f6 - Reviewed source: src/components/ward-management/staffing/staff-requests.ts:132; SHA256 d3e51d13faedefa5314d5f128c59473110a61bae075bd5ddb362788d5ae479f3 + Reviewed source: src/components/ward-management/staffing/staff-requests.ts:156; SHA256 e47b9fadc1f70f84b56bd4e91eb36f5b95f85da6234e10f6251bea10c3f6237a Reviewed source: src/components/ward-management/ward-flow-event-roles.ts:605; SHA256 808d614bd517bb11c0ef517ce5632dd3caba8a71758476401f35da82fe26afda - CLOSE_WARD_STAFF_REQUEST — modelled; event roles: ward, coordinator, bed_manager Source-reviewed command model: an open staff request closed as arranged, not available or withdrawn. @@ -1718,7 +1719,7 @@ Source-contract SHA256: 7cfda9a71c556b4d10a573977f0ef64456a4f9bb9890c7a236952cd7 effects: Does not change beds, placement, movements or any patient stage tests: tests/ward-staff-requests.test.ts Reviewed source: src/components/ward-management/ward-flow-reducer.ts:2269; SHA256 ff62a01c308a19a3cd2f6ea39a1502194855812ad15c7599a441bc8c9e32c4f6 - Reviewed source: src/components/ward-management/staffing/staff-requests.ts:171; SHA256 d3e51d13faedefa5314d5f128c59473110a61bae075bd5ddb362788d5ae479f3 + Reviewed source: src/components/ward-management/staffing/staff-requests.ts:195; SHA256 e47b9fadc1f70f84b56bd4e91eb36f5b95f85da6234e10f6251bea10c3f6237a Reviewed source: src/components/ward-management/ward-flow-event-roles.ts:615; SHA256 808d614bd517bb11c0ef517ce5632dd3caba8a71758476401f35da82fe26afda - SET_SITE_FEATURE_SWITCH — modelled; event roles: coordinator Source-reviewed command model: one listed feature switched off, or back on, at one site (Batch 4 item 20, D-135; access admin by D-142). diff --git a/docs/ward-flow/journey/README.md b/docs/ward-flow/journey/README.md index 3e12573bd3..bb1d57fb55 100644 --- a/docs/ward-flow/journey/README.md +++ b/docs/ward-flow/journey/README.md @@ -302,3 +302,7 @@ Source digests were re-reviewed against the Batch 4 command review (`573c7ff77`) - Screens now dispatch the new events: `SET_SITE_FEATURE_SWITCH` from Features at this site on the access admin's Access tab, and `RECORD_OUTAGE_WINDOW` from the coordinator's Record an outage form on the downtime pack. The ward catch-up card, outage bed tags, Home's catch-up card, the old packs band and the ward's pack printed line read the records. The `SET_SITE_FEATURE_SWITCH`, `RECORD_OUTAGE_WINDOW` and `RECORD_DOWNTIME_PACK_PRINTED` models say so and cite the new screen tests. The same day, the print time record moved from `reports/downtime-pack-prints.ts` to the ward root as `ward-downtime-pack-prints.ts`, so the coordinator and ward screens read it without a screen-to-screen import (the import map guard). The file's text is unchanged, so its cited line and digest stand; only the path changed. `ward-flow-pilot-control-events.ts` and `ward-outage-catch-up.ts` changed one import line each, so no cited line moved and only their digests were re-recorded. + +## Source review — 11 Nov 2026 (main merged into the repository review, PR #1623, D-145) + +After `main` (with #1624's screen figures hook, D-146) was merged into this branch, `ward/ward-screen.tsx` holds both sides' edits: this PR's reasons on three hook rule switch-offs and `main`'s move of the bed, occupancy and roster figures into `use-ward-screen-figures.ts`. Each of the twelve cited lines was found again by its text, unchanged in role, payload and guard; each now sits three lines above its place on `main`, and only the line numbers and digest were re-recorded. diff --git a/docs/ward-flow/journey/actions.json b/docs/ward-flow/journey/actions.json index e420e504da..5c50823142 100644 --- a/docs/ward-flow/journey/actions.json +++ b/docs/ward-flow/journey/actions.json @@ -172,8 +172,8 @@ }, { "path": "src/components/ward-management/patients/add-patient.tsx", - "line": 614, - "sha256": "fc5752f90ad948491ad836c940e4eb1571aba082c71cee36e4e6083afdf78002" + "line": 611, + "sha256": "e4d277572fc48f16fc5a3746118fc7ab1758d274ed28ae459d9cd1821a2de4f0" }, { "path": "src/components/ward-management/referrals/use-referral-command-completion.ts", @@ -396,8 +396,8 @@ }, { "path": "src/components/ward-management/ward/ward-screen.tsx", - "line": 1332, - "sha256": "2a4fe5a4d45c7f2a9c77b047f28817ca58f2dc31692fefa9a7cad402900d996d" + "line": 1329, + "sha256": "609353a46e34485afe5b65294ebe0e4e4239b09adf13946f6575668d60325ce3" }, { "path": "src/components/ward-management/referrals/referral-match.tsx", @@ -498,8 +498,8 @@ }, { "path": "src/components/ward-management/ed/use-ed-screen-decline.ts", - "line": 135, - "sha256": "ff7e1679d14d0e040af8cfa6bf07805d7c1bffc9cf8cf7a0d055fedc5f4862fd" + "line": 133, + "sha256": "f32c28822c1a39a28697617ed37d1cada5fa8bbce0c6ec1d2d9454107f60d01f" }, { "path": "src/components/ward-management/referrals/referral-match.tsx", @@ -1039,8 +1039,8 @@ }, { "path": "src/components/ward-management/ward/ward-screen.tsx", - "line": 1294, - "sha256": "2a4fe5a4d45c7f2a9c77b047f28817ca58f2dc31692fefa9a7cad402900d996d" + "line": 1291, + "sha256": "609353a46e34485afe5b65294ebe0e4e4239b09adf13946f6575668d60325ce3" }, { "path": "src/components/ward-management/ward/ward-answer-view.tsx", @@ -1131,8 +1131,8 @@ }, { "path": "src/components/ward-management/ward/ward-screen.tsx", - "line": 1385, - "sha256": "2a4fe5a4d45c7f2a9c77b047f28817ca58f2dc31692fefa9a7cad402900d996d" + "line": 1382, + "sha256": "609353a46e34485afe5b65294ebe0e4e4239b09adf13946f6575668d60325ce3" }, { "path": "src/components/ward-management/ward/ward-answer-view.tsx", @@ -1853,8 +1853,8 @@ }, { "path": "src/components/ward-management/ward/ward-screen.tsx", - "line": 1430, - "sha256": "2a4fe5a4d45c7f2a9c77b047f28817ca58f2dc31692fefa9a7cad402900d996d" + "line": 1427, + "sha256": "609353a46e34485afe5b65294ebe0e4e4239b09adf13946f6575668d60325ce3" }, { "path": "src/components/ward-management/ward/ward-answer-view.tsx", @@ -1968,8 +1968,8 @@ }, { "path": "src/components/ward-management/ward/ward-screen.tsx", - "line": 1828, - "sha256": "2a4fe5a4d45c7f2a9c77b047f28817ca58f2dc31692fefa9a7cad402900d996d" + "line": 1825, + "sha256": "609353a46e34485afe5b65294ebe0e4e4239b09adf13946f6575668d60325ce3" }, { "path": "src/components/ward-management/patients/patient-transit-operations.tsx", @@ -3093,8 +3093,8 @@ }, { "path": "src/components/ward-management/legal-forms/legal-forms-screen.tsx", - "line": 358, - "sha256": "6b9c32af15d569ddb7bcffdd4202bc0def13f74465b211163a1bd706293a4721" + "line": 365, + "sha256": "21e9f1961cac15e3deac106f62f32fd6f5b9dccd51020fd7827ebb52043b9d19" }, { "path": "src/components/ward-management/ward-flow-record-events.ts", @@ -3239,8 +3239,8 @@ }, { "path": "src/components/ward-management/legal-forms/legal-forms-screen.tsx", - "line": 1277, - "sha256": "6b9c32af15d569ddb7bcffdd4202bc0def13f74465b211163a1bd706293a4721" + "line": 1303, + "sha256": "21e9f1961cac15e3deac106f62f32fd6f5b9dccd51020fd7827ebb52043b9d19" }, { "path": "src/components/ward-management/ward-flow-record-legal-events.ts", @@ -3385,8 +3385,8 @@ }, { "path": "src/components/ward-management/ward/ward-screen.tsx", - "line": 1726, - "sha256": "2a4fe5a4d45c7f2a9c77b047f28817ca58f2dc31692fefa9a7cad402900d996d" + "line": 1723, + "sha256": "609353a46e34485afe5b65294ebe0e4e4239b09adf13946f6575668d60325ce3" }, { "path": "src/components/ward-management/tools/ward-tool-feed.tsx", @@ -3691,8 +3691,8 @@ }, { "path": "src/components/ward-management/ward/ward-screen.tsx", - "line": 1751, - "sha256": "2a4fe5a4d45c7f2a9c77b047f28817ca58f2dc31692fefa9a7cad402900d996d" + "line": 1748, + "sha256": "609353a46e34485afe5b65294ebe0e4e4239b09adf13946f6575668d60325ce3" }, { "path": "src/components/ward-management/board/ward-board.tsx", @@ -3824,8 +3824,8 @@ }, { "path": "src/components/ward-management/ward/ward-screen.tsx", - "line": 1664, - "sha256": "2a4fe5a4d45c7f2a9c77b047f28817ca58f2dc31692fefa9a7cad402900d996d" + "line": 1661, + "sha256": "609353a46e34485afe5b65294ebe0e4e4239b09adf13946f6575668d60325ce3" }, { "path": "src/components/ward-management/ward-flow-bed-events.ts", @@ -4037,8 +4037,8 @@ }, { "path": "src/components/ward-management/ward/ward-screen.tsx", - "line": 1683, - "sha256": "2a4fe5a4d45c7f2a9c77b047f28817ca58f2dc31692fefa9a7cad402900d996d" + "line": 1680, + "sha256": "609353a46e34485afe5b65294ebe0e4e4239b09adf13946f6575668d60325ce3" }, { "path": "src/components/ward-management/discharges/discharge-board.tsx", @@ -4170,8 +4170,8 @@ }, { "path": "src/components/ward-management/ward/ward-screen.tsx", - "line": 1572, - "sha256": "2a4fe5a4d45c7f2a9c77b047f28817ca58f2dc31692fefa9a7cad402900d996d" + "line": 1569, + "sha256": "609353a46e34485afe5b65294ebe0e4e4239b09adf13946f6575668d60325ce3" }, { "path": "src/components/ward-management/ward/ward-answer-view.tsx", @@ -4699,8 +4699,8 @@ }, { "path": "src/components/ward-management/ward/ward-screen.tsx", - "line": 1107, - "sha256": "2a4fe5a4d45c7f2a9c77b047f28817ca58f2dc31692fefa9a7cad402900d996d" + "line": 1104, + "sha256": "609353a46e34485afe5b65294ebe0e4e4239b09adf13946f6575668d60325ce3" }, { "path": "src/components/ward-management/ward-inbox-reducer.ts", @@ -6238,8 +6238,8 @@ }, { "path": "src/components/ward-management/legal-forms/legal-forms-screen.tsx", - "line": 524, - "sha256": "6b9c32af15d569ddb7bcffdd4202bc0def13f74465b211163a1bd706293a4721" + "line": 531, + "sha256": "21e9f1961cac15e3deac106f62f32fd6f5b9dccd51020fd7827ebb52043b9d19" }, { "path": "src/components/ward-management/ward-flow-record-legal-events.ts", @@ -6725,8 +6725,8 @@ }, { "path": "src/components/ward-management/ward/ward-screen.tsx", - "line": 1087, - "sha256": "2a4fe5a4d45c7f2a9c77b047f28817ca58f2dc31692fefa9a7cad402900d996d" + "line": 1084, + "sha256": "609353a46e34485afe5b65294ebe0e4e4239b09adf13946f6575668d60325ce3" }, { "path": "src/components/ward-management/ward-flow-reducer.ts", diff --git a/docs/ward-flow/journey/event-dispositions.json b/docs/ward-flow/journey/event-dispositions.json index 5c457660cb..82c7fb6f6d 100644 --- a/docs/ward-flow/journey/event-dispositions.json +++ b/docs/ward-flow/journey/event-dispositions.json @@ -4179,7 +4179,8 @@ "after": "staffRequests holds one open request for the ward and shift with count and ordered reasons", "payload": [ "unitId; shift this or next; count 1, 2, 3 or 4 or more", - "reasons: one or more distinct items from STAFF_REQUEST_REASONS; actingUnitId for ward callers; role and now" + "reasons: one or more distinct items from STAFF_REQUEST_REASONS; actingUnitId for ward callers; role and now", + "optional shiftStartAt: the start of the shift the person chose; kept only when it is that shift's start at now or 5 minutes earlier, otherwise the shift at now is used" ], "scope": "Ward, coordinator or site bed manager in EVENT_ROLE; a ward acts only for its own ward (actingUnitId must equal unitId). Executive changes nothing (D-80). Shared authenticated command scope additionally checks the permitted place and stored record; EVENT_ROLE alone is not place authority.", "guards": [ @@ -4198,8 +4199,8 @@ }, { "path": "src/components/ward-management/staffing/staff-requests.ts", - "line": 132, - "sha256": "d3e51d13faedefa5314d5f128c59473110a61bae075bd5ddb362788d5ae479f3" + "line": 156, + "sha256": "e47b9fadc1f70f84b56bd4e91eb36f5b95f85da6234e10f6251bea10c3f6237a" }, { "path": "src/components/ward-management/ward-flow-event-roles.ts", @@ -4240,8 +4241,8 @@ }, { "path": "src/components/ward-management/staffing/staff-requests.ts", - "line": 171, - "sha256": "d3e51d13faedefa5314d5f128c59473110a61bae075bd5ddb362788d5ae479f3" + "line": 195, + "sha256": "e47b9fadc1f70f84b56bd4e91eb36f5b95f85da6234e10f6251bea10c3f6237a" }, { "path": "src/components/ward-management/ward-flow-event-roles.ts", diff --git a/docs/ward-flow/journey/machines.json b/docs/ward-flow/journey/machines.json index fc2c1b608a..cb73aa6b7d 100644 --- a/docs/ward-flow/journey/machines.json +++ b/docs/ward-flow/journey/machines.json @@ -1744,7 +1744,7 @@ { "path": "src/components/ward-management/legal-forms/legal-forms-screen.tsx", "line": 1, - "sha256": "6b9c32af15d569ddb7bcffdd4202bc0def13f74465b211163a1bd706293a4721" + "sha256": "21e9f1961cac15e3deac106f62f32fd6f5b9dccd51020fd7827ebb52043b9d19" }, { "path": "src/components/ward-management/legal-forms/legal-forms-sheets.tsx", @@ -1754,7 +1754,7 @@ { "path": "src/components/ward-management/patients/add-patient.tsx", "line": 87, - "sha256": "fc5752f90ad948491ad836c940e4eb1571aba082c71cee36e4e6083afdf78002" + "sha256": "e4d277572fc48f16fc5a3746118fc7ab1758d274ed28ae459d9cd1821a2de4f0" }, { "path": "src/components/ward-management/patients/patient-now-screen.tsx", diff --git a/docs/ward-flow/journey/ward-journey-explorer.html b/docs/ward-flow/journey/ward-journey-explorer.html index ec7199f33c..446d353c83 100644 --- a/docs/ward-flow/journey/ward-journey-explorer.html +++ b/docs/ward-flow/journey/ward-journey-explorer.html @@ -1284,7 +1284,7 @@

What to do here