Status: PLAN, nothing executed (2026-10-12). Decisions recorded below were made by the owner on 2026-10-12.
Owner: michael.hay@mediumroast.io
Scope: the root README.md, v4/README.md, the changelog, the plans, the guides, and the open-source hygiene that goes with them, for the V4.0.0-pre release. It runs next to
v4-production-cutover.md (which owns the deployment and calls the repository clean-up WP10) and uses the same rule: every document change is its own small pull
request, merged by the owner, and a document never claims something that is not yet true when it merges.
| # | Decision | Consequence |
|---|---|---|
| R1 | The root README does not advertise the staging URL before the event. The URL goes in the client guide sent to the teams. | The README describes V4 and where staging fits without a link; DP3 and DP7. |
| R2 | Documents call this release V4.0.0-pre. The version strings in code are 4.0.0 everywhere (/health, the OpenAPI document, all Cargo crates), so nothing is reset at release. |
Dropping “-pre” at release is a documents-only change (DP1). |
| R3 | (Superseded 2026-10-16: the owner asked for the Zetaris guide, see DP9.) No Zetaris mention in the user-facing guide for now. Later: a configuration example, a pointer to the Zetaris getting-started repository and its worked examples, and an example link from the README. The owner (also the Zetaris CTO) will make sure the integration guide material exists. | DP9 is a parked item with its place reserved; nothing is written now. |
| R4 | Be honest that the scripts are maintainer-focused, state the intention to make them generic, report what is already generic, and keep a debt list. | DP4 and the appendix. |
| R5 | Data terms. Redistribution rights are in hand for the US SIC, Japan SIC and EU NACE data. ISIC (UN) is pending: an email has gone out with no answer yet. The README states this and carries a risk that the ISIC data could be removed. | DP5. |
| R6 | Sweep the repository for IP addresses and internal host names, and clean the Git history (an action, not just a note). | DP2. |
| R7 | The 24-hour soak from outside the network is running (started the evening of 11 October). Its results, combined with the single-image performance work, become a performance report. The bring-up guide is marked “proven” when the soak passes. | DP11 and DP12. |
README.md is entirely V3.3.0: install via the V3 image and svc_ctl.sh, port 8000, the Python dependency list, build-and-deploy.sh, and the V3 live links. V4 is not mentioned.v4/README.md is titled “company_dns V4 (prototype)” and describes the prototype’s scope; its settings table is current (including the rate-limit settings).CHANGELOG.md stops at 3.2.0 although the README narrates 3.3.0. There is no V4 entry./health and the OpenAPI document say 4.0.0; the Cargo crates say 0.1.0.v4/THIRD_PARTY_NOTICES.md exists; v4/data-manifest.json lists the four SIC data files including the ISIC one. The SIC data is baked into the public image.Each is one small pull request unless noted. “Gate” says what must be true before it merges.
version = "4.0.0" in the workspace and every crate; check nothing derives behaviour from the old value; update any test that pins a version (api_tests already expects 4.0.0 from /health).v4/README.md: the code says 4.0.0, the documents say V4.0.0-pre until release.cargo test --workspace passes, /health and /openapi.json say 4.0.0, and a grep shows no 0.1.0 crate versions.<traefik-lan-ip>, <public-ip>, <build-node>), or remove. Allow the documentation address ranges reserved for examples (192.0.2.0/24, 198.51.100.0/24, 203.0.113.0/24).scripts/check_hygiene.py) that fails on those patterns with an allow-list, run by the existing test files’ habit (a unit test calls it), and documented in the contributing section. Stub-based like the others.git clone --mirror) kept outside the repository;git filter-repo --replace-text / --replace-message; run a secret scanner over the result;main and tags; ask everyone with a clone (the remote soak tester, the platform partner, forks) to re-clone; note that old commit hashes quoted in plans and the build log (v4/.build-log) will no longer resolve and need a mapping note;total, semantic and hybrid SIC search, an experimental SQL endpoint, /docs and /ui), its status (V4.0.0-pre, running on a staging environment, V3 still the live service), and a link to v4/README.md. No staging URL (R1).Three layers in the root README and v4/README.md:
docker run of the public image with the settings table; this is the general path and comes first.k8s/ manifests as a reference example, with their assumptions listed (the appendix) and “adapt these” said plainly.scripts/build-and-deploy-v4.sh, labelled maintainer-focused, with the stated intention to make the scripts generic and a link to the debt list.Also: k8s/README.md gets the same honesty paragraph; docs/v4-bringup.md is labelled as the maintainers’ guide. The appendix below is the first version of the inventory and the debt list; it moves to its own page when it grows.
v4/README.md, one row per source: US SIC, Japan SIC (JSIC), EU NACE Rev. 2, ISIC Rev. 4 (UN), the SEC EDGAR data, Wikipedia and Wikidata; for each, where it comes from, what the image does with it, and the terms. The owner supplies the exact rights wording and attributions (this plan does not guess them).international routes, and the global and hybrid searches that use ISIC: to be confirmed in step 2) and that clients should not build on ISIC yet.v4/THIRD_PARTY_NOTICES.md current (the software licences) and link it.total on V3 paths, / redirecting to /ui/, the per-IP rate-limit model and its settings, the SQL endpoint off in production, the ISIC position).Added, Changed, Removed); one line per change with a pointer to the document that explains it.docs/using-the-api.md) written for the hackathon teams and other clients: choose V3 or V4 paths (both work), identify yourself with a User-Agent that carries a contact, the per-IP limit and burst (the figures are the operator’s: quote the deployed ones in the copy sent to teams, not in the repository), handle 429 with Retry-After, cache answers on your side, the envelope and total, error codes, a few curl examples for US SIC, EU NACE and Japan SIC, and where /docs is.429 using only this page.docs/migrating-to-v4.md: what is identical, what is added, what differs, what to test in a client; link the differences ledger (docs/results/differences.json and its readable form) so it is found from the README and the changelog.Written as docs/integrations/zetaris.md (US SIC, EU NACE and Japan SIC as Zetaris REST tables, the placeholder-User-Agent pitfall, the level naming, rate limits for many teams), a README link under “Integrations”, a docs index row and a % section in docs/using-the-api.md. What follows is the original plan.
docs/integrations/zetaris.md that points to the Zetaris getting-started repository and its worked examples, a configuration example for the three data sets (US SIC, EU NACE, Japan SIC), and a README link under an “Integrations” heading. The owner coordinates the content with Zetaris; this repository only links to it.docs/plans/README.md: one line per plan with a status (done, in progress, superseded, historical) and what replaced it; fix the stale “Planned / In progress / Built” headers; docs/README.md indexes the guides (bring-up, soak, using the API, migration) and the plans.Combine into one document (replacing or extending v4-results-report.md):
docs/results/2026-10-10-rerun/), as already analysed.v4-sizing-test.md): 12 cores at three shapes, then 16 and 20 pods.windows.csv and summary.md: throughput and latency by step, drift while holding, canary results, errors and 429s, the tester’s network noted.perf_tests/report.py from committed result files; raw per-window CSV from the soak is small enough to commit under docs/results/.docs/v4-bringup.md proven (tag, date, suite result), refresh its numbers (20 replicas, the quota), and update k8s/README.md.svc_ctl.sh described as V3’s local controller, k8s/ restructured to one production directory, the V3-era plans marked historical.| When | Package | Why then |
|---|---|---|
| Now to 15 October | DP1, DP3, DP4, DP6, DP10 | Small, independent, true today. |
| Before 22 October | DP7 (the client guide), DP2 steps 1 and 2 (the sweep and the guard), DP5’s statement | The teams and any outside reader need these first. |
| When the soak results arrive | DP11, then the first half of DP12 | They depend on the data and the soak’s PASS. |
| In the cutover PR | the README swap (DP12) | Must flip with the traffic. |
| Not 22 to 25 October | no history rewrite, no repository changes that need clones to reset | The event. |
| From 26 October | DP2 step 3 (the history clean-up) with V3’s retirement, DP12’s last part, DP5’s ISIC engineering if the answer is still pending | A quiet window, no open branches. |
| Whenever the Zetaris material exists | DP9 | The owner’s timing. |
| Risk | Handling |
|---|---|
| The README claims V4 is live before it is. | The rule at the top; the swap is in the cutover PR, not before. |
| A history rewrite breaks clones, open pull requests and quoted hashes. | A mirror backup, a quiet window, a hash mapping note, a message to everyone with a clone (DP2). |
| The UN says no to ISIC (or never answers) after the image is public. | DP5: the statement now, the dependency list, a build that can omit ISIC, and a rehearsed removal. |
| Rights wording stated wrongly. | The owner supplies it; the plan never invents it. |
| The README links to the Zetaris material before it exists. | DP9 is parked; no link until the content does. |
| Documents drift from the code again. | Version strings are 4.0.0 in code (R2), the hygiene guard (DP2), and the plans index with statuses (DP10). |
Already general
/health endpoint, all settings as environment variables or two optional mounted files, no Kubernetes dependency, a public image.perf_tests/) work against any URL.Specific to the Mediumroast lab, and the debt
scripts/build-and-deploy-v4.sh and scripts/seal-secrets-v4.sh hard-code the registry and owner, the namespace, the host and certificate names, the Traefik ingress class and the letsencrypt-prod issuer; they assume SealedSecrets, a GitHub token in .env, and microk8s kubectl. Intent: move the constants into a config file or environment overrides, and make the cluster checks configurable.Middleware object), cert-manager with a named issuer, and the lab’s host names. Intent: Kustomize overlays (a shared base plus per-environment changes), or documented substitutions.mediumroast.io and its subdomains. Intent: make the trusted origins an explicit setting with no built-in default for outside deployments, and document it.COMPANY_DNS_REPLICAS must equal the Deployment’s replicas by hand. Intent: derive it automatically where possible, and warn loudly when it cannot.--resolve) and the CoreDNS section of the bring-up guide are workarounds for this lab’s router. Intent: label them as lab-specific; the generic check is the public name.svc_ctl.sh is V3-only and uses a latest tag. Intent: fold V3 and V4 into one controller (v4-staging-scripts.md §6), or retire it with V3.svc_ctl.sh; the monthly image workflow builds V3 only (the cutover plan’s WP9).