Skip to content

Commit 1979df0

Browse files
docs(qa): re-point the eight accept-set checklist anchors at their enclosing declarations (#20999)
Fixes #18101 Clause-②: no Ruling-ref: 5748968793 ## What this does The shared symbol-anchor resolver refuses eight platform-checklist anchors that name real sites: six are object-literal keys written INLINE in config, seed, datasource and action literals, and two are data identifiers (`sys_user`, `sys_invitation`) that appear only as the HEAD of dotted action names. Under the ruling on the card (letter C), the shared core in `scripts/symbol-anchors.mjs` is **not** widened, and no citation is dropped to a bare one. Each anchor now points at the nearest enclosing declaration the resolver does read, so every pointer stays checkable. The eight `accept-set` rows leave `SHARED_RESOLVER_RESIDUAL` by repair. `scripts/symbol-anchors.mjs` is untouched; `git diff 05be352 -- scripts/symbol-anchors.mjs` is empty. ## The eight rows How I picked each one: the first segment is always the top-level declaration that encloses the literal. I add a member segment only when the cited sentence names that member itself (the `admin` / `organization` feature entries, the `parent` field). The config file is the one exception. Its default export is an anonymous `defineStack(...)` call, so its nearest enclosing declaration that resolves is the `plugins` key. Each re-pointed value also gets a `re-pointed #18101: ...` note saying why, following the trace the `bad-citation` drain cuts used. | area file | old anchor | new anchor | why this declaration encloses the cited site | |---|---|---|---| | `dashboards.json` | `examples/app-showcase/src/data/seed/index.ts#signed_on` | `...#accounts` | `signed_on` is set inline in each account seed row. `const accounts = defineSeed(Account, ...)` declares those rows. | | `dashboards.json` | `examples/app-showcase/src/data/seed/index.ts#sales_region` | `...#accounts` | Same rows: `sales_region` and `signed_on` are both inline keys of the records in the `accounts` seed constant. | | `identity-auth.json` | `packages/spec/src/kernel/public-auth-features.ts#sys_invitation` | `...#PUBLIC_AUTH_FEATURES.organization` | The three `sys_invitation.actions.*` tokens all sit in `PUBLIC_AUTH_FEATURES.organization.gatedInputs`. The sentence is about the organization feature. | | `identity-auth.json` | `packages/spec/src/kernel/public-auth-features.ts#sys_user` | `...#PUBLIC_AUTH_FEATURES.admin` | The `sys_user` lifecycle action tokens (create / ban / unban / unlock / set password / impersonate) sit in `PUBLIC_AUTH_FEATURES.admin.gatedInputs`. The sentence is about the admin flag. | | `integration-system.json` | `examples/app-showcase/objectstack.config.ts#declarativeStdio` | `...#plugins` | `declarativeStdio` is inline in `new ConnectorMcpPlugin({ ... })`, an element of the `plugins:` array. The config is an anonymous `export default defineStack(...)`, and `defineStack` / `ConnectorMcpPlugin` are imports, which do not resolve. `plugins` is the nearest enclosing key the resolver reads. | | `integration-system.json` | `examples/app-showcase/src/system/datasources/showcase-external.datasource.ts#onMismatch` | `...#ShowcaseExternalDatasource` | `onMismatch` is inline in `external.validation`. `export const ShowcaseExternalDatasource = defineDatasource(...)` is the datasource constant that holds it, and the file's only declaration. | | `records-forms.json` | `examples/app-showcase/src/ui/actions/index.ts#maxSize` | `...#ActionParamGalleryAction` | Both `maxSize` sites (the `p_cover` and `p_attachments` params) are inline in the `params` of `export const ActionParamGalleryAction`. No other action in the file sets `maxSize`. | | `records-forms.json` | `examples/app-showcase/src/data/objects/business-unit.object.ts#allowCreate` | `...#BusinessUnit.parent` | `allowCreate: true` is inline in the options of the `parent: Field.lookup(...)` field of `export const BusinessUnit`. The sentence is "parent allowCreate:true". | I probed every new anchor through `symbolSegmentResolution` before editing (every segment `declaration`, none `literal`), then confirmed it with the gate run below. ## The ceiling: 18 → 10 At `origin/main` `05be35259` the ceiling is already 18, not the 55 the ruling quotes; the `bad-citation` drain lowered it after the ruling was written. The ledger's own drain contract says: "the citation is re-pointed at what the cited file actually declares, the row goes, and the ceiling below comes down by the same number in the same edit. ⛔ Never by raising the ceiling". So removing 8 rows takes `SHARED_RESOLVER_RESIDUAL_CEILING` from 18 to 10, and rows == ceiling again. That matches the ruling's intent (the ledger is shrink-only). Only the number 55 has moved since then. I also updated the ledger prose that this change made false: - the second- and third-slice notes said these files "still carry" their `accept-set` rows; - the `accept-set` verdict description said the rows were "a different card, against the shared core". The `accept-set` verdict stays in the closed two-verdict vocabulary with **0 rows**. The shape it names still exists; the ruling only decided how such a row is repaired. I added a short drain paragraph that records the ruling. ## Verification (at `9919256b81`) `pnpm check:platform-checklist` is red on `main` because of ONE unrelated row: `areas/identity-auth.json` → `packages/plugins/plugin-auth/src/auth-plugin.ts#twoFactor`, already filed as #20464. That row is not touched here and stays red. The proof for this PR is that this one problem stays, no new one appears, and the eight residual rows are gone. | reading | before (`05be35259`) | after (`9919256b81`) | |---|---|---| | `pnpm check:platform-checklist` | exit 1, `1 problem(s)`: the #20464 `twoFactor` row | exit 1, `1 problem(s)`: the same #20464 `twoFactor` row, nothing else | | `--anchor-census` resolved | 628/647 | 636/647 | | on the named residual | 18 | 10 | | per-file floor population (resolved + residual) | dashboards 22 · identity-auth 82 · integration-system 57 · records-forms 84 | identical (census JSON byte-equal), so no floor moves and none was touched | | `node scripts/check-platform-checklist.mjs --self-test` | 221 assertions, exit 0 | 221 assertions, exit 0 | Intermediate reading: I ran the gate with the anchors already re-pointed and the ledger not yet edited. It printed exactly 8 `STALE RESIDUAL ROW` reds, one per row, plus the #20464 row, and no `ABSENT SYMBOL` for any new anchor. That shows the gate really reads the eight re-pointed citations, and that each one resolves. One-shot mutation (run from the committed state, through `scripts/ablation-replace.mjs`, restore verified): I changed the re-pointed `#accounts` in `areas/dashboards.json` to `#accountz`. The gate printed `ABSENT SYMBOL — examples/app-showcase/src/data/seed/index.ts#accountz` and `SYMBOL ANCHORS LOST — 21 anchor(s) resolve here but the floor is 22`, alongside the #20464 row. After the run the file blob equals HEAD (`85e8f6f4a702`) and `git diff HEAD` is empty. So a re-pointed anchor is still checked both ways: by the resolver, and by the per-file floor. No test file was added for this. Every gate `node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands` derives for this diff (32 commands, change set from merge base `05be35259`), run at `9919256b81`. `--ran` reconciles them as `32 derived, 32 run, 0 NOT-MEASURED, 0 UNRUN` (every line exit-coded): - **exit 0 (30 commands):** `check-ci-filter-parity`, `check-closing-keyword-parity` (+ `--self-test`), `check-comment-mask-corpus`, `check-declaration-mirrors` (+ `--self-test`), `check-scripts-symbol-anchors` (+ `--self-test`; this corpus reads the new comment prose in the gate script), `check-self-test-wired` (+ `--self-test`), `check-self-test-workflow-commands` (+ `--self-test`), `check-whole-set-label-write` (+ `--self-test`), `pm/bare-root-worklist --self-test`, and `pnpm check:` `agent-test-spelling` · `bash32-floor` · `cli-command-ids` · `cross-package-test-inputs` · `doc-authoring` · `driver-memory-census` · `entry-guard` · `gitlink-declared` · `nul-bytes` · `parse-guard` · `pnpm-filter-targets` · `ratchet-remedy-authority` · `refd-timer-probe` · `watch-hint-literal`. - **exit 0, re-run (2 commands):** - `pnpm --filter @objectstack/lint run check:doc-formula-expressions` first exited 3 with PREREQUISITE NOT MET: `@objectstack/formula` and `@objectstack/lint` had no `dist/`, so nothing was measured. I built both under the verify lock and re-ran it: exit 0. - `pnpm check:pm-dispatch-gates`: my batch runner's time cap killed the first attempt. I ran it alone to completion: exit 0, `dispatch-gates self-test: 1976 cases pass`, battery 912.6 s on this shared box. - **exit 1 (1 command):** `pnpm check:platform-checklist`, on the one #20464 row only, as shown above. ## Changeset None needed. `docs/qa/**` and the root `scripts/` directory sit outside every package directory, and the root package is `private`. Across 81 tracked `package.json` files, no non-private package's `files[]` names either path. ⇒ `skip-changeset`. ## Acceptance notes - The `shape` legend in the ledger header still gives the per-shape counts from when the binding was made ("string-substring … 12 rows", "import-only … 6 rows", …). The 10 live rows are 5 / 3 / 2. These are old dated readings and not a defect. I did not touch them here because they are outside this card's 8 rows. Nobody is carrying this. - Self-test `D4` still reads "the `accept-set` rows are the minority and are named as a DIFFERENT card". It holds numerically (zero `accept-set` rows against ten `bad-citation` rows), but the label is out of date after the ruling. I kept the change to the surface the ruling names, so the label is not edited here. --- _Generated by [Claude Code](https://claude.ai/code/session_01JAhu8u8QfBvRjVZDox7CP9)_ Co-authored-by: Claude <noreply@anthropic.com>
1 parent 9b0de7d commit 1979df0

5 files changed

Lines changed: 39 additions & 30 deletions

File tree

‎docs/qa/platform-checklist/areas/dashboards.json‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -636,7 +636,7 @@
636636
"packages/qa/dogfood/test/date-bucket-parity-conformance.test.ts (#3773)",
637637
"packages/qa/dogfood/test/empty-group-bucket-parity.test.ts (#3839)",
638638
"examples/app-showcase/src/ui/dashboards/ops-dashboard.dashboard.ts#dateRange (dateRange + global filter levers)",
639-
"examples/app-showcase/src/data/seed/index.ts#signed_on (prospects carry no signed_on — the deliberate NULL population)"
639+
"examples/app-showcase/src/data/seed/index.ts#accounts (prospects carry no signed_on — the deliberate NULL population; re-pointed #18101: signed_on is a key written INLINE in each seed row, which the shared resolver does not read as a declaration, and accounts is the seed constant that declares those rows)"
640640
],
641641
"history": [
642642
{
@@ -749,7 +749,7 @@
749749
"source": [
750750
"examples/app-showcase/src/ui/dashboards/revenue-pulse.dashboard.ts (framework#2501 / objectui#2578 acceptance fixture)",
751751
"examples/app-showcase/src/ui/dashboards/ops-dashboard.dashboard.ts",
752-
"examples/app-showcase/src/data/seed/index.ts#sales_region (sales_region + signed_on seeding, prospects unset by design)",
752+
"examples/app-showcase/src/data/seed/index.ts#accounts (sales_region + signed_on seeding, prospects unset by design — re-pointed #18101: both keys are written INLINE in each seed row, which the shared resolver does not read as a declaration, and accounts is the seed constant that declares those rows)",
753753
"examples/app-showcase/src/coverage.ts (dashboard kind notes: revenue-pulse demonstrates dashboard-level filters)",
754754
"objectui packages/app-shell/src/views/metadata-admin/inspectors/DashboardWidgetInspector.tsx (Filter Bindings section — Apply toggle writes false for opt-out, field-override combo, data-testid widget-filter-binding-<name>, patches draft.widgets[i].filterBindings; objectui#2586)",
755755
"objectui packages/plugin-dashboard/src/DashboardFilterBar.tsx (isDirty→Reset affordance RotateCcw, data-testid dashboard-filter-bar; SelectFilter {value,label} options + server GROUP BY via queryDataset, #2578 item 5)",

‎docs/qa/platform-checklist/areas/identity-auth.json‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -358,7 +358,7 @@
358358
"packages/spec/src/identity/organization.zod.ts#InvitationSchema (InvitationSchema, InvitationStatus enum)",
359359
"packages/rest/src/rest-route-ledger.ts#REST_ROUTE_LEDGER (GET /api/v1/security/my-delegable-scope — security.describeDelegableScope, ADR-0090 D12 / ADR-0105 D8, self-scoped read half of the delegated-admin gate — re-pointed #18104: describeDelegableScope is a CLIENT METHOD name, carried in this file only inside a string value)",
360360
"packages/spec/src/contracts/security-service.ts#DelegableScope (DelegableScope: isTenantAdmin, scopes, placeableBusinessUnitIds, assignablePositions — no invitation-role field, which is why the scope read cannot be the invite picker's allowlist)",
361-
"packages/spec/src/kernel/public-auth-features.ts#sys_invitation (organization feature gates sys_invitation invite/cancel/resend actions)"
361+
"packages/spec/src/kernel/public-auth-features.ts#PUBLIC_AUTH_FEATURES.organization (organization feature gates sys_invitation invite/cancel/resend actions — re-pointed #18101: sys_invitation is carried in this file only as the HEAD of dotted action names, never as a complete quoted token, and the organization entry of PUBLIC_AUTH_FEATURES is the declaration that holds them)"
362362
],
363363
"history": [
364364
{ "revision": 1, "date": "2026-08-07", "change": "new item: invitation scope gates and lifecycle, pinned to the delegated-admin-invite dogfood test", "ref": "claude/platform-test-checklist-ocwugl" },
@@ -479,7 +479,7 @@
479479
"packages/plugins/plugin-auth/src/auth-route-ledger.ts#BETTER_AUTH_MOUNTED_SURFACE (BETTER_AUTH_MOUNTED_SURFACE admin/* rows: list-users, create-user, set-role, remove-user, revoke-user-session(s))",
480480
"packages/plugins/plugin-auth/src/admin-user-endpoints.ts#resolvePassword (create-user resolvePassword: explicit password wins over generatePassword — #3031/#3033; leaves sys_user + credential sys_account)",
481481
"packages/plugins/plugin-security/src/security-plugin.ts#SecurityPlugin (§A5 #3023 EXEMPTION: __referentialFieldClear owner_id-null cascade rides a server-derived context, the owner-anchor guard must not veto it — re-pointed #18104: __referentialFieldClear is a CONTEXT KEY this file only reads off opCtx.context, a member access; the guard that honours it is in the SecurityPlugin class this file declares) + security-plugin.test.ts '[#3023] … engine referential FK clear … is exempt'",
482-
"packages/spec/src/kernel/public-auth-features.ts#sys_user (admin flag gates the sys_user lifecycle actions; SCIM forces it on — ADR-0134)",
482+
"packages/spec/src/kernel/public-auth-features.ts#PUBLIC_AUTH_FEATURES.admin (admin flag gates the sys_user lifecycle actions; SCIM forces it on — ADR-0134; re-pointed #18101: sys_user is carried in this file only as the HEAD of dotted action names, never as a complete quoted token, and the admin entry of PUBLIC_AUTH_FEATURES is the declaration that holds the lifecycle ones)",
483483
"packages/qa/dogfood/test/admin-identity-audit-trail.dogfood.test.ts",
484484
"packages/plugins/plugin-auth/src/anonymous-session-refusal.ts#ANONYMOUS_SESSION_REFUSAL_STATUS (since #17881 an anonymous or revoked /get-session answers 401 with the ADR-0112 refusal envelope, code UNAUTHENTICATED derived from that status; a live session still answers 200 with { user, session }. Both legs are driven end to end in packages/plugins/plugin-auth/src/anonymous-session-refusal.test.ts, and the body-not-status discipline for a revoke is kept in packages/plugins/plugin-auth/src/session-of-record.test.ts)"
485485
],

‎docs/qa/platform-checklist/areas/integration-system.json‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,7 @@
256256
"source": [
257257
"docs/plans/release-15.1-test-plan.md §B4 (#3059)",
258258
"packages/connectors/connector-mcp/src/mcp-provider.ts (#3055 policy: default deny, strict-equality allowlist, both messages)",
259-
"examples/app-showcase/objectstack.config.ts#declarativeStdio (declarativeStdio: ['node'] opt-in) + src/system/connectors/index.ts (the 'remove that option and boot fails loudly — try it' fixture note)"
259+
"examples/app-showcase/objectstack.config.ts#plugins (declarativeStdio: ['node'] opt-in on the ConnectorMcpPlugin entry — re-pointed #18101: declarativeStdio is a key written INLINE in that constructor call, which the shared resolver does not read as a declaration, and the config itself is an anonymous default export, so plugins is the nearest enclosing key it does read) + src/system/connectors/index.ts (the 'remove that option and boot fails loudly — try it' fixture note)"
260260
],
261261
"history": [
262262
{
@@ -1406,7 +1406,7 @@
14061406
"packages/spec/src/shared/external-errors.ts#renderDiffMessage (renderDiffMessage + ExternalSchemaMismatchError — datasource, object, per-column diffs)",
14071407
"packages/cli/src/commands/serve.ts#ExternalDatasourceServicePlugin (ADR-0015 federation block — ExternalDatasourceServicePlugin + createExternalValidationPlugin wired unconditionally, best-effort dynamic import)",
14081408
"packages/spec/src/data/datasource.zod.ts#checkOnBoot (validation policy schema; checkOnBoot default true, the checkonboot/validateonboot alias rows are REJECTION-path did-you-means, not folds — enforced since #13149, so declared = enforced here now)",
1409-
"examples/app-showcase/src/system/datasources/showcase-external.datasource.ts#onMismatch (stock policy onMismatch:'warn' — deliberate, per its own comment)",
1409+
"examples/app-showcase/src/system/datasources/showcase-external.datasource.ts#ShowcaseExternalDatasource (stock policy onMismatch:'warn' — deliberate, per its own comment; re-pointed #18101: onMismatch is a key written INLINE in the external validation literal, which the shared resolver does not read as a declaration, and ShowcaseExternalDatasource is the datasource constant that declares it)",
14101410
"docs/adr/0015-external-datasource-federation.md §5.2"
14111411
],
14121412
"history": [

‎docs/qa/platform-checklist/areas/records-forms.json‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1387,7 +1387,7 @@
13871387
"source": [
13881388
"#3358 §4 ('leaving it unticked on the strength of a label')",
13891389
"ADR-0059",
1390-
"examples/app-showcase/src/ui/actions/index.ts#maxSize (maxSize declarations)"
1390+
"examples/app-showcase/src/ui/actions/index.ts#ActionParamGalleryAction (maxSize declarations on its image and file params — re-pointed #18101: maxSize is a key written INLINE in each param literal, which the shared resolver does not read as a declaration, and ActionParamGalleryAction is the action constant that declares those params)"
13911391
],
13921392
"history": [
13931393
{
@@ -2835,7 +2835,7 @@
28352835
},
28362836
"source": [
28372837
"objectui: packages/fields/src/widgets/LookupField.tsx (allowCreate default-on, SYSTEM_REFERENCE_RX / USER_DIRECTORY_REFS, isUserFacingReference, handleCreateNew), packages/fields/src/widgets/RecordPickerDialog.tsx (scoped find)",
2838-
"examples/app-showcase/src/data/objects/business-unit.object.ts#allowCreate + category.object.ts (parent allowCreate:true)",
2838+
"examples/app-showcase/src/data/objects/business-unit.object.ts#BusinessUnit.parent + category.object.ts (parent allowCreate:true — re-pointed #18101: allowCreate is a key written INLINE in the lookup options, which the shared resolver does not read as a declaration, and the parent field of the BusinessUnit object is the declaration that carries it)",
28392839
"PENDING-GAPS §B lookup-picker-create-new"
28402840
],
28412841
"history": [

‎scripts/check-platform-checklist.mjs‎

Lines changed: 31 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1920,8 +1920,8 @@ const CORPUS = defineCorpus({
19201920
// import-only persona whose constant had MOVED to another file (the path was
19211921
// re-pointed, not the symbol), a `.json` cross-area citation re-pointed at the
19221922
// `items` block it means, and the `detector-artifact` row above. ⚠️ That file
1923-
// still carries its 2 `accept-set` rows and that is CORRECT, not half-done:
1924-
// they are #18101's, and reaching them means widening the shared core.
1923+
// still carried its 2 `accept-set` rows after this slice, and that was
1924+
// CORRECT, not half-done: they were #18101's, drained by the ruling below.
19251925
// Third slice landed (#18104): `areas/cli.json`, `areas/platform-core.json`
19261926
// and `areas/records-forms.json` — 15 rows, the three largest remaining
19271927
// `bad-citation` blocks taken together. Two classes recur from the slices
@@ -1931,10 +1931,24 @@ const CORPUS = defineCorpus({
19311931
// pins the ADR-0112 SCREAMING_SNAKE one, a manifest VALUE re-pointed at the
19321932
// `scripts.dev` key pair that carries it, and a member read off a manifest or
19331933
// a capability re-pointed at the function whose body does the reading.
1934-
// ⚠️ `areas/records-forms.json` still carries its 2 `accept-set` rows, for
1935-
// the same reason `areas/identity-auth.json` does: that file mixes both
1934+
// ⚠️ `areas/records-forms.json` still carried its 2 `accept-set` rows, for
1935+
// the same reason `areas/identity-auth.json` did: that file mixes both
19361936
// verdicts, so a slice judges it ROW BY ROW BY VERDICT, never by file.
19371937
//
1938+
// ⭐ THE ACCEPT-SET DRAIN (#18101). The 8 `accept-set` rows left the same one
1939+
// way, under the ruling recorded on that card (comment 5748968793, letter C).
1940+
// ⛔ The shared core was NOT widened — neither toward a key written anywhere
1941+
// on a line nor toward the head segment of a dotted string, because a
1942+
// widening there lands on every corpus at once — and ⛔ no citation dropped
1943+
// to a bare one, which would delete a checkable pointer to satisfy a check.
1944+
// Each anchor was re-pointed at the nearest ENCLOSING declaration the
1945+
// resolver does read: the seed, datasource or action constant that declares
1946+
// the inline literal; the `plugins` key of a config whose default export has
1947+
// no name; the `PUBLIC_AUTH_FEATURES` entry that holds the dotted action
1948+
// names. A member segment rides on the constant only where the cited
1949+
// sentence names that member itself. The ceiling came down by the same 8 in
1950+
// the same edit.
1951+
//
19381952
// `verdict` is the classification #16898's acceptance asks for, and there are
19391953
// exactly two:
19401954
//
@@ -1943,30 +1957,25 @@ const CORPUS = defineCorpus({
19431957
// what the file carries, or drop to a bare citation. ⚠️ Dropping
19441958
// costs the file an anchor and most floors have no headroom, so
19451959
// re-pointing is the route and the sizing is its own card.
1946-
// accept-set (8 rows) the anchor names something real that the SHARED
1947-
// resolver's accept set does not reach — an object-literal key
1948-
// written INLINE rather than at the start of a line (6), and a
1949-
// DATA identifier that is the head segment of a dotted string
1950-
// token, `sys_user` in `'sys_user.actions.invite_user'` (2).
1951-
// ⛔ THAT IS A DIFFERENT CARD, against
1952-
// `scripts/symbol-anchors.mjs`, and ⛔ nothing here may widen
1953-
// the core to reach them: it is shared with four other corpora
1954-
// and widening it would export this defect to all of them.
1960+
// accept-set (0 rows — DRAINED, #18101) the anchor names something real
1961+
// that the SHARED resolver's accept set does not reach — an
1962+
// object-literal key written INLINE rather than at the start
1963+
// of a line, or a DATA identifier that is the head segment of
1964+
// a dotted string token, `sys_user` in
1965+
// `'sys_user.actions.invite_user'`. The verdict is kept because
1966+
// the shape is not gone: ruled C, its repair is the
1967+
// `bad-citation` one — re-point at the enclosing declaration
1968+
// the resolver reads, as the drain above did — and ⛔ never a
1969+
// widening of the core to reach the literal: it is shared with
1970+
// four other corpora and widening it would export this defect
1971+
// to all of them.
19551972
const SHARED_RESOLVER_RESIDUAL = Object.freeze([
19561973
{ doc: 'areas/ai.json', anchor: 'packages/mcp/src/plugin.ts#OS_MCP_SERVER_ENABLED', shape: 'string-substring', verdict: 'bad-citation' },
19571974
{ doc: 'areas/ai.json', anchor: 'packages/runtime/src/domains/ai.ts#capabilityUnavailable', shape: 'import-only', verdict: 'bad-citation' },
19581975
{ doc: 'areas/approvals.json', anchor: 'examples/app-showcase/src/security/seed-approval-demo.ts#AUDITOR_DEMO_USER', shape: 'import-only', verdict: 'bad-citation' },
19591976
{ doc: 'areas/attachments-storage.json', anchor: 'packages/spec/liveness/field.json#live', shape: 'json-value-not-key', verdict: 'bad-citation' },
1960-
{ doc: 'areas/dashboards.json', anchor: 'examples/app-showcase/src/data/seed/index.ts#sales_region', shape: 'inline-key', verdict: 'accept-set' },
1961-
{ doc: 'areas/dashboards.json', anchor: 'examples/app-showcase/src/data/seed/index.ts#signed_on', shape: 'inline-key', verdict: 'accept-set' },
1962-
{ doc: 'areas/identity-auth.json', anchor: 'packages/spec/src/kernel/public-auth-features.ts#sys_invitation', shape: 'dotted-string-head', verdict: 'accept-set' },
1963-
{ doc: 'areas/identity-auth.json', anchor: 'packages/spec/src/kernel/public-auth-features.ts#sys_user', shape: 'dotted-string-head', verdict: 'accept-set' },
1964-
{ doc: 'areas/integration-system.json', anchor: 'examples/app-showcase/objectstack.config.ts#declarativeStdio', shape: 'inline-key', verdict: 'accept-set' },
1965-
{ doc: 'areas/integration-system.json', anchor: 'examples/app-showcase/src/system/datasources/showcase-external.datasource.ts#onMismatch', shape: 'inline-key', verdict: 'accept-set' },
19661977
{ doc: 'areas/integration-system.json', anchor: 'packages/services/service-messaging/src/messaging-service.ts#PreferenceResolver', shape: 'import-only', verdict: 'bad-citation' },
19671978
{ doc: 'areas/integration-system.json', anchor: 'packages/spec/liveness/email_template.json#requireVars', shape: 'json-value-not-key', verdict: 'bad-citation' },
1968-
{ doc: 'areas/records-forms.json', anchor: 'examples/app-showcase/src/data/objects/business-unit.object.ts#allowCreate', shape: 'inline-key', verdict: 'accept-set' },
1969-
{ doc: 'areas/records-forms.json', anchor: 'examples/app-showcase/src/ui/actions/index.ts#maxSize', shape: 'inline-key', verdict: 'accept-set' },
19701979
{ doc: 'areas/studio-authoring.json', anchor: 'packages/objectql/src/overlay-precedence.test.ts#not_overridable', shape: 'string-substring', verdict: 'bad-citation' },
19711980
{ doc: 'areas/studio-authoring.json', anchor: 'packages/rest/src/meta-write-actor-identity.test.ts#Actor', shape: 'string-substring', verdict: 'bad-citation' },
19721981
{ doc: 'areas/studio-authoring.json', anchor: 'packages/rest/src/rest-route-ledger.ts#getHistory', shape: 'string-substring', verdict: 'bad-citation' },
@@ -1977,7 +1986,7 @@ const SHARED_RESOLVER_RESIDUAL = Object.freeze([
19771986
// fail), so this is the belt on the braces: a silent append — the one edit that
19781987
// would turn a closed ledger back into a permissive rule, one row at a time —
19791988
// refuses here rather than validating.
1980-
const SHARED_RESOLVER_RESIDUAL_CEILING = 18;
1989+
const SHARED_RESOLVER_RESIDUAL_CEILING = 10;
19811990

19821991
const residualKey = (doc, anchor) => `${doc}::${anchor}`;
19831992
const SHARED_RESOLVER_RESIDUAL_INDEX = new Map(

0 commit comments

Comments
 (0)