Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
423 commits
Select commit Hold shift + click to select a range
eb2c3f3
mypy: clear gently/hardware/* type errors (#49)
subindevs Jun 17, 2026
2be3587
mypy: clear gently library modules (ui, ml, eval, analysis, organisms…
subindevs Jun 17, 2026
87a52c5
Move hardware-control stack into default-on device dependency group
schneidermc Jun 17, 2026
44d9f2b
Merge pull request #61 from gently-project/device-dependency-group
pskeshu Jun 25, 2026
4d503f8
docs(temperature): design spec for temperature interface (sub-project A)
pskeshu Jun 27, 2026
d1c881f
docs(temperature): TDD implementation plan for temperature interface …
pskeshu Jun 27, 2026
06a5883
feat(temperature): session-scoped temperature.jsonl store on FileStore
pskeshu Jun 27, 2026
3279c8f
feat(temperature): add TEMPERATURE_UPDATE event type
pskeshu Jun 27, 2026
81bba23
feat(temperature): TemperatureSampler service (poll/persist/emit @1Hz)
pskeshu Jun 27, 2026
122a580
feat(temperature): start/stop TemperatureSampler with the agent
pskeshu Jun 27, 2026
1a062c2
feat(temperature): GET /api/temperature/{session}/history backfill route
pskeshu Jun 27, 2026
a8e9817
feat(temperature): stamp latest reading into burst + volume metadata
pskeshu Jun 27, 2026
e21b567
feat(temperature): live SVG temperature graph on the Devices tab
pskeshu Jun 27, 2026
0daebda
fix(temperature): idempotent graph init + theme setpoint color + labe…
pskeshu Jun 27, 2026
1f6c7fa
docs(temperature): correct EventType auto() example in plan
pskeshu Jun 27, 2026
60e63dd
fix(temperature): events-tab exclusion, burst-stamp test, invalidate …
pskeshu Jun 27, 2026
a79a957
fix(temperature): root-level temp graph colors for portability
pskeshu Jun 28, 2026
339cc7c
docs(manual-mode): design spec for SPIM single-slice live view (B1)
pskeshu Jun 28, 2026
2041c3a
docs(manual-mode): B1 plan (7 tasks) + ASIdiSPIM two-camera model app…
pskeshu Jun 28, 2026
ec917e0
feat(manual-mode): add LIGHTSHEET_FRAME event type + frontend exclusion
pskeshu Jun 28, 2026
0ec20c2
feat(manual-mode): device-layer lightsheet live streamer (continuous …
pskeshu Jun 28, 2026
2c2cc95
feat(manual-mode): client stream_lightsheet + set_lightsheet_live_params
pskeshu Jun 28, 2026
8b86000
feat(manual-mode): LightSheetStreamMonitor bridge + agent wiring
pskeshu Jun 28, 2026
d641fa4
feat(manual-mode): require_control proxy routes for lightsheet live +…
pskeshu Jun 28, 2026
84a659d
fix(manual-mode): laser/off uses Laser ALL OFF config + expose laser …
pskeshu Jun 28, 2026
481d8bb
mypy: clear final cluster + remove the last overrides (#49)
subindevs Jun 28, 2026
9917e12
feat(manual-mode): Manual view — SPIM live canvas, galvo/piezo/exposu…
pskeshu Jun 28, 2026
c69c1ae
Restore dependencies accidentally stripped in 2be3587
subindevs Jun 28, 2026
37f9156
ci: add deps-installed mypy job (non-blocking)
subindevs Jun 28, 2026
c749223
fix(manual-mode): init temperature graph per-view in switchView (sing…
pskeshu Jun 28, 2026
5e12b60
docs(manual-mode): lightsheet FPS measurement protocol + transport de…
pskeshu Jun 28, 2026
804e370
Merge pull request #62 from subindevs/49-mypy-clear-overrides
pskeshu Jun 28, 2026
779e6c6
fix(manual-mode): brightfield-safe + focal-plane-correct acquire, seq…
pskeshu Jun 28, 2026
909aacc
docs(tactic): spec + plan for temp-change burst tactic (C, 6 tasks)
pskeshu Jun 28, 2026
7ec42d0
feat(tactic): timeline event types for temp-change burst protocol
pskeshu Jun 28, 2026
5412c30
feat(tactic): thread laser_config through BurstAcquisition + queue_bu…
pskeshu Jun 28, 2026
030a443
feat(tactic): wait_for_temperature_lock poll helper
pskeshu Jun 28, 2026
28abaa1
feat(tactic): temp-change burst protocol driver (brightfield before/d…
pskeshu Jun 28, 2026
6af4396
feat(tactic): run_temp_change_burst_protocol agent tool
pskeshu Jun 28, 2026
c986c92
feat(tactic): surface temp-protocol band + setpoint changes in strate…
pskeshu Jun 28, 2026
dc03872
fix(tactic): correct event docstrings, guard against concurrent timel…
pskeshu Jun 28, 2026
59c429a
docs(operations): spec + plan for Operations tab (D, 4 tasks)
pskeshu Jun 28, 2026
95f9126
feat(operations): rename Experiment tab to Operations (label only)
pskeshu Jun 28, 2026
380336f
feat(operations): emit burst phase in BURST_START + record in snapshot
pskeshu Jun 28, 2026
2a3d8b0
feat(operations): tactic band — protocol pill + setpoint markers + ph…
pskeshu Jun 28, 2026
6003b8e
docs(operations): redesign D as operation-spine (data-driven + scenar…
pskeshu Jun 28, 2026
b8da138
feat(operations): discard swimlane tactic-band (replaced by operation…
pskeshu Jun 28, 2026
22d9b06
docs(operations): v3 spec — agent-authored typed Operation Plan (DRAF…
pskeshu Jun 28, 2026
9d0c7d8
docs(operations): v3 plan — agent-authored Operation Plan (5 tasks, b…
pskeshu Jun 28, 2026
192fe97
feat(operations): OperationPlan store domain in FileContextStore
pskeshu Jun 28, 2026
1472dd0
feat(operations): declare_operation_plan typed agent tool
pskeshu Jun 28, 2026
f0d09bd
docs(operations): add execution-linkage tasks (transition_tactic, too…
pskeshu Jun 28, 2026
a75d23f
feat(operations): GET /api/operation_plan/{session} route
pskeshu Jun 28, 2026
84f5f17
docs(operations): add plan-item↔operation linkage tasks (tactical out…
pskeshu Jun 28, 2026
66a40d1
feat(operations): transition_tactic store helper
pskeshu Jun 28, 2026
224d865
feat(operations): link execution tools to plan tactics via tactic_id
pskeshu Jun 28, 2026
c445f6c
docs(sdd): Task 7 report — tactic_id threading
pskeshu Jun 28, 2026
442265f
feat(operations): OperationPlanUpdater — execution events transition …
pskeshu Jun 28, 2026
152837e
feat(operations): plan-item tactical outline (plan tactics with the i…
pskeshu Jun 28, 2026
16a85a3
feat(operations): seed Operation Plan goal + planned tactics from the…
pskeshu Jun 28, 2026
5d16f34
feat(operations): operation-spine renderer + plan scenario library (d…
pskeshu Jun 28, 2026
e65834d
feat(operations): live telemetry binding + event-driven refresh
pskeshu Jun 28, 2026
ab4395c
fix(operations): wire seeding + agent plan guidance + queue_burst gua…
pskeshu Jun 28, 2026
f4ab606
fix(operations): surface bound live.* telemetry, paused state styling…
pskeshu Jun 28, 2026
b98a041
chore: untrack SDD scratch doc accidentally committed
pskeshu Jun 28, 2026
3a2bda6
chore: gitignore .superpowers SDD scratch (untrack accidentally-commi…
pskeshu Jun 28, 2026
286e95e
docs(tactics-library): spec + plan (G, 3 tasks) — save/reuse typed ta…
pskeshu Jun 28, 2026
126de2c
feat(tactics-library): tactic-library store domain (save/list/get/apply)
pskeshu Jun 28, 2026
e25798d
feat(tactics-library): save/list/apply_tactic agent tools
pskeshu Jun 28, 2026
0dcfdca
feat(tactics-library): GET /api/tactic_library route
pskeshu Jun 28, 2026
4703f91
fix(tactics-library): scope round-trip test + preserve rationale + de…
pskeshu Jun 28, 2026
df7cf8e
docs(d2): embryo roles/strain + multi-embryo observability spec + wra…
pskeshu Jun 28, 2026
cc77f0f
docs(d2): implementation plan (4 tasks) — strain field, roles-as-use,…
pskeshu Jun 28, 2026
3ad9afe
feat(d2): per-embryo strain field
pskeshu Jun 28, 2026
d14c6de
feat(d2): roles-as-use — add lineaging + subject/reference class
pskeshu Jun 28, 2026
f48b206
docs(sdd): d2-task-2 report
pskeshu Jun 28, 2026
a697a68
feat(d2): /api/roles route + role-scoped tactic scope resolver
pskeshu Jun 28, 2026
b1a47ce
feat(d2): Operations roster lens — embryos by role + strain
pskeshu Jun 29, 2026
866d4e0
fix(d2): surface strain through timelapse_tracker + rename _rosterEmb…
pskeshu Jun 29, 2026
4353c10
chore(d2): untrack .superpowers SDD scratch (committed by a subagent)
pskeshu Jun 29, 2026
a7e41e5
docs(f): session↔plans link/delink spec + plan (4 tasks); base plans …
pskeshu Jun 29, 2026
775392b
feat(f): unlink_plan_item_session + get_plan_items_for_session
pskeshu Jun 29, 2026
26ea06a
feat(f): session↔plan link/delink endpoints
pskeshu Jun 29, 2026
73edb37
feat(f): Plans-tab session link/delink controls
pskeshu Jun 29, 2026
3bfe8e5
feat(f): session Linked-plans panel (link/delink)
pskeshu Jun 29, 2026
e2b7e48
fix(f): item-scoped POST response + delink-failure re-render + defens…
pskeshu Jun 29, 2026
99540bd
docs: add F + B2 to the wrap-up PR plan stack
pskeshu Jun 29, 2026
1f743ce
docs(b2): dual-camera + laser-preset + timelapse-form spec + plan (3 …
pskeshu Jun 29, 2026
340ab96
feat(b2): laser-preset browser (set proxy + manual-mode dropdown)
pskeshu Jun 29, 2026
4ba1d05
feat(b2): dual-camera config (HamCam2 + side selector)
pskeshu Jun 29, 2026
5f7011e
feat(b2): manual timelapse-config form (start proxy + rail panel)
pskeshu Jun 29, 2026
65525e9
fix(b2): style the timelapse panel (define ls-collapsible/ls-sub-* in…
pskeshu Jun 29, 2026
860f5f2
fix(manual): single LED toggle + laser on/off toggle (replace two-but…
pskeshu Jun 29, 2026
225de14
feat(operations): pin plan kind/scope/state schema in guidance + norm…
pskeshu Jun 29, 2026
a1c8170
fix(device): bound live-view memory (cap+drain+snap mode) + side-B ga…
pskeshu Jun 29, 2026
656e974
feat(manual): timelapse config as an accordion with active/inactive s…
pskeshu Jun 29, 2026
29fa9e4
feat(gallery): top-level Gallery tab + volume-acquired confirmation
pskeshu Jun 29, 2026
020feac
feat(operations): set-up-an-operation CTA in the idle state (agent-fi…
pskeshu Jun 29, 2026
537f414
style: ruff check + format — lint clean
pskeshu Jun 29, 2026
e2b03c5
fix(tests): annotate test-stub Optionals for mypy
pskeshu Jun 29, 2026
deaaffa
feat(launch): --no-auth flag + quiet temperature-sampler backoff when…
pskeshu Jun 29, 2026
c50cab0
docs: document --no-auth launch flag in README
pskeshu Jun 29, 2026
3a85449
fix(chat): ask renders main-stage only + waiting-for-answer state (no…
pskeshu Jun 29, 2026
e9900c3
feat(operations): expandable spine tactic cards (rationale/scope/stru…
pskeshu Jun 29, 2026
55cdb39
feat(operations): guidance — plan calibration/reference roles + tacti…
pskeshu Jun 29, 2026
6797e0a
fix(live-view): throttle SPIM live stream to prevent GPU TDR freeze
pskeshu Jun 29, 2026
b34143c
fix(devices): stop Δt label jitter shaking the LIVE badge / room-ligh…
pskeshu Jun 29, 2026
e2d1a7a
feat(manual-view): reorganize lightsheet controls into a no-scroll 2-…
pskeshu Jun 29, 2026
3887f97
refactor(manual-view): remove dead CAM LED button
pskeshu Jun 29, 2026
eaa1d50
fix(web): stop acquire routes returning raw numpy arrays (500 on Snap…
pskeshu Jun 29, 2026
e17280a
Merge remote-tracking branch 'origin/development' into feature/temper…
pskeshu Jun 30, 2026
60b948e
feat(devices): Map-view embryo detect + single-source-of-truth list +…
pskeshu Jun 30, 2026
6ffe1f9
docs(spec): bottom-cam→SPIM Operator surface design (sub-project A)
pskeshu Jun 30, 2026
223812c
feat(operate): backend — fenced Z read/nudge, agent-free marking conf…
pskeshu Jun 30, 2026
7a95f04
feat(operate): Operate view — guided bottom-cam → SPIM operator surface
pskeshu Jun 30, 2026
d1662dd
feat(operate): B — capture marking as localization labels
pskeshu Jun 30, 2026
47bb84f
feat(operate): C — passive focus-trace logging + offline validation
pskeshu Jun 30, 2026
ecfcb60
feat(operate): redesign as 'The Operator Spine' — uncluttered, legibl…
pskeshu Jun 30, 2026
522e25b
refactor(devices): remove duplicate Map-view Detect panel — Detect li…
pskeshu Jun 30, 2026
7bd39ce
docs(spec): Operate → tactics/timelapse integration design (Phase C Run)
pskeshu Jun 30, 2026
f8175b2
feat(operate): Phase C 'Run' — marking→imaging handoff (Phase 1)
pskeshu Jun 30, 2026
178f872
feat(operate): Phase 2 — Mode B emits a real tactic + tactic_id symmetry
pskeshu Jun 30, 2026
030feae
feat(operate): Phase 3 — Tactic Executor + library/oneshot/plan/agent…
pskeshu Jun 30, 2026
2d4e959
fix(operate): resolve 8 confirmed code-review findings
pskeshu Jun 30, 2026
765c4dd
Merge remote-tracking branch 'upstream/feature/temperature-operations…
pskeshu Jul 1, 2026
c02d52d
docs(spec): settings panel — editable ACUITYnano thermalizer + config…
pskeshu Jul 1, 2026
b47ab66
feat(settings): editable ACUITYnano thermalizer + effective-config vi…
pskeshu Jul 1, 2026
1a0f129
fix(settings): resolve 4 confirmed thermalizer code-review findings
pskeshu Jul 1, 2026
eb63cbe
feat(settings): Phase 2 — rig-wide dashboard defaults + restart-requi…
pskeshu Jul 1, 2026
703db32
fix(settings): drop dead settings.py knobs from editors + group the A…
pskeshu Jul 1, 2026
76c3224
perf(file_store): O(1) prediction_id via bounded tail read
pskeshu Jul 1, 2026
c478a40
docs: concurrency & runtime architecture overview
pskeshu Jul 1, 2026
d5d2c1a
fix(web): quiet 503 for laser-configs/cameras when device layer is of…
pskeshu Jul 1, 2026
fb0e13e
feat(web): friendly login hint when a control action is denied (403)
pskeshu Jul 1, 2026
70a048e
tooling+docs: UI crawler/simulator + living user-story & UX-flow docs
pskeshu Jul 1, 2026
902c01f
feat(ui_crawler): visible-run modes — headed/slow-mo, Playwright trac…
pskeshu Jul 1, 2026
c69c7af
feat(ui_crawler): per-finding traces (--trace-findings) + scenarios.p…
pskeshu Jul 1, 2026
8e2e9cb
style(ui_crawler): split E701 one-line if/return in kind_of
pskeshu Jul 1, 2026
7970e21
docs(ui_crawler): document the Playwright trace viewer (show-trace)
pskeshu Jul 1, 2026
c0a24a6
feat(ui_crawler): per-story UX audit + baseline-diff regression spine
pskeshu Jul 1, 2026
96ada33
feat(ui_crawler): agent-readable audit artifacts — PNG shots + text p…
pskeshu Jul 1, 2026
b04e5d3
feat(ui_crawler): full per-story UX audit — 36 story flows + seeded b…
pskeshu Jul 1, 2026
ed84f19
feat(ideation): product-ideation engine — entity inventory + 2 matric…
pskeshu Jul 1, 2026
dd36a16
docs(ideation): Fable second-consult — thesis, deepened flagships, en…
pskeshu Jul 1, 2026
7aca47e
docs(ideation): Fable entity-evolution assessment — the scientific sp…
pskeshu Jul 2, 2026
33635d7
feat(temperature): bundle ACUITYnano serial SDK in-repo
pskeshu Jul 2, 2026
c49e524
build(deps): move hardware-control stack into default-on `device` group
pskeshu Jul 2, 2026
7136498
fix(operate): correct marking stage origin + SAM room-light fallback
pskeshu Jul 2, 2026
236e940
feat(operate): add per-embryo piezo-galvo calibration step
pskeshu Jul 2, 2026
565593c
fix(devices-map): frame marked embryos so they aren't clipped off-map
pskeshu Jul 2, 2026
d846dcd
fix(tools): coerce string tool args to annotated scalar types; quiet …
pskeshu Jul 9, 2026
8687721
Merge upstream/development into feature/temperature-operations-all
pskeshu Jul 11, 2026
08a6752
fix(lint): resolve post-merge ruff-format and mypy errors
pskeshu Jul 11, 2026
ebb545c
Merge pull request #72 from gently-project/feature/temperature-operat…
pskeshu Jul 11, 2026
31730bd
Agent chat UI improvements (#60) — rebased onto current development
pskeshu Jul 12, 2026
2604eda
Merge pull request #60 from gently-project/agent-ui-improvements
pskeshu Jul 12, 2026
554cb7a
chore(types): fix all 200 mypy-strict errors across the repo
pskeshu Jul 12, 2026
3fe6e80
fix(types): avoid _tifffile no-redef in imaging.py (deps-less mypy)
pskeshu Jul 12, 2026
11633fb
style: ruff format imaging.py
pskeshu Jul 12, 2026
0536ee3
Merge pull request #83 from gently-project/chore/mypy-strict-green
pskeshu Jul 12, 2026
dbdc959
docs(launcher): parked design — unified launcher + bare-basic launch …
pskeshu Jul 2, 2026
8ad9035
docs(launcher): credit Magdalena + open questions to fold in (initial…
pskeshu Jul 2, 2026
caa0d57
docs(launcher): future direction — Windows desktop app (Electron shell)
pskeshu Jul 2, 2026
e2aa54f
feat(launcher): scaffold DeviceLayerSupervisor + launch gate (RFC #78)
pskeshu Jul 12, 2026
cdd0eb3
feat(devices+desktop): device-layer supervision panel + Tauri desktop…
pskeshu Jul 12, 2026
461c93e
feat(launcher+desktop): --reload dev flag + npm scripts + dev workflo…
pskeshu Jul 12, 2026
eaa778f
feat(desktop): hide backend console window + document desktop app in …
pskeshu Jul 12, 2026
8eaab88
fix(lint+types): satisfy ruff + mypy on the device-layer code (RFC #78)
pskeshu Jul 12, 2026
ab2bf58
feat(launcher): entry-point gate + startup-progress pipeline (RFC #78)
pskeshu Jul 12, 2026
a5bdf4f
feat(launcher): dashboard boot banner following the device-layer boot…
pskeshu Jul 12, 2026
a066606
feat(launcher): auto-detect GPU for SAM + Device-layer Settings secti…
pskeshu Jul 12, 2026
63579e7
feat(launcher): pragmatic microscope reconnect when gate starts devic…
pskeshu Jul 12, 2026
574d1e8
fix(desktop): compile + run on Linux dev machines
pskeshu Jul 13, 2026
a4d22f3
docs(replay): session replay + agent postmortem — design spec
pskeshu Jul 13, 2026
4b5091d
docs(replay): Tauri shell compatibility notes (quit-flush race, WebKi…
pskeshu Jul 13, 2026
6ba9774
feat(replay): recorder + ingest + semantic action log + player (phase…
pskeshu Jul 13, 2026
4c9d9bd
feat(replay): agent tooling — render_frame.py + gently-session-postmo…
pskeshu Jul 13, 2026
e821250
fix(lint): wrap long line in render_frame.py
pskeshu Jul 13, 2026
57546fe
fix(replay): animation-accurate replays + E2E-tested postmortem workflow
pskeshu Jul 13, 2026
ecdda56
perf(recorder): O(1) buffer accounting — no per-event stringify
pskeshu Jul 13, 2026
04f1a7b
feat(desktop): graceful backend shutdown handshake before the hard kill
pskeshu Jul 13, 2026
06ff77c
perf(recorder): idle-start after load + calmer sampling; felt-actions…
pskeshu Jul 13, 2026
33d100f
perf(recorder): revert idle-start; gate on absolute per-method added …
pskeshu Jul 13, 2026
cd22181
docs(replay): phase-5 performance certification — PASS
pskeshu Jul 13, 2026
c4c8b00
fix(boot-banner): Details dismisses the landing overlay before switch…
pskeshu Jul 13, 2026
5997354
Merge pull request #78 from gently-project/feature/unified-launcher
pskeshu Jul 13, 2026
4bac194
Merge development (now incl. #78 unified launcher) into feature/sessi…
pskeshu Jul 13, 2026
1053689
fix(boot-banner): dismissal sticks — Details and × acknowledge the fa…
pskeshu Jul 13, 2026
09092da
chore: add Playwright MCP server at project scope
pskeshu Jul 17, 2026
5410d9f
Merge pull request #88 from gently-project/chore/playwright-mcp
pskeshu Jul 17, 2026
cf57874
Merge pull request #84 from gently-project/feature/session-replay
pskeshu Jul 17, 2026
57fa6f1
Merge pull request #86 from gently-project/feature/shutdown-handshake
pskeshu Jul 17, 2026
6513c10
Merge pull request #87 from gently-project/fix/boot-banner-hide-on-de…
pskeshu Jul 17, 2026
d8fec46
Merge remote-tracking branch 'origin/development' into tooling/ui-cra…
pskeshu Jul 17, 2026
4a2cd14
style(ui_crawler): ruff format the crawler + story flows
pskeshu Jul 17, 2026
bd560ce
Merge pull request #76 from gently-project/tooling/ui-crawler-user-st…
pskeshu Jul 17, 2026
edd14a1
feat(devices): dynamic device-layer availability propagation (RFC #78)
pskeshu Jul 17, 2026
9330e5f
feat(devices): device-layer card UX — boot log, red Stop, live uptime…
pskeshu Jul 17, 2026
8065abe
feat(ui): entry-screen UX — welcome theme toggle, light default, resu…
pskeshu Jul 17, 2026
b2e6cd1
fix(dev): serve /static with no-cache so edits reflect on reload
pskeshu Jul 17, 2026
32322a6
fix(replay): split oversized rrweb flushes to avoid 413 data loss
pskeshu Jul 17, 2026
8cd6cda
Merge pull request #89 from gently-project/feature/dynamic-hardware-a…
pskeshu Jul 17, 2026
4a85c3e
chore: bump development to 1.0.0.dev0
pskeshu Jul 17, 2026
a3bfba8
Merge pull request #90 from gently-project/chore/bump-1.0.0.dev0
pskeshu Jul 17, 2026
1d13901
feat(replay): sustainable session recording — fidelity levels + disk …
pskeshu Jul 17, 2026
6f1b6ff
Merge pull request #91 from gently-project/feature/replay-fidelity-an…
pskeshu Jul 17, 2026
e22d17f
Merge pull request #27 from ceej640/ceej/issue-9-sample-framework
pskeshu Jul 17, 2026
4fded13
fix(agent): set _autonomous_active inside the turn-lock (reapply #33)
pskeshu Jul 17, 2026
adeab18
fix(tests+mesh): repair pytest collection + stale dispim expectations…
pskeshu Jul 17, 2026
ae6db92
fix(ui): boot banner always dismissible + reliable ready-flash auto-d…
pskeshu Jul 17, 2026
a4bd8f8
chore(mcp): enable Chromium sandbox for the Playwright MCP
pskeshu Jul 17, 2026
f90b3ab
Merge pull request #94 from gently-project/fix/boot-banner-dismiss-an…
pskeshu Jul 17, 2026
3e9f21d
fix(security): harden FileStore YAML loading + embryo_id paths (reapp…
pskeshu Jul 17, 2026
6fce360
fix(security): validate + gate array upload endpoints (reapply #24)
pskeshu Jul 17, 2026
bd5ec0d
Merge pull request #92 from gently-project/fix/autonomous-active-lock…
pskeshu Jul 17, 2026
bf3751d
Merge pull request #93 from gently-project/fix/test-suite-collection
pskeshu Jul 17, 2026
bea0e8e
Merge pull request #95 from gently-project/fix/filestore-hardening
pskeshu Jul 17, 2026
97b9f64
Merge pull request #96 from gently-project/fix/upload-input-hardening
pskeshu Jul 17, 2026
2a2f875
fix(ui): resuming a session no longer bounces to the launch gate
pskeshu Jul 17, 2026
622427b
Merge pull request #97 from gently-project/fix/resume-skips-launch-gate
pskeshu Jul 17, 2026
f9495f0
fix(ui): boot banner actually hides — the "blue dot" ghost
pskeshu Jul 17, 2026
c76246d
Merge pull request #98 from gently-project/fix/boot-banner-hidden-css
pskeshu Jul 17, 2026
4250798
fix(imaging): stop discarding the right half of every SPIM frame
pskeshu Jul 18, 2026
2fd5eed
feat(operate): navigable steps, real Z instruments, one surface per s…
pskeshu Jul 18, 2026
3b09d3b
feat(operate): position-aware F-drive steps, one axis per step, hones…
pskeshu Jul 18, 2026
9fb4f63
ci: make mypy-strict a required gate (closes #63)
subindevs Jul 19, 2026
73c5a21
feat(ui): process console in the header — agent + device-layer output
pskeshu Jul 19, 2026
ffacef5
Merge pull request #99 from subindevs/63-mypy-strict-required
pskeshu Jul 20, 2026
2d04122
feat(operate): three instrument surfaces, no workflow
pskeshu Jul 20, 2026
5fa3351
docs(operate): mark the navigable-steps spec superseded
pskeshu Jul 20, 2026
3a2345a
fix(replay): assert block selectors still bind at boot
pskeshu Jul 20, 2026
09933ed
style(stories): satisfy ruff format in US-15
pskeshu Jul 20, 2026
d61067a
docs: document the contributor workflow and the CI gates
pskeshu Jul 20, 2026
dbc90bd
docs: restructure CLAUDE.md around working effectively with coding ag…
pskeshu Jul 20, 2026
810ca32
docs: drop the incident reference from the pre-commit note
pskeshu Jul 20, 2026
fb4cb84
docs: cut noise and a broken command from CLAUDE.md
pskeshu Jul 20, 2026
6f7504e
docs: stop restating CI gating rules that live in lint.yml
pskeshu Jul 20, 2026
9121c56
fix(operate): freeze last frame, size viewport to image, detect on la…
pskeshu Jul 20, 2026
28ccdcf
chore(deps): reconcile uv.lock with pyproject
pskeshu Jul 20, 2026
f0ccca3
feat(operate): shared persistent embryo table + detect/preview fixes
pskeshu Jul 20, 2026
470cfb1
feat(operate): show captured image before detection runs
pskeshu Jul 20, 2026
eab49a4
docs: drop the broken tests/js command from the JS bullet
pskeshu Jul 24, 2026
655d44e
docs: fix the stale toolchain content in CONTRIBUTING.md
pskeshu Jul 24, 2026
3e17177
chore: pin ruff to 0.16.0 across CI, pre-commit, and pyproject
pskeshu Jul 24, 2026
fa6bc2b
Merge pull request #103 from gently-project/chore/pin-ruff-0.16.0
pskeshu Jul 26, 2026
0459510
Merge branch 'development' into docs/contributor-workflow
pskeshu Jul 26, 2026
b2d8184
Merge branch 'development' into feature/operate-navigable-instruments
pskeshu Jul 26, 2026
14c85b5
Merge pull request #102 from gently-project/docs/contributor-workflow
pskeshu Jul 26, 2026
42a89c9
style: satisfy ruff in device_layer
pskeshu Jul 26, 2026
2a5d31d
Merge pull request #100 from gently-project/feature/operate-navigable…
pskeshu Jul 26, 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
  •  
  •  
  •  
7 changes: 7 additions & 0 deletions .claude/playwright-mcp-config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"browser": {
"launchOptions": {
"chromiumSandbox": true
}
}
}
94 changes: 94 additions & 0 deletions .claude/skills/gently-session-postmortem/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
---
name: gently-session-postmortem
description: Use when analyzing how a user actually operated the gently UI — replaying a recorded session, walking the semantic action log, correlating UI actions with agent/device behavior at the same timestamps, or rendering what the screen showed at a specific moment.
---

# Gently session postmortem

Every gently session records its UI interactions (always-on, rrweb-based;
kill switch `GENTLY_REPLAY=0`). You are the intended reader: work text-first
through the action log, and render pixels only for the moments that matter.

## Where the artifacts live

Per session, under the storage root (`D:\Gently3` on the Windows production
machine; on Linux dev runs the default is the *literal* directory `D:/Gently3`
under the cwd the server launched from, unless `GENTLY_STORAGE_PATH` is set):

```
sessions/{folder}/ui-replay/
actions.jsonl # semantic action log — READ THIS FIRST
rrweb-{tab}.jsonl # full DOM event stream, one file per browser tab
meta.yaml # tabs seen, first_seen, user agents
ui-replay/unassigned-{YYYYMMDD}/ # batches that arrived with no active session
```

Session id → folder mapping: `sessions/_index.yaml`.

## The walk

1. **Read `actions.jsonl`** (one JSON object per line). It is **arrival-ordered,
not time-ordered** (batches from multiple tabs interleave) — sort by `t`
before reconstructing a timeline. Non-browser traffic (curl probes, harness
runs) records too; check the tab's `user_agent` in `meta.yaml` before
treating a tab as a human. Kinds you'll see:
- `page-load` — with url + viewport; a new `tab` id per browser tab/reload.
- `tab:embryos`, `view:board`, `bz:-10`, `button#op-detect`,
`click:marking-action-btn:Done` — clicks, named from the UI's semantic
`data-*` vocabulary, element ids, or class+text fallback. `target` carries
tag/id/dataset/label.
- `submit`, `navigate` — forms and SPA route/hash changes.
- `bus-summary` — per-flush counts of ClientEventBus traffic
(`BOTTOM_CAMERA_FRAME×240` means live frames were streaming; token
streaming shows as high `AGENT_*` counts). This is how you know what the
*system* was doing between clicks.
- `gap` — the recorder dropped events under pressure (params say how many).
2. **Join with the rest of the file store on timestamps.** Everything else is
already on disk: agent logs (`logs/gently_*.log`), perception traces and
`predictions.jsonl` per embryo, `timelapse.yaml`, events. See the
`gently-debugging` skill for that map.
**Clock semantics:** `actions.jsonl` `t` is the *browser's* clock as UTC
ISO; rrweb `timestamp` is epoch ms; `meta.yaml` `first_seen` is *naive
server-local* time (IST on the production rig — expect it to differ from
the same tab's UTC `page-load` by the UTC offset); server logs print
server-local time. Convert everything to epoch before joining, and expect
modest client/server skew (same machine ⇒ sub-second; remote browser ⇒
whatever their clock is).
**Names vs labels:** action names use the UI's *internal* vocabulary
(`tab:events`), while `target.label` is what the user actually saw
("Logs") — quote labels when narrating for humans.
3. **Render the moments that matter** (needs the repo venv with Playwright):

```bash
python tools/session_replay/render_frame.py \
--session 81865db3 --t 2026-07-13T07:05:38Z --out /tmp/frame.png \
[--tab 04dce1bd] [--url http://localhost:8080] [--storage PATH]
```

`--t` takes an ms offset, `52s`, `mm:ss`, or an absolute ISO timestamp
(paste straight from an action's `t`). `--url` pointing at a *running*
gently makes stored images inside the frame resolve; without it you get
structure + inlined CSS only. Default tab is the largest stream.
4. **Human scrubbing**: `http://localhost:8080/replay` lists recordings;
`/replay/{session_id}` plays one (tab picker, speed, click an action to
seek to it).

## Caveats

- The live camera `<img id="op-cam-img">` is deliberately blocked from
capture (base64 frame storms) — replays show a placeholder box there. What
the camera saw lives in the file store (volumes/projections); whether it
was streaming is in `bus-summary`.
- Replays disable CSS animations/transitions (`animation: none` injected) so
final styles apply — otherwise paused replays freeze entrance animations at
their invisible from-state. Consequence: spinners/pulses appear static, and
a frame rendered mid-animation shows the settled state, not the tween.
- A rendered frame shows the DOM *at that instant*: click a nav button and
the previous panel is still on screen — the response mutations land in the
following ~200 ms. Render a second frame slightly later to see the effect.
- A session's recording can span multiple `rrweb-{tab}` files (reloads, second
windows). `meta.yaml` + `page-load` actions give the timeline of tabs.
- The final ≤4s batch of a tab can be missing if the browser/app closed
uncleanly (see spec: quit-flush race).
- Recording only exists for sessions run with `settings.ui.replay` on
(default on; `GENTLY_REPLAY=0` disables).
69 changes: 69 additions & 0 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
name: Lint

on:
push:
branches: [main, development]
pull_request:

jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.10"

- name: Install ruff
# Pinned so CI never floats to a new ruff release mid-review. Keep in
# sync with the ruff-pre-commit rev in .pre-commit-config.yaml and the
# pin in pyproject.toml.
run: pip install ruff==0.16.0

- name: ruff check
run: ruff check .

- name: ruff format check
run: ruff format --check .

# Fast baseline mypy without project deps. With ignore_missing_imports,
# third-party imports fall back to Any, so this is the weaker check — kept
# as the required gate because it needs no heavy install and stays green.
# The stronger, deps-installed run lives in the mypy-strict job below.
# Pin to match the pre-commit mirrors-mypy rev and the pyproject dev
# group so CI, local commits, and `uv sync` never run different mypys.
- name: Install mypy
run: pip install mypy==2.1.0

- name: mypy (deps-less)
run: mypy .

# Deps-installed mypy: with the real third-party packages present (numpy,
# anthropic, …) mypy resolves their actual types instead of Any, surfacing
# genuine mismatches the deps-less run above cannot see. This is what a
# contributor gets from `uv run mypy .` after `uv sync` (see CONTRIBUTING.md).
# Required gate: the deps-only errors have been cleared (issue #63), so a
# regression here now fails the workflow like the deps-less run above.
mypy-strict:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

# gently-perception is not on PyPI; it is installed editable from a sibling
# clone (see [tool.uv.sources]), so `uv sync` fails without it.
- name: Clone gently-perception sibling
run: git clone --depth 1 https://github.com/gently-project/gently-perception.git ../gently-perception

- name: Install uv
uses: astral-sh/setup-uv@v5
with:
python-version: "3.10"
enable-cache: true

- name: uv sync
run: uv sync

- name: mypy (deps-installed)
run: uv run mypy .
14 changes: 14 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -145,3 +145,17 @@ electron/
/stage_definitions_for_review.txt
gently/ui/tui/node_modules/
gently/ui/tui/dist/

# Stray local storage: GENTLY_STORAGE_PATH default (D:\Gently3) resolves
# literally to ./D:/ under the repo on Linux. Not data we track.
/D:/
.superpowers/

# Runtime operator overrides (written by the Settings panel)
config/config.local.yml
config/settings.local.yml
config/dashboard_defaults.json

# UI crawler generated output
tools/ui_crawler/out*/

