Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
85 commits
Select commit Hold shift + click to select a range
c64bcae
Improve Forge import and Viewer sync UX
Enksodsoon Aug 13, 2026
a9c92cf
feat: add capability-driven universal image readers
Enksodsoon Aug 13, 2026
1f6feec
feat: open Motic MDS and SDPC slides
Enksodsoon Aug 13, 2026
9add47e
feat: open iSyntax slides with libisyntax
Enksodsoon Aug 14, 2026
688895c
test: audit local SVS compatibility
Enksodsoon Aug 14, 2026
32a4a36
feat: package universal reader runtimes
Enksodsoon Aug 14, 2026
c8d6bcc
Fix local annotation paths, calibrated measurements and hierarchy
Enksodsoon Oct 8, 2026
3ad05d6
Make Forge reader runtime and credential boundaries portable
Enksodsoon Oct 8, 2026
b5a3837
Restore crop geometry when pointer gestures are cancelled
Enksodsoon Oct 8, 2026
48674f4
Read bounded native RGB regions from exact series and Z/T plane
Enksodsoon Oct 8, 2026
b17ba11
Add sandboxed Electron desktop and owned Java service lifecycle
Enksodsoon Oct 8, 2026
93d4317
Bound desktop shutdown fallback to the macOS service process group
Enksodsoon Oct 8, 2026
d3bda70
Restrict reviewed reader file links to macOS staging hosts
Enksodsoon Oct 8, 2026
4db0d20
Require explicit service distribution channel and truthful containmen…
Enksodsoon Oct 8, 2026
ed82acc
Persist bounded deterministic analysis runs and exact ROI outputs
Enksodsoon Oct 8, 2026
68adbfb
Freeze native view provenance and persist conflict-safe tool reviews
Enksodsoon Oct 8, 2026
0e04805
Add deterministic tool configuration, inspection and review interface
Enksodsoon Oct 8, 2026
32ad392
Bound thin ROI sampling and verify external source invalidation
Enksodsoon Oct 8, 2026
8f11fd8
Verify and persist non-AI feature pack activation and rollback
Enksodsoon Oct 8, 2026
3446f58
Integrate private desktop lifecycle, durable tools, queue pause and v…
Enksodsoon Oct 8, 2026
f9dc24c
Add offline Study drafts, canonical preview and bounded question imports
Enksodsoon Oct 8, 2026
bc0b9a1
Add offline Study authoring UI and deterministic teaching coordinates
Enksodsoon Oct 8, 2026
f2a2756
Require loaded teaching pixels before faculty preview review
Enksodsoon Oct 8, 2026
010422f
Bind Viewer recovery state to verified accounts and atomic offline ac…
Enksodsoon Oct 8, 2026
b78ebd9
Integrate feature lifecycle, Study APIs and verified native/offline e…
Enksodsoon Oct 8, 2026
c1a40e2
Wire offline Study authoring navigation and local export routes
Enksodsoon Oct 8, 2026
e514dc9
Preserve accepted deterministic result provenance and frozen retry pa…
Enksodsoon Oct 8, 2026
a6cf68a
Connect scoped result delivery and record current qualification limits
Enksodsoon Oct 8, 2026
bf8dd9b
Use verified Viewer transport for signed feature catalog and pack dow…
Enksodsoon Oct 8, 2026
f5175a7
Return completed delivery without another ingest reservation
Enksodsoon Oct 8, 2026
811dcd8
Expose verified offline sync states and guard account and export races
Enksodsoon Oct 8, 2026
e2fca09
Preserve JSON request bodies and bind native cancel to its export job
Enksodsoon Oct 8, 2026
7978a2f
Capture one verified credential for account-bound Viewer requests
Enksodsoon Oct 8, 2026
61684b2
Inspect corrected deterministic objects as scoped slide overlays
Enksodsoon Oct 8, 2026
dfbe69d
Pass the packaged approved feature trust key to the local service
Enksodsoon Oct 8, 2026
7a77806
Keep offline retries and status responsive with scoped transfer writes
Enksodsoon Oct 8, 2026
1bb4831
Replace obsolete derivative-only contract instructions with release d…
Enksodsoon Oct 8, 2026
41443f3
Inspect approximate registration with independent checks and bounded …
Enksodsoon Oct 8, 2026
62c283c
Gate Forge distribution on exact inventories and native release evidence
Enksodsoon Oct 8, 2026
3fdb04e
Bind dependency and legal input hashes to distribution review
Enksodsoon Oct 8, 2026
808e587
Pin packaged activation to signed service bytes and Electron integrit…
Enksodsoon Oct 8, 2026
8ab4a6c
Record current integration evidence and remaining release gates
Enksodsoon Oct 8, 2026
5ffbcab
Persist batch snapshots and recover pinned conversion admissions
Enksodsoon Oct 8, 2026
387c1f8
Connect durable batch reports and verified exports to app journeys
Enksodsoon Oct 8, 2026
5b2d9e4
Freeze local reviewed release input schema
Enksodsoon Oct 8, 2026
1267f60
Capture service metadata before Gradle task execution
Enksodsoon Oct 8, 2026
28b73a7
Preserve inventoried signed app bytes during Squirrel assembly
Enksodsoon Oct 8, 2026
1c4246d
Connect scoped Study publication and explicit Teaching artifact gener…
Enksodsoon Oct 8, 2026
3800edd
Persist reviewed TMA hierarchy and preserve bounded analysis provenance
Enksodsoon Oct 8, 2026
cdb49b4
Add exact-coordinate mask overlay and reviewed TMA core actions
Enksodsoon Oct 8, 2026
404c734
Connect reviewed cores, scoped mask overlays and paged analysis history
Enksodsoon Oct 8, 2026
4af0a05
Complete explicit Teaching prepared delivery and package-bound results
Enksodsoon Oct 8, 2026
04ef244
Bind final installer payload and stage signed reader activation
Enksodsoon Oct 8, 2026
b70a3c1
Show fixed actionable data-upgrade startup failures
Enksodsoon Oct 8, 2026
01a6c3f
Back up managed SQLite data before versioned upgrades and refuse down…
Enksodsoon Oct 8, 2026
71294b4
Document locked data recovery and conservative rollback constraints
Enksodsoon Oct 8, 2026
b8cd8e3
Refuse orphan SQLite sidecars on same-version restarts
Enksodsoon Oct 8, 2026
7d332df
Expose measured managed storage and preserve unscoped annotation exports
Enksodsoon Oct 8, 2026
f26085f
Record integrated delivery recovery and remaining release acceptance …
Enksodsoon Oct 8, 2026
eb0e5c4
Bind offline Study drafts to immutable teaching artifacts and pixel r…
Enksodsoon Oct 8, 2026
2d9bacf
Preview exact offline teaching pixels and capture scoped spatial targets
Enksodsoon Oct 8, 2026
4a3b5bb
Serve bounded teaching preview bytes exclusively from verified packages
Enksodsoon Oct 8, 2026
3fd6108
Bind offline teaching review to intact packaged pixels
Enksodsoon Oct 8, 2026
effa829
Compose brush edits as bounded contour masks preserving holes
Enksodsoon Oct 8, 2026
3ae4e11
Connect scoped brush composition and desktop boundary CI
Enksodsoon Oct 8, 2026
237dcc2
Expose paged durable batch history
Enksodsoon Oct 8, 2026
cd7208f
Preflight legacy transfer and serialize brush view mutations
Enksodsoon Oct 8, 2026
b284c89
Exercise brush mask HTTP scope bounds and source conflicts
Enksodsoon Oct 8, 2026
8a7ef57
Verify legacy annotation preflight before remote batches
Enksodsoon Oct 8, 2026
b1012f7
Record integrated teaching brush and private transport evidence
Enksodsoon Oct 8, 2026
680103b
Track current acceptance gates and await visible inspector readiness
Enksodsoon Oct 8, 2026
d8b552e
Persist batch intent before metadata inspection
Enksodsoon Oct 8, 2026
98ccc35
Freeze authoritative contract fixture bytes across platforms
Enksodsoon Oct 8, 2026
793bc3d
Persist batch intent before bounded metadata inspection
Enksodsoon Oct 8, 2026
af765f9
Stop durable batch inspection before conversion shutdown
Enksodsoon Oct 8, 2026
480cac6
Reuse native batch launcher styling and declare desktop build tool
Enksodsoon Oct 8, 2026
bb536e3
Check feature import HTTP grants and signed catalog rejection
Enksodsoon Oct 8, 2026
eebc2a9
Wire native signed feature import without Viewer pairing
Enksodsoon Oct 8, 2026
3f31440
Require offline feature bridge in packaged smoke
Enksodsoon Oct 8, 2026
e7cb83e
Import approved signed non-AI packs offline without Viewer pairing
Enksodsoon Oct 8, 2026
2a506db
Preserve selected pack inputs outside managed cleanup paths
Enksodsoon Oct 8, 2026
ebf2986
Record integrated desktop and Viewer qualification evidence
Enksodsoon Oct 8, 2026
c430d34
Improve Gradle test failure diagnostics
Enksodsoon Oct 8, 2026
0c9b965
Normalize hosted Java test paths
Enksodsoon Oct 8, 2026
fcdbc95
Stabilize cross-platform release tests
Enksodsoon Oct 8, 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
1 change: 1 addition & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
src/test/resources/study/viewer-authoritative-v1.json text eol=lf
11 changes: 10 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ jobs:
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
os: [windows-latest, macos-latest]

steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
Expand All @@ -48,6 +48,15 @@ jobs:
- name: Frontend tests
run: pnpm --dir frontend test

- name: Desktop dependency lock
run: pnpm --dir desktop install --frozen-lockfile

- name: Desktop boundaries and release receipt tests
run: pnpm --dir desktop test

- name: Desktop syntax
run: pnpm --dir desktop check

- name: Test
if: runner.os != 'Windows'
run: ./gradlew --no-daemon test
Expand Down
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ Thumbs.db
*.dzi

# Runtime and packaging
runtime/
/runtime/
dist/
installers/
*.dmg
Expand All @@ -55,3 +55,6 @@ installers/

# Local evidence that may contain sensitive names
docs/evidence/local/

# Generated bundled Java service
/desktop/resources/service/
14 changes: 7 additions & 7 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

## Purpose

PathLab Forge is a standalone Windows/macOS desktop application. It performs computationally expensive WSI work locally and connects to PathLab Viewer through a versioned API, resumable tus upload and the `.plslide` package.
PathLab Forge is a standalone Windows/macOS desktop application. It performs computationally expensive WSI work locally and connects to PathLab Viewer through a versioned desktop API, offset-aware transfer and verified OME artifacts; Teaching delivery explicitly uses static DZI packages.

The separate PathLab Viewer repository owns the server library, storage accounting, package import, private preview, publication grants, folder/collection sharing, Trash, annotations and static delivery.

