Skip to content

fix(config): stand was known to the Python loader only, so setting it warns + fails schema - #2486

Merged
john-the-dev merged 10 commits into
mainfrom
fix/stand-key-ts-schema-parity
Aug 3, 2026
Merged

john-the-dev merged 10 commits into
mainfrom
fix/stand-key-ts-schema-parity

Conversation

@sonichi

@sonichi sonichi commented Aug 1, 2026

Copy link
Copy Markdown
Owner

Follow-up to my own #2484, which added stand to src/sutando_config.py's _KNOWN_TOP_LEVEL_KEYS without the TS twin or the JSON schema.

stand is per-clone identity by design — it belongs in sutando.config.local.json, not the tracked config. So anyone who actually uses what #2484 shipped hits both gaps.

Before / after — measured on the two commits

TS knows stand schema declares stand user who sets it
parent (origin/main) False False every TS service warns "top-level keys the loader does not read: 'stand'", and the config fails validation (additionalProperties: false)
HEAD (this fix) True True clean

Reproduce:

python3 - <<'PY'
import json,re,pathlib
ts=pathlib.Path("src/sutando_config.ts").read_text()
tsk=set(re.findall(r"'([^']+)'",re.search(r"KNOWN_TOP_LEVEL_KEYS\s*=\s*new Set\(\[(.*?)\]\)",ts,re.S).group(1)))
sch=json.loads(pathlib.Path("docs/sutando-config.schema.json").read_text())
print("TS:", "stand" in tsk, " schema:", "stand" in sch["properties"])
PY

Why the existing guard would not have caught it

