Skip to content

refactor(plugin-audit)!: retire restore from the sys_audit_log action enum (#8315) - #8325

Merged
os-zhuang merged 7 commits into
mainfrom
claude/issue-8315-retire-restore-action
Aug 13, 2026
Merged

refactor(plugin-audit)!: retire restore from the sys_audit_log action enum (#8315)#8325
os-zhuang merged 7 commits into
mainfrom
claude/issue-8315-retire-restore-action

Conversation

@os-zhuang

@os-zhuang os-zhuang commented Aug 13, 2026

Copy link
Copy Markdown
Contributor

Fixes #8315

restore is retired from the sys_audit_log.action enum. It is the last unresolved
value from #7675's survey, and the least ambiguous member of the family: the
record-level audit writer could not have produced it even by accident, because
actionFor() in plugin-audit/src/audit-writers.ts is typed

function actionFor(event: string): 'create' | 'update' | 'delete' | null

and its caller early-returns on null. A tree-wide sweep (below) finds no other
producer in this repo. There is no undelete capability behind the value either —
soft delete/restore is unbuilt and parked (#1883 pm:on-hold, #3146 status:parked).

This is the inherited #7675-family ruling —「空 widget + 永远查不到东西的过滤器是可见产品
缺陷;审计面宁窄勿谎」— carried by triage from #8147 / PR #8200, which performed the same
operation on export and permission_change. Not re-adjudicated here.

⚠️ The retirement is a statement about the WRITER, not a product stance against
undelete.
If the restore capability lands (#1883 / #3146 restart), the enum value
returns with its writer — the emission point, its tests, and the view that surfaces
it — never as a bare enum row again. That sentence is in the code comment, the
changeset, and the ADR-0087 ledger entry, so it survives this PR.

What made it a card and not a tidy-up

Two shipped declarations asserted the opposite, so a declaration-reading audit stopped
and scored the action as covered:

  1. A permanently-unmatchable filter. The writes_only list view offered restore
    as a filter value — narrowed here to ['create', 'update', 'delete'], which is now
    exactly what actionFor() can emit. (The card's text calls this view data_changes;
    its actual name in sys-audit-log.object.ts is writes_only. Same line, same
    filter — noting it so the discrepancy is not read as a second surface.)
  2. A false coverage comment, plugin-audit/src/auth-event-audit.ts:11, which said
    the writer emits "create/update/delete/restore and nothing else". That was
    false the day it was written and contradicted by the type signature four files away —
    the ADR-0049 declared-≠-enforced shape in its purest form ([security] verify the unverified "hashed / encrypted at rest" claims on sys_scim_provider.scim_token and sys_oauth_application.client_secret — both are plain Field.text and API-readable #8011): a sentence next to
    a mechanism, with nothing in CI able to tell. Corrected, with the correction recorded
    in place rather than silently overwritten.

The invariant the comment was really claiming — every declared action has a writer
is now a pin test with the writer inventory written as literals, not prose. It
asserts set equality in both directions, so it also catches the strictly worse inverse:
an action the platform writes and the object does not declare.

Consumer sweep for restore

Every hit read, not counted.

where what disposition
plugin-audit/.../sys-audit-log.object.ts:125 the enum removed
plugin-audit/.../sys-audit-log.object.ts:55 writes_only view filter narrowed
plugin-audit/src/translations/*.objects.generated.ts:27 (4 locales) option label regenerated
plugin-audit/src/auth-event-audit.ts:11 the false coverage comment corrected
platform-objects/.../system_overview.dashboard.ts audit widgets no restore widget exists — the open widget card #8148 is about permission_change only

No test, fixture, dogfood case or dashboard dataset in this repo references the audit
restore action. Everything else the sweep surfaced is a different vocabulary that
merely shares the word, and is deliberately untouched: the ObjectPermission operation
enum (read/create/update/delete/transfer/restore/purge in plugin-security,
spec/src/security/explain.zod.ts, spec/src/api/protocol.zod.ts, client), the
derived ApiOperation verb list (spec/src/data/object.zod.ts:35,64), the
restore_api_key record action on sys_api_key, and sys-attachment.object.ts:138's
restore: false capability declaration.

Downstream, in other repos — reported, not touched

  • objectuiapps/console/src/pages/system/AuditLogPage.tsx lists restore in
    ACTION_OPTIONS (the audit-log filter dropdown, so this is the user-visible half:
    an operator can pick a value that returns nothing) and in ACTION_VARIANT;
    packages/plugin-detail/src/HistoryTimeline.tsx has a restore arm in its own
    ACTION_VARIANT. objectui#4476 already covers this console surface for the other
    retired values and needs restore added to its scope. Not edited from this PR.
  • cloudpackages/service-cloud/src/audit-helpers.ts:60 hand-mirrors the action
    vocabulary as a TS union on recordAuditRow, and that union still names both
    restore and export (the latter already retired by audit-log (C): retire export / import / permission_change from the sys_audit_log action enum and its in-repo consumer surfaces (ADR-0087 registration) #8147). No caller passes
    either — the two live call sites pass update and delete — so nothing writes an
    undeclared row today; the union is a stale copy of a contract that has moved twice.
    Reported for routing, not edited.

Ablation (predicted before measured)

Mutation: put restore back in both places in sys-audit-log.object.ts, everything
else held.

arm predicted measured
restore is not declared by the action enum RED RED
restore is not named by any shipped list-view filter RED RED — names the offending view (writes_only)
every list-view action filter names a value the enum still declares GREEN — reverting both sides keeps filter and enum consistent; this case is the one-sided detector GREEN
the action enum declares exactly the actions that have a writer RED RED
the four #8147 cases + import case + rest of suite GREEN GREEN — 3 failed, 213 passed
check:i18n (plugin-audit) RED, bundle drift RED — "4 bundle(s) drifted", exit 1
check:migration-registry / check:spec-changes / check:upgrade-guide GREEN — nothing cross-checks a ledger entry against the live enum PASS / PASS / PASS
plugin-audit typecheck GREEN — nothing derives a TS union from this enum, and the enum is unenforced at runtime PASS

Zero divergence, arms predicted at 3 failures and measured at exactly 3. The negative
arms are the load-bearing half: the ADR-0087 registration is not a detector, and
neither the type system nor the runtime can see this class of defect — every
sys_audit_log field is readonly: true and validateRecord skips readonly fields, so
re-adding a value rejects nothing anywhere. The only two mechanical detectors are the
pin test and the i18n bundle ratchet, which is exactly why the pin test's expectations
are literals: expectation and reality must not derive from the same source.

Breaking-change classification

minor on @objectstack/plugin-audit and @objectstack/spec, with a refactor(...)!
commit and a BREAKING changeset body — the #8147 / PR #8200 classification,
unchanged. Retiring a declared enum value is breaking; major is refused by
check-changeset-no-major under the launch-window lockstep convention, so the break is
carried by the ! and the changeset prose rather than by the semver digit. Both packages
sit in the same fixed group in .changeset/config.json, so they move together anyway.

ADR-0087: registered as the semantic migration audit-log-action-restore-retired
(D3 step 17) — a separate entry from #8147's audit-log-action-enum-retired, per
entries/README.md: two cards registering different entries merge clean, while two cards
editing the same entry collide in git, which is the behaviour that layout deliberately
buys on a registry where a dropped entry produces no error anywhere. An enum-VALUE
retirement, so nothing lands in RETIRED_KEYS_BY_MAJOR and the four surface ratchets are
byte-identical by construction — verified, check:authorable-surface passes with 1266
defaults unchanged.

⚠️ Note for reviewers of the first push: the gate that failed there was
check-adr-0087-registration, and not for a missing marker. The marker was present
from the first commit; the gate resolves the id against the generated registry.ts,
which had not been regenerated yet. The entry file alone is not enough — the three
projections (registry.ts, spec-changes.json, protocol-upgrade-guide.md) have to be
regenerated and committed, which is the second commit here.

Verification

All run locally in this worktree, foreground, serialized on the shared lock.

  • plugin-audit216 tests / 14 files pass (213 + the 3 new cases).
  • plugin-audit typecheck, spec typecheck — pass.
  • Gates: check:nul-bytes, check:empty-changeset, check:adr-0087-registration,
    check:changeset-gate-self-tests (covers check-changeset-no-major), check:i18n
    (all 9 packages in sync), check:adr-anchors, check:docs-audit-scope,
    check:engine-double-contract, and spec's check:migration-registry,
    check:spec-changes, check:upgrade-guide, check:authorable-surfaceall pass.
  • Translation bundles regenerated with node scripts/check-i18n-bundles.mjs --write --filter=audit (which runs the built CLI's os i18n extract with the flags the
    config's own docstring documents) — not hand-edited. It produced a real diff: one
    removed option label in each of the four locales.

#7675 cannot close on this PR

restore was its last unresolved enum value, but two sub-issues remain open and both
are named in #7675's own symptom text:

Post-merge regeneration round (main moved 7 commits underneath this branch)

origin/main was merged in at cca6f857 and the three ADR-0087 projections were
regenerated on the merged tree at c985c4a6. Regeneration was not a no-op, and the
measurement is worth recording because it is the whole reason this round exists.

artifact plain merge vs regenerated
packages/spec/src/migrations/registry.ts byte-identical — spliced correctly, regenerated to the same 78 semantic entries
packages/spec/spec-changes.json differed, +26 lines
docs/protocol-upgrade-guide.md differed, +10 lines

What the plain merge was missing, in both prose projections, was two sibling PRs'
entries
view-export-options-pdf-removed (#8010 / PR #8324) and
engine-dotted-projection-refused (#7589 / PR #8327). Both are present in
origin/main's copies; both were absent after the conflict-free merge; both came back on
regeneration. Verified by counting occurrences in all three versions of each file.

The mechanism, stated correctly

This is not git silently losing data, and the commit message on c985c4a6 overstates
it in exactly that direction — I am correcting it here rather than force-pushing an
amended message. .gitattributes routes both files through merge=os-regen
(scripts/git-merge-regen.mjs), a driver that deliberately refuses to text-merge
generator-owned artifacts: it takes one side, marks the artifact deferred, and a commit
hook then blocks the commit until the generator has run. That hook fired on my commit and
cleared itself once both files were current:

os-regen: 2 generated artifact(s) were merged WITHOUT a text merge and must be
          regenerated from the merged tree before this commit.
  ✓ packages/spec/spec-changes.json — current
  ✓ docs/protocol-upgrade-guide.md — current

So the "missing" entries were the designed intermediate state, not corruption.
registry.ts is deliberately not driver-managed (it is listed under
NOT_DRIVER_MANAGED) and text-merged fine, which is #7297's per-entry-file sharding
working as intended at the source.

Severity, measured rather than asserted

Against the un-regenerated merge:

gate result on the plain merge
check:spec-changes FAIL (exit 1)
check:upgrade-guide FAIL (exit 1)
check:migration-registry PASS

So this class does not ship silently — it is caught. The cost it would have been caught
at is the merge-queue ejection, which is what regenerating beforehand buys.

⚠️ This round is durable only until main next touches those two files. The local
merge driver is a local facility: .gitattributes says so explicitly, and notes that the
GitHub merge queue rebuilds each PR server-side where no custom merge driver runs.
spec-changes.json and protocol-upgrade-guide.md are single files, not sharded. If
another ADR-0087 entry lands on main before this PR is queued, the same
merge-then-regenerate lap is needed again.

Re-verified on the merged tree

check:migration-registry (78 semantic / 27 retired-key / 53 retired-def),
check:spec-changes, check:upgrade-guide, check:adr-0087-registration (marker still
resolves), check:i18n (9 packages in sync) — all PASS. Plus, since main moved seven
commits including objectql behaviour changes: plugin-audit 216/216 tests pass,
plugin-audit typecheck PASS, spec typecheck PASS. The retirement itself is intact
after the merge — the enum is ['create', 'update', 'delete', 'login', 'logout', 'config_change', 'import'] and the writes_only filter is ['create', 'update', 'delete'].

Changeset classification untouched, no ratchet touched — this round was regeneration only.


Generated by Claude Code


Generated by Claude Code

… enum (#8315)

`restore` was declared by `sys_audit_log.action` with no writer anywhere in the
repo, and the record-level writer structurally cannot produce it: `actionFor()`
returns `'create' | 'update' | 'delete' | null`. Retired under the maintainer
ruling of 2026-08-12 on #7675, carried by triage — the same operation #8147
performed on `export` / `permission_change`.

Also corrects the false coverage comment in `auth-event-audit.ts`, which named
`restore` among the actions the writer emits, and narrows the `writes_only`
list-view filter to what `actionFor()` can actually emit.

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

vercel Bot commented Aug 13, 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 Aug 13, 2026 11:44am

Request Review

@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

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

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

  • content/docs/ai/agents.mdx (via @objectstack/spec)
  • content/docs/ai/skills-reference.mdx (via @objectstack/spec)
  • content/docs/ai/skills.mdx (via @objectstack/spec)
  • content/docs/api/client-sdk.mdx (via @objectstack/spec)
  • content/docs/api/environment-routing.mdx (via @objectstack/spec)
  • content/docs/api/error-catalog.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-client.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-server.mdx (via @objectstack/spec)
  • content/docs/api/index.mdx (via @objectstack/spec)
  • content/docs/automation/approvals.mdx (via @objectstack/spec)
  • content/docs/automation/connectors.mdx (via @objectstack/spec)
  • content/docs/automation/flows.mdx (via @objectstack/spec)
  • content/docs/automation/hook-bodies.mdx (via packages/spec)
  • content/docs/automation/hooks.mdx (via @objectstack/spec)
  • content/docs/automation/index.mdx (via @objectstack/spec)
  • content/docs/automation/webhooks.mdx (via @objectstack/spec)
  • content/docs/automation/workflows.mdx (via @objectstack/spec)
  • content/docs/concepts/architecture.mdx (via @objectstack/spec)
  • content/docs/concepts/design-principles.mdx (via packages/spec)
  • content/docs/concepts/index.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-driven.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-lifecycle.mdx (via packages/spec)
  • content/docs/concepts/north-star.mdx (via @objectstack/spec)
  • content/docs/data-modeling/analytics.mdx (via @objectstack/spec)
  • content/docs/data-modeling/drivers.mdx (via @objectstack/spec)
  • content/docs/data-modeling/external-datasources.mdx (via @objectstack/spec)
  • content/docs/data-modeling/field-types.mdx (via @objectstack/spec)
  • content/docs/data-modeling/fields.mdx (via @objectstack/spec)
  • content/docs/data-modeling/formulas.mdx (via @objectstack/spec)
  • content/docs/data-modeling/index.mdx (via @objectstack/spec)
  • content/docs/data-modeling/objects.mdx (via @objectstack/spec)
  • content/docs/data-modeling/queries.mdx (via @objectstack/spec)
  • content/docs/data-modeling/schema-design.mdx (via @objectstack/spec)
  • content/docs/data-modeling/seed-data.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation-rules.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation.mdx (via @objectstack/spec)
  • content/docs/deployment/cli.mdx (via @objectstack/plugin-audit, @objectstack/spec)
  • content/docs/deployment/production-readiness.mdx (via @objectstack/plugin-audit)
  • content/docs/deployment/tenancy-modes.mdx (via @objectstack/spec)
  • content/docs/deployment/troubleshooting.mdx (via @objectstack/spec)
  • content/docs/deployment/validating-metadata.mdx (via @objectstack/spec)
  • content/docs/getting-started/build-with-claude-code.mdx (via @objectstack/spec)
  • content/docs/getting-started/common-patterns.mdx (via @objectstack/spec)
  • content/docs/getting-started/examples.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-reference.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-start.mdx (via @objectstack/spec)
  • content/docs/getting-started/your-first-project.mdx (via @objectstack/spec)
  • content/docs/kernel/cluster.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/auth-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/cache-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/data-engine.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/index.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/metadata-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/storage-service.mdx (via @objectstack/spec)
  • content/docs/kernel/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/data-service.mdx (via @objectstack/spec)
  • content/docs/kernel/runtime-services/email-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/examples.mdx (via @objectstack/spec)
  • content/docs/kernel/runtime-services/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/queue-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/sharing-service.mdx (via @objectstack/spec)
  • content/docs/kernel/runtime-services/sms-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/storage-service.mdx (via @objectstack/spec)
  • content/docs/kernel/services-checklist.mdx (via @objectstack/spec)
  • content/docs/kernel/services.mdx (via @objectstack/spec)
  • content/docs/permissions/authorization.mdx (via @objectstack/spec)
  • content/docs/permissions/permission-sets.mdx (via @objectstack/spec)
  • content/docs/permissions/permissions-matrix.mdx (via @objectstack/spec)
  • content/docs/permissions/positions.mdx (via @objectstack/spec)
  • content/docs/permissions/rls.mdx (via @objectstack/spec)
  • content/docs/permissions/sharing-rules.mdx (via @objectstack/spec)
  • content/docs/permissions/system-context.mdx (via packages/spec)
  • content/docs/plugins/adding-a-metadata-type.mdx (via @objectstack/spec)
  • content/docs/plugins/development.mdx (via @objectstack/spec)
  • content/docs/plugins/index.mdx (via @objectstack/spec)
  • content/docs/plugins/packages.mdx (via @objectstack/plugin-audit, @objectstack/spec)
  • content/docs/protocol/backward-compatibility.mdx (via @objectstack/spec)
  • content/docs/protocol/diagram.mdx (via packages/spec)
  • content/docs/protocol/kernel/config-resolution.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/http-protocol.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/i18n-standard.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/index.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/lifecycle.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/plugin-spec.mdx (via @objectstack/spec)
  • content/docs/protocol/knowledge.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/query-syntax.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/schema.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/security.mdx (via packages/spec)
  • content/docs/protocol/objectql/state-machine.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/actions.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/concept.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/layout-dsl.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/record-alert.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/widget-contract.mdx (via @objectstack/spec)
  • content/docs/ui/actions.mdx (via @objectstack/spec)
  • content/docs/ui/apps.mdx (via @objectstack/spec)
  • content/docs/ui/create-vs-edit-form.mdx (via @objectstack/spec)
  • content/docs/ui/dashboards.mdx (via @objectstack/spec)
  • content/docs/ui/field-grouping-and-order.mdx (via @objectstack/spec)
  • content/docs/ui/forms.mdx (via @objectstack/spec)
  • content/docs/ui/index.mdx (via @objectstack/spec)
  • content/docs/ui/public-data-collection.mdx (via @objectstack/spec)
  • content/docs/ui/setup-app.mdx (via @objectstack/spec)
  • content/docs/ui/translations.mdx (via @objectstack/spec)
  • content/docs/ui/views.mdx (via @objectstack/spec)

7 release-owned page(s) also reference the affected code. These are read-only:

  • content/docs/releases/implementation-status.mdx (via @objectstack/plugin-audit, @objectstack/spec)
  • content/docs/releases/index.mdx (via @objectstack/spec)
  • content/docs/releases/v12.mdx (via @objectstack/spec)
  • content/docs/releases/v13.mdx (via @objectstack/spec)
  • content/docs/releases/v16.mdx (via @objectstack/spec)
  • content/docs/releases/v17.mdx (via @objectstack/spec)
  • content/docs/releases/v9.mdx (via @objectstack/spec)

content/docs/releases/ is RELEASE-OWNED (AGENTS.md "Documentation Guardrails"): release
notes are written centrally at release time, and a code PR that edits them is the exact PR
that guardrail exists to stop. They are still audited — read-only. If one of them is actually
wrong, file an issue or open a dedicated docs-only PR; do not edit it here.

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 labels Aug 13, 2026
claude added 3 commits August 13, 2026 05:41
…og-action-restore-retired (#8315)

`registry.ts`'s semantic table is GENERATED from `entries/` (#7297), and
`spec-changes.json` + `docs/protocol-upgrade-guide.md` are projections of that
registry. The entry file alone leaves the id absent from all three, which is
exactly what `check-adr-0087-registration` reads when it resolves a changeset's
`registered <id>` marker.

Ran, in order:
  pnpm --filter @objectstack/spec gen:migration-registry
  pnpm --filter @objectstack/spec gen:spec-changes
  pnpm --filter @objectstack/spec gen:upgrade-guide

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PEVB6w7D7uCszR9Mw1BL73
… retirement (#8315)

Four locales lose the `sys_audit_log.action.restore` option label. Produced by
`node scripts/check-i18n-bundles.mjs --write --filter=audit` (which runs the
built CLI's `os i18n extract` with the flags the config's own docstring
documents) — not hand-edited.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PEVB6w7D7uCszR9Mw1BL73
…8315)

The merge with main was textually conflict-free, but a conflict-free merge of
two independently-regenerated projections is not the generator's output.
Measured on this tree: the plain merge result was MISSING two sibling PRs'
entries from `spec-changes.json` and `docs/protocol-upgrade-guide.md` —
`view-export-options-pdf-removed` (#8010 / PR #8324) and
`engine-dotted-projection-refused` (#7589 / PR #8327). Both are present in
origin/main's copies of those artifacts; git dropped them while reporting no
conflict.

`registry.ts` spliced correctly and regenerated byte-identical (78 semantic
entries) — the loss was confined to the two prose projections.

Not a silent class: against the un-regenerated merge, `check:spec-changes` and
`check:upgrade-guide` both FAIL (exit 1) while `check:migration-registry`
passes. So this would have been caught — in the merge queue, as an ejection.
Regenerating before arming is what makes it cost nothing.

Ran on the merged tree, merge committed first:
  pnpm --filter @objectstack/spec gen:migration-registry
  pnpm --filter @objectstack/spec gen:spec-changes
  pnpm --filter @objectstack/spec gen:upgrade-guide

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PEVB6w7D7uCszR9Mw1BL73
claude added 2 commits August 13, 2026 11:43
…gain (#8315)

Third lap of merge-then-regenerate; main moved 25 commits while CI was green and
the arm was held. The conflict-free merge again left the two driver-managed
prose projections stale, this time missing `datasource-config-url-userinfo-refused`
(#8082 / PR #8341): present in origin/main's copies, absent after the merge,
restored by regeneration.

Round-2's prediction held exactly. `registry.ts` is byte-identical to the plain
merge (79 semantic entries) because it is NOT_DRIVER_MANAGED and #8341 added a
NEW entry file — the #7297 per-entry-file sharding removes the conflict at the
source. The two `merge=os-regen` projections are the ones that needed the
generator: spec-changes.json +14 lines, protocol-upgrade-guide.md +3.

Regeneration only — no code change, no changeset reclassification, no ratchet.
Merge committed first, then:
  pnpm --filter @objectstack/spec gen:migration-registry
  pnpm --filter @objectstack/spec gen:spec-changes
  pnpm --filter @objectstack/spec gen:upgrade-guide

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PEVB6w7D7uCszR9Mw1BL73
@os-zhuang
os-zhuang marked this pull request as ready for review August 13, 2026 12:05
@os-zhuang
os-zhuang added this pull request to the merge queue Aug 13, 2026
Merged via the queue into main with commit 4827e91 Aug 13, 2026
27 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-8315-retire-restore-action branch August 13, 2026 12:23
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

2 participants