Repository navigation
fix(hydra-gates): stop gates 54, 55 and 102 reporting non-defects - #898
Merged
Merged
Conversation
Gate 102 skips a visible-field value only when its place and shape both say it is not copy: a CSS length under a width key, a value-map token, a field path in a field-path block, or an @ binding token. Gate 55 reads config.band as a widget placement, like sideColumn. Gate 54 resolves @object.<field> filter tokens in a register.d fragment against the schema merged with the base register and other fragments. Assisted-by: ClaudeCode:claude-opus-5-5
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Three manifest gates report things that are not defects. This PR teaches each one the shape it was missing, narrowly, and keeps a deliberately bad case of the same shape failing.
Gate 102 (manifest strings need an nl.json key)
Visible-field keys (
title,label,description,task, ...) also appear where the value is not copy. A value is now skipped only when both its place and its shape say it is not text:columnWidths,width,minWidth,maxWidth,paneWidthauto"columnWidths": {"title": "275px"}colorMap,variantMap,iconMap,typeMap"colorMap": {"task": "purple"}cardLayout,expandableRows, a field-listrow, a board'scard, a fields entry withinitialsPathtitle,owner.name)"expandableRows": {"title": "title"}@object.title,@me)"props": {"title": "@object.title"}This starts from the screens GATE-FIX patch (
gate-102-checker.patch) and narrows it where it skipped real copy:columnWidths, now only CSS lengths;cardblock, which includesnav.card.title, an i18n key in the schema; now only a board'scard;"cardLayout": {"title": "Case title"}is still copy;@, now only binding tokens, so"@ mention someone"is still copy.Gate 55 (detail-page discipline)
config.band(schema 2.171, CnDetailPagebandWidgets()) places widgets in a row above the body. The rule-8 check now reads it likesideColumn: a string id or{widgetId}entry places a declared widget, an inline definition needs none. Still reported: a band widget that also has a layout cell, one also in the side column, one named twice, and a band entry naming no declared widget (CnDetailPage drops it silently).Gate 54 (relation dialect)
A
register.dfragment is deep-merged onto the base register (ADR-037, pipelinqConfigFileLoaderService). A filter token@object.<field>is now resolved against the merged schema: the fragment's own properties plus that schema's properties in the base register and the other fragments. Mock and example registers are separate documents and are not merged, in either direction.Verified
Fleet run of the three helpers, origin/main vs this branch, on the
developmenttip of all 21 swept apps:275px); pipelinq FAIL 8 to PASS (@object.title,CheckCircleOutline,description,handle,ownerId,purple,title,value)Indeling,Upload); 18 apps unchangedconfig.bandwidgetcrmTask.contactMoment@object.clientIdfinding goneStrings the new gate 102 no longer collects, fleet-wide (all checked by hand to be field paths, tokens or lengths): dossiq
275px,title(board card, cardLayout); pipelinq the 8 above plusname(initialsPath entries); portaliqhostname,displayName(field-listrow). No string was added.After this, gate 102 on dossiq development reports no untranslated string.
Tests:
test_check_manifest_l10n_coverage.py: new cases for every skip, and a STILL_COPY manifest that puts real copy under each of those keys ("columnWidths": {"title": "Open cases"},"275px"as a page title,nav.card.title, a wordedcardLayout.title,"@ mention someone","12 px wide"); all still reported. Six mutants of the new skip logic (drop the width guard, the field-path guard, the board-parent guard, the token grammar, the value-map skip, the width context) each fail the suite.test_check_detail_page_placement.py: 7 band cases, 3 of them controls that must still fail. 21 tests OK.test_check_relation_dialect.py: 5 fragment-merge cases, 3 controls (a field nobody declares, a mock register in both directions). 44 tests OK.run-helper-suites.shpassed 82 suites with no failure before my 25-minute local cap; the rest is left to CI'sPackage invariants.Inherited, not from this PR:
Package invariantshits its 30-minute timeout on every open PR here today (#888, #896, #897 and others' PRs), so it reads CANCELLED.AI disclosure: prepared with Claude Code (Opus 5.5).
🤖 Generated with Claude Code