14 changes: 14 additions & 0 deletions .mcp.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"mcpServers": {
"playwright": {
"type": "stdio",
"command": "npx",
"args": [
"@playwright/mcp@latest",
"--config",
".claude/playwright-mcp-config.json"
],
"env": {}
}
}
}
16 changes: 16 additions & 0 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
repos:
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.16.0 # keep in sync with the ruff pins in pyproject.toml + lint.yml; bump via `pre-commit autoupdate`
hooks:
- id: ruff
args: [--fix]
- id: ruff-format

- repo: https://github.com/pre-commit/mirrors-mypy
# Keep in sync with the mypy pin in pyproject.toml dev group and
# .github/workflows/lint.yml. Run `pre-commit autoupdate` to bump.
rev: v2.1.0
hooks:
- id: mypy
pass_filenames: false
args: ["."]
1 change: 1 addition & 0 deletions .python-version
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
3.11
46 changes: 46 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -394,6 +394,52 @@ Net: ~3,500 lines removed across P6–P7.

---

## v0.22.0

File-based storage, a redesigned web UI, new hardware, and the tooling to
keep it all honest.

**File-based storage (Gently3)**
Retired the SQLite databases. All state now lives as human-browsable files
under `D:\Gently3\` — sessions, embryos, volumes, projections, traces,
campaigns, learnings, agent memory, all YAML/JSONL/TIFF.
- `FileStore` replaces `GentlyStore`; `FileContextStore` replaces the
`agent_mind.db` `ContextStore`. Drop-in API replacements.
- A root `gently.yaml` manifest documents the layout for humans and agents.
- YAML parses are cached in `FileContextStore` — fixes slow Plans/campaign
loading.

**Web UI redesign**
- Agent chat became a docked, sliding side panel (overlay + pin-to-dock)
instead of owning the screen.
- Added a Home landing tab; the chat no longer auto-runs the startup wizard.
- Login is non-blocking — a "Continue in view-only" escape hatch.
- Recent images aggregate across previous sessions.

**Hardware**
- Integrated the ACUITYnano temperature controller (config, web control,
SDKs) with a live HiveMQ cloud SIM for hardware-free testing.
- Added the SPIM-head F-drive device, hard limits, and focus/align plans.
- Room-light toggle and a device-layer terminal UI.

**Agent + perception**
- Integrated the agent with perception: pull tool, prompt context, event
bridge, wake-router.
- Live acquisition control with observable, permissioned autonomy and a
refreshed prompt.
- Retired napari from the agent; added web-chat autocomplete and pruned
dead tools.

**Tooling and environment**
- Added ruff lint/format tooling and fixed all violations.
- Adopted incremental mypy typing — config, CI, pre-commit wiring, and a
documented policy in `CONTRIBUTING.md`; pinned mypy to 2.1.0.
- Switched environment setup to uv with an offline/UI-only launch path;
pinned pymmcore to device-interface 70.
- Relicensed and updated the author list.

---

## Notes on how we think about this

Things we've learned building this, roughly in order:
Expand Down
Loading
Loading