Repository navigation
docs(changeset): five pending notes state what the next 18.0.0 prerelease ships, amended in place (Hono currentRecord; organization_id drop gate) - #23707
Conversation
…release ships, amended in place The two earlier pending notes said a Hono door's 409 CONCURRENT_UPDATE holds currentRecord back; a later same-release change forwards it, the caller's own read of the row. Each note now states the shipped behaviour, and the later note's FROM names the body the last published prerelease answered, so no entry describes a body no release shipped. Claude-Session: https://claude.ai/code/session_01Q9PZ5Pzqcus4woVvTZwWNU Co-authored-by: Claude <noreply@anthropic.com>
…lease-text-in-place
…at the release ships, amended in place The v18 boot-refusal note said os migrate apply --allow-destructive refuses the organization_id drop only on the ceremony's inventory tables; a later same-release change holds back every such drop. The note now states the shipped behaviour, and the later note's FROM names the behaviour the last published prerelease had (no drop held back), so no entry describes a gate no release shipped. Claude-Session: https://claude.ai/code/session_01Q9PZ5Pzqcus4woVvTZwWNU Co-authored-by: Claude <noreply@anthropic.com>
席位复核: REWORK, patch round 1 (the same family, two more pending notes) · 2026-10-15T17:34Z
What holds (read on GitHub, not from the report): all 12 rows of the before / after table.
Item 1: the dev's two out-of-scope findings are this card's own family. They are folded into this PR, and the claim's file surface widens by exactly these files.
Everything else is unchanged: no code, test or docs page, no Generated by Claude Code |
…he in-place amendment The createHonoApp note's known-gap paragraph now states the two fields the release's 409 carries. The sys_metadata family note states the trail doors' admission after the setup.access narrowing. The two Hono conflict notes name each door's last-published answer in their FROM: a HonoHttpServer route answered code and message, createHonoApp a 500. The trail-door note no longer says the data door "already" refused. Claude-Session: https://claude.ai/code/session_01Q9PZ5Pzqcus4woVvTZwWNU Co-authored-by: Claude <noreply@anthropic.com>
…ast-published answer and the duplicate insert's translation Its FROM and "unchanged" sentence now say what each door answered in the last published prerelease: a HonoHttpServer route answered code and message, createHonoApp a 500. Its duplicate-insert example now says what ships: that refusal is answered UNIQUE_VIOLATION, so the classification agrees and its fields ride details. Claude-Session: https://claude.ai/code/session_01Q9PZ5Pzqcus4woVvTZwWNU Co-authored-by: Claude <noreply@anthropic.com>
席位核对✅ ACCEPT: PR #23707 at
Checklist, read against GitHub and
The DELIBERATE CORRECTION, confirmed note by note (the PR body's 21-row table holds every before / after with the code line it was read from; this seat read each against
This seat's corrections, in public:
Gates:
Landing with the route-0 red (
Contract review: none owed. The diff is release text only, Landing: Generated by Claude Code |
Fixes #23703
Clause-②: no
Release text only. This PR amends eight pending changesets in place, so each says what the next
18.0.0prerelease actually ships. Later PRs in the same release made some of their sentences false:409 CONCURRENT_UPDATEholdscurrentRecordback. Since PR fix(plugin-hono-server): a Hono door's 409 CONCURRENT_UPDATE carries currentRecord, the caller's own read of the row (#23531) #23667 (5bb9a83bd0), both Hono doors forward it: the caller's own read of the row.os migrate apply --allow-destructiverefuses theorganization_iddrop only on the ceremony's inventory tables. Since PR fix(cli)!: os migrate apply --allow-destructive holds back every organization_id drop until the organization-ownership ceremony verifies (#23684) #23699 (6074eafb63,merged: true), it holds back every such drop.@objectstack/hono's "Known gap" paragraph. PR fix(plugin-hono-server): a Hono door's 409 CONCURRENT_UPDATE carries currentVersion (#23531) #23582 and PR fix(plugin-hono-server): a Hono door's 409 CONCURRENT_UPDATE carries currentRecord, the caller's own read of the row (#23531) #23667 close that gap.sys_metadatafamily note's trail-door admission. PR fix(rest,runtime)!: the authoring-trail doors stop admitting setup.access, so an organization admin is refused the environment's trail #23674 narrows it.23587-hono-structured-arm-fields.md, already amended here (row 4), is now left fully true.No new changeset, no erratum sentence, and no code, test, docs page or
CHANGELOG.md.A correction to round 1, made in this round. Round 1 said the later
#23531note's new FROM was "the body18.0.0-next.1answered:codeandmessageonly". That holds for a route mounted onHonoHttpServeronly. In18.0.0-next.1,createHonoAppanswered a staleIf-Matchwith500 INTERNAL_ERROR. The evidence:0c52e43075,packages/adapters/hono/src/index.ts:793-794answers a throw witherrorJson(c, err.message …, err.statusCode || 500).ConcurrentUpdateErrordeclaresstatus = 409and nostatusCode(packages/metadata-protocol/src/protocol.tsat0c52e43075, the class at:2867-2869).@objectstack/hono's own entry for hono adapter:createHonoApp's catch-all renders an error thrown out ofdispatch()fromstatusCodealone, so a declaredstatus/code(a missing record's404 RECORD_NOT_FOUND, an outage's503) answers500 INTERNAL_ERROR#23365 states it in its FROM (23365-hono-declared-envelope.md:14-17).Both
#23531notes now name each door's last-published answer (rows 3, 5-7 and 13-15 below).Has any of this shipped? (measured, per file)
main18.0.0-next.N?23531-hono-conflict-body.md19c554ddc1, 2026-10-15 02:52Z23587-hono-structured-arm-fields.mdf7cd580bff, 2026-10-15 07:22Z23531-hono-conflict-current-record.md5bb9a83bd0, 2026-10-15 11:55Z23429-v18-boot-refusal.mddd29bbe60d, 2026-10-15 06:17Z23684-drop-gate-host-tables.md6074eafb63, 2026-10-15 16:55Z23365-hono-declared-envelope.mde1cefa58e3, 2026-10-14 19:11Z23429-sys-metadata-family-organization-column-retired.mddd29bbe60d, 2026-10-15 06:17Z23546-trail-doors-setup-access.mdc2635881e0, 2026-10-15 14:27ZReadings:
.changeset/pre.jsonis{"mode":"pre","tag":"next"}and has nochangesetskey, so it records no consumed changeset.0c52e43075(chore: version packages (next), 2026-10-14 10:19Z,18.0.0-next.1).git merge-base --is-ancestor 0c52e43075 ADDED_ATexits 0 for every row above..changeset/pre/, the archive of the 582 notes earlier cuts consumed.git merge-base --is-ancestor a87d8be299 0c52e43075also exits 0.dist-tags.nextis18.0.0-next.1.18.0.0-next.1tarballs were checked againstorigin/main. For@objectstack/plugin-hono-server,@objectstack/hono,@objectstack/cli,@objectstack/restand@objectstack/runtime, the tarball'sCHANGELOG.mdis byte-identical (cmp) to the one onorigin/main.currentRecordcounts 0,currentVersion0 andKnown gap0.## 18.0.0-next.1counts 1 in each.0c52e43075,apply.tshas 0organizationreferences, and the drop-gate file is absent.0c52e43075:studio.access,setup.accessormanage_metadata(rest-server.ts:1824-1829, throughmayReadPendingDrafts);studio.accessorsetup.access(packages.ts:1887,requireReadCapability);sys-metadata-audit.object.tscarried norequiredPermissions.So every pair compiles into one release. Following the ruling, each pair now tells one story: the earlier note states the final behaviour, and no FROM / TO describes a state that no release shipped.
How each pair was made one story
The two
#23531notes.23531-hono-conflict-body.md) states the final body.currentRecordbesidecurrentVersion, and:15states whatcurrentRecordis.:8,:10) and its "unchanged" sentence (:13) name each door's18.0.0-next.1answer: aHonoHttpServerroute answered409withcodeandmessage, andcreateHonoAppanswered500 INTERNAL_ERROR.:17no longer points at the#23365"Known gap", which is gone.23531-hono-conflict-current-record.md) carries the same per-door FROM and the same TO.23587-hono-structured-arm-fields.md(patch round 2).:14loses its hold-back sentence.:7and:9name each door's18.0.0-next.1answer toDELETE_RESTRICTED: aHonoHttpServerroute answered409withcodeandmessage, andcreateHonoAppanswered500 INTERNAL_ERROR.:12's "unchanged" clause is per door.:12's duplicate-insert example now says these doors answer the engine'sDUPLICATE_RECORDas409 UNIQUE_VIOLATION, so the classification agrees and its fields ridedetails. That matches23587-hono-unique-violation.md(:5,:14), which is not edited.@objectstack/hono's#23365note (23365-hono-declared-envelope.md:51-56). The "Known gap" paragraph is replaced by what ships: the409carriescurrentVersionandcurrentRecordinerror.details. Its FROM (:14-17,500oncreateHonoApp) was already the18.0.0-next.1behaviour and is unchanged.The
organization_iddrop-gate pair.23429-v18-boot-refusal.mdsays any table (:20,:27).23684-drop-gate-host-tables.md's FROM names the18.0.0-next.1behaviour (no drop held back), and its TO loses "As before,".The trail-door pair.
23429-sys-metadata-family-organization-column-retired.md:49states the merged admission:studio.accessormanage_metadata;studio.accessalone;setup.accessalone is refused at all four.manage_metadata" clause now covers the history and audit rows, not the commit rows.23546-trail-doors-setup-access.md's FROM / TO bullets (:18-23) are the18.0.0-next.1→ final pair as written: "was 200" for asetup.accesscaller is what0c52e43075answered.:14said the data door "already refused them". The data door'srequiredPermissionsgate ships in this same release (dd29bbe60d), so:14now says it "refuses them".Before / after: every amended sentence
Before is the text on
origin/main; after is the text at this head. Code was read onorigin/main6074eafb63, except [H] and [I], which were read at0c52e43075(18.0.0-next.1):plugin-hono-server/src/adapter.ts:367:declaredEnvelopeForThrowmergesdeclaredArmContext(...)intodetails.adapter.ts:462-475: every arm key buterrorandcodeis forwarded; nothing is held back by name.types/src/data-error-classification.ts:1046-1053: theCONCURRENT_UPDATEarm carriescurrentVersionandcurrentRecord.metadata-protocol/src/protocol.ts:15027-15031: a version mismatch re-reads the row withreadAsCaller, and throwsConcurrentUpdateErrorwithcurrentRecord: visible.adapters/hono/src/index.ts:554:createHonoApprenders throughdeclaredEnvelopeForThrow.cli/src/utils/organization-ownership-drop-gate.ts:47-55: every intendeddrop_column organization_id, no table filter.cli/src/commands/migrate/apply.ts:494-523: the refusal, beforeflushSchemaDdl(:558).0c52e43075:apply.tshas noorganizationreference, and there is no drop-gate file;adapters/hono/src/index.ts:793-794answerserr.statusCode || 500;ConcurrentUpdateErrordeclaresstatusonly;spec/src/api/errors.zod.ts:192maps500toINTERNAL_ERROR;declaredEnvelopeForThrow(plugin-hono-server/src/adapter.ts:284) had no arm context.0c52e43075, as listed in the readings above.rest/src/rest-server.ts:1868:AUTHORING_TRAIL_READ_CAPABILITIES = ['studio.access', 'manage_metadata'].:1886-1892:mayReadAuthoringTrailadmitsisSystemor one of those.refuseNonAuthoringCaller(:1920-1921) at history:7629, audit:7766and diff:8239.runtime/src/domains/packages.ts:381-395:requireCommitTrailReadCapabilityadmitsisSystemorstudio.accessonly. It is asked atGET /packages/:id/commits(:1972).metadata-core/src/objects/sys-metadata-audit.object.ts:238:requiredPermissions: ['studio.access'], added bydd29bbe60d.DELETE_RESTRICTEDproducer:0c52e43075,objectql/src/engine.ts:18664-18666setscode,status = 409andhttpStatus = 409. The file has nostatusCodeat all, so next.1createHonoApp([H],index.ts:793-794) answered500;spec/src/api/errors.zod.ts:97registersDELETE_RESTRICTED, so the next.1 direct-mountdeclaredEnvelopeForThrow(adapter.ts:284) answered409;engine.ts:18728-18730.plugin-hono-server/src/adapter.ts:362:const code = isEngineDuplicateRecordEnvelope(thrown) ? 'UNIQUE_VIOLATION' : resolved.code;, decided before the arm is asked.:289-308("One wire spelling") explains the ordering.:466-468), which it does forUNIQUE_VIOLATION.23531-hono-conflict-body.md:15(row 1)currentRecordis held on these two doors until #23586 settles how the protocol reads that row, and the REST server's answer is unchanged.currentRecordrides beside it, as on the REST server: the row as the caller reads it, which the protocol re-reads under the caller's own context on a version mismatch (#23586).23531-hono-conflict-body.md:11(TO){"success":false,"error":{"code":"CONCURRENT_UPDATE","message":"…","details":{"currentVersion":"…"}}}{"success":false,"error":{"code":"CONCURRENT_UPDATE","message":"…","details":{"currentVersion":"…","currentRecord":{…}}}}23531-hono-conflict-body.md:17(revised this round)@objectstack/honoentry for #23365 names this as a known gap. This change closes the gap'scurrentVersionhalf. Nothing changes in …#23365"Known gap" paragraph no longer exists (row 16)23587-hono-structured-arm-fields.md:14(row 2)objecton … these doors answer without a route.CONCURRENT_UPDATE'scurrentRecordstays held until #23586 settles how the protocol reads that row. The REST server's answer is unchanged.objecton … these doors answer without a route. The REST server's answer is unchanged.adapter.ts:466asks the arm with no route object23531-hono-conflict-current-record.md:8(revised this round)currentVersioninerror.details, and heldcurrentRecordback while the protocol read that row with a system context. … and these doors forward it.codeandmessageonly, andcreateHonoAppanswered it500 INTERNAL_ERROR, which the@objectstack/honoentry for #23365 makes a409. … and these doors forward it beside the server'scurrentVersion.23531-hono-conflict-current-record.md:10(FROM, revised this round){"success":false,"error":{"code":"CONCURRENT_UPDATE","message":"…","details":{"currentVersion":"…"}}}{"success":false,"error":{"code":"CONCURRENT_UPDATE","message":"…"}}on aHonoHttpServerroute, and500{"success":false,"error":{"code":"INTERNAL_ERROR","message":"…"}}oncreateHonoApp23531-hono-conflict-current-record.md:13(revised this round)code,messageandcurrentVersionare unchanged, and no other answer changes.HonoHttpServerroute, status,codeandmessageare unchanged; oncreateHonoAppthey are the409the@objectstack/honoentry for #23365 states. No other answer changes.23531-hono-conflict-current-record.md:15currentRecordstays held on these two doors. Nothing changes in …23429-v18-boot-refusal.md:20(row 3)organization_idfrom any table in the ceremony's inventory (the D7 tables and thesys_metadatafamily) while …organization_idfrom any table (the D7 tables and thesys_metadatafamily among them) while …23429-v18-boot-refusal.md:27(row 3)organization_idis refused, as above.organization_idcolumn is refused, as above.23684-drop-gate-host-tables.md:15(FROM)organization_iddrop the schema-drift report offered was applied byos migrate apply --allow-destructivewith no ceremony marker on the database: on the objects …, and on any host or application object …os migrate apply --allow-destructiveheld back noorganization_iddrop. Every one the schema-drift report offered was applied with no ceremony marker on the database, among them those on the objects … and on any host or application object …23684-drop-gate-host-tables.md:17--allow-destructiverun …--allow-destructiverun …23531-hono-conflict-body.md:8(new)codeandmessageonly. They are@objectstack/hono'screateHonoAppand a route mounted on@objectstack/plugin-hono-server'sHonoHttpServer.@objectstack/hono'screateHonoApp, which answered it500 INTERNAL_ERROR(the@objectstack/honoentry for #23365 makes it a409), and a route mounted on@objectstack/plugin-hono-server'sHonoHttpServer, which answered it withcodeandmessageonly.23365-hono-declared-envelope.md:14-1723531-hono-conflict-body.md:10(FROM, new){"success":false,"error":{"code":"CONCURRENT_UPDATE","message":"…"}}{"success":false,"error":{"code":"CONCURRENT_UPDATE","message":"…"}}on aHonoHttpServerroute, and500{"success":false,"error":{"code":"INTERNAL_ERROR","message":"…"}}oncreateHonoApp23531-hono-conflict-body.md:13(new)codeandmessageare unchanged, and no other answer changes.HonoHttpServerroute, status,codeandmessageare unchanged; oncreateHonoAppthey are the409the@objectstack/honoentry for #23365 states. No other answer changes.23365-hono-declared-envelope.md:51-56→:51-53(new)409 CONCURRENT_UPDATEthis host now answers carriescodeandmessage, but not thecurrentVersionandcurrentRecordthat the standalone REST server's409carries. The recogniser forwards only thedetailsa producer declares, and those two fields are own properties of the error. That gap is outside this change.409 CONCURRENT_UPDATEthis host now answers carriescurrentVersionandcurrentRecordinerror.details, the two fields the standalone REST server's409carries;currentRecordis the row as the caller reads it.23429-sys-metadata-family-organization-column-retired.md:49(new)/meta/:type/:name/historyand/auditadmitstudio.access,setup.accessormanage_metadata;/packages/:id/commitsadmitsstudio.accessorsetup.access. … A caller holding onlysetup.accessor onlymanage_metadatatherefore still reads these rows through/meta, but not through the data door./meta/:type/:name/history,/auditand/diffadmitstudio.accessormanage_metadata, and/packages/:id/commitsadmitsstudio.accessalone;setup.accessalone is refused at all four. … A caller holding onlymanage_metadatatherefore still reads the history and audit rows through/meta, but not the commit rows, and none of them through the data door.23546-trail-doors-setup-access.md:14(new)requiredPermissions: ['studio.access'], ADR-0131 D7). The doors now follow the same rule. …requiredPermissions: ['studio.access'], ADR-0131 D7), and the doors now follow the same rule. …0c52e43075carried no such gate23587-hono-structured-arm-fields.md:7(round 2)codeandmessageonly. They are@objectstack/hono'screateHonoAppand a route mounted on@objectstack/plugin-hono-server'sHonoHttpServer.@objectstack/hono'screateHonoApp, which answered it500 INTERNAL_ERROR(the@objectstack/honoentry for #23365 makes it a409), and a route mounted on@objectstack/plugin-hono-server'sHonoHttpServer, which answered it withcodeandmessageonly.23365-hono-declared-envelope.md:14-1723587-hono-structured-arm-fields.md:9(FROM, round 2){"success":false,"error":{"code":"DELETE_RESTRICTED","message":"…"}}{"success":false,"error":{"code":"DELETE_RESTRICTED","message":"…"}}on aHonoHttpServerroute, and500{"success":false,"error":{"code":"INTERNAL_ERROR","message":"…"}}oncreateHonoApp23587-hono-structured-arm-fields.md:12(round 2)codeandmessageare unchanged, and a refusal whose classification answers a different status or code (a duplicate insert'sDUPLICATE_RECORD, which the REST server answers asUNIQUE_VIOLATION) gains nothing.HonoHttpServerroute, status,codeandmessageare unchanged; oncreateHonoAppthey are the declared envelope the@objectstack/honoentry for #23365 states. A refusal whose classification answers a different status or code gains nothing. The engine's duplicate insert is the one envelope these doors translate first: itsDUPLICATE_RECORDis answered409 UNIQUE_VIOLATION, the REST server's code, so the classification agrees and its fields ridedetails, as this package'sUNIQUE_VIOLATIONentry states.23587-hono-unique-violation.md:5,:14The bounded sweep (the seat's four behaviours, every pending
.changeset/*.md)The sweep covered 113 pending files: the 111 top-level
.mdunder.changeset/on this branch (excludingREADME.md; the consumed archive.changeset/pre/is not pending), plus 2 more onmain. pre.json lists none of them.0c52e43075.main,23630-promote-doors-d99.mdand23686-dispatcher-unique-violation.md, landed after this branch's base and were read fromorigin/main395ca21cc7.23630hits?package=at:19and:22; both describe the server's publish door in its own note and are true.23686hits nothing.23268-external-sharing-model-retired,23268-skills-lint-rules-row,23357-page-component-view-data-api-refused,23387-two-master-names-release,23397-ceremony-builtin-positions,23399-ceremony-not-declared-column-drop). They were grepped too and hit nothing.currentRecord/currentVersion.23531-hono-conflict-body.md:6and23531-hono-conflict-current-record.md:6(the titles), and both notes':11(TO).23406-sealed-first-draft-remedy.md:15and23577-sealed-write-one-sentence.md:21: the/metaconflict and spec schemas, not a Hono door.23586-occ-conflict-caller-visibility.md:9,:13,:14: the protocol. Its:16says the Hono hosts get the narrowed answer, which they do ([B] [D]).23587-hono-structured-arm-fields.md:12: itscurrentVersionclauses are true ([B] [C]). Its other two clauses were amended in patch round 2 (row 21).setup.accessat the trail doors.23546-trail-doors-setup-access.md:6,:18-22(each "was 200" matches [I]; "now 403" matches [J] [K]),:27-29(who is still admitted: [J] [K]),:33(draft switches),:34(package reads,requireReadCapability) and:37. Its:10is the ADR-0087 disposition marker and is unchanged."inventory" at the drop gate.
23684-drop-gate-host-tables.md:5(title),:9(disposition: "a table outside the platform inventory is refused", which is still a subset of every table) and:17("read without a copy of its inventory").15211-cli-apply-reviewed-plan.md:16: the ceremony plan's inventory digest, not the drop gate.publishItem/?package=. No amendment.23658-client-publish-package.mdis PR feat(client): meta.publishItem names the package whose draft it promotes, sent as ?package= #23680's own note.23495-draft-doors-one-address.md:19,:27,:28,:33,:35prescribe?package=, which the client now sends.23183,23214,23291,23350,23415,23416,23473and23501use?package=on reads, saves, deletes, uninstall and/automation, none of which the publish change touches.Check Changeset
This diff edits existing changesets and adds none, so
Check Changesetreads it as the DELIBERATE CORRECTION class (scripts/check-empty-changeset.mjs, route 0 ofpr-automation.yml). It is red by design, and I made no attempt to turn it green. Noskip-changesetlabel, under ruling D on #18375.Gates
All readings were taken on the final commit,
45a2c8c11a(merge base6074eafb6).node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderives 20 commands from the 8 changed paths (+23 / -26), the same set as before. I ran all 20, plusnode scripts/check-changeset-fixed.mjs(its roster sits under.changeset/), and captured each exit code before any pipe:check-adr-0087-registration(--base origin/mainand--self-test)check-changeset-no-major(both)check-closing-keyword-parity(both)check-comment-mask-corpuscheck-empty-changeset --self-testrelease-rehearsal-clone --self-testrelease-pending-publish --self-testcheck:changeset-gate-self-testscheck:driver-memory-censuscheck:gitlink-declaredcheck:nul-bytescheck:objectui-changesetcheck:pm-changeset-deadline-censuscheck:published-filescheck:refd-timer-probecheck:watch-hint-literalcheck-changeset-fixednode scripts/check-empty-changeset.mjs --base origin/main. It names all eight files as "present on the merge base and CHANGED by this PR", with "DELIBERATE CORRECTION -- your change may have made this PENDING release note false, and you rewrote it in the same stroke. Remedy: do NOT restore it -- say so on the PR and get it confirmed".dispatch-gates --ran, with exit codes recorded, answered20 derived, 20 run, 0 NOT-MEASURED, 0 UNRUN(a derived zero).The same battery ran on
ff753e13da,4ccf7bc3a5anddc8f243f3awith the same verdicts.Not run locally: the type-check lanes and the whole-tree families, which belong to CI. This diff touches no package source.
Acceptance notes
None open. The two
23587-hono-structured-arm-fields.mdfindings reported in patch round 1 are folded in as rows 19-21. No other file was swept or touched in round 2.Generated by Claude Code