You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit f1e92dc
Browse filesBrowse the repository at this point in the historyBrowse files
Merge Batch A: CI signal per commit (#44) and the main-checkout guard (#37)
Two guardrails on the path that deploys and verifies everything else, landed
first so later batches inherit them: each main commit now gets its own CI run,
and replicator.service refuses to start on any checkout but main.
Includes CR round 1 (#1-#8) and the AGENTS.md curation that took the policy file
from 6031 back to 5890 against its 6000 budget.
Closes#44Closes#37
# 2026-08-17 curation (#47). Two lines rewritten because a command refuted them.
2
+
disproven :: Auth is ADC: on the VM the SA key at `GOOGLE_APPLICATION_CREDENTIALS` (`/etc/replicator/co-pypi-reader.json`), in CI a keyless WIF token. Pin the current minor
3
+
disproven :: enforces eight charter invariants in CI; change a
Copy file name to clipboardExpand all lines: AGENTS.md
+11-14Lines changed: 11 additions & 14 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -31,7 +31,7 @@ Python ≥3.12, uv, pytest, ruff. `ty` is available as a **non-gating** type che
31
31
uv run --no-project --with 'google-cloud-storage>=2,<4' python scripts/sync_wheelhouse.py
32
32
```
33
33
34
-
Auth is ADC: on the VM the SA key at `GOOGLE_APPLICATION_CREDENTIALS` (`/etc/replicator/co-pypi-reader.json`), in CI a keyless WIF token. Pin the current minor — `>=0.9.4,<0.10`. The **patch** floor is load-bearing, not tidiness: the change-bus payloads are `extra="ignore"`, so on an older wheel a model constructed with fields it does not have yet succeeds and silently discards them. Raise the floor with every co-core feature the code starts depending on, or a version skew publishes facts that look right and carry nothing (#10). Both floors since fail *loudly* instead — a ValidationError at construction (0.8.0 requires `info_source_id` on all three fetch payloads, #19/#28) or an ImportError at load, never reaching a running worker (0.9.4 cuts the replicate contracts, #29).
34
+
Auth is ADC: on the VM the SA key at `GOOGLE_APPLICATION_CREDENTIALS` (`/etc/replicator/co-pypi-reader.json`), in CI a keyless WIF token. Pin the current minor — `>=0.10,<0.11`. The **patch** floor is load-bearing, not tidiness: the change-bus payloads are `extra="ignore"`, so on an older wheel a model constructed with fields it does not have yet succeeds and silently discards them. Raise the floor with every co-core feature the code starts depending on, or a version skew publishes facts that look right and carry nothing (#10). Both floors since fail *loudly* instead — a ValidationError at construction (0.8.0 requires `info_source_id` on all three fetch payloads, #19/#28) or an ImportError at load, never reaching a running worker (0.9.4 cuts the replicate contracts, #29).
35
35
36
36
<!-- BEGIN socraticode-policy -->
37
37
## Code Exploration Policy
@@ -91,8 +91,10 @@ test a branch with `uv run python -m src.worker.main` under a distinct
91
91
`REPLICATOR_CONSUMER_NAME`. **After editing `deploy/replicator.service`, `cp` it to
92
92
`/etc/systemd/system/`** — the installed unit is a copy, not a symlink, so
93
93
`daemon-reload` alone silently re-reads the old file and the mismatch has no
94
-
symptom until a directive matters. Full lifecycle table and the dev-server
Copy file name to clipboardExpand all lines: docs/CONVENTIONS.md
+12Lines changed: 12 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -20,3 +20,15 @@ states them in one line each; what a *particular* stream carries, and why, is in
20
20
-**`occurred_at` is enforced tz-aware UTC on every payload** since co-core v0.7.2 (cannobserv#273). Naive is rejected fail-loud rather than assumed UTC; aware non-UTC is normalized. Load-bearing beyond tidiness — `isoformat()` is half `fetch_failed`'s envelope key, and a naive value would serialize without an offset. Issuer-visible: a naive `occurred_at` now fails `from_wire` and dead-letters as an anomaly.
21
21
-**`from_wire`'s topic and message_id are keyword-only** — `from_wire(fields, topic=..., message_id=...)`. The founding plan's API table showed them positionally.
22
22
-`sha256` lives at `co_core.pure.util.hashing`, not `co_core.pure.extract` (which carries `simhash`, `Chunk`, and the parsers). Import parsers from submodules — they are not re-exported from `__init__`.
23
+
-**The replicate loop writes for `gcs` (#29).** T4's create-if-absent, so a
24
+
redelivery onto matching bytes re-emits the same `public_url` and differing bytes
25
+
are a terminal conflict. `blob_uri` is **never resolved as a path** — fingerprint
26
+
out, compared against `store.uri_for()`. Writers are keyed **by alias**, and every
27
+
refusal happens before any credential is touched. Provider failures classify by
28
+
HTTP status — 4xx closes the command, 5xx/408/429 and statusless errors leave it
29
+
pending — because a transient failure is exempt from the delivery ceiling and
30
+
publishes no fact at all, so misclassifying one strands the issuer forever
31
+
(#29 CR #26, #27).
32
+
The mechanism in full — the four outcomes, the guard order, why the writers are
33
+
keyed by alias — is [ARCHITECTURE.md](ARCHITECTURE.md); this bullet is the rule
34
+
an agent needs before touching the replicate path.
0 commit comments