Skip to content

docs: migrate the changelog out of the line-8 header field into PROGRESS §7 - #66

Merged
tornidomaroc-web merged 1 commit into
mainfrom
docs/changelog-section-migration
Jul 22, 2026
Merged

docs: migrate the changelog out of the line-8 header field into PROGRESS §7#66
tornidomaroc-web merged 1 commit into
mainfrom
docs/changelog-section-migration

Conversation

@tornidomaroc-web

Copy link
Copy Markdown
Owner

Docs-only. Moves the update log out of the Last updated header field into a new append-only ## 7. Changelog section, with every entry body preserved byte-identical.

Why

A header field is overwritten every step; a log is appended every step. Line 8 stored the second inside the first, and that single root cause produced every symptom we hit: unbounded growth (head 2,380 → 3,518 → 6,112 chars over three docs PRs), the 2026-07-20 date label absorbed and lost, and PR #64 needing 106,630 bytes of diff to express 6 insertions and 4 deletions. Line 8 was 37,590 bytes — 25.8% of the file, 98.7% of it entry bodies.

Separating the two by lifecycle fixes all of it at once.

Preservation proof

All 17 entry bodies moved byte-identical — nothing reflowed, re-wrapped, added, or stripped, including each body's original (and in nine cases unbalanced) parentheses. Normalization was deliberately declined: it is exactly where silent corruption enters.

sorted, NUL-joined sha256 of all 17 bodies
  before  53e227aefee8d1e8a769d092c824345baaca6679419473f67d24bf930d0eb78b
  after   53e227aefee8d1e8a769d092c824345baaca6679419473f67d24bf930d0eb78b   (committed blob)
entry count  17 -> 17
§7 body bytes  37,095

The paren-stripped digest was not used — bodies are not uniformly wrapped, so that transform is unsafe.

Scope — proven, not asserted

git diff --numstat main -- docs/PROGRESS.md   ->   90  3
hunks: @@ -5,9 +5,9 @@   and   @@ -182,3 +182,90 @@
removed lines: exactly the 3 old header fields (Last updated / Active branch / Main tip)
lines 1-7 and 11-184 byte-identical to main, region sha256 40f6d3cd40246acb9a6ed5f98f8a283d22dc1f56ecec67a7a3a2d5864b8b27f4
register #17 row identical: True | still OPEN (🔎)

No register row, no §1–§6 content, no §5, no phase status, no code, no CI, no migration, no legal/refund copy. §1–§6 are NOT renumbered — 28 §-references in PROGRESS.md and 4 in PIVOT_PLAN.md depend on them, so the new section is appended as §7 and cross-references are qualified as "PROGRESS §7" (the file already uses §7/§8/§10 to mean PIVOT_PLAN sections).

The 2026-07-20 entry, absorbed undated into the head by PR #64, regains its date label; its bytes are unchanged.

This retires the Option C frozen-tail invariant — by design

That hash existed only to police a boundary inside an unreviewable single line. It is superseded, and this PR records the retirement explicitly rather than letting it lapse silently.

The new invariant, stated in §7's preamble: an update adds exactly one ### YYYY-MM-DD - <slug> block directly below the preamble and changes nothing else in §7 — so git diff renders one added hunk with zero deletions. Entries are immutable once landed; a correction is a new superseding entry, never an edit. No bespoke hash is needed going forward: the diff is the proof.

Header fields refreshed

They were stale and self-contradicting: Active branch named docs/progress-log-gate-hardening (deleted), Main tip named 3378dd8 (two merges behind c119f6b), and the old line carried a reminder that no longer matches the structure. All three now carry current, verified values.

Checks

  • npm run typecheckexit 0.
  • db-types: no SQL migration touched, so regenerated types are byte-identical.

🤖 Generated with Claude Code

…ESS §7

