Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
368 commits
Select commit Hold shift + click to select a range
139d59d
fix(migration): filter out stale source nodes for latest edges
akhileshh Oct 28, 2025
393d536
fix(migration): handle cases where children IDs have already had thei…
akhileshh Oct 30, 2025
1f8b096
fix(migration, edits): replace stale edges with new edges before pers…
akhileshh Oct 31, 2025
e477077
Bump version: 3.1.1 → 3.1.2
akhileshh Oct 31, 2025
444d192
fix(migration): use None for non stale node end ts, performance impro…
akhileshh Nov 6, 2025
0cd87d4
perf(upgrade): reduce latency for atomic layer chunks
akhileshh Nov 6, 2025
c9ee0c3
fix(migration): erase corrupt ids from failed edits
akhileshh Nov 8, 2025
9bd35a4
fix(edits/migration): pass edge layer to helper function; handle stal…
akhileshh Nov 12, 2025
53d78e7
Bump version: 3.1.2 → 3.1.3
akhileshh Nov 12, 2025
0a7ed8b
fix(edits/migration): don't use lru parents cache with edits
akhileshh Nov 13, 2025
ef258a3
fix(migration): use larger cache, faster parent search with bisect, c…
akhileshh Nov 13, 2025
254ed86
Bump version: 3.1.3 → 3.1.4
akhileshh Nov 13, 2025
c7ea47a
fix(migration): add env for cache size
akhileshh Nov 13, 2025
49ab255
fix(edits): dont use children cache for edits
akhileshh Nov 13, 2025
120fd9c
Bump version: 3.1.4 → 3.1.5
akhileshh Nov 13, 2025
66c3293
feat(migration): split chunks tasks for faster completion
akhileshh Nov 15, 2025
b27fcc2
fix(migration): fallback to atomic edges when everything else fails, …
akhileshh Nov 16, 2025
a579a39
fix(upgrade_cli): check for completion when splits>0
akhileshh Jan 10, 2026
ebe4f21
fix(locks): improve locking latency
akhileshh Jan 19, 2026
ea2f675
feat(upgrade): cache earliest ts, live status refresh
akhileshh Jan 21, 2026
218de1e
Bump version: 3.1.5 → 3.1.6
akhileshh Jan 21, 2026
e69b0b2
fix(upgrade): avoid reading the entire chunk for split tasks
akhileshh Jan 22, 2026
e228cb1
fix(edits): search entire hierarchy upto stop to layer to find new edges
akhileshh Jan 25, 2026
c9bb1cf
fix(copy): add shim to replace graph_id in meta for copied graphs
akhileshh Jan 25, 2026
cb18972
fix(edits): stale edges - search hierarchies from both sides for pote…
akhileshh Jan 26, 2026
c130507
fix(edits): look for new edges by dilating lifted edges down to l2
akhileshh Jan 28, 2026
30e51ab
edits: batch parents dict and neighbor cx edges updates to reduce io …
akhileshh Jan 28, 2026
b634c1e
test: batch update cx edges to use the batched stale edge resolution
akhileshh Jan 29, 2026
f1dd4ff
fix(edits): search for children when edges are dilated
akhileshh Feb 4, 2026
43e69b8
fix(edits): handle simple case when stale edge is at l2; persist reso…
akhileshh Feb 6, 2026
6fa1c26
feat(edits): batch get descendents, make sanity checks optional
akhileshh Feb 8, 2026
3b01659
frontend: enable sanity checks for edits
akhileshh Feb 8, 2026
9f11702
Bump version: 3.1.6 → 3.1.7
akhileshh Feb 8, 2026
1e41f18
fix(edits): batch create new l2 ids for better performance
akhileshh Feb 11, 2026
a45a4d5
fix(edits): use a valid timestamp when locks are overridden, instead …
akhileshh Feb 11, 2026
6f38418
fix(edits): batch create higher layer ids, reuse future roots from lo…
akhileshh Feb 15, 2026
f68a4f0
fix: use 8 threads at most for locks, refactor stale edge code
akhileshh Feb 19, 2026
eaa24bc
tests: reorganize, new tests, fix codecov integration
akhileshh Feb 19, 2026
9bbc816
migrate to p3.12 and numpy 2, consolidate dockerfile
akhileshh Feb 19, 2026
930706b
try to fix codecov
akhileshh Feb 20, 2026
c3ec2a4
add more tests to improve coverage
akhileshh Feb 20, 2026
03a0422
feat: add stitching changes
akhileshh Feb 25, 2026
d163513
fix: initialize stitch mode attr
akhileshh Feb 25, 2026
df96222
add buildkit env for cloudbuild
akhileshh Feb 26, 2026
45dddf5
remove bigtable client, reorganize tests, improve redis+rq ops
akhileshh Feb 28, 2026
803acd6
upgrade kvdbclient
akhileshh Mar 4, 2026
e758d68
remove multiwrapper from ingest module
akhileshh Mar 18, 2026
90e8258
feat(sv_split): track max sv id to create new ids; convert ws seg to …
akhileshh Sep 10, 2025
a2a51f9
feat(sv_split): metadata changes to support ocdbt seg
akhileshh Sep 10, 2025
ea78867
feat(sv_split): split sv, update seg and edges, read and write new ed…
akhileshh Sep 10, 2025
14338c6
feat(sv_split): sv split in frontend
akhileshh Sep 10, 2025
fb50497
fix(sv_split): update multicut tests, add other tests
akhileshh Feb 26, 2026
17c5577
use kvdbclient, organize tests
akhileshh Mar 4, 2026
0c1cd1f
regenrate requirements
akhileshh Mar 4, 2026
deff2c0
fix: use registered attributes module
akhileshh Mar 5, 2026
328f98e
feat(ingest): make ocdbt seg optional
akhileshh Mar 5, 2026
9c0778a
add ocdbt flag to ingest cli
akhileshh Mar 18, 2026
18d3198
bugfix: use labels for cx edges after split with inf affinity
akhileshh Mar 18, 2026
5e82105
optimize whole sv lookup, use rep sv from source
akhileshh Mar 19, 2026
b659906
fix: use relative ocdbt path in info
akhileshh Mar 19, 2026
7b27599
fix: inf edges to only closest partner; mesh worker pubsub version, a…
akhileshh Mar 20, 2026
621a811
remove multiwrapper usage and references
akhileshh Mar 20, 2026
174156b
use a common logger, cleanup old mess
akhileshh Mar 20, 2026
bf1bd18
fix: mincut vertex index mismatch, source/sink overlap detection, sv_…
akhileshh Mar 21, 2026
f13f0b5
refactor: extract edge routing to edges_sv.py, root-based active/inac…
akhileshh Mar 21, 2026
919ca73
chore: remove trivial and redundant tests
akhileshh Mar 21, 2026
6d688f3
test the right error is raised for ocdbt vs precomputed seg
akhileshh Mar 21, 2026
48d5667
fix: _expand_partners set type crash, validation checks labels not fr…
akhileshh Mar 21, 2026
497cef0
add pcg logger with timing for sv split flow: whole sv, seg read, spl…
akhileshh Mar 21, 2026
6af123b
add sv_split debug utilities: subgraph edges, inf bridges, L2 childre…
akhileshh Mar 21, 2026
632ae4d
perf: lazy kdtree distances, single-process chunk updates, add timing…
akhileshh Mar 21, 2026
f54f87a
fix: app logger propagation blocking pcg logger in common.py
akhileshh Mar 21, 2026
7e778bf
test: all edge routing tests use multi-SV old_new_map to match produc…
akhileshh Mar 21, 2026
5bfae6d
fix: use sv_remapping for whole SV lookup, filter stale split edges v…
akhileshh Mar 22, 2026
7fbe2ce
refactor: extract split_with_sv_splits, return user message when retr…
akhileshh Mar 22, 2026
3a938b2
add split lineage inspection, unsplit SV bridge detection
akhileshh Mar 22, 2026
8ba60ff
add compacted split edges for O(1) current-time reads, suppress glog …
akhileshh Mar 22, 2026
b65e754
ingest/upgrade: add ocdbt option to upgrade cli
akhileshh Mar 22, 2026
33c378d
feat: multi-scale OCDBT seg with mode-downsample propagation, inline …
akhileshh Apr 16, 2026
6250bc0
feat: per-CG delta OCDBT via kvstack fork, base auto-detection, --res…
akhileshh Apr 16, 2026
c416bcd
test: multi-scale propagation, fork isolation, meta→kvstack e2e, clea…
akhileshh Apr 16, 2026
5ddd4d1
ocdbt: write_seg writes base scale only
akhileshh Apr 21, 2026
ff8caff
edits: forward SV-split bbox to publish_edit for async downsample
akhileshh Apr 21, 2026
d936782
downsample: async pubsub worker updates coarser mips
akhileshh Apr 21, 2026
8a269ea
deps: add tinybrain
akhileshh Apr 21, 2026
8abbf67
locks: add L2ChunkLock for spatial serialization of SV splits
akhileshh Apr 22, 2026
09ecbb0
cutting: return tagged result from run_multicut
akhileshh Apr 22, 2026
a76cdbb
sv split: extend root lock across multicut + SV split + commit
akhileshh Apr 22, 2026
7619c9c
sv split: drive lock + write scope from the SVs being split
akhileshh Apr 22, 2026
affa672
feat(ocdbt): pinned-at reads
akhileshh Apr 23, 2026
f216de7
refactor(sv-split): pure planner + consolidated persist
akhileshh Apr 23, 2026
984634d
feat(locks): IndefiniteL2ChunkLock + exception-path hold
akhileshh Apr 23, 2026
ff6f215
feat(repair): stuck_ops — cleanup-then-replay for SV-split ops
akhileshh Apr 23, 2026
a7fae00
deps: kvdbclient>=0.7.0
akhileshh Apr 23, 2026
4b7aa1d
refactor(sv-split): thread operation_ts + named structs
akhileshh Apr 23, 2026
f19eb4d
feat(stuck_ops): surface exception-path + verify cells before replay
akhileshh Apr 23, 2026
56923af
include kvstack spec in info
akhileshh Apr 23, 2026
7672ceb
feat(meta): require fork to be pre-created; assert fork_exists
akhileshh Apr 24, 2026
ed7f9f0
docs: scope-set stuck signal; pre-replay cell verification
akhileshh Apr 24, 2026
0eace5e
sv-split: drive bbox from user seeds, narrow cut set to bbox
akhileshh Apr 28, 2026
8eec8ca
docs: edge update after sv split
akhileshh Apr 28, 2026
4216ba6
sv discrepancy error message details
akhileshh May 7, 2026
d7fcd2e
update gitignore, add hybrid ws seg plan
akhileshh May 7, 2026
df4ac6a
unify ocdbt sv lookup for 2d and 3d clicks
akhileshh May 13, 2026
69b71df
fix(ocdbt): drop redundant `shape` from schema clone
akhileshh May 19, 2026
e684d50
ci/ingest: cache cloudbuild layers, explicit --populate-base flag
akhileshh May 19, 2026
9594b2c
ci: combine buildx create + build into one step
akhileshh May 19, 2026
70deb56
fix(ocdbt): wipe via underlying driver; create base before CG table
akhileshh May 19, 2026
2e62e06
feat(ocdbt): move populate to configurable parent-layer task with ato…
akhileshh May 20, 2026
9cef706
docs(ocdbt): clarify copy_ws_bbox_multiscale file-count invariant
akhileshh May 20, 2026
8de3ccb
feat(ingest): retry reuses stored config; populate runs async; richer…
akhileshh May 20, 2026
9ac370c
feat(ingest status): rich live panel + busy worker count + configurab…
akhileshh May 20, 2026
6dd4bfb
perf(ingest status): precompute redis keys; skip per-refresh rq alloc…
akhileshh May 20, 2026
603e282
fix(ingest): run ocdbt populate synchronously after add_parent_chunk
akhileshh May 20, 2026
ddea330
perf(ocdbt): stream copy_ws_bbox_multiscale via dst.write(src) — no i…
akhileshh May 20, 2026
e4462fd
refactor(ocdbt): module → package; OcdbtConfig dataclass; yaml-driven…
akhileshh May 20, 2026
54173ae
feat(meta): info-file > custom_data precedence; redis-cached helper s…
akhileshh May 20, 2026
cc20f10
refactor(ingest): consolidate OCDBT helpers into ingest/ocdbt.py; dro…
akhileshh May 20, 2026
dc75804
feat(ingest): coordinator-managed OCDBT populate; drop --reset-ocdbt
akhileshh May 20, 2026
d4ede71
refactor(ingest): consolidate duplicated chunk-requeue body into util…
akhileshh May 20, 2026
86ee9fe
fix(tests): unpack 4-tuple from bootstrap in test_from_config
akhileshh May 20, 2026
b4985c3
chore(ingest status): reorder + rename columns; split workers/busy
akhileshh May 21, 2026
12b68d1
fix(ingest): route OCDBT populate writes through the coordinator spec
akhileshh May 21, 2026
7802721
fix(ocdbt): drop atomic=True from copy_ws_bbox_multiscale
akhileshh May 21, 2026
9c11b7f
chore(ocdbt): log per-task populate work
akhileshh May 21, 2026
12cdebb
chore(ocdbt): per-task GCS dump on commit failures, gated on ERROR_DUMP
akhileshh May 21, 2026
c644efc
feat(ingest): purge_layer command for re-running from a previous backup
akhileshh May 21, 2026
f9be480
feat(ingest): retry runs full setup minus cg.create(); add --skip-queue
akhileshh May 21, 2026
5873aa8
docs(ocdbt): tensorstore OCDBT reference
akhileshh May 21, 2026
6f9920c
fix(ocdbt): lower max_inline_value_bytes so chunk values go out-of-line
akhileshh May 21, 2026
2617e01
fix(ocdbt): retry transient tensorstore errors in marker IO
akhileshh May 21, 2026
6b373a6
feat(ingest): consolidate OCDBT lifecycle under `ingest layer`; add t…
akhileshh May 22, 2026
8ca9743
tmp: disable ocdbt seg read for meshing
akhileshh May 23, 2026
0cb09c1
fix(ocdbt): self-heal stale fork manifests; re-enable OCDBT seg reads
akhileshh May 24, 2026
81752e4
feat(meshing): emit `dynamic_mesh_dir` in info JSON
akhileshh May 25, 2026
086771f
feat(graph): seamless setup for copied bigtables (mesh dir + ocdbt fork)
akhileshh May 25, 2026
fdff144
fix(deps): pin docker base image digest; regenerate requirements.txt
akhileshh May 25, 2026
0cdcb96
test(graph): align stale tests with current bootstrap/ws_cv/ocdbt source
akhileshh May 25, 2026
1fea204
fix(ocdbt): on-disk config wins on open; never assert in-code defaults
akhileshh May 25, 2026
949f8b8
fix(ocdbt): ensure_fork_synced acts only pre-edit; drop noisy steady-…
akhileshh May 25, 2026
b0d1a81
feat(meshing): one-shot mesh meta setup + `ingest mesh_meta` CLI
akhileshh May 25, 2026
01b1791
feat(meshing): 3-day TTL on manifest cache + admin endpoint to clear …
akhileshh May 25, 2026
6d8caa7
feat(debug): per-block memory + IO tracking on HierarchicalProfiler
akhileshh May 26, 2026
fcf37a7
feat(graph): PCG_DRY_RUN env var to suppress edit-flow writes
akhileshh May 26, 2026
a3dc41f
feat(debug): SV-split dry-run profile harness
akhileshh May 27, 2026
50d41cf
feat(debug): clean per-stage metrics + standalone replay helper
akhileshh May 27, 2026
a3b83e0
feat(debug): leaf-level profile() blocks across SV split path
akhileshh May 27, 2026
f01eacc
perf(sv-split): collapse build_coords + remap_to_root + binary_seg vi…
akhileshh May 28, 2026
b3887d4
perf(sv-split): confine enforce_cc label-3 dilation to its bounding box
akhileshh May 28, 2026
568a375
fix(sv-split): pin get_roots reads to parent_ts for deterministic replay
akhileshh May 28, 2026
6cd5e2e
refactor: consolidate sv-split into a package with co-located docs
akhileshh May 28, 2026
9430f46
perf(sv-split): window seed snapping to a bbox around the seeds
akhileshh May 28, 2026
a8a60fc
perf(sv-split): skip label-3 reassignment scan when no strays exist
akhileshh May 28, 2026
05b4373
perf(sv-split): write fresh IDs into the seg crop in place
akhileshh May 29, 2026
3309803
fix(sv-split): align chunk lattice to voxel offset, drop redundant ro…
akhileshh May 29, 2026
cfea904
Add scheduling package for weight-balanced work partitioning
akhileshh May 31, 2026
d129f44
Make HierarchicalProfiler fold-on-record, fork-safe, and tree-reported
akhileshh May 31, 2026
c2c7405
Add cgroup peak-memory reader for pod sizing
akhileshh May 31, 2026
d245d88
Add parallel sharded mesh stitching, mesh-equivalent to the serial path
akhileshh May 31, 2026
538eb3c
Add profiling + correctness harness for the parallel stitch
akhileshh May 31, 2026
3f729c8
Decode draco buffers as zero-copy views; deprecate the serial stitch fn
akhileshh May 31, 2026
63d43ef
Dispatch the parallel stitch from the mesh task
akhileshh May 31, 2026
1a1025b
Remove unused ocdbt edge put/get helpers
akhileshh May 31, 2026
6bc0152
Harden parallel stitch for heavy chunks
akhileshh May 31, 2026
caaa067
Run each initial-mesh chunk in a forked child that exits
akhileshh Jun 1, 2026
4182aed
Reclaim mesh-buffer heap after the stitch shard write
akhileshh Jun 1, 2026
97e510c
refactor: extract sv_lookup package; root-constrained 3D click resolu…
akhileshh Jun 1, 2026
6576b2f
refactor: assert_same_root helper for multi-root precondition errors
akhileshh Jun 1, 2026
8d743cf
fix(sv-split): pick fresh source/sink IDs from cut labels; cluster-ti…
akhileshh Jun 1, 2026
191a3e3
chore(sv-split): RunRecord rename, cleaner harness output
akhileshh Jun 1, 2026
5c22c70
chore(deploy): suppress kube-probe access logs and uWSGI cheaper chatter
akhileshh Jun 1, 2026
ecb14db
fix(deploy): inline server block in override nginx.conf
akhileshh Jun 2, 2026
989b84a
chore(sv-split): extract state dataclasses to state.py
akhileshh Jun 2, 2026
cbffaa1
refactor(sv-split): drop DBSCAN seed-cluster bbox
akhileshh Jun 2, 2026
4405df3
chore(sv-split): consolidate docs, add dry-run-toggle profile harness
akhileshh Jun 2, 2026
4970fc0
chore(edits): op_id-tagged logs, edit-end summary, drop TimeIt usages
akhileshh Jun 3, 2026
0e7db89
perf(sv-split): parallel TA/TB + dj3d geodesic backend toggle
akhileshh Jun 3, 2026
0f0801d
fix(sv-split): pair downsample with binary_seg.shape in same axis order
akhileshh Jun 3, 2026
099a970
perf(sv-split): reuse new_kdtrees, cache partner_tree, batch boundary…
akhileshh Jun 3, 2026
71a1930
perf(sv-split): make resolve3 scale with len(L3), not volume
akhileshh Jun 3, 2026
a397ab4
fix(sv-split): let label-3 fragments through to the mincut
akhileshh Jun 3, 2026
109453e
chore(logging): add VERBOSE level for stage-summary diagnostics
akhileshh Jun 3, 2026
7ff888a
chore(sv-split): switch default geodesic backend to dj3d
akhileshh Jun 4, 2026
fb7def8
test(sv-split): align validate_split_edges tests with {1, 2}-only check
akhileshh Jun 4, 2026
3bcc543
docs(sv-split): use L1 for the supervoxel layer (PCG has no L0)
akhileshh Jun 4, 2026
0cfab28
perf(sv-split): run enforce_cc / resolve3 on the foreground crop
akhileshh Jun 4, 2026
262f5e1
perf(sv-split): chunked OR for binary_seg union
akhileshh Jun 4, 2026
a35795e
perf(sv-split): bbox crop via per-axis projections, not argwhere
akhileshh Jun 4, 2026
b0f3b30
chore(sv-split): extract _nonzero_bbox_zyx helper + record crackle fi…
akhileshh Jun 4, 2026
d50bb0d
fix(meshing): correct dynamic mesh dir lookup, quiet remesh logs
akhileshh Jun 4, 2026
da9598d
fix(meshing): route dynamic mesh fetch via unsharded_mesh_dir
akhileshh Jun 4, 2026
7adaaa2
chore(env): bump Python floor to 3.14
akhileshh Jun 6, 2026
8233221
refactor(sv-split): lift post-split coord helpers to _coords.py
akhileshh Jun 6, 2026
c81a758
feat(sv-split): route split through env-driven get_splitter
akhileshh Jun 6, 2026
fd19576
fix(sv-split): restore log + behavior parity, instrument update_edges
akhileshh Jun 6, 2026
f4f061c
perf(sv-split): swap scipy.cKDTree for pykdtree in _get_new_edges
akhileshh Jun 7, 2026
a8f27ab
build: depend on supervoxel-splitter==0.1.0 from PyPI
akhileshh Jun 7, 2026
c813fab
refactor(sv-split): drop in-tree split code now in supervoxel-splitter
akhileshh Jun 7, 2026
d1b7230
build: drop transitive deps now pulled by supervoxel-splitter
akhileshh Jun 7, 2026
308c349
perf(sv-split): boundary-only point cloud + focused metrics report
akhileshh Jun 7, 2026
0a5d79d
fix(ci): set WORKDIR /app and install procps in Dockerfile
akhileshh Jun 7, 2026
8da35d5
perf(sv-split): inline update_edges, free seg before boundary alloc
akhileshh Jun 7, 2026
5cd9875
perf(sv-split): dedupe per-voxel old/new pairs in _parse_results
akhileshh Jun 7, 2026
339c159
perf(sv-split): drop redundant foreground AND in boundary mask
akhileshh Jun 7, 2026
2065be7
fix(deploy): pin LD_LIBRARY_PATH to venv lib so libpython resolves to…
akhileshh Jun 7, 2026
3a20fbb
fix(deploy): recycle uwsgi worker once its RSS exceeds 2 GiB
akhileshh Jun 8, 2026
cd4f071
log(edits): dump full err context to bucket, name values in assertions
akhileshh Jun 8, 2026
4fdbd8b
docs(sv-split): note err_dump artifact path, queue multi-rep dedup as…
akhileshh Jun 8, 2026
1fd457f
feat(pipeline): cross-branch chunk-batch core (ingest + meshing)
akhileshh Jun 10, 2026
1a8c48f
feat(pipeline): pcgv3 ingest dispatch + migration workload
akhileshh Jun 11, 2026
d124757
fix(pipeline): force-exit workers to dodge bigtable thread
akhileshh Jun 12, 2026
d5b225b
fix(pipeline): port chunk lock to kvdbclient primitives
akhileshh Jun 12, 2026
a913ae2
fix(logging): stop duplicate log lines, print chunk coords as ints
akhileshh Jun 12, 2026
3eab490
feat(pipeline): verify hierarchy after the root chunk is built
akhileshh Jun 12, 2026
1d8e26b
fix(pipeline): route every entrypoint through one run_and_exit helper
akhileshh Jun 13, 2026
d1c3697
feat(ingest): --exist-ok skips create when the graph table exists
akhileshh Jun 13, 2026
a1ebe1c
refactor(pipeline): adopt cave-pipeline for the distribution core
akhileshh Jun 15, 2026
750f4d5
build: bump cave-pipeline to 0.0.3
akhileshh Jun 15, 2026
abfa8c7
perf(graph): read watershed via tensorstore
akhileshh Jun 16, 2026
07036ec
perf(graph): defer graph_tool/pandas/networkx/cloudfiles off import path
akhileshh Jun 16, 2026
19cd3d2
perf(sv-split): adopt fastremap.point_cloud(shell=True) in build_coor…
akhileshh Jun 16, 2026
30f9487
fix(meshing): read watershed at requested mip; derive chunk_size
akhileshh Jun 16, 2026
1e90ad0
fix(pipeline): delegate mesh-meta setup to the meshing library
akhileshh Jun 16, 2026
4feda63
build: derive version from git tags via setuptools_scm
akhileshh Jun 16, 2026
2756be1
perf(imports): confine cloudvolume to the meshing package
akhileshh Jun 16, 2026
fd8633c
feat(ingest): stamp mesh ingest boundary at root-layer build
akhileshh Jun 17, 2026
383797f
fix(build): set version only from version-like tags
akhileshh Jun 17, 2026
335e657
fix(meta): isolate copied-table mesh dirs by layout
akhileshh Jun 18, 2026
3f13889
fix(version): stamp tables from a committed _version.py literal
akhileshh Jun 18, 2026
72ccfda
fix(meshing): handle top-layer chunks in calculate_stop_layer
akhileshh Jun 20, 2026
3918789
Merge pull request #534 from CAVEconnectome/akhilesh/sv-splitting-locks
akhileshh Jun 21, 2026
530bfe6
fix(deps): bump scipy>=1.18.0 to dodge broken cp314 1.17.1 wheel
akhileshh Jun 21, 2026
10a1b70
fix(deps): make conda the sole numpy source, drop it from the pip lock
akhileshh Jun 25, 2026
3c00b0b
docs(readme): document the release workflow
akhileshh Jun 27, 2026
99943c4
test: configure pytest discovery in pyproject
akhileshh Jun 28, 2026
d1123b1
test: drop unused gen_graph_with_edges fixture
akhileshh Jun 28, 2026
bfedd19
test: extract fake_timestamp helper for the shared past timestamp
akhileshh Jun 28, 2026
62bbed8
test: add build_graph helper deriving the parent hierarchy
akhileshh Jun 28, 2026
e08bbe2
test: build_graph spec uses named SV coordinates
akhileshh Jun 28, 2026
d345c14
test: build_graph returns BuiltGraph(cg, sv)
akhileshh Jun 28, 2026
55c65f0
test: migrate graph-test builders to the build_graph factory
akhileshh Jun 28, 2026
c529db7
test: eliminate hardcoded node coordinates from the suite
akhileshh Jun 28, 2026
57653c6
test: group edit-operation tests into an edits package
akhileshh Jun 29, 2026
b340ac5
test: keep stale-edge tests on a between-chunk edge
akhileshh Jun 29, 2026
3ef7798
test: cut real-time sleeps from the slowest lock/error tests
akhileshh Jun 29, 2026
8677404
refactor: discover test backends from kvdbclient (>=0.8.0)
akhileshh Jun 29, 2026
7d8a643
fix(ingest): size worker pools by the pod's cpu, not the node's
akhileshh Aug 10, 2026
228516a
fix(meshing): use the parallel stitch, bounded by the pod's cpu
akhileshh Aug 10, 2026
20e3f1e
fix(deps): require cave-pipeline 0.0.4 and pin the conda solve
akhileshh Aug 10, 2026
851ed8c
fix(meshing): size shard upload parts to bound compose calls
akhileshh Aug 12, 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
6 changes: 0 additions & 6 deletions .bumpversion.cfg

This file was deleted.

7 changes: 7 additions & 0 deletions .coveragerc
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,13 @@ source = pychunkedgraph
omit =
*test*
*benchmarking/*
pychunkedgraph/debug/*
pychunkedgraph/export/*
pychunkedgraph/jobs/*
pychunkedgraph/logging/*
pychunkedgraph/repair/*
pychunkedgraph/meshing/*
pychunkedgraph/app/*

[report]
# Regexes for lines to exclude from consideration
Expand Down
1 change: 1 addition & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,7 @@ venv.bak/

# Visual Code
.vscode/
*.code-workspace

# terraform
.terraform/
Expand Down
51 changes: 51 additions & 0 deletions .github/workflows/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
# GitHub Actions workflows

Two workflows drive CI and releases for PyChunkedGraph.

| File | Workflow name | Trigger | Purpose |
|---|---|---|---|
| `main.yml` | PyChunkedGraph | push / PR to `main` or `pcgv3` | Build the image and run the test suite with coverage |
| `release.yml` | publish release | manual (`workflow_dispatch`) | Bump the version, tag, and create the GitHub Release; optionally bump the Helm chart |

## `main.yml` — CI

Runs on every push and pull request targeting `main` or `pcgv3`. One `unit-tests` job:

1. Builds the Docker image locally with Buildx (`load: true`, not pushed), tagged with the commit SHA, using the GitHub Actions layer cache.
2. Runs `pytest` with coverage inside the container against `pychunkedgraph/tests`.
3. Copies `coverage.xml` out and uploads it to Codecov — runs even when tests fail, and a Codecov upload error does not fail the build.
4. Removes the test container.

Secrets: `CODECOV_TOKEN`.

## `release.yml` — release

Manual only — dispatch it from the branch you want to release. **The branch is the major line**: `main` carries 2.x, `pcgv3` carries 3.x, because the version is a committed literal in `pychunkedgraph/_version.py` (the repo-root README has the full versioning flow). The tag and the in-code literal are written by the same job, so they never drift.

### Inputs

| Input | Default | Effect |
|---|---|---|
| `part` | `patch` | which semver component to bump — `major` / `minor` / `patch` |
| `dry-run` | `false` | `true` computes the next version and stops: no commit, tag, release, or chart bump |
| `skip-tests` | `false` | currently unused — no step references it |
| `update-chart` | `false` | `true` also bumps the Helm chart `appVersion` (needs `HELM_CHART_UPDATE_TOKEN`) |

### Jobs

- **`bump`** — reads the version from `pychunkedgraph/_version.py`, bumps `part`, writes it back. Unless dry-run: commits `release vX.Y.Z`, tags `vX.Y.Z`, pushes the branch and the tag, then creates the GitHub Release. Needs `contents: write`.
- **`update-chart`** — opt-in: runs only when `update-chart` is `true` (and not dry-run). Checks out `CAVEconnectome/cave-helm-charts`, sets `charts/pychunkedgraph/Chart.yaml` `appVersion` to the new version, bumps the chart's own `version` by a patch, and pushes. Needs `HELM_CHART_UPDATE_TOKEN` (write access to the chart repo).

## Cutting a release

```
# preview the next version, no writes
gh workflow run release.yml --ref pcgv3 -f part=patch -f dry-run=true

# cut the release
gh workflow run release.yml --ref pcgv3 -f part=patch
```

Or via the Actions UI: **publish release → Run workflow →** pick the branch and `part`.

The pushed tag is what the image build (`cloudbuild.yaml`) builds from. New tables created by that image are stamped with this version, and the server only serves tables whose major matches. The Helm chart `appVersion` bump that rolls the image out is opt-in via `update-chart`.
38 changes: 34 additions & 4 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,49 @@ on:
push:
branches:
- "main"
- "pcgv3"
pull_request:
branches:
- "main"
- "pcgv3"

jobs:
unit-tests:
runs-on: ubuntu-latest
steps:
- name: Check out code
uses: actions/checkout@v2
uses: actions/checkout@v4

- name: Build image and run tests
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Build image
uses: docker/build-push-action@v6
with:
context: .
load: true
tags: seunglab/pychunkedgraph:${{ github.sha }}
cache-from: type=gha
cache-to: type=gha,mode=max

- name: Run tests with coverage
run: |
docker build --tag seunglab/pychunkedgraph:$GITHUB_SHA .
docker run --rm seunglab/pychunkedgraph:$GITHUB_SHA /bin/sh -c "pytest --cov-config .coveragerc --cov=pychunkedgraph ./pychunkedgraph/tests && codecov"
docker run --name pcg-tests seunglab/pychunkedgraph:${{ github.sha }} \
/bin/sh -c "pytest --cov-config .coveragerc --cov=pychunkedgraph --cov-report=xml:/app/coverage.xml ./pychunkedgraph/tests"

- name: Copy coverage report from container
if: always()
run: docker cp pcg-tests:/app/coverage.xml ./coverage.xml

- name: Upload coverage to Codecov
if: always()
uses: codecov/codecov-action@v5
with:
files: ./coverage.xml
token: ${{ secrets.CODECOV_TOKEN }}
slug: CAVEconnectome/PyChunkedGraph
fail_ci_if_error: false

- name: Cleanup
if: always()
run: docker rm pcg-tests || true
52 changes: 27 additions & 25 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,11 @@ on:
type: boolean
required: true
default: false
update-chart:
description: "Also bump the pychunkedgraph Helm chart appVersion (needs HELM_CHART_UPDATE_TOKEN)"
type: boolean
required: false
default: false

jobs:
bump:
Expand All @@ -36,37 +41,34 @@ jobs:
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Get tags
run: git fetch --tags origin
- name: Configure git for github-actions[bot]
run: |
git config --global user.name "github-actions[bot]"
git config --global user.email "github-actions[bot]@users.noreply.github.com"
- name: Install Python
uses: actions/setup-python@v5
with:
python-version: "3.11"
- name: Install bumpversion
run: pip install bumpversion
- name: Bump version with bumpversion
run: |
bumpversion ${{ github.event.inputs.part }}
- name: Commit and push with tags
if: ${{ github.event.inputs.dry-run == 'false' }}
run: git push --follow-tags
- name: Get version
- name: Bump version in pychunkedgraph/_version.py
id: get-version
run: |
version="$(git describe --tags)"
# remove the leading v from version
version="${version:1}"
cur=$(sed -n 's/^__version__ = "\(.*\)"/\1/p' pychunkedgraph/_version.py)
IFS=. read -r major minor patch <<< "$cur"
case "${{ github.event.inputs.part }}" in
major) major=$((major + 1)); minor=0; patch=0 ;;
minor) minor=$((minor + 1)); patch=0 ;;
patch) patch=$((patch + 1)) ;;
esac
version="$major.$minor.$patch"
sed -i "s/^__version__ = .*/__version__ = \"$version\"/" pychunkedgraph/_version.py
echo "VERSION=$version" >> $GITHUB_OUTPUT
major_version="$(cut -d '.' -f 1 <<< $version)"
echo "MAJOR_VERSION=$major_version" >> $GITHUB_OUTPUT
minor_version="$(cut -d '.' -f 2 <<< $version)"
echo "MINOR_VERSION=$minor_version" >> $GITHUB_OUTPUT
short_version="$major_version.$minor_version"
echo "SHORT_VERSION=$short_version" >> $GITHUB_OUTPUT
echo "MAJOR_VERSION=$major" >> $GITHUB_OUTPUT
echo "MINOR_VERSION=$minor" >> $GITHUB_OUTPUT
echo "SHORT_VERSION=$major.$minor" >> $GITHUB_OUTPUT
- name: Commit the bump and push the tag
if: ${{ github.event.inputs.dry-run == 'false' }}
run: |
git add pychunkedgraph/_version.py
git commit -m "release v${{ steps.get-version.outputs.VERSION }}"
git tag "v${{ steps.get-version.outputs.VERSION }}"
git push origin HEAD
git push origin "v${{ steps.get-version.outputs.VERSION }}"
- name: Show short version
run: echo ${{ steps.get-version.outputs.SHORT_VERSION }}

Expand All @@ -92,7 +94,7 @@ jobs:
name: Update pychunkedgraph Helm chart
runs-on: ubuntu-latest
needs: bump
if: ${{ github.event.inputs.dry-run == 'false' }}
if: ${{ github.event.inputs.dry-run == 'false' && github.event.inputs.update-chart == 'true' }}
permissions:
contents: read
id-token: write
Expand Down
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -115,8 +115,11 @@ venv.bak/


# local dev stuff
*.code-workspace
.claude/
.devcontainer/
*.ipynb
*.rdb
/protobuf*
.DS_Store
.DS_Store
*debug.py
5 changes: 5 additions & 0 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
repos:
- repo: https://github.com/psf/black
rev: 26.1.0
hooks:
- id: black
60 changes: 0 additions & 60 deletions .travis.yml

This file was deleted.

86 changes: 84 additions & 2 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,11 +1,93 @@
FROM caveconnectome/pychunkedgraph:base_042124
# syntax=docker/dockerfile:1
ARG PYTHON_VERSION=3.14
# python:X-slim is the official upstream image. Pin by digest once a
# known-good build is identified so cache invalidation stays explicit;
# until then, the tag follows the latest 3.14 patch release.
ARG BASE_IMAGE=python:${PYTHON_VERSION}-slim


######################################################
# Stage 1: Conda environment
######################################################
FROM ${BASE_IMAGE} AS conda-deps
ENV PATH="/root/miniconda3/bin:${PATH}"

RUN apt-get update && apt-get install build-essential wget -y \
&& wget -q https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh \
&& bash Miniconda3-latest-Linux-x86_64.sh -b \
&& rm Miniconda3-latest-Linux-x86_64.sh \
&& conda config --add channels conda-forge \
&& conda update -y --override-channels -c conda-forge conda \
&& conda tos accept --override-channels --channel https://repo.anaconda.com/pkgs/main \
&& conda tos accept --override-channels --channel https://repo.anaconda.com/pkgs/r \
&& conda install -y --override-channels -c conda-forge conda-pack

COPY requirements.yml requirements.txt requirements-dev.txt ./

# Solve against baseline x86-64. conda picks microarch-optimized builds from the
# *builder's* cpu (graph-tool ships v1/v3/v4 variants), so an image built on an
# AVX-512 host raises SIGILL on import wherever it later lands on an older node.
RUN --mount=type=cache,target=/opt/conda/pkgs \
CONDA_OVERRIDE_ARCHSPEC=x86_64 conda env create -n pcg -f requirements.yml

RUN conda-pack -n pcg --ignore-missing-files -o /tmp/env.tar \
&& mkdir -p /app/venv && cd /app/venv \
&& tar xf /tmp/env.tar && rm /tmp/env.tar \
&& /app/venv/bin/conda-unpack


######################################################
# Stage 2: Bigtable emulator
######################################################
FROM golang:bullseye AS bigtable-emulator
ARG GOOGLE_CLOUD_GO_VERSION=bigtable/v1.19.0
RUN --mount=type=cache,target=/go/pkg/mod \
--mount=type=cache,target=/root/.cache/go-build \
git clone --depth=1 --branch="$GOOGLE_CLOUD_GO_VERSION" \
https://github.com/googleapis/google-cloud-go.git /usr/src \
&& cd /usr/src/bigtable && go install -v ./cmd/emulator


######################################################
# Stage 3: Production
######################################################
FROM ${BASE_IMAGE}
ENV VIRTUAL_ENV=/app/venv
ENV PATH="$VIRTUAL_ENV/bin:$PATH"
# Force ld to resolve libpython3.x.so to the conda venv's copy. The
# slim base ships its own /usr/local/lib/libpython, which the loader
# would otherwise pair with conda-built C extensions, segfaulting in
# PyObject_Hash during the first import.
ENV LD_LIBRARY_PATH="$VIRTUAL_ENV/lib"

RUN apt-get update && apt-get install -y --no-install-recommends \
nginx supervisor redis-tools procps \
&& (id nginx >/dev/null 2>&1 || useradd -r -d /home/nginx -s /bin/bash nginx) \
&& mkdir -p /etc/uwsgi /home/nginx/.cloudvolume/secrets \
&& chown -R nginx /home/nginx \
&& rm -rf /var/lib/apt/lists/*

COPY --from=conda-deps /app/venv /app/venv
COPY --from=bigtable-emulator /go/bin/emulator /app/venv/bin/cbtemulator
COPY override/gcloud /app/venv/bin/gcloud
COPY override/timeout.conf /etc/nginx/conf.d/timeout.conf
COPY override/nginx.conf /etc/nginx/nginx.conf
COPY override/supervisord.conf /etc/supervisor/conf.d/supervisord.conf
COPY uwsgi.ini /etc/uwsgi/uwsgi.ini

# PyPI wheel bundles the zstd C source; conda-forge's system-linked
# build lacks `multi_decompress_to_buffer`, used by io/edges.py.
RUN pip install --no-cache-dir --no-deps --force-reinstall zstandard>=0.23.0

COPY requirements.txt .
RUN pip install --upgrade -r requirements.txt
RUN --mount=type=cache,target=/root/.cache/pip \
pip install --upgrade -r requirements.txt

COPY . /app
WORKDIR /app

# --no-deps: graph-tool/cloudvolume etc. are already in the venv. __version__ comes from
# the committed pychunkedgraph/_version.py literal (bumped by the release workflow).
RUN pip install --no-deps -e .

CMD ["/usr/bin/supervisord", "-n", "-c", "/etc/supervisor/supervisord.conf"]
Loading
Loading