Repository navigation
test: retire 17 family rows strict lint now owns; keep the i18n gate and the props parse sweep (#1582) - #2012
Merged
Conversation
Per-row deletion after re-ablation on b54380c: flow-inert-node-condition, the view.list.tabs schema tombstone, page-field-unknown, form-field-unknown and field-group-undeclared / -shadowed / -empty each fire under `objectstack lint --strict` on every case the local assertion covered. Claude-Session: https://claude.ai/code/session_012zh91QzFgePbkmuHnugLN3 Co-authored-by: Claude <noreply@anthropic.com>
…ns (#1583-#1586, #1805) Per-row deletion after re-ablation on b54380c, each case firing under `objectstack lint --strict`: ai-skill-tool-unresolved, chart-dataset-unknown, chart-dimension-unknown, chart-measure-unknown, filter-preset-comparand, translation-option-key-unknown, translation-target-unknown (navigation), translation-section-name-missing, security-fls-unqualified-key, security-fls-unknown-field, and the rls-predicate-* family. Kept: the FLS unknown-object branch, "every policy targets an object the same set grants", and the component-props parse sweep (a nested component with no `properties` is silent at lint). The i18n lint gate goes whole: script, test, package.json script, its verify step and both CI steps, with its roster entries in script-main-guard and verify-log-decoy-pin. Stale prose in the touched files is corrected, as are the two profile comments the 17.7.0 liveness ledger contradicts. Claude-Session: https://claude.ai/code/session_012zh91QzFgePbkmuHnugLN3 Co-authored-by: Claude <noreply@anthropic.com>
Re-ablating the gate removal on the committed tree, a deleted zh-CN label of each i18n/missing-* class (object, field, option, navigation, page, section, view) leaves `pnpm lint` at exit 0: on the two-package artifact the CLI's translation-coverage pass reads the composed top level, which carries no translations and no metadata. The gate reads the same lint report, so the row is kept, byte-identical to main, and reported as a regression against the re-grade. The i18n-references prose that claimed strict lint now fails on a non-default-locale gap is corrected to what was measured. Claude-Session: https://claude.ai/code/session_012zh91QzFgePbkmuHnugLN3 Co-authored-by: Claude <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub. |
This was referenced Oct 8, 2026
This was referenced Oct 8, 2026
zhuangjianguo
pushed a commit
that referenced
this pull request
Oct 9, 2026
…ectories Comment lines only, same rule as the sales commit. The case-escalation flow's note names the platform lint rule instead of the test row #2012 retired. Claude-Session: https://claude.ai/code/session_018Mk4tab2eCyY41UTWK7y7V Co-authored-by: Claude <noreply@anthropic.com>
zhuangjianguo
pushed a commit
that referenced
this pull request
Oct 9, 2026
…ectories Comment lines only. quote.hook.ts's two billing-handoff notes name the contract-activated flow, the one of the two split successors that POSTs a contract's payment_terms and contract_type; the line-item note names the platform lint rule instead of the test row #2012 retired. Claude-Session: https://claude.ai/code/session_018Mk4tab2eCyY41UTWK7y7V Co-authored-by: Claude <noreply@anthropic.com>
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.
Fixes #1582
Part of #1583
Fixes #1584
Part of #1585
Fixes #1586
Fixes #1805
Clause-②: no
The one retirement PR for the family re-grade (ruling hotcrm-R74 item 4 B; re-grade
6053840674, fold plan6053925467). Every row was re-ablated on this PR's baseb54380cf(the two-package artifact from #1907) before its local assertion was deleted. 17 of the 19 planned rows retire. 2 rows stay, because the re-ablation found cases thatobjectstack lint --strictdoes not report on this base. #1583 and #1585 therefore getPart of, not a closing line: each keeps one row, listed under "Rows kept after re-ablation".What changed
os lint --strictguards them (epic #1579, step 3, family F1) #1582): removed the inertconfig.conditionsweep. Deletedtest/view-tab-label-inert.test.ts, with its walk guard.page-field-unknown,field-group-undeclared/-empty/-shadowed,ai-skill-tool-unresolved(plus the transcribedPLATFORM_TOOLSlist, which only that row used) and theview-referencesform-field sweep. Kept: the component-props parse sweep.datasetByName,measuresOf,dimensionsOfand theDATE_RANGE_PRESETSimport.i18n/missing-*and translation-target rules (epic #1579, step 3, family F4) #1585): retired the option-key sweep, theapps.*.navigationorphan sweep and the section-name-missing sweep. Kept: the wholelint:i18n-gategate. Its script, test,package.jsonscript,verifystep, both CI steps and roster entries are byte-identical tomain.test/authorization-coverage.test.ts's qualified-FLS-key half once@objectstack/lintshipssecurity-fls-unknown-field(objectstack#16108 → objectstack PR #16998, merged, not yet released) #1805): split the FLS assertion. The unqualified-key and names-a-real-field branches are retired. The unknown-object branch stays, renamedevery object-qualified FLS key names a real object. Retired both RLS sweeps, plusUSER_VARS/CLAUSE, which only they used. "Every policy targets an object the same set grants" is unchanged.⚰️ RETIREDcomment that names the rule id now responsible.Re-ablation on
b54380cf, per case (before deletion)Method: same as the re-grade. Each case was one anchored mutation through
ablation-replace.mjs. It ranpnpm lint --json(objectstack lint --strict), then the owning test file. A trap restored the tree, and the restore was proven three ways: blob hash equals HEAD,git diff HEADis empty, andgit statusis clean. Baseline onb54380cf: errors 0, warnings 0, suggestions 18, failing 0, strict true, exit 0. In every row below the local assertion was also red.config.condition''1expression-invalid·null0 (same as the re-grade: a null states no predicate, so it is outside the assertion's rationale)view-tab-label-inertlist.tabs1 ·listViews.*.tabs1 (config load refusesview.list.tabs was removed in @objectstack/spec 17.5.0, no rule id)action_1 · wildcard 1 · service-module skill 1 · a name only astack.toolsrecord serves: 0, held by the keptdoes not lean on AI tool metadata(red)form1 ·formViewsobject entry 1$eqon a widget 1 ·$inin a report 1translation-target-unknownapps.*.navigationorphansform1 ·formViews1 · page record:details in tabs 1using: unknown field 1 · unknown leading field 1 ·current_user.nope1 · nested path 1 · function call 1 ·check(new, not in the re-grade): unknown field 1 ·current_user.nope1 · function call 1 · unknown policy object 0, held by the keptevery policy targets an object the same set grants(red)After deletion, at
68fe1b2c: one case per retired row was re-run with lint only (18 probes). Every probe gave exit 1 with the same rule id, or the same schema refusal forlist.tabs.Rows kept after re-ablation (not retired)
every page component's properties parse against its own ComponentPropsMap entry). This case is new; the re-grade did not probe it. A page component nested in another component'sproperties, with its ownpropertiesabsent and a contract that requires keys, gets exit 0. Measured on a nestedrecord:related_list, a nestedpage:accordionand a nestedelement:text. The local sweep is red on all three. Control: the same edit on a top-levelrecord:pathgets exit 1 (component-props-invalid). Mechanism:PageComponentSchemadefaults a top-level component'spropertiesto{}, but nothing parses a nested component, andvalidateComponentPropsskips one withif (!props) continue. The three nested types in use today are also held, by chance, by other kept tests. A new nested type with required props would be held by nothing. The test file is unchanged.lint:i18n-gategate. This is a regression against the re-grade. On68fe1b2c(the gate restored) one non-default-locale (zh-CN) entry was deleted per class: object, field, option, section, view, action, navigation, dashboard, widget, dataset, page and flow. All 12 classes gavepnpm lintexit 0 (plain and--json) and gate exit 0. Onc529de2bthe re-grade measured exit 1 on all 12. Mechanism: the CLI's translation-coverage pass runscomputeI18nCoverageon the composed top level. Since Packaging: sales becomes thetype: apppackage and service atype: module—composeStacks(…, { manifest: 'preserve' }), navigation contributions, two-entrypackages[]#1907,composeStacks(…, { manifest: 'preserve' })leaves that level with onlymanifest,packagesandi18n: notranslationsand no metadata. Run in memory over the union-of-packages stack, the same deletion is reported (warning zh-CN navigation apps.crm_enterprise.navigation.nav_home.label). The kept local completeness tests are red for field, option, section, view, action, widget and page. Nothing inpnpm verifyis red for object, navigation, dashboard, dataset or flow. The gate removal could not be shown to lose nothing, so per the dispatch rule the gate stays, and the platform defect is reported for the seat to file upstream.KEEP rows in the files this PR edits: byte-identity
Method: each
it(…)block was extracted fromb54380cfand fromHEAD, and the text was hashed (sha1, first 12 hex). Across the 8 edited test files, 118 blocks are byte-identical. Seventeen were removed (the retired rows) and one was added (the FLS split). One block is comment-only:sees a real navigation tree and an apps.*.navigation table in every locale, whose inline comment was rewritten because it pointed at the retired orphan sweep. Its non-comment lines hash equal (44031195) at both revisions. The KEEP rows of the table, and the holders named above:The gate's files have an empty
git diff b54380cf HEAD:scripts/check-lint-i18n-gate.mjs,test/lint-i18n-gate.test.ts,package.json, both workflows,test/script-main-guard.test.ts,scripts/lib/main-module.mjsandtest/verify-log-decoy-pin.test.ts.F4 gate-removal proof: not obtained, gate kept
pnpm lintpnpm lint --jsonfailingi18n-referencesStale prose corrected in this PR
test/i18n-references.test.ts. The completeness block comment saidpnpm lintruns with--skip-i18nand that lint exits 0 on warnings. It now gives what was measured: the run is strict, but its i18n coverage reports nothing on this artifact. The View-labels comment, the nav block comment and the "no_sectionscategory" sentence (17.7.0 hasi18n/missing-section) were corrected the same way.src/sales/profiles/{sales-manager,marketing-user}.profile.ts, comments only. They said "liveness: dead in 17.6.0". The installed 17.7.0liveness/permission.jsonmarksprops.rowLevelSecurity.children.labeland.description"status": "live"(verifiedAt 2026-10-03, "RE-GRADED dead → live … the permission editor's Row-Level Security section heads each policy card withpol.label").view-tab-label-inertpointer) and the metadata-references split map.Outside the claimed surface, edited because this PR's retirements made the text false:
content/docs/analytics/cubes.mdx,.zh-Hans.mdxand.zh-Hant.mdx. These saidtest/analytics-integrity.test.tsfails the build on an unresolved dataset, measure or dimension name; they now creditobjectstack validateandobjectstack lint --strict.docs/ARCHITECTURE.mdanddocs/developers/code_examples.md. These namedtest/skills-integrity.test.tsas the tool-name resolver and saidPLATFORM_TOOLSis transcribed there.Not edited here, now stale. Both are src comments, and the dispatch allows only the two profile comments under
src/. They are listed for #1919, the src-comment card that follows this PR:src/revenue/objects/opportunity_line_item.object.ts:69: "test/field-groups-coverage.test.tspins it" (field-group-shadowed).src/service/flows/case-escalation.flow.ts:123: "test/flow-decision-authority.test.tsenforces that".Verification
pnpm verifyat68fe1b2cexited 0 through the verify lock (VERDICT command-exit 0). Validate: "✓ Validation passed". Typecheck: clean. Lint: "18 suggestion(s)", exit 0.lint:i18n-gate: "✓ i18n lint gate: 0i18n/missing-*issues". Hygiene: "✓ source hygiene clean". Token ratchet: "✓ source token ratchet clean". Build: "✓ Build complete". Test: "Test Files 178 passed (178) · Tests 3814 passed | 1 skipped (3815)".ablation-replacebecause the anchor was contained in its replacement (no-op, restored), and each was redone with a unique anchor.Acceptance notes (for the seat; not filed by this PR)
objectstack linttranslation coverage is blind on acomposeStacksartifact. Evidence is above. Since Packaging: sales becomes thetype: apppackage and service atype: module—composeStacks(…, { manifest: 'preserve' }), navigation contributions, two-entrypackages[]#1907,pnpm verifycatches no missing non-default-locale label for object, navigation, dashboard, dataset or flow.component-props-*skips a nested page component whosepropertiesis absent.ai-skill-tool-unresolvedcounts astack.toolsrecord as resolving, whileToolSchemasays a metadata-authored tool is never executed in the open edition. The kept skills test holds this case today.test/i18n-shared-widget-parity.test.ts:23still says "pnpm lint --skip-i18nskips the bundles". This was stale before this PR, and the file is outside this surface.--strict(Turn onos lint --strictin this repo's verify chain and prove the gate reds (epic #1579, step 2b — the half that needs a release) #1581) it now fails on both, so this step overlaps it") are kept byte-identical with the row, and are not true on this base.Generated by Claude Code