Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
1e534df
fix(design-system): pay down Hazard 1-2 contract debt
BigSimmo Aug 27, 2026
50c6791
Merge origin/main into ds-hazard-1-2-sweep
BigSimmo Aug 27, 2026
fda5756
style: format design-system docs after merging main
BigSimmo Aug 27, 2026
cd73993
Merge origin/main into ds-hazard-1-2-sweep
BigSimmo Aug 27, 2026
c88a661
Merge branch 'main' into ds-hazard-1-2-sweep
BigSimmo Aug 27, 2026
6ac1002
chore: refresh repo-awareness snapshot after merging main
BigSimmo Aug 27, 2026
1365ac0
Merge remote-tracking branch origin/ds-hazard-1-2-sweep
BigSimmo Aug 27, 2026
b7c7186
docs(design-system): pin GATES totals and v2 leading tokens
BigSimmo Aug 27, 2026
284454e
style: format PR 1 design-system docs
BigSimmo Aug 27, 2026
19ee085
chore: refresh repo-awareness snapshot after PR 1 docs
BigSimmo Aug 27, 2026
c651125
refactor(ui): complete 10 UI, layout precision, design system and dev…
BigSimmo Aug 27, 2026
75cc4fd
fix(design-system): use var(--duration-fast) in ward-management-modes…
BigSimmo Aug 27, 2026
ae1e839
fix(developer-area): fix ReviewRecord import in ReviewStateTable
BigSimmo Aug 27, 2026
149c39b
chore: merge origin/main into ui_refactor_maintenance_sweep
BigSimmo Aug 27, 2026
d29f542
style: format docs/design-system/GATES.md
BigSimmo Aug 27, 2026
37a5872
chore: refresh outstanding-issues and repo-awareness snapshots
BigSimmo Aug 27, 2026
3da4d7d
fix(developer-area): make CheckedAt pure for react-hooks/purity
BigSimmo Aug 27, 2026
a92e860
Merge remote-tracking branch 'origin/main' into ui_refactor_maintenan…
claude Aug 27, 2026
9676e64
fix: address PR review findings and stale role=menuitem assertions
claude Aug 27, 2026
5c38bd2
fix: migrate remaining raw size={16} icons to size-icon-md token
claude Aug 27, 2026
7d2e735
Merge remote-tracking branch 'origin/main' into ui_refactor_maintenan…
claude Aug 27, 2026
79611b0
fix: paginate the developer review-state table server-side
claude Aug 27, 2026
df5437b
Merge remote-tracking branch 'origin/main' into ui_refactor_maintenan…
claude Aug 27, 2026
6d50be2
fix(test): disambiguate Search action locator after menuitem->button …
claude Aug 27, 2026
b1570b6
Merge remote-tracking branch 'origin/main' into ui_refactor_maintenan…
claude Aug 27, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 49 additions & 1 deletion data/outstanding-issues-snapshot.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
"p2": 49,
"p3": 31,
"queued": 7,
"pending": 9,
"pending": 17,
"resolved": 431
},
"queue": [
Expand Down Expand Up @@ -824,12 +824,30 @@
}
],
"pending": [
{
"request_id": "17e26e25-5180-4ed4-9391-834ec456d605",
"action": "done",
"summary": "#G693BZ: Verified PanelSection extracted in panel-primitives.tsx and adopted across routes, documentation, test-health, review-state, and ledger pages.",
"created_at": "2026-08-27"
},
{
"request_id": "2f077536-00d5-46da-a7c2-63ad9d0221e5",
"action": "done",
"summary": "#76GGRG: Standardized Useful actions to role=group disclosure model with plain buttons and added Escape handling for mode picker.",
"created_at": "2026-08-27"
},
{
"request_id": "39bc43fc-7bd7-4088-a7e4-4d29d3d418d5",
"action": "done",
"summary": "#4AM8Z0: Added Ramipril and Simvastatin to medication catalogue with full interaction, dosing, and contraindication profiles; rebuilt interaction index and asserted in tests/medication-badges.test.ts",
"created_at": "2026-08-27"
},
{
"request_id": "3ac44d1e-88b8-4676-97e5-aa83d615fc98",
"action": "done",
"summary": "#XKS6FD: Added first-class mode live to Freshness type and resolveLiveFreshness helper displaying read live status.",
"created_at": "2026-08-27"
},
{
"request_id": "44e5f87c-d30f-4334-9184-75c1544773ef",
"action": "done",
Expand All @@ -848,6 +866,12 @@
"summary": "/calculators/search keeps a 2px residual scroll range at 1280x1200 after the dead-scroll sweep",
"created_at": "2026-08-27"
},
{
"request_id": "74818f95-4e71-4808-bec2-ff7ffb233ac1",
"action": "done",
"summary": "#Y0BDBJ: Implemented ReviewStateTable with 50-item responsive pagination reducing HTML payload from 1.73 MB to <100 KB.",
"created_at": "2026-08-27"
},
{
"request_id": "8324c7e4-18fb-4073-ba6b-ae46920f768d",
"action": "update",
Expand All @@ -866,6 +890,18 @@
"summary": "Ward Flow pinned-clock fix is committed only to an unpushed local branch, and the Phase 6 morning page still carries the defect, its workaround, and an untested D5 branch",
"created_at": "2026-08-27"
},
{
"request_id": "a6215b70-c84e-41b3-8828-b170c00a1b49",
"action": "done",
"summary": "#FDST2Q: Implemented formatRelativeAge formatting sub-60-minute durations as just now or < 1 hour ago instead of 0 hours ago.",
"created_at": "2026-08-27"
},
{
"request_id": "af496d9a-fd58-4984-b216-efcf2495fd67",
"action": "done",
"summary": "#WG24JB: Wired confirmed-today and predicted-today headline cards in CapacityView to /mockups/ward-flow/discharges with tests.",
"created_at": "2026-08-27"
},
{
"request_id": "af8b8fb0-3930-43a6-8d06-c897866a86b9",
"action": "add",
Expand All @@ -877,6 +913,18 @@
"action": "done",
"summary": "#DTSABC: Authored Form 12A statutory Authority and Criteria prose from committed PDF and asserted in tests/forms.test.ts",
"created_at": "2026-08-27"
},
{
"request_id": "dece668d-e5da-4d9f-bf44-d3abed47e492",
"action": "done",
"summary": "#HX1KSZ: Codified 3-way component-metric boundary rule in docs/design-system/GATES.md section 3 prohibition table without value conversions.",
"created_at": "2026-08-27"
},
{
"request_id": "fed7ba66-652e-4081-8845-3c3b70496507",
"action": "done",
"summary": "#ZW43ZT: Bypassed GlobalMockupSearchShell for /mockups/development in MockupsLayoutClient to eliminate duplicate dev main landmark collisions.",
"created_at": "2026-08-27"
}
]
}
4 changes: 2 additions & 2 deletions data/repo-awareness-snapshot.json
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
{
"version": "repo-awareness-snapshot-v1",
"captured_revision": {
"sha": "f36f94da025fa080d71ace0dce6672a9907a122c",
"committed_at": "2026-08-28T01:34:34+08:00"
"sha": "79611b0ce313799d9332fcd4ae30d9bfcd3b6027",
"committed_at": "2026-08-27T19:57:02+00:00"
},
"routes": {
"modes": [
Expand Down
57 changes: 29 additions & 28 deletions docs/design-system/GATES.md

Large diffs are not rendered by default.

6 changes: 5 additions & 1 deletion docs/design-system/adoption-manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -1332,7 +1332,11 @@
"preview": ".design-sync/previews/Pagination.tsx",
"previewValid": true
},
"testFiles": ["tests/design-sync-visual-exports.test.ts", "tests/ui-v2-components.dom.test.tsx"],
"testFiles": [
"tests/design-sync-visual-exports.test.ts",
"tests/developer-review-state-page.dom.test.tsx",
"tests/ui-v2-components.dom.test.tsx"
],
"baseline": {
"targetLayer": "v2",
"liveLayer": "v2",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"version": 2,
"id": "17e26e25-5180-4ed4-9391-834ec456d605",
"createdOn": "2026-08-27",
"action": "done",
"payload": {
"id": "#G693BZ",
"outcome": "Verified PanelSection extracted in panel-primitives.tsx and adopted across routes, documentation, test-health, review-state, and ledger pages.",
"baseRowFingerprint": "0d370d0dd385be7854cb2323dbcebf4130053901cb5e81b8961c2d9d8a365a6f"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"version": 2,
"id": "2f077536-00d5-46da-a7c2-63ad9d0221e5",
"createdOn": "2026-08-27",
"action": "done",
"payload": {
"id": "#76GGRG",
"outcome": "Standardized Useful actions to role=group disclosure model with plain buttons and added Escape handling for mode picker.",
"baseRowFingerprint": "5b609edac36991b6c776a54ded369741d417ca1b4f4fa768135de3a317ebea0d"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"version": 2,
"id": "3ac44d1e-88b8-4676-97e5-aa83d615fc98",
"createdOn": "2026-08-27",
"action": "done",
"payload": {
"id": "#XKS6FD",
"outcome": "Added first-class mode live to Freshness type and resolveLiveFreshness helper displaying read live status.",
"baseRowFingerprint": "9e547684b5e56ae4ebb97aebb3e257df782180dd018fb627d003087eaa7c910c"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"version": 2,
"id": "74818f95-4e71-4808-bec2-ff7ffb233ac1",
"createdOn": "2026-08-27",
"action": "done",
"payload": {
"id": "#Y0BDBJ",
"outcome": "Implemented ReviewStateTable with 50-item responsive pagination reducing HTML payload from 1.73 MB to <100 KB.",
"baseRowFingerprint": "eb1b1c0c3e96a890a4359edfbe9f2a6a85feb431a4fef4f3cf79a6cf88030028"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"version": 2,
"id": "a6215b70-c84e-41b3-8828-b170c00a1b49",
"createdOn": "2026-08-27",
"action": "done",
"payload": {
"id": "#FDST2Q",
"outcome": "Implemented formatRelativeAge formatting sub-60-minute durations as just now or < 1 hour ago instead of 0 hours ago.",
"baseRowFingerprint": "27db53ffd4993c930a64726a777bcb905c62c4bcbd365d71b33052e526f3f32b"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"version": 2,
"id": "af496d9a-fd58-4984-b216-efcf2495fd67",
"createdOn": "2026-08-27",
"action": "done",
"payload": {
"id": "#WG24JB",
"outcome": "Wired confirmed-today and predicted-today headline cards in CapacityView to /mockups/ward-flow/discharges with tests.",
"baseRowFingerprint": "903eb9a8bb6f9b4260bb30cd316ee92c0bba163691bc18f5b5ab6df373cac650"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"version": 2,
"id": "dece668d-e5da-4d9f-bf44-d3abed47e492",
"createdOn": "2026-08-27",
"action": "done",
"payload": {
"id": "#HX1KSZ",
"outcome": "Codified 3-way component-metric boundary rule in docs/design-system/GATES.md section 3 prohibition table without value conversions.",
"baseRowFingerprint": "ed5a8c332d2a9d2fcddd33b2c94cee796a4dfb961310e13b4d86b8deab8eaad8"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"version": 2,
"id": "fed7ba66-652e-4081-8845-3c3b70496507",
"createdOn": "2026-08-27",
"action": "done",
"payload": {
"id": "#ZW43ZT",
"outcome": "Bypassed GlobalMockupSearchShell for /mockups/development in MockupsLayoutClient to eliminate duplicate dev main landmark collisions.",
"baseRowFingerprint": "bbf58e5eb4703f200e634e9fcd4bb2b122c3031c81535dfca994cf1d4511539f"
}
}
2 changes: 1 addition & 1 deletion src/app/(search-app)/documents/[id]/loading.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { DocumentViewerPageSkeleton } from "@/components/mode-home-page-skeleton

export default function Loading() {
return (
<div className="bg-[color:var(--background)]">
<div className="flex min-h-dvh flex-col bg-[color:var(--background)]">
<DocumentViewerPageSkeleton />
</div>
);
Expand Down
19 changes: 6 additions & 13 deletions src/app/mockups/development/ingestion/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import type { Metadata } from "next";

import { IngestionPanel } from "@/components/developer-area/hub/ingestion-panel";
import { PanelPageShell } from "@/components/developer-area/hub/panel-page-shell";
import { resolveFreshnessFrom } from "@/lib/developer-area/freshness";
import { resolveLiveFreshness } from "@/lib/developer-area/freshness";

export const metadata: Metadata = {
title: "Ingestion · Developer · Clinical KB",
Expand All @@ -12,19 +12,12 @@ export const metadata: Metadata = {
export default function DeveloperIngestionPage() {
/**
* Every other Phase 1/2 panel stamps "content as of <build time>", read from
* a snapshot committed at build time. This page is deliberately not one of
* those (plan §3, Ruling I1): `IngestionPanel` is a Client Component that
* polls `/api/ingestion/jobs` live, so at the moment this Server Component
* renders, no job data has been read yet. Passing a build-time value here —
* or any non-null `contentAt` — would be true of the page and false of the
* numbers on it (plan §8). `contentAt: null` is the honest answer for this
* particular stamp: it renders "revision unknown", which is exactly what a
* server that has not fetched anything should say. The fact §8 actually
* asks for — when the data was last fetched, updating as it polls — is
* rendered by `IngestionPanel` itself (`CheckedAt`), next to the data it
* describes, since only the client component ever knows that timestamp.
* a snapshot committed at build time. This page is deliberately live (plan §3,
* Ruling I1, #XKS6FD): `IngestionPanel` is a Client Component that polls
* `/api/ingestion/jobs` live. Using `resolveLiveFreshness` stamps the page as
* "read live on demand" rather than claiming "revision unknown" (#XKS6FD).
*/
const freshness = resolveFreshnessFrom(null, new Date());
const freshness = resolveLiveFreshness(null, new Date());

return (
<PanelPageShell
Expand Down
121 changes: 20 additions & 101 deletions src/app/mockups/development/review-state/page.tsx
Original file line number Diff line number Diff line change
@@ -1,112 +1,31 @@
import type { Metadata } from "next";

import {
CARD_CLASS,
CountTile,
META_CLASS,
MONO_CLASS,
PanelSection,
ROW_CLASS,
} from "@/components/developer-area/hub/panel-primitives";
import { PanelPageShell } from "@/components/developer-area/hub/panel-page-shell";
import { loadRepoAwarenessSnapshot, resolveRepoFreshness } from "@/lib/developer-area/repo-awareness-snapshot";
import { ReviewStatePageContent } from "@/components/developer-area/hub/review-state-page-content";

export const metadata: Metadata = {
title: "Review state · Developer · Clinical KB",
description: "Every immutable review record: which ref was reviewed, at which head, with what outcome.",
};

const DISCLOSURE_CLASS =
"min-h-12 cursor-pointer text-xs font-bold text-[color:var(--text-muted)] focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[color:var(--focus)]";

export default function DeveloperReviewStatePage() {
const snapshot = loadRepoAwarenessSnapshot();
const freshness = resolveRepoFreshness(snapshot, new Date());
const { records, counts } = snapshot.review_state;

return (
<PanelPageShell
testId="developer-review-state"
title="Review state"
freshness={freshness}
freshnessLabel="Repository"
>
<div className="grid grid-cols-2 gap-3">
<CountTile testId="developer-review-state-count-records" value={counts.records} label="review records" />
<CountTile testId="developer-review-state-count-refs" value={counts.refs} label="distinct recorded refs" />
</div>
type DeveloperReviewStatePageProps = {
searchParams?: Promise<{ page?: string | string[] }>;
};

{/*
* The panel is named for what it has, and says plainly what it has not.
* A label promising more than its data delivers is the `#338` failure
* wearing different clothes: "open changes, checks, review state" from
* "local data; no new permissions" was the original outline's own
* contradiction, because open pull requests and CI status are not on
* disk — reading them needs a token, a network call, and an approval
* boundary this repo deliberately gates. This page answers a narrower,
* honest question instead: has this ref been reviewed at this exact
* head, with what outcome. That is history, not live state, and it says
* so in its own words below rather than leaving a reader to infer it
* from an absence.
*/}
<p data-testid="developer-review-state-scope" className={META_CLASS}>
This is the repository&rsquo;s own review history: which recorded ref was reviewed, at which exact commit, and
what the reviewer concluded. It does not show which pull requests are open, whether their checks are green, or
whether a review is outstanding — none of that exists on disk, and reading it would need credentials this page
deliberately does not have. A ref absent from this list has not been reviewed at any head; it does not mean
there is no pull request.
</p>
function parsePageParam(value: string | string[] | undefined): number {
const raw = Array.isArray(value) ? value[0] : value;
const parsed = raw ? Number.parseInt(raw, 10) : 1;
return Number.isFinite(parsed) && parsed >= 1 ? parsed : 1;
}

<PanelSection headingId="developer-review-state-heading" heading={`Records · ${counts.records}`}>
<p className={META_CLASS}>
Newest first. Each record is immutable; a later review of the same recorded ref adds a row rather than
replacing one. Showing all {counts.records} — nothing here is capped, paginated, or filtered, so a count and
its list can never disagree.
</p>
{/*
* `record` is `{ date, ref, head, scope, outcome, checks }` — six free-text
* fields (Ruling R7: review outcomes are prose from many sessions over
* months, so the page never classifies or buckets `outcome`). Every field
* of every record is rendered unconditionally below, and nothing here
* branches on a field's *value* — the only structural choices are which
* fields get their own line versus a shared row, which is presentation,
* not a recognised/unrecognised-value distinction. So the "render an
* unrecognised value under its own heading" rule has nothing to bite on
* for this page, the same conclusion Task 11 reached for the quarantined
* test list.
*/}
{records.length === 0 ? (
<p data-testid="developer-review-state-empty" className={META_CLASS}>
No immutable review records are committed.
</p>
) : (
<ol data-testid="developer-review-state-records" className="grid gap-3">
{records.map((record, index) => (
<li
// `head` alone is not unique — 21 records in the corpus share a
// date, ref AND head, because one branch can be reviewed twice at one
// commit under different scopes. Adding `scope` disambiguates every
// record today, but nothing structurally guarantees it, so the index
// carries uniqueness and the fields carry readability.
key={`${record.date}-${record.ref}-${record.head}-${record.scope}-${index}`}
className={CARD_CLASS}
>
<div className={ROW_CLASS}>
<span className={META_CLASS}>{record.date}</span>
<span className="text-sm font-bold text-[color:var(--text-heading)]">{record.ref}</span>
<span className={MONO_CLASS}>{record.head}</span>
</div>
<p className={META_CLASS}>{record.scope}</p>
<p className="text-sm leading-6 text-[color:var(--text-heading)]">{record.outcome}</p>
<details>
<summary className={DISCLOSURE_CLASS}>Checks run</summary>
<p className="mt-2 text-sm leading-6 text-[color:var(--text-muted)]">{record.checks}</p>
</details>
</li>
))}
</ol>
)}
</PanelSection>
</PanelPageShell>
);
/**
* Thin async wrapper only — Next 16 serves `searchParams` as a `Promise`, so
* unwrapping it is the one thing here that has to be async. Everything else
* (the snapshot read, the pagination slice, the actual markup) stays in the
* synchronous `ReviewStatePageContent`, which is what `render()` can execute
* directly the same way every sibling developer-hub page's dom test does —
* mirrors `ToolsRoute` in `src/app/(search-app)/tools/page.tsx`.
*/
export default async function DeveloperReviewStatePage({ searchParams }: DeveloperReviewStatePageProps) {
const params = searchParams ? await searchParams : {};
return <ReviewStatePageContent requestedPage={parsePageParam(params.page)} />;
}
Loading
Loading