diff --git a/.envrc b/.envrc
new file mode 100644
index 000000000..b48edb47f
--- /dev/null
+++ b/.envrc
@@ -0,0 +1,3 @@
+
+export SCITEX_TODO_AGENT_ID="scitex-python"
+export SCITEX_TODO_TASKS_YAML_SHARED="$HOME/.scitex/todo/tasks.yaml"
diff --git a/.scitex/clew/db.sqlite b/.scitex/clew/runtime/db.sqlite
similarity index 100%
rename from .scitex/clew/db.sqlite
rename to .scitex/clew/runtime/db.sqlite
diff --git a/.worktrees/fix-umbrella-ml-canonical b/.worktrees/fix-umbrella-ml-canonical
new file mode 160000
index 000000000..760528812
--- /dev/null
+++ b/.worktrees/fix-umbrella-ml-canonical
@@ -0,0 +1 @@
+Subproject commit 76052881269c66efdf976c2bbe6eeb5cd0fb3696
diff --git a/.worktrees/full-green b/.worktrees/full-green
new file mode 160000
index 000000000..14c03fbee
--- /dev/null
+++ b/.worktrees/full-green
@@ -0,0 +1 @@
+Subproject commit 14c03fbee5fdbe50f165bb6bdecc22ecf9a3dfe4
diff --git a/.worktrees/gen-deprecation-shim b/.worktrees/gen-deprecation-shim
new file mode 160000
index 000000000..1f29601e9
--- /dev/null
+++ b/.worktrees/gen-deprecation-shim
@@ -0,0 +1 @@
+Subproject commit 1f29601e9fe10f29cbb91ab6de65d172cbe478ba
diff --git a/.worktrees/gen-deprecation-shim-clean b/.worktrees/gen-deprecation-shim-clean
new file mode 160000
index 000000000..17c68f212
--- /dev/null
+++ b/.worktrees/gen-deprecation-shim-clean
@@ -0,0 +1 @@
+Subproject commit 17c68f2124025e8e092908712b3d78df6d17ef20
diff --git a/.worktrees/reconcile-pins b/.worktrees/reconcile-pins
new file mode 160000
index 000000000..6820c5475
--- /dev/null
+++ b/.worktrees/reconcile-pins
@@ -0,0 +1 @@
+Subproject commit 6820c5475ab97500e6307166f053c32edeeb4ff2
diff --git a/.worktrees/scitex-python-rel b/.worktrees/scitex-python-rel
new file mode 160000
index 000000000..403dab431
--- /dev/null
+++ b/.worktrees/scitex-python-rel
@@ -0,0 +1 @@
+Subproject commit 403dab4318ad7811e606534a91284de6185d58a0
diff --git a/.worktrees/step-c-figrecipe b/.worktrees/step-c-figrecipe
new file mode 160000
index 000000000..423b253e2
--- /dev/null
+++ b/.worktrees/step-c-figrecipe
@@ -0,0 +1 @@
+Subproject commit 423b253e28b5ea007cdefb2a0c69fe65c606e54a
diff --git a/.worktrees/umbrella-session-reexport b/.worktrees/umbrella-session-reexport
new file mode 160000
index 000000000..41ff63203
--- /dev/null
+++ b/.worktrees/umbrella-session-reexport
@@ -0,0 +1 @@
+Subproject commit 41ff632030861f825b1693ad19b424fc283028da
diff --git a/docs/architecture/06_ecosystem_loose_coupling.mmd b/docs/architecture/06_ecosystem_loose_coupling.mmd
new file mode 100644
index 000000000..121189551
--- /dev/null
+++ b/docs/architecture/06_ecosystem_loose_coupling.mmd
@@ -0,0 +1,28 @@
+%% SciTeX ecosystem — loose coupling (record → read → render).
+%% Every edge is a data contract (optional hook / neutral file / JSON export),
+%% never a code import. clew = provenance hub; writer = render/UI hub.
+%% Producer topology finalized 2026-07-04 (writer/clew/scholar/figrecipe agreed).
+flowchart TB
+ subgraph SUB["record → read → render — no imports across edges"]
+ direction TB
+ IO["scitex-io
save / load + record_output hooks"]
+ SESS["scitex-session
provenance session (@stx.session)"]
+ STATS["scitex-stats
stat outputs"]
+ FIG["figrecipe
figures = recipe + data"]
+ SCH["scitex-scholar
citations / DOI"]
+ CLEW["scitex-clew
provenance DAG · claims · citations · stat · source-gate
exports JSON — renderer-agnostic"]
+ WRITER["scitex-writer
compile + editor UI
neutral Hints feed (manuscript-hints/1) + renders marks"]
+ end
+
+ IO -->|"record_output (optional hook)"| CLEW
+ SESS -->|"session records"| CLEW
+ STATS -->|"recorded outputs"| CLEW
+ FIG -->|"tracker files (provenance)"| CLEW
+ SCH -->|"citations/v1 data"| CLEW
+ CLEW -->|"claims.json / export_manuscript_hints (JSON)"| WRITER
+ FIG -->|"figure-quality hints (direct, source:figrecipe)"| WRITER
+
+ classDef core fill:#dbeafe,stroke:#1d4ed8,color:#0b1324,stroke-width:2px;
+ classDef prod fill:#dcfce7,stroke:#166534,color:#0b1324;
+ class CLEW,WRITER core
+ class IO,SESS,STATS,FIG,SCH prod