Skip to content

promote 0.21.1 to prod (Bugbot fixes + first application of release-validation-gate)#123

Merged
klappy merged 1 commit intoprodfrom
main
Apr 20, 2026
Merged

promote 0.21.1 to prod (Bugbot fixes + first application of release-validation-gate)#123
klappy merged 1 commit intoprodfrom
main

Conversation

@klappy
Copy link
Copy Markdown
Owner

@klappy klappy commented Apr 20, 2026

Promotes oddkit 0.21.1 from main to prod.

What ships

  • Bug Add Claude Code integration (v0.9.0) #1 fix (medium severity)parseCheckColumn and runtime call site both pass new Set() to tokenize(), restoring the strictly-additive invariant. Canon vocab keywords that are also stop-words (from in source-named) survive on both sides of the matcher.
  • Bug Fix CLI --version to read from package.json #2 fix (low severity)BasePrerequisite = BasePrerequisiteCore & PrereqMatchVocab intersection eliminates the DRY violation introduced in 0.21.0.
  • +2 regression smoke assertionsfrom-only source attribution and according to multi-word phrase, both anchoring the fix at preview/main/prod.

Release Validation Gate compliance

Per klappy://canon/constraints/release-validation-gate (now live in canon as ee9aee4):

Rule 1 — Active reviews:

Check Status Disposition
Cursor Bugbot on PR #122 (9d09fe4) completed/success No findings
Cursor Bugbot on this promotion PR (will verify before merge) TBD

Rule 2 — Independent validator (load-bearing surface: orchestrate.ts):

  • Validator session: sesn_011CaERPjHi1CV4TrvKW68jB
  • Agent: agent_011CaERLniErdgxJagniRtNP (claude-sonnet-4-6)
  • Verdict: CONDITIONAL PASS — all 5 corroborations:
    • C1 PRD-vs-shipped drift: PASS
    • C2 bytes-on-branch verification: PASS
    • C3 live curl matrix (5 inputs): PASS
    • C4 canon retrievability: PARTIAL (fixed — klappy.dev#126 merged before this promotion opens, satisfying validator's only conditional)
    • C5 independent smoke × 3: PASS
  • Findings folded into closeout ledger before this PR merges.

Rule 3 — Canon outranks session artifacts:

  • The P1.3.2 ledger's "Option A is fine for P1.3.3" recommendation has been explicitly overridden by klappy://canon/constraints/release-validation-gate and klappy://canon/principles/contract-governs-handoff-drift. This promotion follows canon Rule 2 (validator dispatch), not the session ledger's Option-A recommendation.

Attestation

Stage Result
Preview branch smoke (fix-0-21-1-bugbot-stopword-and-dry-oddkit) × 3 172/172 each
CI Test CF Preview on PR #122 success
Main-preview smoke (main-oddkit) × 3 172/172 each
Sonnet 4.6 validator (independent fresh session) CONDITIONAL PASS — fully passed once canon merged
0.21.0 prod regression curl confirmation from-only input fails source-named (bug confirmed in prod)
0.21.1 preview regression-fixed curl from-only input passes source-named (fix confirmed)

Sweep status after promotion

Tool Version Notes
oddkit_encode 0.18.0 regex matcher (P8 follow-up)
oddkit_challenge 0.21.1 stemmed set intersection + structural tests, no stop-word filter, no microsecond cache
oddkit_gate 0.20.0 BM25 + stemmed set intersection

Refs


Note

Medium Risk
Touches oddkit_challenge prerequisite matching logic in workers/src/orchestrate.ts, which directly affects gating behavior for user inputs; changes are small but can alter pass/fail outcomes. Added smoke regressions reduce risk by locking in the intended matching behavior.

Overview
Restores oddkit_challenge’s strictly-additive prerequisite-matching behavior by disabling stop-word filtering in both parse-time (parseCheckColumn) and runtime (tokenize(input, new Set())) tokenization so canon keywords like from aren’t dropped.

Refactors types to remove DRY drift by defining BasePrerequisite as BasePrerequisiteCore & PrereqMatchVocab, and adds two smoke regressions in canon-tool-envelope.smoke.mjs covering from-only and according to cases. Bumps versions to 0.21.1 and documents the fixes in CHANGELOG.md.

Reviewed by Cursor Bugbot for commit d17bc0c. Bugbot is set up for automated code reviews on this repo. Configure here.

….21.1) (#122)

Two fixes from Cursor Bugbot findings on PR #120 / #121 that should have
blocked the 0.21.0 ship and didn't because the orchestrator treated
Bugbot's in_progress state as non-blocking. The findings are real and
the medium-severity one is a prod regression vs pre-refactor behavior.

Bug #1 (medium) — Stop-word filtering silently drops canon vocab keywords:
- parseCheckColumn called tokenize(m[1]) with default STOP_WORDS filter.
  Canon vocab includes 'from' (in source-named) and 'to' (inside
  'according to'); STOP_WORDS includes both. Result: 'from' is dropped
  from stemmedTokens; the runtime call site applied the same filter to
  inputStems so 'from' is dropped there too.
- Pre-refactor regex evaluator matched 'from' literally as
  new RegExp('\\bfrom\\b', 'i') against raw input. Inputs like
  'I learned this from my colleague' passed source-named pre-refactor
  and fail post-refactor — the strictly-additive invariant the 0.21.0
  CHANGELOG and PR description claimed is broken.
- Latent landmine: any prereq whose canon vocab is entirely stop-words
  would have stemmedTokens.size === 0 and trigger the conservative
  length>=20 fallback inappropriately (false positive). Not currently
  exploited by canon but the structural risk is there.
- Fix: pass new Set() (empty stop-words) to both tokenize() calls so
  canon keywords survive on both sides and shape matches.

Bug #2 (low) — DRY violation in BasePrerequisite:
- 0.21.0 introduced PrereqMatchVocab interface to share shape between
  BasePrerequisite and ChallengeTypeDef.prerequisiteOverlays[]. The
  inline type on prerequisiteOverlays uses '& PrereqMatchVocab'
  intersection; BasePrerequisite re-listed all five fields manually.
  Future PrereqMatchVocab additions would not propagate to
  BasePrerequisite — defeats the DRY purpose.
- Fix: split into BasePrerequisiteCore (3 core fields) and
  type BasePrerequisite = BasePrerequisiteCore & PrereqMatchVocab.

Verification:
- Typecheck clean
- governance-parser.test.mjs 105/105 pass
- 2 new regression assertions in canon-tool-envelope.smoke.mjs:
  (10) source-named via 'from'-only canon keyword
  (11) source-named via 'according to' multi-word phrase
- Bugbot Autofix preview diff for PR #121 used as the basis for the
  Bug #1 fix (cherry-picked the change locally rather than applying
  via Autofix UI to keep the audit trail in this branch).

Process post-mortem to follow in P1.3.3 closeout ledger.
@cloudflare-workers-and-pages
Copy link
Copy Markdown

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Preview URL Updated (UTC)
✅ Deployment successful!
View logs
oddkit d17bc0c Commit Preview URL

Branch Preview URL
Apr 20 2026, 05:05 AM

@klappy klappy merged commit 2c5d652 into prod Apr 20, 2026
5 checks passed
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