Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
95 commits
Select commit Hold shift + click to select a range
0ba4ada
embryos: split XY position into coarse (bottom-cam) and fine (SPIM) s…
pskeshu May 15, 2026
6f28365
embryos: broadcast EMBRYOS_UPDATE on mutation
pskeshu May 15, 2026
4db06d8
Devices > Map: render embryo waypoints as coarse rings / fine discs
pskeshu May 15, 2026
1ed5fc4
detect_embryos: web Marking canvas replaces napari editor, gate contr…
pskeshu May 15, 2026
5b15797
Devices > Map: pick-up / drop / delete to edit embryos in-place
pskeshu May 15, 2026
7995cbd
device_layer: re-enable XY joystick at boot
pskeshu May 15, 2026
feca96a
Devices > Map: image-anchored crosshair + scroll-to-zoom in camera panel
pskeshu May 15, 2026
294f7dc
eval: event capture / replay / shadow scaffolding for orchestrator A/B
pskeshu May 15, 2026
2f4e1a2
eval: capture production decisions per user turn
pskeshu May 15, 2026
1194a1f
eval: operator-action events + ReactiveCandidate (first real shadow)
pskeshu May 15, 2026
ed75933
docs: closed-loop paradigm write-up
pskeshu May 15, 2026
6dd37be
events: bridge Python logs onto the EventBus / Events page
pskeshu May 16, 2026
7017866
switchbot: BLE room-light accessory device + web test GUI
pskeshu May 28, 2026
d42ac6b
temperature: ACUITYnano thermal controller device (serial/MQTT/mock)
pskeshu May 28, 2026
32a8ad2
device_layer: register switchbot + temperature; expose temperature to…
pskeshu May 28, 2026
3c7bfc7
events: EMBRYO_TERMINATED — orchestrator emits, UI tracker handles
pskeshu May 28, 2026
a7250ed
Calibration: SPIM thumb expands into a floating popout for a larger l…
pskeshu May 28, 2026
7f241e1
Embryos > Board: clock / stereo / pace columns replace confidence + rate
pskeshu May 28, 2026
cbf4140
Bump version to 0.21.0.dev0
pskeshu May 28, 2026
63c5be0
switchbot: accept newer 0x05 status-frame response as success
pskeshu May 28, 2026
b6bd49c
config: register room_light SwitchBot for the diSPIM rig
pskeshu May 28, 2026
0158004
switchbot: read_status() — battery / firmware via 0x57 0x02 query
pskeshu May 28, 2026
a2a82bc
feat(web): add agent chat window + control lock; retire TUI launch
pskeshu May 29, 2026
9460b78
docs: add biologist-readiness plan
pskeshu May 29, 2026
14a62c3
Merge 0.21-dev into worktree-elegant-purring-russell (integrate web-c…
pskeshu May 29, 2026
99fb073
feat(web): self-managed auth + chat activity indicator + branding
pskeshu May 29, 2026
6917a42
fix(launcher): make Ctrl-C stop the server on Windows
pskeshu May 29, 2026
e075dcd
fix(web): viewing is open; login elevates to control (not a page gate)
pskeshu May 29, 2026
645aace
feat(web): gate person-driven control actions by role
pskeshu May 29, 2026
0fc43c6
feat(web): uniform session transcript across all clients
pskeshu May 29, 2026
f6aad74
fix(store): crash-safe atomic YAML/JSON writes (V3)
pskeshu May 29, 2026
7698dec
fix(tools): get_timelapse_status crashed with KeyError (V1)
pskeshu May 29, 2026
8e3531b
fix(launcher): unify storage env var — logs follow data (V4)
pskeshu May 29, 2026
2f4e3e6
fix(web): escape event text to close events-table XSS (V6)
pskeshu May 29, 2026
2b94ffe
docs: update progress — auth, gating, transcript, verified bugs done
pskeshu May 29, 2026
2038bf7
feat(web): resume a session from the Sessions tab
pskeshu May 29, 2026
a14372d
fix(config): friendly errors for unknown organism/hardware
pskeshu May 29, 2026
638f827
fix(web): serve session review data from FileStore
pskeshu May 29, 2026
cf2c24e
fix(web): resumed sessions show history + correct session id
pskeshu May 29, 2026
df3db33
feat(web): rehydrate viz imagery from disk on session resume
pskeshu May 29, 2026
c316399
feat(web): rehydrate perception reasoning on resume (populates the vi…
pskeshu May 29, 2026
6d3cc12
feat(web): filmstrip reasoning/detail panel on the side, not the bottom
pskeshu May 29, 2026
8e3d266
feat(web): restore the original filmstrip side-panel CSS (from lost WIP)
pskeshu May 29, 2026
0c69e55
fix(imaging): stored projection is the three-view of View A, not A|B
pskeshu May 29, 2026
e6646fd
feat(scripts): regenerate_projections — refresh a session's projectio…
pskeshu May 29, 2026
eead638
fix(scripts): add project root to sys.path in regenerate_projections
pskeshu May 29, 2026
b2bf1f9
fix(web): content-aware cache for FileStore projections
pskeshu May 29, 2026
9240631
fix(imaging): don't split 3D volume by width — it halved centered emb…
pskeshu May 29, 2026
95224f7
docs: record dual-view readiness as a design constraint
pskeshu May 29, 2026
a356dfd
feat(launcher): open the web UI in Chrome (GENTLY_BROWSER override, d…
pskeshu May 29, 2026
76505f4
feat(scripts): --all to regenerate projections for every session
pskeshu May 29, 2026
f87b3c9
fix(web): filmstrip thumbnail crops to the XY embryo, not the black c…
pskeshu May 29, 2026
9d0790d
Add room-light toggle and device-layer terminal UI
pskeshu May 29, 2026
cdeabb8
Retire napari from the agent; add web-chat autocomplete; prune dead t…
pskeshu May 29, 2026
c5009ac
Integrate the agent with perception: pull tool, prompt context, event…
pskeshu May 29, 2026
c4bfac2
Live acquisition control, observable + permissioned autonomy, and a r…
pskeshu May 29, 2026
f8f9771
Redesign agent chat as a docked, sliding side panel (overlay + pin-to…
pskeshu May 30, 2026
2a36834
Add a Home landing tab; stop the chat auto-running the startup wizard
pskeshu May 30, 2026
befe98e
Cache YAML parses in FileContextStore — fixes slow Plans/campaign loa…
pskeshu May 30, 2026
9369407
Home: recent images aggregated across previous sessions
pskeshu May 30, 2026
7d877ba
Login: non-blocking page with a "Continue in view-only" escape hatch
pskeshu May 30, 2026
596edd3
Home: recent-images was starved by empty trailing sessions
pskeshu May 30, 2026
f64406f
Chat: wider default and a roomier resize ceiling
pskeshu May 30, 2026
cbb8f6a
Open 0.22 dev line: bump version to 0.22.0.dev0
pskeshu May 30, 2026
f33847d
docs(readme): web-first quick start + first-run admin/accounts
pskeshu May 30, 2026
406c87d
docs(readme): dual venv + uv setup instructions
pskeshu May 30, 2026
d6c0082
docs(try-offline): web-first install + dual venv/uv
pskeshu May 30, 2026
bfed3e8
docs(eval): replay-harness design for testing the orchestrator offline
pskeshu May 30, 2026
d50f9d6
docs(readme): "Make your first plan" walkthrough (chat -> /plan -> Pl…
pskeshu May 30, 2026
2e36add
Merge main (fix-name hotfix, PR #34) into 0.22-dev
schneidermc Jun 1, 2026
ce8b647
Relicense and update author list
schneidermc Jun 1, 2026
574bc80
fix(web): use Starlette 1.x TemplateResponse(request, name, ...) sign…
schneidermc Jun 1, 2026
82ed966
Merge pull request #35 from gently-project/relicense
pskeshu Jun 1, 2026
c33d033
Merge pull request #36 from gently-project/fix/web-templateresponse
pskeshu Jun 1, 2026
856df4c
Switch environment setup to uv and add offline/UI-only launch
schneidermc Jun 1, 2026
37ca689
Merge pull request #37 from gently-project/feature/env-setup
pskeshu Jun 2, 2026
a7670f9
Pin pymmcore to device-interface 70 and restructure the environment
schneidermc Jun 5, 2026
bc74cb6
Merge pull request #39 from gently-project/feature/env-setup
schneidermc Jun 5, 2026
38cac40
Integrate ACUITYnano temperature controller (config, web control, SDKs)
pskeshu Jun 8, 2026
06ccbfe
Add SPIM-head F-drive device, hard limits, and focus/align plans
pskeshu Jun 8, 2026
73a4c19
Merge pull request #44 from pskeshu/feature/temperature-controller
pskeshu Jun 12, 2026
59a1d5e
Merge pull request #45 from pskeshu/feature/spim-fdrive
pskeshu Jun 12, 2026
efb6a8e
Add ruff lint/format tooling and fix all violations (#42)
subindevs Jun 14, 2026
4a11734
Merge pull request #47 from subindevs/42-add-linting-formatting
pskeshu Jun 14, 2026
f895625
Add incremental mypy config, CI, and pre-commit wiring (#46)
subindevs Jun 14, 2026
baeaa4b
Document incremental mypy typing policy in CONTRIBUTING.md
subindevs Jun 14, 2026
0b4927f
Fix mypy errors in gently/harness/bridge.py
subindevs Jun 14, 2026
b4dc3b7
Fix implicit-Optional parameter defaults across 45 modules
subindevs Jun 14, 2026
06ced01
Add StoreProtocol for ContextStore memory mixins, fix remaining type …
subindevs Jun 14, 2026
4e24a92
Type the tool-execution context dict, clearing gently.app.tools.* myp…
subindevs Jun 14, 2026
b6d9e59
Address PR #48 review findings: fix view_image None-client crash and …
subindevs Jun 15, 2026
7da8443
mypy: pin to 2.1.0 across CI/pre-commit/dev; fix missed implicit-Opti…
pskeshu Jun 15, 2026
97e3d25
Merge pull request #48 from subindevs/46-gradual-mypy-typing
pskeshu Jun 15, 2026
d777cdd
Release 0.22.0: finalize version, changelog, ignore stray runtime dir
pskeshu Jun 15, 2026
d77bb12
README: bump status to 0.22.0
pskeshu Jun 15, 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
  •  
  •  
  •  
34 changes: 34 additions & 0 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
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
run: pip install ruff

- name: ruff check
run: ruff check .

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

# 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
run: mypy .
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -145,3 +145,6 @@ electron/
/stage_definitions_for_review.txt
gently/ui/tui/node_modules/
gently/ui/tui/dist/

# Runtime storage accidentally created on Linux when GENTLY_STORAGE_PATH="D:/" resolves literally
D:/
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.15.17 # run `pre-commit autoupdate` to pin to latest
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
72 changes: 72 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
# Contributing to Gently

## Code quality toolchain

This project uses [ruff](https://docs.astral.sh/ruff/) for linting and formatting, and
[mypy](https://mypy-lang.org/) for type checking, enforced automatically before every
commit via [pre-commit](https://pre-commit.com/).

### First-time setup

Install the dev dependencies (includes ruff, mypy, and pre-commit):

```bash
uv sync
```

Then install the pre-commit hooks:

```bash
pre-commit install
```

From this point on, ruff runs on staged files and mypy runs across the whole
project whenever you `git commit`.

### Running manually

To check all files at once (useful before opening a PR):

```bash
pre-commit run --all-files
```

Or run the tools directly:

```bash
ruff check . # lint
ruff format . # format in-place
```

### Keeping hooks up to date

To update hook versions to their latest releases:

```bash
pre-commit autoupdate
```

### Type checking

Run mypy the same way pre-commit and CI do:

```bash
mypy .
```

The codebase is being typed incrementally (see issue #46). Modules with
pre-existing errors are listed in the `[[tool.mypy.overrides]]` block in
`pyproject.toml` with `ignore_errors = true`, so `mypy .` passes today even
though not every module is fully typed yet.

Policy for working with this list:

- **New modules** must pass `mypy .` cleanly — do not add them to the
overrides list.
- **PRs that substantively touch a module on the overrides list** should fix
that module's type errors and remove it from the list as part of the
change.

### CI

Every pull request runs the lint job (`.github/workflows/lint.yml`), which checks ruff lint and formatting and runs mypy across the entire project. Fix any failures locally with `pre-commit run --all-files` before pushing.
Loading
Loading