Skip to content

fix(standards): bring the one-renderer design to main, and fix a sticky-date bug it exposed - #295

Merged
beyondnetPeru merged 1 commit into
mainfrom
fix/standards-one-renderer-on-main
Jul 30, 2026
Merged

fix(standards): bring the one-renderer design to main, and fix a sticky-date bug it exposed#295
beyondnetPeru merged 1 commit into
mainfrom
fix/standards-one-renderer-on-main

Conversation

@beyondnetPeru

Copy link
Copy Markdown
Contributor

Converges main onto the GT-633 reconciliation already on develop (#294), so the standards half of developmain stops being a design conflict. One renderer in test/rule-corpus-triage.ts, two callers: the spec pins it byte-for-byte, the capture script writes it and --checks it for the GT-630 chain and docs.yml.

It exposed a real bug in that reconciliation

The driver decided sticky-vs-fresh capturedOn by comparing JSON.stringify(previous.counts) against a counts object rebuilt in KNOWN_CLASSES order, while the renderer emits them in CLASS_ORDERa different order for the same six numbers. So "changed" was always true and the date was rewritten on every run.

That would have failed the GT-630 fixed-point replay on any day after a capture. It passed on develop only because both runs happened on the same date and stamped the same value — the precise shape of green this chain exists to distrust. It surfaced here because main's committed snapshot carries 2026-07-29: the first run rewrote it to 2026-07-30, the second rewrote it back.

The comparison is now order-insensitive, and observed: with the classification unchanged, capturedOn stays 2026-07-29 across runs and the replay is byte-identical.

develop still carries the buggy comparison. It is invisible there today and will bite tomorrow. It needs the same one-function fix, as a follow-up against develop rather than something smuggled into a main-targeted change.

Numbers are main's own, measured not copied

native-handler 154 (develop computes 151, having fewer handler closures landed), corpus 389, mapping 391 rows.

Verified

  • capture --check faithful · replay byte-identical · build --check up to date (391 rules, 37 mapped)
  • iso-5055-mapping.test.mjs 9/9 · chain guard 5 links current and at a fixed point
  • core-domain jest 1446 passed / 128 suites · tsc --noEmit clean · 01/04/08 green

Evolith Core Quality Gates

  • Bilingual Parity: no bilingual document changed.
  • Validation Scripts: 01-validate-docs.mjs green.
  • Bilingual Validation: 04-check-bilingual-parity.mjs green.
  • Agnosticism: no new technology dependency.

Linked ADRs / Issues

Conventional Commits

  • Commit follows Conventional Commits.

🤖 Generated with Claude Code

…ky-date bug it exposed

Converges main onto the GT-633 reconciliation already on develop (#294), so the
standards half of develop -> main stops being a design conflict: one renderer in
`test/rule-corpus-triage.ts`, two callers — the spec pins it byte-for-byte, the
capture script writes it and `--check`s it for the GT-630 chain and docs.yml.

AND IT EXPOSED A REAL BUG IN THAT RECONCILIATION, which is why this is not a
copy-paste. The driver decided sticky-vs-fresh `capturedOn` by comparing
`JSON.stringify(previous.counts)` against a counts object rebuilt in
KNOWN_CLASSES order, while the renderer emits them in CLASS_ORDER — a different
order for the same six numbers. So "changed" was ALWAYS true and the date was
rewritten on every run.

That would have failed the GT-630 fixed-point replay on any day after a capture.
It passed on develop only because both runs happened on the same date and stamped
the same value — the precise shape of green this chain exists to distrust. It
surfaced here because main's committed snapshot carries 2026-07-29: the first run
rewrote it to 2026-07-30, the second run rewrote it back.

The comparison is now order-insensitive, and observed: with the classification
unchanged, `capturedOn` stays 2026-07-29 across runs and the replay is
byte-identical.

NOTE: develop still carries the buggy comparison. It is invisible there today and
will bite tomorrow; it needs the same one-function fix, which is a follow-up
against develop rather than something to smuggle into a main-targeted change.

Numbers on this base are main's own, measured rather than copied: native-handler
154 (develop computes 151, having fewer handler closures landed), corpus 389,
mapping 391 rows.

Verified: capture --check faithful, replay byte-identical, build --check up to date
(391 rules, 37 mapped), iso-5055-mapping guard 9/9, chain 5 links current and at a
fixed point, core-domain jest 1446 passed / 128 suites, tsc --noEmit clean,
01/04/08 green.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@beyondnetPeru
beyondnetPeru requested a review from a team as a code owner July 30, 2026 14:37
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@github-actions

Copy link
Copy Markdown

📊 Bilingual Coverage Impact

PR Changes

  • Paired EN/ES files modified: 0
  • New EN files needing ES translation: 0

Repository Coverage

Metric Value
Total EN files 524
Total ES files 498
Paired files 0
Coverage 0%

Good: All EN changes have ES counterparts.


Generated by GitHub Actions

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