Tracking checklist for #26 — [EPIC] Establish single ownership of the Appwrite environment.
Cross items off as they land. The order below is the implementation order; dependencies are noted where they constrain it.
Checklist
Completion criteria
The epic is done when all ten boxes are ticked and:
Not this epic — cross-linked, not re-scoped
|
|
| views-faoapi#337 |
Extract the credential/partition contract to views-appwrite. Gated on þing-01 D8, which is views-appwrite#23. Those two are the same decision from opposite sides. views-crafdapi existing now satisfies one of #337's two trigger conditions; #23 is the other |
| views-pipeline-core#339 |
The Appwrite eviction epic, Phases 0–2 |
| views-models#298 / #299 |
Liveness .env; .gitignore gaps |
| views-postprocessing#187 |
Registry drift detection |
Already shipped — verified against current HEADs, not assumed
views-pipeline-core#346 (find_dotenv deleted, preflight everywhere, AppwriteConfig frozen) · views-faoapi#322 and #323 (both in v1.4.0) · views-appwrite#13 (conformance vector).
The finding this epic rests on
Two mechanisms write coordinates into the process environment. The registry wins because it runs second. Against Rust's stated definition of a data race — two or more pointers to the same data, at least one writing, no synchronising mechanism — all three conditions hold.
That reclassified the problem from tidiness to correctness, and it is why the system was hard to hold in your head: its ownership is genuinely undefined. The seam contract §2 already mandates the fix; the shell layer structurally cannot express it, having no parameter passing to child processes — only the global environment.
Tracking checklist for #26 — [EPIC] Establish single ownership of the Appwrite environment.
Cross items off as they land. The order below is the implementation order; dependencies are noted where they constrain it.
Checklist
needs-decisionNo dependencies. Blocks S3 and S5. Amends the contract directly rather than convening a þing — the operator can override that call, in which case the epic waits.
No dependencies. Do this first among implementation items — the relative sibling hop is the single thing most likely to break the next machine set up.
model_path.py:371, the surviving library dotenv load ·needs-decisionIndependent. A genuine judgment call, filed as one:
self.root/".env"may be a legitimate entry point. What must not happen is that it survives because nobody looked — which is how it survived #346.registry_to_env.pycopies agree (C-50)Independent. Does not challenge the two-copies decision — that is WET-before-DRY correctly applied. Adds the missing check.
run.shexplicit as clonesIndependent. Not deduplication — they do not touch Appwrite, and CRP says leave them apart. One header line so the duplication is visible.
tools/platform_env.sh: one writer (C-48)Depends on S1 + S2. The centre of the epic. The extraction is not the point; the contents are — it must not source
.envfor coordinates.Depends on S1. Reduces this repo's
.envto one secret.bootstrap.sh, CI-tested without credentialsDepends on S2 + S3. The epic's real test. Hard constraint: if it needs arguments or a companion document, the structure underneath is still wrong.
[Internal Tech Guide]link is emptyDepends on S8. Documentation last, deliberately — by then the setup path is a program that must work.
views-crafdapiadopts the pattern at birthDepends on S5. Filed in views-faoapi because the clone has no tracker yet; move it when it gets one.
Completion criteria
The epic is done when all ten boxes are ticked and:
.envanywhere on the platformviews-faoapi's.envrequires one variablebootstrap.shgreen in CI with no real credentials — and followed end-to-end on a machine that had never run the platform, with every failure recorded rather than worked aroundviews-crafdapinever acquires a second.envhabitregistry_to_env.pycopies proven to emit identical outputNot this epic — cross-linked, not re-scoped
views-crafdapiexisting now satisfies one of #337's two trigger conditions; #23 is the other.env;.gitignoregapsAlready shipped — verified against current HEADs, not assumed
views-pipeline-core#346(find_dotenv deleted, preflight everywhere,AppwriteConfigfrozen) ·views-faoapi#322and#323(both in v1.4.0) ·views-appwrite#13(conformance vector).The finding this epic rests on
Two mechanisms write coordinates into the process environment. The registry wins because it runs second. Against Rust's stated definition of a data race — two or more pointers to the same data, at least one writing, no synchronising mechanism — all three conditions hold.
That reclassified the problem from tidiness to correctness, and it is why the system was hard to hold in your head: its ownership is genuinely undefined. The seam contract §2 already mandates the fix; the shell layer structurally cannot express it, having no parameter passing to child processes — only the global environment.