Expand All @@ -17,11 +17,11 @@ For every Codex run:
5. `docs/integration/CURRENT_VIEWER_BASELINE.md` when a task depends on Viewer internals
6. `docs/compatibility/OS_MATRIX.md` when platform behavior is involved

Do not read or implement every future milestone.
The approved release plan covers all non-AI milestones. Follow its dependency order and assigned worktree ownership.

## Current Viewer integration rules

- New desktop APIs belong under `/api/v2/desktop`; tus remains `/api/v1/uploads/`.
- Reuse the existing offset-aware desktop upload. New desktop contracts belong under `/api/v2/desktop`; retain reviewed compatibility routes where required.
- Forge local states do not mirror Viewer states one-to-one.
- Viewer’s MVP prepared flow reuses `uploading → queued → validating → converting → ready_private` and distinguishes the path through `ingest_mode`.
- Forge uses local `SERVER_PROCESSING` while polling the exact server state separately.
Expand Down Expand Up @@ -52,16 +52,16 @@ PathLab Forge does not own:
- public tile delivery;
- Viewer library search, collections, sharing or Trash;
- Viewer annotations;
- student/teacher workflows;
- Viewer course authority and learner records; Forge owns offline Study Pack authoring.
- AI diagnosis;
- fluorescence analysis;
- Z-stack or time-series navigation;
- Unsupported channel, Z-stack or time-series claims; qualified reader views are included.
- PACS/DICOM integration;
- automatic public publication by default.

## Working rules

- Work on exactly one active-plan task.
- Work on the assigned focused batch within the approved complete release plan.
- Create a focused `codex/` branch.
- Use test-driven development for behavior changes.
- Prefer small interfaces and adapters over direct dependency coupling.
Expand All @@ -73,7 +73,7 @@ PathLab Forge does not own:
- Preserve completed local packages across upload failures.
- Never reconvert solely because upload failed.
- Do not invent a Viewer API, schema, thumbnail policy or state transition that conflicts with the reviewed baseline.
- Commit the completed task, return the required report, and stop.
- Return commits, focused/full checks and evidence; continue coordinated work until the approved plan is handled.

## Resource defaults

Expand Down
36 changes: 7 additions & 29 deletions CODEX_START_HERE.md
Original file line number Diff line number Diff line change
@@ -1,35 +1,13 @@
# Codex Start Here — PathLab Forge
# Start here: PathLab Forge desktop release

The private repository already exists:
Read `docs/plans/active/current.md` and `docs/plans/active/RELEASE_PROGRESS.md` first. The approved work is the complete non-AI Windows/macOS release, not the obsolete F1.1 foundation task.

