Skip to content

Commit ff5eb46

Browse files
Merge pull request #60 from voidstackloop/codex/release-validation-2026-08-31
Codex/release validation 2026 08 31
2 parents 0d05000 + 0398b7b commit ff5eb46

17 files changed

Lines changed: 429 additions & 688 deletions

admin-console/src/components/layout.tsx

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { Button } from "@/components/ui/button";
44
import {
55
DropdownMenu,
66
DropdownMenuContent,
7+
DropdownMenuGroup,
78
DropdownMenuItem,
89
DropdownMenuLabel,
910
DropdownMenuSeparator,
@@ -57,14 +58,16 @@ export default function Layout() {
5758
}
5859
/>
5960
<DropdownMenuContent align="end">
60-
<DropdownMenuLabel>Switch organization</DropdownMenuLabel>
61-
<DropdownMenuSeparator />
62-
{me?.memberships.map((m) => (
63-
<DropdownMenuItem key={m.organization.id} onClick={() => navigate(`/organizations/${m.organization.id}/users`)}>
64-
{m.organization.name}
65-
{m.organization.id === organizationId && <span className="ml-auto text-xs text-muted-foreground">current</span>}
66-
</DropdownMenuItem>
67-
))}
61+
<DropdownMenuGroup>
62+
<DropdownMenuLabel>Switch organization</DropdownMenuLabel>
63+
<DropdownMenuSeparator />
64+
{me?.memberships.map((m) => (
65+
<DropdownMenuItem key={m.organization.id} onClick={() => navigate(`/organizations/${m.organization.id}/users`)}>
66+
{m.organization.name}
67+
{m.organization.id === organizationId && <span className="ml-auto text-xs text-muted-foreground">current</span>}
68+
</DropdownMenuItem>
69+
))}
70+
</DropdownMenuGroup>
6871
<DropdownMenuSeparator />
6972
<DropdownMenuItem onClick={() => navigate("/")}>All organizations…</DropdownMenuItem>
7073
</DropdownMenuContent>

compose.dev.yml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ services:
108108
keycloak:
109109
condition: service_started
110110
healthcheck:
111-
test: ["CMD", "node", "-e", "fetch('http://127.0.0.1:4000/health').then(r=>{if(!r.ok)process.exit(1)}).catch(()=>process.exit(1))"]
111+
test: ["CMD", "node", "-e", "require('node:http').get('http://127.0.0.1:4000/health',r=>{r.resume();process.exit(r.statusCode===200?0:1)}).on('error',()=>process.exit(1))"]
112112
interval: 5s
113113
timeout: 4s
114114
retries: 30
@@ -145,4 +145,3 @@ volumes:
145145
redis-dev-data:
146146
keycloak-dev-data:
147147
imaging-dev-data:
148-

docs/CLINICAL_WORKSPACE.md

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -602,15 +602,15 @@ Notably:
602602
tested in this codebase (see [Development: testing](DEVELOPMENT.md#testing)).
603603

604604
Playwright e2e (`e2e/tests/*.spec.ts`) has not been extended for the clinical
605-
layer with scripted assertions, but `e2e/full-app-tour.js` (a headless,
606-
non-mocked Electron launch — the same `_electron.launch({headless: "new"})`
607-
pattern as `manual-app-test.js`) has been run against it end to end: every
608-
clinical route (Patient Cases list, create, detail; Evidence Library;
609-
Knowledge Graph; Audit & Privacy) plus every Settings and Runtime Manager tab,
610-
with zero console errors or uncaught page errors captured across the whole
611-
run. Screenshots from that pass are in `docs/screenshots/`. This is visual/
612-
crash verification, not scripted behavioral assertions — see [Known
613-
limitations](#known-limitations) for what that still leaves uncovered.
605+
layer with scripted assertions, but a one-off manual tour script (a headless,
606+
non-mocked Electron launch via `_electron.launch({headless: "new"})`, not
607+
kept in the repo) has been run against it end to end: every clinical route
608+
(Patient Cases list, create, detail; Evidence Library; Knowledge Graph; Audit
609+
& Privacy) plus every Settings and Runtime Manager tab, with zero console
610+
errors or uncaught page errors captured across the whole run. Screenshots
611+
from that pass are in `docs/screenshots/`. This is visual/crash verification,
612+
not scripted behavioral assertions — see [Known limitations](#known-limitations)
613+
for what that still leaves uncovered.
614614

615615
## Known limitations
616616

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
# ModelForge v1.3.0 release validation
2+
3+
Date: 2026-08-31
4+
5+
## Result
6+
7+
The installed Windows release and the repository build passed the automated,
8+
integration, container, and visual checks listed below. The validation recording
9+
contains synthetic, PHI-free data and captures only the ModelForge application
10+
window.
11+
12+
[Watch the compact release proof](assets/modelforge-v1.3.0-release-proof.mp4)
13+
14+
## Installed release walkthrough
15+
16+
The 3-minute, 655 KB H.264 recording demonstrates:
17+
18+
- local-only chat and the new-chat workflow;
19+
- Runtime Manager detection and live telemetry for an NVIDIA RTX 4060;
20+
- balanced, performance, efficient, and manual resource profiles;
21+
- Download Center limits and concurrent-download controls;
22+
- audit, privacy, encryption, and audit-backend status;
23+
- a synthetic patient case and its inclusion controls;
24+
- Evidence Library and Knowledge Graph navigation.
25+
26+
No AWS credential, AWS account identifier, prompt, patient identifier, or other
27+
secret is visible in the recording or this report.
28+
29+
## Automated evidence
30+
31+
| Area | Result |
32+
| --- | --- |
33+
| Desktop application unit tests | 1,018 passed, 1 skipped across 78 files |
34+
| Server default test mode | 650 passed, 84 skipped across 55 files |
35+
| Server with isolated PostgreSQL and Redis | 731 passed, 3 opt-in live-adapter tests skipped across 55 files |
36+
| Frontend tests | 101 passed |
37+
| Admin console tests | 61 passed |
38+
| MasterVault tests | 14 passed |
39+
| Rust native tests | 80 passed |
40+
| Playwright desktop E2E | 25 passed |
41+
| Imaging CDK regression tests | 3 passed |
42+
43+
The Playwright suite covers approvals, audit persistence and backend migration,
44+
backup/restore, signed central policy handling, cancellation, Download Center,
45+
llama.cpp chat and agent tool gating, medication safety, onboarding, patient-case
46+
backend configuration, response contracts, settings persistence, and
47+
single-instance behavior.
48+
49+
Production builds/typechecks passed for the desktop application, server,
50+
frontend, admin console, shared contracts, MasterVault, Rust native component,
51+
E2E package, and imaging CDK. Frontend and admin lint also passed.
52+
53+
The development container stack was rebuilt and verified healthy. PostgreSQL,
54+
Redis, the API, Keycloak, and the admin console all started successfully; the API
55+
health endpoint returned `{"status":"ok"}` and the admin console returned HTTP
56+
200.
57+
58+
## Defects corrected during validation
59+
60+
1. The server container could load a stale copied `@modelforge/contracts`
61+
package and fail during startup. The image now links the workspace contracts
62+
package after dependency installation.
63+
2. The API health check did not reliably consume the response or terminate from
64+
the HTTP status. It now exits deterministically after consuming the response.
65+
3. The PostgreSQL migration-audit test ordered same-timestamp events only by
66+
`created_at`. It now asserts the audit ledger's monotonic numeric sequence.
67+
4. The imaging CDK stack contained a redundant exact-distribution KMS grant that
68+
created a CloudFormation dependency cycle. The stack now relies on the CDK
69+
OAC-generated, account-scoped distribution grant.
70+
5. The dedicated CloudFront access-log bucket used bucket-owner-enforced object
71+
ownership, which is incompatible with CloudFront legacy standard logging. It
72+
now enables the required object-writer ownership while retaining public-access
73+
blocking. The PHI imaging bucket remains bucket-owner-enforced.
74+
6. CloudFormation descriptions used unsupported punctuation. They now use the
75+
supported ASCII character set.
76+
77+
Regression tests protect the CloudFront log-bucket ownership, KMS grant shape,
78+
and CloudFormation description character set.
79+
80+
## External deployment status
81+
82+
The imaging stack synthesized successfully after the fixes. Deployment reached
83+
AWS and exposed the CloudFront logging and dependency-cycle defects above, but a
84+
subsequent deploy is blocked before resource mutation because the account's CDK
85+
bootstrap toolkit is version 28 and the current deployment requires version 30.
86+
Upgrading the bootstrap stack changes account-level deployment IAM and therefore
87+
requires explicit operator approval. No credential value was read or printed.
88+
89+
Production Compose configuration additionally requires deployment-specific
90+
`OIDC_ISSUER` configuration; no value was invented for validation.
91+
92+
## Scope boundary
93+
94+
This run verifies all repository-owned automated suites and the installed
95+
workflows listed above. Provider-dependent live imaging adapters, real clinical
96+
data flows, real external model/provider credentials, and the final AWS resource
97+
deployment require their respective controlled environments and are not claimed
98+
as exercised here.
655 KB
Binary file not shown.

e2e/full-app-tour.js

Lines changed: 0 additions & 180 deletions
This file was deleted.

e2e/headless-probe.js

Lines changed: 0 additions & 42 deletions
This file was deleted.

0 commit comments

Comments
 (0)