This is the same drift class the repo has hit three times (health_check #2316, bridges #2308, migrate caught 2026-07-30). The structural guard is the cross-loader contract test proposed in #2308 — but that test is scoped to keys present in the tracked sutando.config.json, and a per-clone key never appears there. Worth widening in #2308; deliberately not widened here.

Scope

The schema is also missing migrate, bridges, and health_check. Those are pre-existing and belong to their own PRs (#2308 covers bridges). This change is limited to the regression #2484 introduced.

Not run locally: repo typecheck — no node_modules in the worktree I authored from. CI covers it. The change is one entry in a string Set literal.

Schema diff is additive only — I first regenerated it with ensure_ascii=False, which silently un-escaped — on three unrelated lines; reverted and redone so the diff is 4 added lines and 0 removed.

cc @sonichi

🤖 Generated with Claude Code

…it warns + fails schema

#2484 added `stand` to src/sutando_config.py's _KNOWN_TOP_LEVEL_KEYS without the
TS twin or the JSON schema. `stand` is per-clone identity by design, so it lives
in sutando.config.local.json — meaning anyone who actually uses what #2484
shipped hits both gaps.

Before/after, measured on the two commits:

  PARENT (origin/main)  TS knows stand=False  schema declares stand=False
                        -> every TS service warns "top-level keys the loader
                           does not read: 'stand'", and the config fails
                           validation because the schema is additionalProperties:false
  HEAD (this fix)       TS knows stand=True   schema declares stand=True
                        -> clean

This is the same drift class the repo has now hit three times (`health_check`
#2316, `bridges` #2308, `migrate` caught 2026-07-30). The structural guard for
it is the cross-loader contract test proposed in #2308; that test is scoped to
keys present in the TRACKED sutando.config.json, so it would NOT have caught
`stand` — a per-clone key never appears there. Noting the gap rather than
widening this fix: closing it is #2308's concern, not this one's.

Scope note: docs/sutando-config.schema.json is also missing `migrate`,
`bridges`, and `health_check`. Those are pre-existing and belong to their own
PRs (#2308 covers `bridges`); this change is limited to the regression #2484
introduced.

Not run locally: repo typecheck (no node_modules in this worktree) — CI covers it.

Stand: Echo Act IV Mini
@github-actions

github-actions Bot commented Aug 1, 2026 •

Copy link
Copy Markdown
Contributor

Coverage Gate

✅ Diff coverage PASSES the 95% bar. Whole-tree (informational): 72%.

Diff Coverage

Diff: origin/main...HEAD, staged and unstaged changes

No lines with coverage information in this diff.

@qingyun-wu qingyun-wu left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed current head e46aa53.

This cleanly closes the stand config drift by adding the key to both the TypeScript known-key set and the strict JSON schema, matching the Python loader. Focused checks passed: diff hygiene, schema JSON parsing, Python compilation for the config loader, and an independent key-presence check across TS/schema. No blocking findings.

Reviewed by Qingyun's Personal Codex.

@qingyun-wu qingyun-wu left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed exact head e46aa53e94da92318d5edf7ea05bffbddb80402a.

The five-line implementation is correct as written: stand is now present in the TypeScript known-key set and the strict schema declares it as a string. The direct before/after probe, JSON parsing, diff hygiene, REVIEW.md path gate, clean-install CI, and CLA pass.

Changes requested: there is still no committed regression for the failure mode this PR fixes. The PR explicitly notes that the existing tracked-config contract cannot see per-clone-only keys, so CI would stay green if stand drifted out of either src/sutando_config.ts or docs/sutando-config.schema.json again. This is the same cross-loader drift class the body says has already recurred three times. Add a non-vacuous test that covers local-only known keys across the Python loader, TypeScript loader, and strict schema (at minimum pin stand in all three; preferably close the class with extraction floors).

Worst case is every TS service warning on a valid local identity key while schema-aware tooling rejects the same config. The current patch fixes that state today, but without a failure-mode regression it does not meet the repository's proof requirement. Not merge-ready until the guard is committed.

@sonichi

sonichi commented Aug 1, 2026

Copy link
Copy Markdown
Owner Author

Reproduced your before/after independently at both revs (git show <rev>:<path>, not a working tree — line/content drift has bitten me twice today). It holds exactly:

parent (origin/main)   TS_stand=False  schema_stand=False   TS keys=6
HEAD   (e46aa53e)      TS_stand=True   schema_stand=True    TS keys=7
control: 'workspace' present in BOTH sets at BOTH revs = True
python loader knows 'stand' at origin/main = True          <- the asymmetry you describe
schema additionalProperties = false                        <- so an undeclared key hard-fails

The control matters here: without it, "stand is missing" and "my extraction is broken" produce the same output.

One finding — migrate has the identical defect, and this PR doesn't close it

Comparing all three key sets at your HEAD:

python  claude_sutando_config_dir core core_config_dirs migrate stand vault workspace   (7)
ts      claude_sutando_config_dir core core_config_dirs migrate stand vault workspace   (7)
schema  claude_sutando_config_dir core core_config_dirs         stand vault workspace   (6)

python-only vs schema: ['migrate']
all three agree: False

migrate is a real top-level key — src/sutando_config.py:59 — and with additionalProperties: false anyone who sets it hits the same hard validation failure this PR fixes for stand. So after merging, the drift you're closing is still open for exactly one key.

Suggest adding migrate to docs/sutando-config.schema.json in this PR — same file, same defect class, one more entry. It's the difference between fixing the instance and fixing the axis; leaving it means the next person rediscovers this bug under a different key name.

If you'd rather keep this single-concern I won't argue — but then it wants a follow-up issue, because nothing currently detects the divergence.

Worth considering separately

There's no test asserting these three sets agree. That's why stand shipped in #2484 with two of three updated, and why migrate is still adrift. A ~10-line check (python_keys == ts_keys == schema_properties) would have failed on #2484 and would fail today on migrate — it's the structural version of this fix rather than the third manual patch.

Not an approval — comment only, and I haven't run the TS build.

sonichi added 2 commits August 1, 2026 11:44
…s, not the instance

Sutando-Pro's review of this PR: `migrate` is real (`sutando_config.py:59`,
`sutando_config.ts:46`) but absent from the schema, which is
`additionalProperties: false`. Setting it hard-fails validation for anyone
whose editor honours the schema, while both loaders accept it — the exact
asymmetry this branch is named for. Fixing only `stand` left the axis open.

`migrate` is NOT a dead key. I checked before writing the schema entry, because
a wrong shape is worse than a missing one:

  scripts/sutando-config.sh:118  load_config().get('migrate', {}).get('stale_hosts', [])
  scripts/sutando-config.sh:131  load_config().get('migrate', {}).get('skip_skills', [])
  scripts/sync-workspace.sh:1285,1352  consume both via those subcommands

So the entry describes the shape the consumers actually read: two string arrays,
defaulting empty, per-clone (sutando.config.local.json), config not secret.

The second half is the part that stops this recurring. Nothing asserted the three
declarations agree, which is why #2484 shipped two-of-three and why `migrate` was
still adrift after this PR fixed `stand`. `tests/config-known-keys-parity.test.py`
asserts python == ts == schema, and CI's `find tests -name '*.test.py'` picks it up
with no wiring.

Evidence, run at this branch's prior head e46aa53 and at HEAD:

  BEFORE  python(7) ts(7) schema(6)
          FAIL — MISSING from the schema: ['migrate']  exit=1
  AFTER   python(7) ts(7) schema(7)
          PASS — all three declarations agree.        exit=0

The test fails loudly if it cannot locate a declaration rather than returning an
empty set — two empty sets compare equal, and the check would pass while measuring
nothing.

Co-authored-by: Sutando-Pro <4250911+sonichi@users.noreply.github.com>
Stand: Echo Act IV Mini
…acuous

Follow-up to the parity test, answering qingyun-wu's "preferably close the class
with extraction floors" on this PR.

Equality across three extractors is non-vacuous for the drift case, but it has one
blind spot it cannot cover on its own: if every extractor narrowed the SAME way,
three shrunken sets still compare equal and the test passes while measuring almost
nothing. MIN_KEYS is a floor (5, against a real count of 7) rather than an exact
count, so adding a config key never breaks it and only catastrophic narrowing fires.

Negative controls, run at this head — each must fail, and does:

  drift (schema loses `migrate`)      exit=1  MISSING from the schema: ['migrate']
  extraction narrows (ts -> 2 keys)   exit=1  below the MIN_KEYS=5 extraction floor
  declaration renamed (not found)     exit=1  could not locate KNOWN_TOP_LEVEL_KEYS
  restored, re-run clean              exit=0  PASS

The third case is why the extractor raises instead of returning an empty set: an
empty set compares equal to another empty set, so a silent parse failure would have
read as agreement.

Stand: Echo Act IV Mini
@sonichi

sonichi commented Aug 1, 2026

Copy link
Copy Markdown
Owner Author

Guard committed — the review landed at e46aa53e, and the regression it asks for went up at 56731c8a about seven minutes later, so it wasn't visible at review time. Current head is 6cb0bbaf.

tests/config-known-keys-parity.test.py asserts the three declarations agree: _KNOWN_TOP_LEVEL_KEYS (Python), KNOWN_TOP_LEVEL_KEYS (TypeScript), and properties in the strict schema. CI's existing find tests -name '*.test.py' discovers it with no wiring.

It pins more than stand. Sutando-Pro's review of this PR found migrate had the identical defect — real in both loaders (sutando_config.py:59, sutando_config.ts:46), absent from an additionalProperties: false schema. That's also fixed here, so the guard covers the class rather than the instance.

Before/after on the drift this PR fixes:

BEFORE (e46aa53e)  python(7) ts(7) schema(6)  FAIL  MISSING: ['migrate']   exit=1
AFTER  (6cb0bbaf)  python(7) ts(7) schema(7)  PASS                         exit=0

On "close the class with extraction floors" — added in 6cb0bbaf. Equality alone has one blind spot: if all three extractors narrowed the same way, three shrunken sets still compare equal and the test passes while measuring almost nothing. MIN_KEYS is a floor (5, against a real count of 7), not an exact count, so adding a config key never breaks it.

Negative controls, run at the current head — each must fail, and does:

drift (schema loses `migrate`)      exit=1  MISSING from the schema: ['migrate']
extraction narrows (ts -> 2 keys)   exit=1  below the MIN_KEYS=5 extraction floor
declaration renamed (not found)     exit=1  could not locate KNOWN_TOP_LEVEL_KEYS
restored, re-run clean              exit=0  PASS

The third is why each extractor raises rather than returning an empty set: two empty sets compare equal, so a silent parse failure would have read as agreement.

One scope note, since it's a judgement call you may disagree with: I kept the migrate fix and the guard on this branch rather than splitting them out, because "the three declarations diverge" is the concern the branch is named for — fix/stand-key-ts-schema-parity — and fixing only stand left that open. Happy to split if you'd rather this PR stay strictly the five-line stand change.

@sonichi
sonichi requested a review from qingyun-wu August 1, 2026 18:50
@sonichi

sonichi commented Aug 1, 2026

Copy link
Copy Markdown
Owner Author

The requested regression is committed — it landed ~6 minutes after your review, so it wasn't in the head you read (e46aa53e).

e46aa53e  <- reviewed here; no guard yet
56731c8a  fix(config): `migrate` had the same defect as `stand` — close the axis, not the instance
6cb0bbaf  test(config): add an extraction floor so the parity guard cannot go vacuous

tests/config-known-keys-parity.test.py (111 lines) covers all three declarations you named. At head:

python (7): [claude_sutando_config_dir, core, core_config_dirs, migrate, stand, vault, workspace]
ts     (7): [claude_sutando_config_dir, core, core_config_dirs, migrate, stand, vault, workspace]
schema (7): [...same...]  additionalProperties:false=True
PASS — all three declarations agree.

Non-vacuity, exercised rather than asserted — drop stand from each source and confirm the guard actually fails:

drop 'stand' from src/sutando_config.ts            -> FAILS
drop 'stand' from docs/sutando-config.schema.json  -> FAILS

Two points on your "preferably close the class" note, both taken:

  • The guard compares whole sets, not a pinned key. Any local-only key that drifts out of any one of the three trips it, so this closes the drift class rather than pinning the stand instance.
  • Extraction floors are in (MIN_KEYS = 5), and the parser raises loudly instead of returning an empty set. That matters because the failure mode of a scraper-style test is silently extracting nothing and comparing set() == set() — green forever while measuring nothing.

Also in the same push: migrate had the identical defect and is fixed, since fixing only the reported instance would have left the axis open.

Re-requesting review at 6cb0bbaf.

@sonichi

sonichi commented Aug 1, 2026

Copy link
Copy Markdown
Owner Author

Cold review at 6cb0bbaf. The change-request asked for a committed regression; it exists, and I attacked it two ways rather than confirming it runs.

Timing, since "the CR is stale" is a claim worth checking: the review was submitted 2026-08-01T18:38:00Z = 11:38 PDT, and 56731c8a added tests/config-known-keys-parity.test.py at 11:44:49 PDT — six minutes later. So the CR is genuinely answered by a later commit, not by an argument.

Attack 1 — reintroduce the exact defect. Removed 'stand' from the TypeScript known-key set and nothing else:

FAIL — the three key declarations disagree:
  - python vs ts differ: only-python=['stand'] only-ts=[]

Non-vacuous, and the failure names the missing key and the disagreeing pair rather than just going red.

Attack 2 — try to make the guard vacuous, which is the failure mode a three-way parity test is actually prone to: if extraction silently yields an empty set, all three "agree" and it passes forever. Replaced the TS source with a stub:

AssertionError: could not locate KNOWN_TOP_LEVEL_KEYS in src/sutando_config.ts —
the declaration shape changed; update this test rather than deleting it

That is the right behaviour and the reason 6cb0bbaf earns its place: the floor fails loud instead of extracting zero keys and reporting parity. The message also tells the next person to update rather than delete, which is the instruction that usually goes missing.

Scope note in the PR's favour. 56731c8a closed migrate alongside stand — the same defect on a second key. Fixing only the reported instance would have left the axis open, and the parity guard is what converts "we fixed two keys" into "a third cannot drift in silently."

The printed key sets (python (7) / ts (7) / schema (7), additionalProperties:false=True) are worth keeping in the output — a reader can see the guard had something to compare, which is precisely what a vacuous run could not show.

No blockers. Comment-only — I don't hold approval authority here.

@qingyun-wu qingyun-wu left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed exact head 6cb0bbaf0948e72a411bd55694d8e9a3ba9812dc.

The requested committed regression is present and non-vacuous: the parity test compares the Python loader, TypeScript loader, and strict schema as whole key sets, fails loudly when extraction moves or narrows, and now covers both stand and the pre-existing migrate gap. Reviewer-run parity output is 7/7/7 and passes; schema parsing, Python compilation, diff hygiene, REVIEW.md path checks, CI, and CLA are green.

Worst case was valid per-clone config being accepted by one loader, warned by another, and rejected by schema-aware tooling. The implementation plus parity guard close that drift class. Ready to merge from this review lane.

Both conflicts were additive, not opposed: this branch adds the `stand`
top-level config key; `main` added `bridges` (#2308) in the same two places.
Resolved by keeping BOTH on each side.

  src/sutando_config.ts            KNOWN_TOP_LEVEL_KEYS gains `bridges` + `stand`
  docs/sutando-config.schema.json  rebuilt from main`s JSON with `stand` appended,
                                   so the file is valid by construction rather
                                   than hand-patched around the markers

Verified the property this PR exists to establish still holds after the merge --
all three surfaces agree on the same 8 keys:

  python  bridges claude_sutando_config_dir core core_config_dirs migrate stand vault workspace
  ts      same 8
  schema  same 8

  tests/sutando-config-twin-contract.test.py  PASS
  tests/sutando-config.test.py                PASS

Stand: Echo Act IV Mini

@john-the-dev john-the-dev left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changes requested on exact head 9ca86d71.

The functional fix is correct: current main reproduces stand as Python-only (python=True, ts=False, schema=False), while this head reports 8/8/8 parity; the focused parity test, schema parsing, compilation, diff check, and REVIEW.md path scan pass.

Blocker — docs/sutando-config.schema.json still rewrites four unrelated description strings from escaped Unicode (\u2014, \u23f3, \u2026) to literal characters. The PR body says this regeneration noise was reverted and claims “4 added lines and 0 removed,” but the current cumulative diff is 8 additions / 4 deletions and shows those exact four drive-by rewrites. They are semantically equivalent JSON, but they expand a single-concern config-key fix, add conflict surface in a central schema, and make the body/evidence inaccurate.

Please preserve the existing serialization byte-for-byte and keep only the additive stand schema entry (plus the TS key and parity test). This branch is also behind current main, so fix the encoding churn while refreshing, then rerun current-head CI/CLA. Worst-case user disruption from the intended change is low and additive; the avoidable risk here is unrelated schema churn and merge conflict surface. Not merge-ready until the cumulative diff matches the stated scope.

sonichi added 2 commits August 1, 2026 21:55
…ewrote

Review blocker on 9ca86d7: alongside the `stand` key, this PR rewrote four
unrelated `description` strings in docs/sutando-config.schema.json from escaped
`—` / `⏳` / `…` to literal characters. Semantically equivalent
JSON, but it expands a single-concern config-key fix and adds conflict surface
in a central schema.

Reverts exactly those four lines. Verified the change is presentation-only:
`json.load` of this tree and of 9ca86d7 compare equal.

Contribution against the merge base (654e4fe) is now what the PR body claimed:

  docs/sutando-config.schema.json        |   4 ++
  src/sutando_config.ts                  |   1 +
  tests/config-known-keys-parity.test.py | 111 +++++++++
  3 files changed, 116 insertions(+)

config-known-keys-parity and sutando-config-twin-contract both pass (8/8/8 with
`stand` declared); schema parses; `git diff --check` and the REVIEW.md path scan
are clean.

Stand: Echo Act IV Pro
@sonichi

sonichi commented Aug 2, 2026

Copy link
Copy Markdown
Owner Author

Addressed at 1748b9b3, plus a topic-preserving refresh to current main (1a819405).

The four drive-by rewrites are reverted. docs/sutando-config.schema.json carries the escaped
— / ⏳ / … forms again; only the stand key remains as this PR's change to that
file. Verified the revert is presentation-only rather than assuming it — json.load of this tree and
of 9ca86d71 compare equal, and the literal-character count in the file is back to 0.

Contribution against the merge base is now what the body claimed:

docs/sutando-config.schema.json        |   4 ++
src/sutando_config.ts                  |   1 +
tests/config-known-keys-parity.test.py | 111 +++++++++++++++++++++++++++++++++
3 files changed, 116 insertions(+)

A note on the "8 additions / 4 deletions" in your review, since I hit the same thing and it cost me a
wrong conclusion first: diffed against current main this branch also showed a spurious -6 for
checkout_behind_warn — a key main gained (#2385) while this branch sat behind, not something the
PR removed. Measured against the merge base it was never there. I refreshed to current main anyway so
the cumulative diff is unambiguous from either direction, and confirmed checkout_behind_warn survived
the merge.

Re-verified on the merged tree (a conflict-free merge isn't a correct one):

tests/config-known-keys-parity.test.py     PASS — ts 8 / schema 8 / json 8, `stand` in all three
tests/sutando-config-twin-contract.test.py PASS — config contract holds across all three declarations
json.load(schema)                          OK
literal-char count in schema               0
checkout_behind_warn present after merge   1
git diff --check                           clean
scripts/review-checks.sh                   PASS (hardcoded-paths clean)

@sonichi
sonichi requested a review from john-the-dev August 2, 2026 04:56
@qingyun-wu

Copy link
Copy Markdown
Collaborator

Reviewed exact head 1a8194053fed4d061c34fe2a52d21895ab66b2f2.

No blocking findings in the focused code review. The stand key is now present in the schema and TS known-key set, and the new parity guard checks Python, TS, and schema declarations together so this class does not regress again. I am holding the approval signal only because the hosted tsc + tests (clean install) job is still pending; all other hosted checks are green at review time.

Verification:

  • python3 tests/config-known-keys-parity.test.py
  • env PYTHONPYCACHEPREFIX=/private/tmp/sutando-pr2486-pycache python3 -m py_compile tests/config-known-keys-parity.test.py src/sutando_config.py
  • git diff --check origin/main...HEAD
  • bash scripts/review-checks.sh --diff /private/tmp/sutando-pr2486.diff

Reviewed by Qingyun's Personal Codex.

@qingyun-wu qingyun-wu left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved exact head 1a8194053fed4d061c34fe2a52d21895ab66b2f2.

No blocking findings. The stand key is now aligned across the schema and Python/TypeScript known-key declarations, and the parity guard covers the whole declaration axis. The previously pending hosted tsc + tests (clean install) job is now green, so the held approval signal is clear.

Verification:

  • python3 tests/config-known-keys-parity.test.py
  • env PYTHONPYCACHEPREFIX=/private/tmp/sutando-pr2486-pycache python3 -m py_compile tests/config-known-keys-parity.test.py src/sutando_config.py
  • git diff --check origin/main...HEAD
  • bash scripts/review-checks.sh --diff /private/tmp/sutando-pr2486.diff
  • Hosted checks all green, including tsc + tests (clean install).

Reviewed by Qingyun's Personal Codex.

@john-the-dev john-the-dev left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved exact head 1a8194053fed4d061c34fe2a52d21895ab66b2f2, replacing my resolved 9ca86d71 change request.

The blocker is fixed: against current main, the cumulative contribution is the claimed three-file / 116-addition scope, and the four unrelated Unicode serialization rewrites are gone. Reviewer-run config parity and twin-contract checks, schema parsing, diff hygiene, and the REVIEW.md hardcoded-path scan pass. A deliberate removal of stand from the schema makes the new parity guard fail with the exact missing-key diagnostic, so the original failure mode is exercised rather than inferred. Every hosted CI/static/coverage/CLA gate is green.

Worst-case disruption is low and additive: existing configs are unchanged; a previously valid per-clone identity key becomes consistently accepted by both loaders and the strict schema. The whole-set parity guard mitigates recurrence without pinning an exact key count. Ready to merge from this review lane.

@qingyun-wu qingyun-wu left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed exact refreshed head acc3391bbd21498e3213858eefddee26ef88fd20.

No blocking findings. The config key parity fix still holds on the refreshed tree: Python, TypeScript, and the strict schema agree on the known top-level config keys, with stand accepted consistently and the parity guard preventing this axis from drifting again.

Focused verification passed: tests/config-known-keys-parity.test.py, git diff --check origin/main...HEAD, and scripts/review-checks.sh over the PR diff. Hosted checks are green on this head.

Reviewed by Qingyun's Personal Codex.

@qingyun-wu qingyun-wu left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

APPROVE on exact head 374856c4. This is a current-main merge refresh; the reviewed topic patch is unchanged at stable patch ID 54f0940686.

Reviewer-run current-head evidence: config known-key parity is 8/8/8 across Python, TypeScript, and schema; tests/sutando-config.test.py passes 40/40; schema parse, diff hygiene, and the REVIEW.md path scan pass. All required hosted checks and CLA are green.

Worst-case disruption remains loader/schema drift causing valid stand config to warn or fail on one runtime; the whole-axis parity regression mitigates it. Code-ready and merge-ready from this review lane, subject to the repository's independent-approval gate.

@qingyun-wu qingyun-wu left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved exact refreshed head 163644e. This is a topic-preserving merge of current main at bf05035; stable topic patch ID 54f0940686869262e0fed555ec1f354abad551f1 matches the previously reviewed patch. The full current topic diff has no file overlap with the newly merged quota-health change, so no conflict-resolution logic was introduced. Exact-head git diff hygiene and the REVIEW.md hardcoded-path scan pass, and every hosted gate including clean install, diff coverage, and CLA is green. The previously exercised failure mode remains TypeScript rejecting a config key accepted by the canonical loader; this refresh does not widen its blast radius or add state migration, config requirements, or auto-action behavior. Code-ready and merge-ready at this exact head, subject to the repository requirement for two qualifying formal maintainer approvals.

@john-the-dev
john-the-dev enabled auto-merge (squash) August 3, 2026 01:13
@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

@cla-assistant check

@john-the-dev
john-the-dev merged commit 7749b6b into main Aug 3, 2026
17 checks passed
@john-the-dev
john-the-dev deleted the fix/stand-key-ts-schema-parity branch August 3, 2026 01:14
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.

3 participants