diff --git a/.skills/context-counts-ok b/.skills/context-counts-ok index a9db3ac..1157ec7 100644 --- a/.skills/context-counts-ok +++ b/.skills/context-counts-ok @@ -17,7 +17,6 @@ docs/ARCHITECTURE.md :: enumerated :: **two backends** (`local`, `gcs`) AGENTS.md :: enumerated :: Two that bite, each symptomless until it matters: AGENTS.md :: enumerated :: Two env files, split by a security boundary -AGENTS.md :: enumerated :: **Two blob backends, one seam.** AGENTS.md :: enumerated :: **Three stream kinds, three sets of rules.** # The three contracts and their four documents are the four `docs/contracts/` # rows in ## Detail Docs, one line down the same file. diff --git a/.skills/context-loss-ok b/.skills/context-loss-ok index 2a0c596..520557c 100644 --- a/.skills/context-loss-ok +++ b/.skills/context-loss-ok @@ -703,3 +703,25 @@ AGENTS.md :: tighten :: - [CONVENTIONS.md](docs/CONVENTIONS.md) — the rules co AGENTS.md :: tighten :: - [INFRASTRUCTURE.md](docs/INFRASTRUCTURE.md) — VM topology, ports, the broker, and the buckets AGENTS.md :: tighten :: - [TESTING.md](docs/TESTING.md) — fakeredis's divergences, the keys an integration run may create AGENTS.md :: tighten :: - [content-persist-issuer-contract.md](docs/contracts/content-persist-issuer-contract.md) — keeping a blob in the permanent store by digest: obligations, the refusal registry + +# Judged losses from the 2026-10-16 curation (AGENTS.md 6199 -> under 6000). +# Three Bus Conventions bullets whose every fact the destination already states +# at length; a verbatim move would sit a near-duplicate beside the canonical +# treatment, which Phase 5 forbids. Each read against its destination: +# blob backends -> docs/STORAGE.md ## Two backends, one seam: REPLICATOR_BLOB_BACKEND +# (#7), the file:// / gs:// table row, "local is the default and stays +# the default", the bold to_thread rule; STORAGE.md is indexed. +# replicate gcs -> docs/CONVENTIONS.md (create-if-absent, "never resolved as a path", +# line 45) and docs/STREAMS.md's content.replicate bullet (#29). +# Watcher issues -> docs/STREAMS.md's "Watcher alone issues content.fetch" bullet: #90, +# seed_fetch.py seeds scratch streams, --production, Watcher's identity. +AGENTS.md :: duplicate :: - **Two blob backends, one seam.** `REPLICATOR_BLOB_BACKEND` selects them: `local` +AGENTS.md :: duplicate :: announces `file://` and `gcs` announces `gs://`, and `local` stays the +AGENTS.md :: duplicate :: compiled-in default deliberately (#7). Every `BlobStore` call from a coroutine +AGENTS.md :: duplicate :: goes through `asyncio.to_thread`. +AGENTS.md :: duplicate :: [docs/STORAGE.md](docs/STORAGE.md) is the authority for either store. +AGENTS.md :: duplicate :: - **The replicate loop writes for `gcs` (#29)** — create-if-absent, and `blob_uri` is +AGENTS.md :: duplicate :: never resolved as a path. Read [docs/CONVENTIONS.md](docs/CONVENTIONS.md) first. +AGENTS.md :: duplicate :: - **Watcher alone issues `content.fetch` (#90).** `scripts/seed_fetch.py` seeds +AGENTS.md :: duplicate :: scratch streams; the live one takes `--production` and Watcher's identity, never +AGENTS.md :: duplicate :: `replicator`'s. diff --git a/.skills/context-metrics.jsonl b/.skills/context-metrics.jsonl index aba9642..89a2542 100644 --- a/.skills/context-metrics.jsonl +++ b/.skills/context-metrics.jsonl @@ -58,3 +58,5 @@ {"actions": ["baseline:scheduled"], "budget": 6000, "bytes": 14180, "claims_dropped": null, "claims_warranted": null, "counts": null, "counts_acked": null, "delta_days": 0, "delta_tokens": 0, "docs_orphaned": 0, "docs_total": 22, "docs_unindexed": 0, "file": "AGENTS.md", "lines": 249, "links_dead": 0, "links_dead_anchors": 0, "no_loss": null, "no_loss_warrants": null, "note": null, "over_budget": false, "repo": "replicator", "repo_commit": "7550060", "seams": 0, "seams_acked": 36, "skill_commit": "c4ae0d7", "skill_version": "1.31", "tokens": 5993, "tokens_exact": true, "tokens_live": 164942, "top_section": "Bus Conventions", "top_section_share": 28, "ts": "2026-09-29"} {"actions": ["baseline:scheduled"], "budget": 6000, "bytes": 14198, "claims_dropped": null, "claims_warranted": null, "counts": null, "counts_acked": null, "delta_days": 7, "delta_tokens": 16, "docs_orphaned": 0, "docs_total": 22, "docs_unindexed": 0, "file": "AGENTS.md", "lines": 249, "links_dead": 0, "links_dead_anchors": 0, "no_loss": null, "no_loss_warrants": null, "note": null, "over_budget": true, "repo": "replicator", "repo_commit": "7604d0f", "seams": 40, "seams_acked": 36, "skill_commit": "7cf855e", "skill_version": "1.31", "tokens": 6009, "tokens_exact": true, "tokens_live": 165904, "top_section": "Bus Conventions", "top_section_share": 28, "ts": "2026-10-06"} {"actions": ["baseline:scheduled"], "budget": 6000, "bytes": 14190, "claims_dropped": null, "claims_warranted": null, "counts": null, "counts_acked": null, "delta_days": 7, "delta_tokens": -4, "docs_orphaned": 0, "docs_total": 22, "docs_unindexed": 0, "file": "AGENTS.md", "lines": 249, "links_dead": 0, "links_dead_anchors": 0, "no_loss": null, "no_loss_warrants": null, "note": null, "over_budget": true, "repo": "replicator", "repo_commit": "bd49943", "seams": 2, "seams_acked": 35, "skill_commit": "5ff7a82", "skill_version": "1.31", "tokens": 6005, "tokens_exact": true, "tokens_live": 166891, "top_section": "Bus Conventions", "top_section_share": 28, "ts": "2026-10-13"} +{"actions": ["baseline:pre-curation"], "budget": 6000, "bytes": 14641, "claims_dropped": null, "claims_warranted": null, "counts": null, "counts_acked": null, "delta_days": 3, "delta_tokens": 194, "docs_orphaned": 0, "docs_total": 22, "docs_unindexed": 0, "file": "AGENTS.md", "lines": 259, "links_dead": 0, "links_dead_anchors": 0, "no_loss": null, "no_loss_warrants": null, "note": null, "over_budget": true, "repo": "replicator", "repo_commit": "931ddbf", "seams": null, "seams_acked": null, "skill_commit": "3cea77a", "skill_version": "1.31", "tokens": 6199, "tokens_exact": true, "tokens_live": 167028, "top_section": "Bus Conventions", "top_section_share": 27, "ts": "2026-10-16"} +{"actions": ["prune:Bus Conventions/blob-backends (dup docs/STORAGE.md; to_thread rule kept inline)", "prune:Bus Conventions/replicate-gcs (dup docs/CONVENTIONS.md+STREAMS.md)", "prune:Bus Conventions/watcher-issues-fetch (dup docs/STREAMS.md)", "ack:seams x4", "prune:stale counts-ok entry"], "budget": 6000, "bytes": 14099, "claims_dropped": 0, "claims_warranted": 0, "counts": 0, "counts_acked": 4, "delta_days": 0, "delta_tokens": -244, "docs_orphaned": 0, "docs_total": 22, "docs_unindexed": 0, "file": "AGENTS.md", "lines": 251, "links_dead": 0, "links_dead_anchors": 0, "no_loss": "ok", "no_loss_warrants": 9, "note": null, "over_budget": false, "repo": "replicator", "repo_commit": "c95aa3f", "seams": 0, "seams_acked": 39, "skill_commit": "3cea77a", "skill_version": "1.31", "tokens": 5955, "tokens_exact": true, "tokens_live": 166784, "top_section": "Bus Conventions", "top_section_share": 24, "ts": "2026-10-16"} diff --git a/.skills/context-seams-ok b/.skills/context-seams-ok index 6af9665..265833e 100644 --- a/.skills/context-seams-ok +++ b/.skills/context-seams-ok @@ -469,3 +469,12 @@ tests/test_socraticode_config.py :: f"docs/COMMANDS.md caps at {sorted(map(sorte .socraticodecontextartifacts.json :: "description": "How the systemd unit runs and the guards it starts behind; # The POLITENESS description this run extended: ENVIRONMENT.md does index REPLICATOR_MIN_HOST_INTERVAL_SECONDS by name. .socraticodecontextartifacts.json :: "description": "Per-host politeness, the consumer-side mechanism; +# 2026-10-16 curation: back-references to sections that stayed inline. +# Common Commands still carries the env-load line COMMANDS.md points at. +docs/COMMANDS.md :: AGENTS.md), then source this once per shell from the repo root; the examples below assume it: +# Design Preferences stays in AGENTS.md; both SKILLS.md lines point at it by name. +docs/SKILLS.md :: None — `brainstorming` runs upstream's, under AGENTS.md's **Design Preferences**. +docs/SKILLS.md :: | `brainstorming` | Intent and design before building; this repo's overrides are AGENTS.md's Design Preferences | +# Provenance heading from #131, not this run's; nothing links its anchor (grep "in-flight-count"), +# so the slug is not load-bearing. Rename it with the next COMMANDS.md edit rather than widen this one. +docs/COMMANDS.md :: The patching gate's in-flight count (#131) diff --git a/.skills/context-token-counts b/.skills/context-token-counts index 160ed11..f2f2c8b 100644 --- a/.skills/context-token-counts +++ b/.skills/context-token-counts @@ -3,7 +3,7 @@ # The offline estimators prefer a file's own last exact measurement to the # repo-wide figure in .skills/context-token-ratio, falling back to it for a # file never counted exactly or since drifted far from the size recorded here. -14190 6005 AGENTS.md +14099 5955 AGENTS.md 5692 2194 docs/ARCHITECTURE.md 26724 10372 docs/COMMANDS.md 26391 9745 docs/CONVENTIONS.md @@ -12,7 +12,7 @@ 8941 3330 docs/FAILURE-NOTIFICATION.md 21824 8554 docs/INFRASTRUCTURE.md 18208 6458 docs/POLITENESS.md -26831 10116 docs/SKILLS.md +26669 10059 docs/SKILLS.md 11592 4447 docs/SOCRATICODE.md 22502 8233 docs/STORAGE.md 25396 9285 docs/STREAMS.md diff --git a/AGENTS.md b/AGENTS.md index 45be1c7..7f2b369 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -128,14 +128,11 @@ Replicator is a **consumer** first — follow what co-core and the archiver prod `command_id:occurred_at`). `info_source_id` and replicate's `info_item_rep_spec_id` are **echoed, never read** — a `test_boundaries.py` carve-out is one field wide, and adding one edits the charter (#28, #29). -- **Two blob backends, one seam.** `REPLICATOR_BLOB_BACKEND` selects them: `local` - announces `file://` and `gcs` announces `gs://`, and `local` stays the - compiled-in default deliberately (#7). Every `BlobStore` call from a coroutine - goes through `asyncio.to_thread`. - [docs/STORAGE.md](docs/STORAGE.md) is the authority for either store. - **Store, then publish — never the reverse.** A fact pointing at absent bytes is unrepairable by the consumer; stored bytes with no fact repair themselves on the reclaim. +- **Every `BlobStore` call from a coroutine goes through `asyncio.to_thread`** — + [docs/STORAGE.md](docs/STORAGE.md) is the authority for either store. - **Read `count=1`.** `AsyncBusConsumer.read(count>1)` raises on a malformed frame *before* returning the well-formed ones. Recovery claims at `count=1` too — for the #98 turn bound, not poison (#109). @@ -169,12 +166,7 @@ Replicator is a **consumer** first — follow what co-core and the archiver prod default); `content.blobs` carries both fetch outcomes and `content.artifacts` both outcomes of replicate and of persist; `content.fetch-policy` is read **groupless** — no group, no ack, no DLQ. -- **The replicate loop writes for `gcs` (#29)** — create-if-absent, and `blob_uri` is - never resolved as a path. Read [docs/CONVENTIONS.md](docs/CONVENTIONS.md) first. - **A fetch may not reach loopback, RFC 1918, or the tailnet (#89, #95).** Per redirect hop. -- **Watcher alone issues `content.fetch` (#90).** `scripts/seed_fetch.py` seeds - scratch streams; the live one takes `--production` and Watcher's identity, never - `replicator`'s. - **The `docs/contracts/` documents are normative**, indexed below. `tests/test_boundaries.py` enforces the charter in CI; change a charter and its tests together.