The "Last updated" header field had accreted the entire update log into a single
37,590-byte line -- 25.8% of the file, 98.7% of it entry bodies. A header field is
overwritten every step; a log is appended every step. Storing the second inside the
first caused every symptom: unbounded growth, a lost date label, and a 106,630-byte
diff to express PR #64's 6 insertions.

Separates them by lifecycle. New append-only "## 7. Changelog" section, appended
after §6 -- §1-§6 are NOT renumbered, since 32 §-references depend on them. All 17
entry bodies moved BYTE-IDENTICAL: nothing reflowed, re-wrapped, added or stripped,
including each body's original (and in nine cases unbalanced) parentheses. The
2026-07-20 entry, absorbed undated into the head by PR #64, regains its date label;
its bytes are unchanged.

Preservation proof (sorted, NUL-joined sha256 of all 17 bodies):
  before 53e227aefee8d1e8a769d092c824345baaca6679419473f67d24bf930d0eb78b
  after  53e227aefee8d1e8a769d092c824345baaca6679419473f67d24bf930d0eb78b
Entry count 17 -> 17; §7 body bytes 37,095. Lines 1-7 and 11-184 are byte-identical
to main (region sha256 40f6d3cd...), so no register row, no §1-§6 content and no
phase status changed. Register #17 stays OPEN.

This RETIRES the Option C frozen-tail invariant by design: that hash existed only to
police a boundary inside an unreviewable single line. The append-only rule replaces
it -- a future update adds one ### block and git shows one added hunk with zero
deletions, so no bespoke hash is needed.

Also refreshes the three header fields, which were stale: Active branch named a
deleted branch, Main tip named 3378dd8 (two merges behind c119f6b).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@vercel

vercel Bot commented Jul 22, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
knowflow Ready Ready Preview, Comment Jul 22, 2026 6:26pm

@tornidomaroc-web
tornidomaroc-web merged commit 2d0856d into main Jul 22, 2026
4 checks passed
@tornidomaroc-web
tornidomaroc-web deleted the docs/changelog-section-migration branch July 22, 2026 18:31
tornidomaroc-web added a commit that referenced this pull request Jul 23, 2026
…te) (#67)

vercel.json's `experimentalServices.ingestion` block was serving a LIVE
DUPLICATE of the ingestion service at /_/ingestion — confirmed by a 200 from
`GET https://tryknowflow.com/_/ingestion/health`. It was NOT vestigial-inert,
and NOT stale April code: Vercel rebuilds `services/ingestion` from the deployed
commit, so it runs the same current main.py as the real Railway service
(INGESTION_SERVICE_URL = knowflow-production.up.railway.app).

The duplicate is token-shared: INGESTION_TOKEN is a Vercel project env var the
Next route already needs, so the same token that authorizes Next->Railway opens
this copy's /convert and /embed. VOYAGE_API_KEY is set on Vercel, so a
token-holder could burn Voyage credits and run arbitrary documents through
MarkItDown here, bypassing every Next-route guard (auth, per-KB limit,
enforceLimit, rate limits) — none of which live in the Python service. /health
is unauthenticated and discloses provider/model/dimension.

This removes ONLY the `ingestion` sub-key, keeping `frontend` exactly as-is, so
the Next.js frontend keeps deploying. Logged as register #45 (OPEN). A distinct
incident from B5b — the B5b row and PIVOT_PLAN.md:270 are deliberately untouched.

MANDATORY sequencing (rotate LAST): (1) merge; (2) confirm production
/_/ingestion/health -> 404, and DELETE the Vercel service in the dashboard if it
does not (config removal may be necessary-but-insufficient); (3) THEN rotate
INGESTION_TOKEN on Railway then Vercel. Rotating before teardown just re-exposes
the fresh token on the shared-env duplicate. Preview must be verified before
merge: frontend still serves + a real upload completes via Railway, and
<preview>/_/ingestion/health -> 404.

Header fields refreshed per the §7 policy merged in PR #66 (Active branch pointed
at a deleted branch, Main tip was one merge stale).

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant