Skip to content

test(cli),fix(sharing): migrate-meta end-to-end proof + inert-rule warn dedup — the last two finishing touches - #4066

Merged
os-zhuang merged 2 commits into
mainfrom
claude/sharing-rules-schema-bypass-h4c7xr
Jul 30, 2026
Merged

test(cli),fix(sharing): migrate-meta end-to-end proof + inert-rule warn dedup — the last two finishing touches#4066
os-zhuang merged 2 commits into
mainfrom
claude/sharing-rules-schema-bypass-h4c7xr

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Two independent finishing touches on the #3896 line, batched as one small PR now that the close-out sweep (#4054) is merged.

1. os migrate meta gets its end-to-end proof (packages/cli/test/migrate-meta.e2e.test.ts)

The chain's transforms are fixture-tested in @objectstack/spec, but the COMMAND path — config loading via bundleRequire, chain attribution, the schema-validity verdict, the machine JSON shape, --out snapshots, the support-floor refusal — had no test at all. This spawns the REAL CLI (bin/run-dev.js via tsx) against a temp project authored in the pre-protocol-17 dialect, exercising one key from every v17 conversion family in a single pass — exactly the cross-major "consumer upgrades" scenario the command exists for.

Six tests pin:

2. Inert-rule warn dedup + boot aggregate (#3929 follow-up)

isInertMatchAll warned on EVERY pass — findMatchingRecords per evaluation AND recordMatches per reconciled write — so one bad rule spams production logs. Two layers now:

  • Per-rule dedup (sharing-rule-service.ts): a inertRuleSeen set keyed by rule.id ?? rule.name logs once per rule per process, and the message says so ("fix the criteria or set active: false"). A readonly inertRuleNames accessor exposes the set.
  • Boot aggregate (sharing-plugin.ts): backfillRuleGrants emits ONE summary warn after the loop with {count, rules} — the rules matching no records, whose grants are revoked on reconcile (ADR-0049).

Enforcement is unchanged — inert rules still match zero records; only the logging is deduplicated. The new boot-backfill tests pin exactly that: 2 inert rules × 4 evaluations → exactly 2 per-rule warns (per DISTINCT rule, not per pass), zero sys_record_share writes throughout, exactly 1 aggregate with count=2 and sorted rule ids, no re-warn during backfill.

Verification

  • migrate-meta e2e: 6/6 over the real CLI process.
  • plugin-sharing: 225/225 (11 files).
  • Both suites run against dists rebuilt from this head; tsc and ESLint clean; patch changeset for @objectstack/plugin-sharing (the e2e test is test-only, no changeset needed).

Generated by Claude Code

claude added 2 commits July 30, 2026 07:41
…ver a pre-17 project

The chain's transforms were fixture-tested in spec, but the COMMAND path —
bundleRequire config loading, the convert:false normalization that keeps
rewrites attributable to chain hops, the schema-validity verdict, the machine
JSON shape, --out snapshots, the support-floor refusal — had no test.

Spawns bin/run-dev.js against a temp project authored in the pre-17 dialect
(one key from every v17 conversion family in a single pass) and pins:
- all 11 v17 conversion families attribute at least one rewrite;
- semantic TODOs surface with reason + acceptanceCriteria, never auto-apply;
- the --out snapshot re-parses under the CURRENT schema, with per-family
  spot-checks (execute→target, storage.notNull stamped on the required
  field and NOT on the optional one, full→edit, every close-out key gone,
  and the canonical protocol-11 filter key passing through untouched);
- CHAIN IDEMPOTENCE end-to-end: replaying --from 16 on the migrated
  snapshot applies zero changes and stays schema-valid;
- --from 9 exits non-zero with the structured unsupported_from_major error.

Fixture authoring found one doc-comment error in my own draft: the
filters→filter alias is protocol-11 dialect, not 16 — a 16-authored source
already says filter, and the test now pins the pass-through instead.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QuViRSR1j6GJjf9qGbnqFX
The fail-closed evaluator warned on EVERY pass (findMatchingRecords per
evaluation AND recordMatches per reconciled write) — one legacy
criteria-less rule could dominate a deployment's log. Now: once per rule
per process (instance Set, message says so and names the fix), plus one
aggregate line from the boot backfill (count + rule names). Enforcement
unchanged on every pass — the dedup test pins zero grants throughout and
that the backfill walk does not re-warn per rule.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QuViRSR1j6GJjf9qGbnqFX
@vercel

vercel Bot commented Jul 30, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectstack Ignored Ignored Jul 30, 2026 7:47am

Request Review

@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 2 package(s): @objectstack/cli, @objectstack/plugin-sharing.

21 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:

  • content/docs/ai/skills-reference.mdx (via packages/cli)
  • content/docs/api/client-sdk.mdx (via @objectstack/cli)
  • content/docs/api/data-flow.mdx (via @objectstack/cli)
  • content/docs/api/environment-routing.mdx (via @objectstack/cli)
  • content/docs/api/error-catalog.mdx (via @objectstack/cli)
  • content/docs/automation/hook-bodies.mdx (via packages/cli)
  • content/docs/deployment/backup-restore.mdx (via @objectstack/cli)
  • content/docs/deployment/cli.mdx (via @objectstack/cli)
  • content/docs/deployment/self-hosting.mdx (via @objectstack/cli)
  • content/docs/getting-started/your-first-project.mdx (via @objectstack/cli)
  • content/docs/kernel/runtime-services/data-service.mdx (via packages/cli)
  • content/docs/kernel/runtime-services/index.mdx (via packages/cli)
  • content/docs/permissions/authentication.mdx (via @objectstack/cli)
  • content/docs/permissions/authorization.mdx (via packages/plugins/plugin-sharing)
  • content/docs/permissions/permissions-matrix.mdx (via packages/plugins/plugin-sharing)
  • content/docs/plugins/packages.mdx (via @objectstack/cli, @objectstack/plugin-sharing)
  • content/docs/protocol/kernel/plugin-spec.mdx (via @objectstack/cli)
  • content/docs/protocol/kernel/realtime-protocol.mdx (via @objectstack/cli)
  • content/docs/protocol/objectql/security.mdx (via packages/plugins/plugin-sharing)
  • content/docs/releases/implementation-status.mdx (via @objectstack/cli)
  • content/docs/releases/v16.mdx (via @objectstack/cli)

Advisory only. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs origin/main → pass the list as args.docs.

@github-actions github-actions Bot added documentation Improvements or additions to documentation tests tooling size/m labels Jul 30, 2026
@os-zhuang
os-zhuang marked this pull request as ready for review July 30, 2026 08:19
@os-zhuang
os-zhuang merged commit 71af9f5 into main Jul 30, 2026
17 checks passed
@os-zhuang
os-zhuang deleted the claude/sharing-rules-schema-bypass-h4c7xr branch July 30, 2026 08:19
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/m tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants