Umbrella tracker — splitting #31 into 5 child PRs
#31 is the canonical R7 Phase 1 'Isaac Sim backend skeleton' PR (12 files changed, +2,827/-6, 9 review threads, 4 R-rounds). It is correct as a single piece of work but operationally hostile to review at this size — simulation.py alone is 1,097 LOC. Splitting it into 5 dependency-ordered child PRs lets reviewers focus on one subsystem at a time, keeps git bisect useful, and follows the same precedent established on strands-labs/robots#195 → #220-#228 (tracked by robots#219).
Scope (recap from #31)
Phase 1 of the Isaac Sim backend (R7): skeleton + entry-point + tests, no GPU required for CI. Full implementation (stages, sensors, replicator, fleet) follows in subsequent phase PRs.
| Concern |
Module |
Phase 1 status |
| Entry-point discovery |
pyproject.toml, isaac/__init__.py |
✅ working |
| Config validation |
isaac/config.py (IsaacConfig) |
✅ working |
| Procedural USD builders |
isaac/procedural.py (SO-100 / Panda / G1) |
✅ builders return shapes; articulation defects deferred to Phase 2 |
SimEngine lifecycle (init / is_available / cleanup) |
isaac/simulation.py |
✅ working |
| World creation / spawning / observation / render |
isaac/simulation.py |
⚠️ silent-success on procedural add_robot; get_observation returns {} (R2/R4 disclosure documented) |
| GPU integration |
tests/test_gpu_integ.py |
gated on STRANDS_GPU_TEST=1 |
| Documentation |
docs/backends/isaac.md |
✅ install + usage + Phase 1 status banner |
Solution shape
PEP 562 lazy imports throughout (zero omni overhead on import strands_robots_sim); SimulationApp singleton; headless=True default; thread-safe via threading.RLock; is_available() returns (bool, str|None); no binary assets (procedural robots built from code); GPU tests gated behind @pytest.mark.gpu + STRANDS_GPU_TEST=1. R1 narrowed is_available() to probe omni.isaac.kit specifically; R1 added unknown-kwarg rejection; R1 dropped unsafe __del__; R1 narrowed 4 bare-except sites; R2 corrected G1 DOF count + added Phase 1 doc disclosure banner; R4 added distinguishable WARNING/DEBUG diagnostic logs across get_observation's four silent-empty modes (typo / forgotten create_world / Phase 1 articulation None / ambiguous robot_name).
Child PRs (in landing order)
Dependency graph
PR-1 (#44, entry-point + extras + lazy import) ──┐
├──► PR-2 (#45, config dataclass) ──┐
└──► PR-3 (#46, procedural USD builders) ──┤
├──► PR-4 (#47, IsaacSimulation backend) ──┐
│ │
PR-5 (#48, docs) ───────────────────────────────────────┴──► close #31
PR-1 (#44) lands first.
PR-2 (#45) / PR-3 (#46) land in parallel after PR-1.
PR-4 (#47) needs PR-2 + PR-3.
PR-5 (#48) is parallel-mergeable with PR-4 (docs only, no code dep).
This issue closes when PR-5 (#48) lands and #31 is closed with a redirect comment.
Carved test files (split-specific bookkeeping)
test_phase1_doc_honesty.py from #31 was carved into two files so each parallel slice is CI-green standalone:
| Source class on #31 |
New file |
Lands in |
TestG1DOFCount (3 tests) |
tests/test_procedural_g1_dof.py |
PR-3 (#46) |
TestIsaacDocsPhase1Banner (3 tests) |
tests/test_phase1_doc_banner.py |
PR-5 (#48) |
Combined coverage equals the original file.
Review-thread bookkeeping
The 9 review threads on #31 stay open until the corresponding child PR closes them; child PRs cite the original #31 thread URL when resolving (mirrors #195's R-round practice). The R1/R2/R3 (merge)/R4 commit chronicle on #31 is the forensic source of truth — child PRs cherry-pick the relevant content from cagataycali/feat/isaac-sim (HEAD befb1e3).
CI expectations
Closing condition
Closes when PR-5 (#48) lands and #31 is closed with a redirect comment to the 5 child PRs.
Tracking child of #31. Following the precedent set by robots#195 → #220-#228.
Umbrella tracker — splitting #31 into 5 child PRs
#31 is the canonical R7 Phase 1 'Isaac Sim backend skeleton' PR (12 files changed, +2,827/-6, 9 review threads, 4 R-rounds). It is correct as a single piece of work but operationally hostile to review at this size —
simulation.pyalone is 1,097 LOC. Splitting it into 5 dependency-ordered child PRs lets reviewers focus on one subsystem at a time, keepsgit bisectuseful, and follows the same precedent established onstrands-labs/robots#195 → #220-#228(tracked byrobots#219).Scope (recap from #31)
Phase 1 of the Isaac Sim backend (R7): skeleton + entry-point + tests, no GPU required for CI. Full implementation (stages, sensors, replicator, fleet) follows in subsequent phase PRs.
pyproject.toml,isaac/__init__.pyisaac/config.py(IsaacConfig)isaac/procedural.py(SO-100 / Panda / G1)SimEnginelifecycle (init /is_available/ cleanup)isaac/simulation.pyisaac/simulation.pyadd_robot;get_observationreturns{}(R2/R4 disclosure documented)tests/test_gpu_integ.pySTRANDS_GPU_TEST=1docs/backends/isaac.mdSolution shape
PEP 562 lazy imports throughout (zero
omnioverhead onimport strands_robots_sim);SimulationAppsingleton;headless=Truedefault; thread-safe viathreading.RLock;is_available()returns(bool, str|None); no binary assets (procedural robots built from code); GPU tests gated behind@pytest.mark.gpu+STRANDS_GPU_TEST=1. R1 narrowedis_available()to probeomni.isaac.kitspecifically; R1 added unknown-kwarg rejection; R1 dropped unsafe__del__; R1 narrowed 4 bare-except sites; R2 corrected G1 DOF count + added Phase 1 doc disclosure banner; R4 added distinguishable WARNING/DEBUG diagnostic logs acrossget_observation's four silent-empty modes (typo / forgottencreate_world/ Phase 1 articulation None / ambiguous robot_name).Child PRs (in landing order)
feat(isaac): [isaac] extras + entry-point + PEP 562 lazy import (1/5 of #31 split)—pyproject.toml([isaac]extras + entry-points +pytest>=7.0dev/hatch deps +gpupytest marker),isaac/__init__.py(PEP 562 lazy stub),isaac/tests/__init__.py. ~68 LOC. Demonstrates entry-point discovery without any simulation code. Lands first.feat(isaac): IsaacConfig dataclass with validation (2/5 of #31 split)—isaac/config.py. ~116 LOC. Pure dataclass, noomnideps. R1's "reject unknown kwargs" pin lives here (from_kwargsclassmethod). Branched off PR-1.feat(isaac): procedural USD builders (SO-100, Panda, G1) (3/5 of #31 split)—isaac/procedural.py+ carvedtests/test_procedural_g1_dof.py. ~331 LOC. R2's G1-DOF=21 truth-source pin lives here. Branched off PR-1; parallel-mergeable with PR-2.feat(isaac): IsaacSimulation backend (lifecycle + observation + render) (4/5 of #31 split)—isaac/simulation.py+ remainingtests/test_unit.py+tests/test_entrypoint.py+tests/test_get_observation_diagnostic_logs.py+tests/test_gpu_integ.py. ~2,000 LOC. Carries R1'somni.isaac.kit-specific probe + no-__del__+ narrow except + R4'sget_observationdiagnostic logging. Branched off PR-3 (depends on PR-2'sconfig.py+ PR-3'sprocedural.py).docs(isaac): backend reference + Phase 1 status banner (5/5 of #31 split)—docs/backends/isaac.md+ carvedtests/test_phase1_doc_banner.py. ~288 LOC. R2's Phase-1-status disclosure banner about silent-success methods. Parallel-mergeable with PR-4.Dependency graph
PR-1 (#44) lands first.
PR-2 (#45) / PR-3 (#46) land in parallel after PR-1.
PR-4 (#47) needs PR-2 + PR-3.
PR-5 (#48) is parallel-mergeable with PR-4 (docs only, no code dep).
This issue closes when PR-5 (#48) lands and #31 is closed with a redirect comment.
Carved test files (split-specific bookkeeping)
test_phase1_doc_honesty.pyfrom #31 was carved into two files so each parallel slice is CI-green standalone:TestG1DOFCount(3 tests)tests/test_procedural_g1_dof.pyTestIsaacDocsPhase1Banner(3 tests)tests/test_phase1_doc_banner.pyCombined coverage equals the original file.
Review-thread bookkeeping
The 9 review threads on #31 stay open until the corresponding child PR closes them; child PRs cite the original #31 thread URL when resolving (mirrors #195's R-round practice). The R1/R2/R3 (merge)/R4 commit chronicle on #31 is the forensic source of truth — child PRs cherry-pick the relevant content from
cagataycali/feat/isaac-sim(HEADbefb1e3).CI expectations
simulation.pyimportsIsaacConfigfrom PR-2 andprocedural.get_procedural_robotfrom PR-3;test_unit.pyhas 25 abstract-method failures pre-existing on feat(isaac): IsaacSimulation backend skeleton + entry-point registration (R7) #31 against current upstreamstrands_robots). Will go green after PR-2 + PR-3 merge to main and this branch rebases. Pre-existing abstract-method gap noted in PR-4's body — separate review concern, not introduced by the split.Closing condition
Closes when PR-5 (#48) lands and #31 is closed with a redirect comment to the 5 child PRs.
Tracking child of #31. Following the precedent set by
robots#195 → #220-#228.