Skip to content
Merged
Show file tree
Hide file tree
Changes from 250 commits
Commits
Show all changes
902 commits
Select commit Hold shift + click to select a range
3e6b8f2
feat(flip-api): add log_queue_positions — emit-on-change queue-positi…
atriaybagur Jul 16, 2026
fbf7e60
feat(flip-api): emit queue positions at every FL queue mutation
atriaybagur Jul 16, 2026
e597040
feat(flip-api): expose queuePosition on the estate-wide models list
atriaybagur Jul 16, 2026
0976713
feat(flip-api): expose queuePosition on the model detail response
atriaybagur Jul 16, 2026
202cd8e
feat(flip-ui): show the FL queue position on the Models page and life…
atriaybagur Jul 16, 2026
de3fed7
docs: note the visible FL queue position in the training scheduler guide
atriaybagur Jul 16, 2026
3b29dbf
fix: bound global_round, pin schema mirrors, correct stale docstrings
atriaybagur Jul 16, 2026
473fc41
fix(flip-api,flip-ui): batch queue-position rows into one commit; fix…
atriaybagur Jul 16, 2026
32e84ad
fix(flip-api): key queue-position dedup by job id, not model id
atriaybagur Jul 16, 2026
3378ede
fix: natively disable AiSwitch, not just aria-disabled
atriaybagur Jul 16, 2026
0680a92
Abort job before it runs: UI affordance + prompt FL net release (#787)
atriaybagur Jul 16, 2026
a660e12
test(flip-ui): fix group-6 post-training Cypress spec for pre-running…
atriaybagur Jul 16, 2026
e2a9b61
fix(flip-api,flip-ui): harden queue-position emission per review find…
atriaybagur Jul 16, 2026
809848c
791: fix black margins around the login page on mobile
atriaybagur Jul 16, 2026
bbdd283
791: extend the page under the iOS safe areas (viewport-fit=cover)
atriaybagur Jul 16, 2026
d95c0a4
Revert "791: extend the page under the iOS safe areas (viewport-fit=c…
atriaybagur Jul 16, 2026
0a53009
791: re-add viewport-fit=cover (meta only)
atriaybagur Jul 16, 2026
a23fe90
791: fade the corner artwork's cut edges inside the iOS letterbox
atriaybagur Jul 16, 2026
9041563
791: centre the auth footer links when their labels wrap
atriaybagur Jul 16, 2026
8e274f8
791: add empty alt to SecondaryLayout's decorative corner artwork
atriaybagur Jul 16, 2026
55d5827
style: restyle Prepare/Run tabs as a flat ghost tab nav (TAB-NAV.md)
atriaybagur Jul 16, 2026
9edbb34
style: give the active model tab an alpha-ink fill that reads on the …
atriaybagur Jul 16, 2026
b4e626a
Merge branch 'feat/round-progress-card' into 148-arbitrary-x-axis-met…
atriaybagur Jul 16, 2026
cab7cca
fix: default x-axis label displays as 'Global Rounds', matching the o…
atriaybagur Jul 16, 2026
54303d9
docs: weekly drift sweep — DB layer, FL job types, XNAT socket-proxy …
claude Jul 19, 2026
a47eb8c
Add flip.export: package a trained model as a MONAI Bundle
atriaybagur Jul 19, 2026
b7c0b63
Declare xray inference transforms in transforms.py
atriaybagur Jul 19, 2026
0fd5cd6
Add bundle export configs for the spleen and xray tutorials
atriaybagur Jul 19, 2026
2bccdad
Add MAP application templates for segmentation and classification
atriaybagur Jul 19, 2026
f338115
Document packaging a trained model for inference
atriaybagur Jul 19, 2026
46b4cb4
Restore sys.modules['models'] rather than removing it in export tests
atriaybagur Jul 19, 2026
95ec931
Record what deepcOS actually requires of a MAP
atriaybagur Jul 19, 2026
b81822d
Surface the deepcOS gap in the MAP template READMEs
atriaybagur Jul 19, 2026
8fd66bd
fix: serve model-file downloads via presigned S3 URL, not a proxied s…
garciadias Jul 20, 2026
1a2f6d7
chore: bump flip-utils version to 0.4.0
garciadias Jul 20, 2026
2b9c47c
Revert "chore: bump flip-utils version to 0.4.0"
garciadias Jul 20, 2026
4002f1f
chore: bump flip-utils version to 0.4.0
garciadias Jul 20, 2026
ec472c1
test: update Cypress config.json intercepts for the presigned-URL dow…
garciadias Jul 20, 2026
5184b0b
fix(security): bump ansible-core to >=2.19.11 for CVE-2026-11332
garciadias Jul 20, 2026
9daa3f6
fix(security): bump torch to >=2.13.0 in 3d_spleen_seg tutorial for C…
garciadias Jul 20, 2026
397f604
fix(security): bump torch to >=2.13.0 in flip-utils for CVE-2025-3000
garciadias Jul 20, 2026
7ec3d2f
Merge pull request #795 from londonaicentre/claude/dreamy-cerf-43kurq
atriaybagur Jul 21, 2026
3f6ef18
791: keep 100vh as a sizing fallback where dvh is unsupported
atriaybagur Jul 21, 2026
01509ec
791: spec-enforce the theme-color hexes against the Tailwind tokens
atriaybagur Jul 21, 2026
65defd5
791: document why the iOS fade gate holds on trackpad iPads
atriaybagur Jul 21, 2026
406e4ad
fix(dev-iac): mirror the model-files CORS GET into the dev-account Te…
atriaybagur Jul 21, 2026
362185f
fix: default presigned-URL TTLs to the 1800s ceiling so default calle…
atriaybagur Jul 21, 2026
c890925
feat(ui): stream per-file model downloads via the presigned URL inste…
atriaybagur Jul 21, 2026
e7bdbbb
fix(flip-api,flip-utils): bound the queue-position dedup scan and res…
atriaybagur Jul 21, 2026
659de2f
Merge branch 'feat/round-progress-card' into 788-fl-queue-position
atriaybagur Jul 21, 2026
7d5eace
Address review: version bump, alias EOL tracking, status-neutral smok…
atriaybagur Jul 21, 2026
5610f0b
fix(nvflare): emit CLIENT_RESULT_RECEIVED only after the base class a…
atriaybagur Jul 21, 2026
78e6be6
fix(nvflare): seed the round counts at ROUND_STARTED so an all-fail r…
atriaybagur Jul 21, 2026
c7ab6a5
fix(flip-api): treat boolean and negative size_bytes as unusable in t…
atriaybagur Jul 21, 2026
c1f1a32
fix(flip-api): tie-break the latest-job roster on (created, id) in bo…
atriaybagur Jul 21, 2026
9cc7ee2
fix: bound TrainingLog.details to 8192 serialized bytes at ingest and…
atriaybagur Jul 21, 2026
a348d4e
Merge pull request #789 from londonaicentre/788-fl-queue-position
garciadias Jul 21, 2026
155bb09
Merge pull request #799 from londonaicentre/589-bump-flip-utils-0.4.0
garciadias Jul 21, 2026
71c9ebb
Merge pull request #804 from ParhomEsmaeili/arkplus-apps
atriaybagur Jul 21, 2026
adb806a
Merge pull request #783 from londonaicentre/782-running-model-status
atriaybagur Jul 21, 2026
e26c6d1
Merge pull request #792 from londonaicentre/791-fix-mobile-login-blac…
atriaybagur Jul 21, 2026
75b4cb4
Merge origin/develop into feat/round-progress-card
atriaybagur Jul 21, 2026
db8f6d1
Merge pull request #757 from londonaicentre/feat/round-progress-card
atriaybagur Jul 21, 2026
3cac306
fix(db): merge the fl_logs and RUNNING-rename alembic heads
atriaybagur Jul 21, 2026
072fb54
fix(fl-tutorials): patch client_api xray copy and surface fully-maske…
atriaybagur Jul 21, 2026
9df4178
Merge pull request #806 from londonaicentre/fix/alembic-merge-heads-7…
atriaybagur Jul 21, 2026
8ce1bbc
Merge remote-tracking branch 'origin/develop' into 764-flower-nan-tra…
atriaybagur Jul 21, 2026
83bf782
Merge origin/develop into 148-arbitrary-x-axis-metric-plots
atriaybagur Jul 21, 2026
21ab521
docs: resync stale AGENTS.md mirrors with CLAUDE.md and document the …
atriaybagur Jul 21, 2026
a6eda2d
Address review: guard the NVFLARE metric forward, bound x_label, pin …
atriaybagur Jul 21, 2026
5c15442
fix(flip-api): read SSM parameters with WithDecryption=True
atriaybagur Jul 21, 2026
3614af1
fix(deploy): keep add-fl-kits recovery guidance on guard aborts; comm…
atriaybagur Jul 21, 2026
dfdf40c
fix(deploy): pause apply-fl-kit-slots between plan and apply (YES=1 s…
atriaybagur Jul 21, 2026
dfedba1
docs: mirror the FL kit-slot CLAUDE.md additions into the AGENTS.md t…
atriaybagur Jul 21, 2026
07deb9e
feat(nvflare): save the best global model via stock IntimeModelSelect…
atriaybagur Jul 21, 2026
318bc67
feat(fl-api): inject IntimeModelSelector for deployed jobs from confi…
atriaybagur Jul 21, 2026
a8e13cc
Merge pull request #801 from londonaicentre/784-presigned-downloads-s…
garciadias Jul 21, 2026
a82e9f4
style: wrap over-length file-service import in ModelUpload.vue
garciadias Jul 21, 2026
5dba60e
fix(tutorial): set GLOBAL_ROUNDS=3 on xray client-API so best-model s…
atriaybagur Jul 21, 2026
4130d0f
test: cover the scheduler-lookup DB-error branch and the abort-failur…
atriaybagur Jul 22, 2026
9ecb362
fix: narrow the pre-running abort catch so DB errors surface instead …
atriaybagur Jul 22, 2026
76b3912
Merge origin/develop into 787-abort-job-pre-training
atriaybagur Jul 22, 2026
44533b9
fix: read only the newest FLJob in the backend-job-id lookup so re-qu…
atriaybagur Jul 22, 2026
97a1dad
Merge remote-tracking branch 'origin/develop' into spike-map-packaging
atriaybagur Jul 22, 2026
951e2f3
feat: scripted end-to-end demo video recorder + demo-data seeding
atriaybagur Jul 22, 2026
2eba237
Emit a deepcOS engine report from both MAP templates
atriaybagur Jul 22, 2026
676a7ae
Degrade the report on any unexpected mask shape, not only a missing s…
atriaybagur Jul 22, 2026
cf0eeb7
Drop the deepcOS engine-report code; keep the deepc-adaptation docs
atriaybagur Jul 22, 2026
c172933
feat(demo-video): richer researcher journey, 4K capture, XNAT session…
atriaybagur Jul 22, 2026
4d23948
docs: document the demo-video recorder and demo-data seeding across t…
atriaybagur Jul 22, 2026
6e205c9
docs: slim the root README demo section down to pointers
atriaybagur Jul 22, 2026
696609e
Address PR review: doc/hygiene fixes in the MAP templates and export
atriaybagur Jul 22, 2026
6e7d3f1
fix(demo-video): cover the auth wait, hold the topology view, trim te…
atriaybagur Jul 22, 2026
73a3799
feat(demo-video): hold on the imaging import status after approval
atriaybagur Jul 22, 2026
74b406f
fix(demo-video): detect the teardown tail instead of trimming a fixed…
atriaybagur Jul 22, 2026
7dc57a7
fix(demo-video): trim clip heads too, and dwell on the projects page
atriaybagur Jul 22, 2026
87d24d9
fix(demo-video): open each segment with web fonts already loaded
atriaybagur Jul 22, 2026
af35457
feat(demo-video): researcher-led connection status, stealth time-skip…
atriaybagur Jul 22, 2026
589da48
feat(demo-video): hold until trusts onboard the import; bold click ma…
atriaybagur Jul 22, 2026
adc04c5
Merge remote-tracking branch 'origin/develop' into demo-video-recorder
atriaybagur Jul 22, 2026
520598f
fix: integrate with develop after merge
atriaybagur Jul 22, 2026
c61e58d
revert: drop the torch/cu126 bump, keep ansible-core fix standalone
garciadias Jul 23, 2026
1a340f9
Merge remote-tracking branch 'origin/develop' into 438/cve-2026-11332…
garciadias Jul 23, 2026
e70cb22
fix: address PR #811 Copilot review feedback (#673)
garciadias Jul 23, 2026
b42d5f2
Tidy the tutorial imports left by the transforms extraction
atriaybagur Jul 23, 2026
daf35df
Match the classifier MAP's orientation to the training chain
atriaybagur Jul 23, 2026
67d69a1
Stop the xray tutorials training on mirrored radiographs
atriaybagur Jul 23, 2026
4f04c6d
fix(demo-video): keep the OHIF beat on camera
atriaybagur Jul 23, 2026
8ac533b
feat(demo-video): per-app recording profiles + data-enrichment hook
atriaybagur Jul 22, 2026
094caa8
docs(demo-video): document the spleen app profile and enrichment flags
atriaybagur Jul 22, 2026
d5f2d9c
chore(demo-video): name the assembled mp4 after the recorded app
atriaybagur Jul 23, 2026
c9c3255
feat(demo-video): show the segmentation overlaid in OHIF
atriaybagur Jul 23, 2026
e6ff8f9
Merge pull request #797 from londonaicentre/784-presigned-model-downl…
garciadias Jul 23, 2026
0e28666
fix(metrics): reject non-finite result at the schema edge, both mirrors
claude Jul 24, 2026
1378853
fix(xray): surface non-finite val/test losses with the same skip+WARN…
claude Jul 24, 2026
b21678c
Merge remote-tracking branch 'origin/develop' into 809-agents-md-clau…
claude Jul 24, 2026
210a260
Merge pull request #810 from londonaicentre/809-agents-md-claude-md-r…
atriaybagur Jul 24, 2026
0b58913
Merge pull request #768 from londonaicentre/148-arbitrary-x-axis-metr…
atriaybagur Jul 24, 2026
dbd807e
Merge pull request #766 from londonaicentre/764-flower-nan-train-guard
atriaybagur Jul 24, 2026
00e1b6b
Merge remote-tracking branch 'origin/develop' into claude/security-pe…
claude Jul 24, 2026
f3dff32
Merge origin/develop; adapt XNAT credential minting to the trust-kit …
claude Jul 24, 2026
03bb681
fix(fl-kits): parse slot numbers as base-10; salvage raw logs on pref…
claude Jul 24, 2026
8a8e324
Merge pull request #800 from londonaicentre/438/cve-2026-11332-ansibl…
atriaybagur Jul 24, 2026
a87e679
Merge origin/develop into 787-abort-job-pre-training
atriaybagur Jul 24, 2026
05c33b1
docs: fix drift across READMEs, Sphinx docs, and AWS CLAUDE.md
claude Jul 26, 2026
44737ca
docs: apply reviewer follow-ups from PR #828
claude Jul 28, 2026
6f6e1c0
Merge remote-tracking branch 'origin/develop' into demo-video-recorder
atriaybagur Jul 28, 2026
9d38836
Address review: pool confirm on demo-users, idempotent seeding, on-ca…
atriaybagur Jul 28, 2026
5b54b35
fix(fl-api): reject BEST_MODEL_METRIC when effective GLOBAL_ROUNDS <=…
atriaybagur Jul 28, 2026
88cd6a2
Address review: fail fast on Postgres auth errors, warn on FORCE=1 ro…
atriaybagur Jul 28, 2026
9af739a
xnat-configure: unlink stale root-owned logs before tee
atriaybagur Jul 28, 2026
6f8d7d1
Merge origin/develop into 780-dynamic-fl-kit-slots
atriaybagur Jul 28, 2026
d9a64ee
Address approval-round notes: single mint-loop EXIT trap, harness in …
atriaybagur Jul 28, 2026
a4f6df2
Merge pull request #781 from londonaicentre/780-dynamic-fl-kit-slots
atriaybagur Jul 28, 2026
e0df027
docs: regenerate documentation GIFs
atriaybagur Jul 28, 2026
f60abc0
Merge pull request #825 from londonaicentre/bot/regenerate-docs-gifs
atriaybagur Jul 28, 2026
e7dbca8
Address review: sweep stale non-sudo up-trust docs, wire playbook tes…
atriaybagur Jul 28, 2026
ae8161a
Feed Ark+ upright radiographs, not sideways ones
atriaybagur Jul 23, 2026
2e9f292
Undo the loader transpose before resizing, not after
atriaybagur Jul 28, 2026
cba580b
Merge remote-tracking branch 'origin/develop' into spike-map-packaging
atriaybagur Jul 29, 2026
25e9003
fix(security): gate row-level cohort export and replace SQL denylists
atriaybagur Jul 29, 2026
db28ce1
feat(flip-utils): FlipDiffusionRecipe — Client-API recipe for the two…
atriaybagur Jul 29, 2026
55b8a76
fix(flip-utils): StagePercentilePrivacy — every stage's filtering now…
atriaybagur Jul 29, 2026
c98b730
feat(fl-apps): diffusion_model_client_api template — recipe-generated…
atriaybagur Jul 29, 2026
7ec19c5
feat(fl-tutorials): latent_diffusion_model_client_api sibling tutorial
atriaybagur Jul 29, 2026
03efe4e
test(fl-api): configure_server leaves diffusion per-stage round count…
atriaybagur Jul 29, 2026
7a92a43
docs: register the diffusion_model_client_api job type
atriaybagur Jul 29, 2026
2187702
feat(files): scan and quarantine uploaded model files (#52)
atriaybagur Jul 29, 2026
968b689
fix(config): tolerate empty-string scan-timing settings
atriaybagur Jul 29, 2026
7fcf2c1
docs(files): stop implying Python source is scanned (#52)
atriaybagur Jul 29, 2026
0fc56ae
test(files): cover the fail-closed scan branch and suffix passthrough
atriaybagur Jul 29, 2026
e1b1cb3
fix(files): allow .toml uploads and harden the suffix/quarantine paths
atriaybagur Jul 29, 2026
3e0e39a
test(e2e): skip dotfiles when uploading model files
atriaybagur Jul 29, 2026
b3082ab
fix(files): make the post-promote staging delete conditional too
atriaybagur Jul 29, 2026
4d713c9
fix(fl-apps): stub the models module so the diffusion recipe script r…
atriaybagur Jul 29, 2026
edf2f8a
feat(xnat): upgrade XNAT to 1.10.0
claude Jul 30, 2026
17e04a8
docs(xnat): note the 1.10.0 Dynamic Data Types feature
claude Jul 30, 2026
0e50465
docs(xnat): correct the 1.10 plugin story from the release announcement
claude Jul 30, 2026
828a05d
fix(xnat): set siteUrl during headless configure — 1.10.0 NPEs on nul…
atriaybagur Jul 30, 2026
da1c378
fix(orthanc): enforce auth in the image, drop DICOM-Web, fail closed …
atriaybagur Jul 30, 2026
1820652
fix(k8s): require the orthanc-registered-users secret key (FLIP-PT-091)
atriaybagur Jul 30, 2026
dbecadc
fix(status): treat an unauthenticated-200 Orthanc as a failure (FLIP-…
atriaybagur Jul 30, 2026
766cd06
docs: Orthanc auth model; fix stale imaging-api Orthanc claims (FLIP-…
atriaybagur Jul 30, 2026
0938430
fix(xnat): restrict DQR PACS access to site admins and the Dqr role
atriaybagur Jul 30, 2026
2fcb8c0
feat(xnat): upgrade Container Service plugin to 3.8.1
atriaybagur Jul 30, 2026
9d8d2e0
feat(models): show created time and default newest-first sort on the …
atriaybagur Jul 30, 2026
d0f53b9
fix(models): parse naive-UTC API timestamps as UTC in relative create…
atriaybagur Jul 30, 2026
847f4cc
docs(imaging-api): record the XNAT version actually tested
atriaybagur Jul 30, 2026
b1cfb0b
feat(xnat): version-key the S3 artifact set (xnat-<version>/{war, plu…
atriaybagur Jul 30, 2026
14c2246
docs: add a top-level Security page
claude Jul 31, 2026
9fc10e5
docs: cross-link User Roles, trim the Networking section
claude Jul 31, 2026
b0e5ad1
docs: fix the eight Sphinx warnings from generated API docs
claude Jul 31, 2026
cb7a61a
docs: add a top-level Governance and compliance page
claude Jul 31, 2026
25b4806
docs: describe custom/ correctly in flip-utils user-app section
claude Aug 1, 2026
e637b94
docs: fix drift across READMEs, RST, and flip-utils type annotations
claude Aug 2, 2026
91acc95
style: wrap RUN_EVALUATOR.__init__ under the 120-char limit
claude Aug 2, 2026
25ac156
Merge pull request #817 from londonaicentre/demo-video-recorder
atriaybagur Aug 3, 2026
0f96164
chore: pin dcmqi conversion image to v1.5.6
atriaybagur Aug 3, 2026
d31ddc6
Merge pull request #840 from londonaicentre/836-diffusion-model-clien…
atriaybagur Aug 3, 2026
b08c5d2
Merge pull request #841 from londonaicentre/52-malware-scanning-uploa…
atriaybagur Aug 3, 2026
c09f13d
fix(flip-utils): fail fast on best_model_metric with num_rounds <= 1;…
atriaybagur Aug 3, 2026
205fd01
fix(security): gate accession-ids on cohort threshold, reject writabl…
Aug 3, 2026
4825bb9
fix(orthanc): require a non-empty user pair; smoke every refusal case…
atriaybagur Aug 3, 2026
c563611
Address review: refuse placeholder/weak XNAT DB passwords; plumb mint…
atriaybagur Aug 3, 2026
a436f3a
Merge remote-tracking branch 'origin/develop' into security-pt-002-08…
Aug 3, 2026
384ba85
Merge pull request #812 from londonaicentre/spike-map-packaging
atriaybagur Aug 3, 2026
1aa04a6
Move the Helm chart toolchain to Helm 4
atriaybagur Aug 3, 2026
9290820
Merge pull request #848 from londonaicentre/models-list-created-column
atriaybagur Aug 3, 2026
8d455ef
docs: regenerate documentation GIFs
atriaybagur Aug 3, 2026
50c9034
docs: state in-flight controls as in delivery, not shipped; trust-set…
atriaybagur Aug 3, 2026
b2fb8be
fix(xnat): fail loud on configure-xnat.sh API errors, drop PACS_DICOM…
atriaybagur Aug 3, 2026
4b3a757
fix(security): grant DAC_OVERRIDE + FOWNER to orthanc service (#822)
garciadias Aug 3, 2026
9751af8
Merge pull request #864 from londonaicentre/bot/regenerate-docs-gifs
atriaybagur Aug 3, 2026
c8e2d22
fix(xnat): force plugin re-sync when the S3 roster prefix changes
atriaybagur Aug 3, 2026
8050ec5
ci(xnat): read XNAT_VERSION from trust/xnat/.env instead of hardcodin…
atriaybagur Aug 3, 2026
4e603dd
docs(xnat): refresh container-service comments from 3.7.3 to 3.8.1
atriaybagur Aug 3, 2026
8e761a7
Address review: complete sudo sweep (kit packager, trust docs), harde…
atriaybagur Aug 3, 2026
9ae7751
Merge remote-tracking branch 'origin/develop' into 787-abort-job-pre-…
atriaybagur Aug 3, 2026
83d9f85
fix: gate prepare_and_start_training on the abort state so a pre-tick…
atriaybagur Aug 3, 2026
c8929a8
fix(security): run NVFLARE fl-server, fl-client, and fl-base containe…
garciadias Aug 3, 2026
705f452
feat(fl-tutorials): simulator round-metrics harness for arkplus_fine_…
garciadias Aug 3, 2026
897aef5
fix: gate the endpoint success log on the applied status so an ignore…
atriaybagur Aug 4, 2026
2fc2f1f
Merge pull request #790 from londonaicentre/787-abort-job-pre-training
atriaybagur Aug 4, 2026
2a442e6
Address review: document pre-fix host remediation, align test layout
atriaybagur Aug 4, 2026
aca9319
docs: regenerate documentation GIFs
atriaybagur Aug 4, 2026
11c1620
Merge pull request #866 from londonaicentre/bot/regenerate-docs-gifs
atriaybagur Aug 4, 2026
c89a0a3
Merge remote-tracking branch 'origin/develop' into claude/security-pe…
atriaybagur Aug 4, 2026
985563d
Address review: split xnat-db roles on K8s, unify weak-password lists
atriaybagur Aug 4, 2026
901c924
fix(tests): stop alembic's fileConfig disabling the application logger
atriaybagur Aug 4, 2026
b42893d
fix: address garciadias review — exclude_vars list type, KiB math, co…
claude Aug 4, 2026
476f422
docs(k8s): call out Helm 4's stricter kstatus --wait readiness
atriaybagur Aug 4, 2026
392e290
docs: add PROD=<stag|true> to on-prem NLB IP-rotation command
claude Aug 4, 2026
8948521
Merge pull request #811 from londonaicentre/673-best-model-intime-sel…
atriaybagur Aug 4, 2026
3f0cfaf
fix(security): constrain cohort threshold, drop unreachable column guard
atriaybagur Aug 4, 2026
67ed510
Merge pull request #855 from londonaicentre/817-pin-dcmqi-image
atriaybagur Aug 5, 2026
7012d8f
Merge pull request #441 from londonaicentre/claude/security-pentest-f…
atriaybagur Aug 5, 2026
682bd2a
Merge pull request #861 from londonaicentre/860-helm-4-toolchain
atriaybagur Aug 5, 2026
5ff6cd0
Merge pull request #854 from londonaicentre/claude/practical-babbage-…
atriaybagur Aug 5, 2026
2e551d2
docs(tests): scope the logging regression docstring to .disabled
atriaybagur Aug 5, 2026
144e0a4
Warn about image orientation in the Ark+ tutorial docs
atriaybagur Aug 5, 2026
bb89a24
Address review: execute the XNAT password guards in CI
atriaybagur Aug 5, 2026
e72da3e
Correct four inaccuracies in the orientation documentation
atriaybagur Aug 5, 2026
049d86d
fix(orthanc): reject blank credentials, pin the auth flag at runtime …
atriaybagur Aug 5, 2026
7fc402b
docs(xnat): record that Compose/Swarm redeploys are always fresh inst…
atriaybagur Aug 5, 2026
be345e6
fix(k8s): let the XNAT init job actually wait for XNAT to boot
atriaybagur Aug 5, 2026
6a4408b
fix(k8s): pin the chart's XNAT plugins to the 1.10.0-compatible roster
atriaybagur Aug 5, 2026
dff3cbb
Report the current Ark+ evaluation numbers in the guide
atriaybagur Aug 5, 2026
17da950
fix(k8s): fail loud in xnat-init-job, grant admin ContainerManager
atriaybagur Aug 5, 2026
d35987e
Merge pull request #444 from londonaicentre/claude/security-pentest-f…
atriaybagur Aug 5, 2026
e96d74d
Merge pull request #821 from londonaicentre/820-arkplus-orientation-fix
atriaybagur Aug 5, 2026
45120e5
Merge pull request #828 from londonaicentre/claude/practical-babbage-…
atriaybagur Aug 5, 2026
0129220
Merge pull request #839 from londonaicentre/security-pt-002-088-cohor…
atriaybagur Aug 5, 2026
43ee750
Merge pull request #867 from londonaicentre/fix-flip-api-test-order-d…
atriaybagur Aug 5, 2026
76b7b9e
docs: regenerate documentation GIFs
atriaybagur Aug 5, 2026
682d15f
Merge pull request #850 from londonaicentre/claude/docs-security-page
atriaybagur Aug 5, 2026
9fad952
Merge pull request #873 from londonaicentre/bot/regenerate-docs-gifs
atriaybagur Aug 5, 2026
9ea476b
Merge branch 'develop' into pt-091-orthanc-auth-hardening
atriaybagur Aug 5, 2026
9dd8415
docs: correct Model Files and Training Configuration in the user guide
atriaybagur Aug 5, 2026
10b9e70
docs: clarify that config.json is optional for Flower job types
atriaybagur Aug 5, 2026
9049f72
Merge branch 'develop' into claude/readthedocs-model-files-docs-atbrtr
atriaybagur Aug 5, 2026
eb72ed3
Merge pull request #847 from londonaicentre/pt-091-orthanc-auth-harde…
atriaybagur Aug 5, 2026
f4e4639
Merge pull request #865 from londonaicentre/862-configure-xnat-fail-loud
atriaybagur Aug 5, 2026
28c88dd
Merge origin/develop into the XNAT 1.10.0 upgrade
atriaybagur Aug 5, 2026
bfca038
docs: correct rounds-validation note and app-bundling claims
atriaybagur Aug 5, 2026
69dd7f7
Merge pull request #869 from londonaicentre/claude/readthedocs-model-…
atriaybagur Aug 5, 2026
82f9f74
fix(k8s): create the XNAT service account over REST, not a raw SQL in…
atriaybagur Aug 5, 2026
87c0459
refactor(k8s): remove the imaging-import-worker DQR bypass
atriaybagur Aug 5, 2026
b7282e6
fix(k8s): mount the XNAT data PVC into Container Service jobs (#565)
atriaybagur Aug 5, 2026
64e3e98
Merge pull request #849 from londonaicentre/claude/xnat-1-10-upgrade-…
atriaybagur Aug 6, 2026
42dadf5
fix: clear open Dependabot security alerts across manifests (#874)
garciadias Aug 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
66 changes: 66 additions & 0 deletions .claude/commands/headers.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
---
description: Add the Apache 2.0 copyright header to new/changed source files that are missing it
allowed-tools: Bash(git:*), Read, Edit, Grep
---

CLAUDE.md requires every source file to carry the Apache 2.0 copyright header, but **nothing
in CI or pre-commit enforces it**. This command finds source files missing the header and adds it.

The canonical header for FLIP-authored files uses this exact owner string. **Match the
year convention already used by neighbouring files in the same directory**: the predominant
existing style is the **dateless** form shown below (`Copyright (c) Guy's and St Thomas' ...`),
so default to dateless; only include a year if the surrounding files in that directory
consistently carry one, and in that case copy their year rather than stamping the current
year. Do not "correct" the year on files that already have a header — leave existing headers
untouched (see step 2).

**Hash-comment languages** (`.py`, `.sh`, `.yml`, `.yaml`, `Dockerfile`, `Makefile`, `.toml`):
```
# Copyright (c) Guy's and St Thomas' NHS Foundation Trust & King's College London
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# http://www.apache.org/licenses/LICENSE-2.0
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
```

**C-style block-comment languages** (`.ts`, `.js`, `.vue`, `.css`):
```
/*
* Copyright (c) Guy's and St Thomas' NHS Foundation Trust & King's College London
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
```

Steps:

1. **Determine the file set.** Default to files this branch actually added/changed. Diff
against the **merge-base** (not `develop` directly) so files changed on `develop` since
the branch was cut are excluded:
```
git diff --name-only --diff-filter=ACMR "$(git merge-base HEAD origin/develop)"
git status --porcelain
```
If the user passed paths in `$ARGUMENTS`, use those instead. Restrict to source files in the languages above; skip vendored/generated files (e.g. anything carrying a `Copyright (c) 2026 Flower Labs GmbH` header — leave third-party headers untouched), lockfiles, JSON, Markdown, and `required_files.json`.

2. **Check each file** for an existing copyright header (Grep for `Copyright (c)` in the first ~15 lines). Skip files that already have one.

3. **Insert the matching header** for files that are missing it, using Edit:
- Preserve any shebang (`#!/usr/bin/env ...`) or encoding line as the **first** line — insert the header immediately after it.
- For `.vue` files, the header goes at the very top of the file (before `<template>`/`<script>`).
- Otherwise insert at the very top.

4. **Report** the list of files you added headers to, and any you skipped (already had one / vendored / unsupported type). Do not commit — leave staging to the user.
38 changes: 38 additions & 0 deletions .claude/commands/migration.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
---
description: Generate a flip-api Alembic migration for model changes and verify the drift guard
argument-hint: "<short description of the schema change>"
allowed-tools: Bash(make:*), Bash(git:*), Read, Edit
---

You are creating a database migration for **flip-api**. CLAUDE.md makes this a hard rule:
any schema-affecting change to `flip-api/src/flip_api/db/models/*.py` **must** ship an
Alembic revision in the same change, or the integration drift guard
(`flip-api/tests/integration/test_migrations.py`) fails.

The change description is: **$ARGUMENTS**

Do the following, stopping to report if any step fails:

1. **Confirm there is a model change to capture.** Diff against the **merge-base** (not `develop` directly) so model changes merged into `develop` after this branch was cut don't show up as false positives: `git diff --stat "$(git merge-base HEAD origin/develop)" -- flip-api/src/flip_api/db/models/` (also check the unstaged working tree). If nothing under `db/models/` changed, warn the user that a migration may not be needed and ask whether to continue anyway.

2. **Generate the revision.** Run:
```
make -C flip-api migration MESSAGE="$ARGUMENTS"
```
This requires `flip-db` to be up (it runs alembic inside the service container). If it fails because the DB isn't running, tell the user to `make central-hub` (or `make up`) first.

3. **Review the generated revision.** Find the new file under `flip-api/src/flip_api/db/migrations/versions/` (the most recently created one) and Read it. Check that:
- the autogenerated `upgrade()` / `downgrade()` match the intended change and nothing spurious was captured (e.g. unrelated type changes from a stale DB),
- the `down_revision` chains onto the current head,
- the Apache 2.0 copyright header is present (run `/headers` if not).
Summarise what the migration does for the user.

4. **Run the drift guard** to prove models and migrations agree:
```
make -C flip-api integration_test
```
(or, if you want to scope it, run just `tests/integration/test_migrations.py`). Report pass/fail.

5. **Remind** the user to `git add` both the model change and the new revision together, and to commit with `-s` (DCO sign-off).

Do not edit the migration's logic unless the user asks — Alembic autogenerate is the source of truth; only fix the header or obviously wrong autogen artifacts after confirming with the user.
40 changes: 40 additions & 0 deletions .claude/commands/test-both-backends.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
---
description: Run the full e2e smoke lifecycle on both FL backends (flower then nvflare), reusing the project to pull DICOM only once
allowed-tools: Bash(make:*), Bash(docker:*), Read
---

Drive the end-to-end smoke test (`make e2e_smoke`) across **both** FL backends in one go.
This is the scripted full-lifecycle check (create project → cohort query → image pull → FL
training → download results) and is **not** run in CI. It is heavy and long-running, so run
the smoke steps in the **background** and report each backend's result.

Use the documented backend-switch trick so the ~6-min DICOM image pull happens only **once**:
pull on the first backend, then reuse the same approved project on the second.

**Preconditions (check first, do not skip):**
- The stack must be running: `make up` (central hub + trusts + XNAT), trusts registered, Orthanc seeded. If it's not up, stop and tell the user to start it — do not try to `make up` yourself (it needs AWS access and is slow).
- If the user is testing branch code, the running containers must carry it. Remind them that the stack serves published images unless rebuilt (`make build-fl FL_BACKEND=<backend>` or the fast fl-api-only path), and they can confirm with `docker exec flip-fl-api-net-1 cat fl_api/utils/upload.py`.

**Steps:**

1. **Backend 1 — Flower (does the image pull).** Run in the background:
```
make e2e_smoke FL_BACKEND=flower
```
Watch the output for the `project_id=<UUID>` printed near the start — **capture it**; you need it for step 3. Wait for completion and report pass/fail. (Tutorial files default to `fl-tutorials/flower/xray_classification/` for this backend.)

2. **Switch the stack to NVFLARE** without disturbing the pulled DICOM (`restart-fl` leaves Orthanc/XNAT untouched):
```
make restart-fl FL_BACKEND=nvflare DOCKER_FL_REGISTRY= DOCKER_FL_TAG=dev
```
(Drop `DOCKER_FL_REGISTRY=`/`DOCKER_FL_TAG=dev` if the user is running published images rather than locally-built `:dev` images — ask if unsure.)

3. **Backend 2 — NVFLARE (reuses the project, skips re-pull).** Run in the background:
```
make e2e_smoke FL_BACKEND=nvflare EXTRA_ARGS="--project-id <UUID-from-step-1>"
```
The `--project-id` override skips cohort submission + approval and the image-pull wait returns immediately because the studies are already pulled. Report pass/fail.

4. **Summarise**: a clear PASS/FAIL line per backend, and surface any error output from a failed run. If the user passed extra flags in `$ARGUMENTS` (e.g. `--abort-midway`, custom `MODEL_FILES_DIR`/`QUERY_FILE`), thread them into the `EXTRA_ARGS`/make vars of both runs.

Note: if the first run fails before printing a `project_id`, stop and report — don't proceed to the switch.
72 changes: 72 additions & 0 deletions .claude/hooks/session-start.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
#!/usr/bin/env bash
# Copyright (c) 2026 Guy's and St Thomas' NHS Foundation Trust & King's College London
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# http://www.apache.org/licenses/LICENSE-2.0
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#
# FLIP SessionStart hook: make a fresh Claude Code session (especially on the web)
# ready to test/lint. Best-effort only — it must never fail the session, so every
# step is guarded and the script always exits 0. Output is surfaced to Claude as
# session context.

set +e
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
cd "$REPO_ROOT" || exit 0

echo "== FLIP session bootstrap =="

# 1. Install pre-commit hooks (TruffleHog, detect-secrets, uv-lock, header/env checks).
if command -v pre-commit >/dev/null 2>&1; then
if [ ! -f .git/hooks/pre-commit ]; then
pre-commit install >/dev/null 2>&1 && echo "pre-commit: hooks installed" || echo "pre-commit: install skipped"
else
echo "pre-commit: already installed"
fi
else
echo "pre-commit: not on PATH (run 'pip install pre-commit' to enable commit-time guards)"
fi

# 2. Sync uv environments for the Python services this branch touched, so tests/linters
# (ruff + mypy + pytest) can run immediately. Bounded + quiet; never blocks on network.
BASE="$(git merge-base HEAD origin/develop 2>/dev/null || echo develop)"
CHANGED_DIRS="$(git diff --name-only "$BASE" 2>/dev/null | grep -E '\.(py|toml)$' \
| sed -E 's#/[^/]+$##' | sort -u)"

declare -A SYNCED
if command -v uv >/dev/null 2>&1; then
for d in $CHANGED_DIRS; do
# walk up to the nearest dir containing a pyproject.toml
p="$d"
while [ -n "$p" ] && [ "$p" != "." ]; do
if [ -f "$p/pyproject.toml" ]; then
if [ -z "${SYNCED[$p]}" ]; then
SYNCED[$p]=1
( cd "$p" && timeout 120 uv sync --quiet >/dev/null 2>&1 ) \
&& echo "uv sync: $p ✓" || echo "uv sync: $p (skipped/timeout)"
fi
break
fi
p="$(dirname "$p")"
done
done
[ ${#SYNCED[@]} -eq 0 ] && echo "uv sync: no changed Python projects on this branch"
else
echo "uv: not on PATH"
fi

# 3. Report uv.lock drift so a forgotten 'make lock' surfaces before CI blocks the PR.
DRIFT="$(git status --porcelain '*uv.lock' 2>/dev/null)"
if [ -n "$DRIFT" ]; then
echo "uv.lock drift detected (run 'make lock' and stage the changes):"
echo "$DRIFT" | sed 's/^/ /'
fi

echo "== bootstrap done =="
exit 0
15 changes: 15 additions & 0 deletions .claude/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"hooks": {
"SessionStart": [
{
"hooks": [
{
"type": "command",
"command": "bash \"$CLAUDE_PROJECT_DIR/.claude/hooks/session-start.sh\"",
"timeout": 180
}
]
}
]
}
}
Loading
Loading