```text
Enksodsoon/PathLab-Forge
```
Use Java 17, React, SQLite and the existing streaming pipeline. Electron owns the desktop window and service lifecycle. Normal delivery retains verified OME; Teaching delivery explicitly produces independently identified static DZI. Viewer remains authoritative for identity, permissions, privacy, publication and learner records.

The integration plan has been re-based on the current PathLab Viewer library v2 architecture.
Build in isolated `codex/` worktrees, with one integration owner and at most three active workers. Integrate focused commits and run checks on the combined head. Preserve user data and historical evidence. Never treat unverified runtime rights, signing, actual-platform testing, deployment or production verification as complete.

## First Codex prompt
Development: `gradlew test` runs Java tests and the production interface build. Run frontend tests separately with `pnpm test` in `frontend`, desktop checks with `pnpm test` and `pnpm check` in `desktop`, and repository policy with `scripts/verify-repo.ps1`. Use JDK 17 explicitly on machines whose default Java differs.

Paste only this:
`gradlew run --args=--serve` retains the browser/headless development mode. The packaged Electron app uses `--desktop`, bundled resources, private readiness and one-time local authorization. Development runtime discovery does not qualify a clean-machine release.

```text
Open Enksodsoon/PathLab-Forge.

Read AGENTS.md and docs/plans/active/current.md. Work on Task F1.1 only: Java 17 build foundation and batch domain state machine.

The active task is intentionally independent from PathLab Viewer implementation. Do not add QuPath, Bio-Formats, OpenSlide, libvips, JavaFX, SQLite, package schemas, server upload, WSI conversion, installers or later tasks.

Use test-driven development exactly as specified:
1. create the failing tests;
2. run them and confirm the expected failure;
3. implement the smallest complete solution;
4. run focused and full checks;
5. review scope and naming;
6. commit Task F1.1;
7. return the required TASK RESULT report;
8. stop.
```

## Why the first task remains small

PathLab Viewer now has folders, collections, storage accounting, cached thumbnails, publication grants, sharing and annotations. Those are server-owned systems. The first Forge task builds only a stable local batch state model, allowing later conversion and upload adapters to integrate without coupling the core to Viewer internals.
Record acceptance receipts and remaining blockers in the progress register. No paid service, certificate purchase or cloud spend is automatic.
2 changes: 1 addition & 1 deletion LICENSE_STATUS.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# License Status

No final distribution license is selected yet.
The approved target is GPL-3.0-or-later, subject to exact dependency and corresponding-source review. No final redistribution approval is granted yet.

The application is intended to use open-source components that may impose redistribution or copyleft requirements. Before publishing source or installers, complete `docs/licensing/DEPENDENCY_REVIEW.md` and decide the compatible application license.

Expand Down
12 changes: 6 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# PathLab Forge

**PathLab Forge** is the local desktop companion for PathLab Viewer.
**PathLab Forge** is the local desktop companion for PathLab Viewer. The active non-AI Windows/macOS release is in development; see `docs/plans/active/current.md` and `docs/plans/active/RELEASE_PROGRESS.md` for current implementation and qualification.

It opens supported whole-slide image datasets on Windows and macOS, lets the user inspect the correct image series, crop or downsample, renders standardized 8-bit RGB through a temporary pyramidal OME-TIFF, generates a compact PathLab-compatible DZI, processes slides in batch, and uploads prepared packages resumably.

Expand All @@ -9,10 +9,10 @@ PathLab Forge is deliberately separate from `PathLab-Viewer`.
```text
PathLab Forge desktop
-> local WSI read / view / crop / convert
-> temporary local OME-TIFF staging
-> verified .plslide with compact DZI + thumbnail
-> staging OME and loose DZI removed
-> HTTPS + tus
-> retained verified OME-TIFF artifact (normal delivery)
-> explicit Teaching delivery: separate verified DZI package + thumbnail
-> original sources and completed artifacts preserved
-> HTTPS + existing offset-aware desktop transfer
PathLab Viewer server
-> safe validation / import
-> existing library folder or Unfiled
Expand All @@ -33,7 +33,7 @@ The latest Viewer is a folder-aware library rather than a flat upload list. Forg

Forge does not replace any of those systems.

## Run the viewer-first shell
## Development browser mode (desktop release uses Electron)

The desktop shell binds only to a
random `127.0.0.1` port, opens a one-time launch URL, and establishes an HttpOnly,
Expand Down
Loading
Loading