Uh oh!
There was an error while loading. Please reload this page.
docs: align pages with framework 17.0 - #82
Merged
Conversation
The docs were aligned to 16.0 and had not moved since. Several pages
described a contract the runtime no longer has.
Live contradictions fixed (a reader following these failed):
- Node.js floor 20 -> 22 (quickstart, faq, changelog compatibility matrix)
- faq promised a GraphQL roadmap for a surface 17.0 deleted
- build/data directed readers to `enable: { trash: true }`, a key that
now fails at parse time -- and which never had a runtime consumer
Stale framing corrected against packages/spec:
- GraphQL removed from runtime-capabilities, extend-existing-systems,
data-sources and the two skill blurbs
- media fields: state that a sys_file id is stored and the {url,...}
object is the expanded read form; accept/maxSize are server-enforced
- export: allowExport added to the object-permission tables as an opt-in
grant; it is not a system permission and read does not confer it
- record access: sharing rules with no criteria and RLS enabled:false
both fail closed
- approvals: expression approvers, onEmptyApprovers, decisionOutputs
- boot/readiness: a bound datasource must connect or the boot fails;
/api/v1/ready answers 503 on a dead data driver
- changelog: 17.0 entry; support windows stated relative to the current
major instead of pinning majors that rot
configure/mcp.mdx is deliberately unchanged: `action.ai.requiresConfirmation`
is a different, live key from the removed `tool.requiresConfirmation`.
English only; locale siblings are left to the translation pass.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CJPxtTxoxTUnjNdTbiEaRaos-zhuang
marked this pull request as ready for review
August 18, 2026 12:36
Uh oh!
There was an error while loading. Please reload this page.
This was referenced Aug 18, 2026
This was referenced Aug 18, 2026
Closed
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 freeto 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#78
The docs were aligned to 16.0 and had not moved since. This brings them to 17.0.0 (released 2026-08-14).
Every claim below was checked against
packages/speconobjectstack@origin/main, not against the release prose. The card said its findings came from release notes plus a grep and had not been schema-checked; three of them changed shape once measured, and one is refuted outright. Those are called out in their own section.English only — 19 files, zero locale siblings. The pages edited now report stale in the freshness gate, which is the designed outcome.
The four live contradictions (the priority)
quickstart.mdxpackage.jsonandpackages/cli/package.jsonboth declareengines.node: ">=22.0.0"resources/faq.mdxresources/faq.mdx/graphqlnow returns 404"packages/spec/src/system/core-services.zod.ts(the entry left in #4451/v17); nographqlmodule remains underpackages/spec/srcbuild/data/index.mdxenable: { trash: true }documented as the shipped replacement forsoftDelete, "on by default"packages/spec/src/data/object.zod.ts,CAPABILITIES_RETIRED_KEY_GUIDANCEI also found a fifth in the same class the card's grep missed:
resources/changelog.mdxcompatibility matrix said "Node.js — 20 LTS or newer". Same fix.On
enable.trash— the correction is bigger than "the key was removed"The card called this the worst of the four and it is, but not quite for the stated reason. The schema's retirement guidance says:
So the page was not merely pointing at a key that stopped parsing — it was describing a capability that never existed. "Soft-delete with restore, on by default" was wrong on the day it was written. The rewrite says that plainly, gives the real recoverability options the schema names (per-field
trackHistory, alifecyclepolicy), states that soft delete is not a shipped capability, and gives the migration (os migrate meta --from 16).Two dating notes, since the card and the release notes disagree with the schema and I would rather flag it than paper over it: the schema attributes the removal to the 16.x line, while
content/docs/releases/v17.mdxlistsobject.enable.trash/enable.mruin its 17.0 retirement table. Both agree the key is now strict-rejected, which is the only part the doc asserts, so I wrote the doc without a version attribution for the removal itself.While in that section I closed the honesty gap it opened: the page now claims
enableis a closed vocabulary, so it has to list the vocabulary. The flag list is corrected againstObjectCapabilities(searchableandclonewere missing;trackHistoryandfileswere shown with the wrong defaults — both are opt-in, defaultfalse), andenable.apiMethodsis documented, including the six-primitive shrink and the deny-all cliff a pure-legacy whitelist falls into.Where the card was wrong
configure/mcp.mdx:157— refuted, no change madeThe card flagged
ai.requiresConfirmationagainst thetool.requiresConfirmationthat 17.0 removed, and said to read both schemas rather than assume the similar name meant the same key. They are different keys on different schemas, and the removed one's own retirement guidance prescribes the one this page documents:ActionAiSchema.requiresConfirmationis live inpackages/spec/src/ui/action.zod.ts, and its docstring also confirms the page's second sentence — "When unset, the bridge defaults totruefor actions that look destructive (confirmTextset,mode:'delete', orvariant:'danger')". The page is correct as written. Editing it would have replaced a true statement with a false one.Verified against:
packages/spec/src/ai/tool.zod.ts(TOOL_RETIRED_KEY_GUIDANCE.requiresConfirmation) andpackages/spec/src/ui/action.zod.ts(ActionAiSchema).Export — the pages were silent, not wrong
The card flagged this as unverified and it was right to. None of the three pages asserts the old "export inherits read" behaviour. They are silent: the object-permission flag tables list
allowRead/allowCreate/allowEdit/allowDelete/viewAllRecords/modifyAllRecordsand omitallowExportentirely.So the correct change was to add the semantics, not correct a wrong statement — with one real error underneath: all three pages filed export under system permissions ("Access Console, run reports, export data"), and it is an object permission. That mis-routing is what would send an admin to the wrong screen.
Added:
allowExportin both flag tables, a dedicated Export is its own grant section onpermission-sets.mdx(the three-state table, the most-permissive merge, package-shipped sets re-seeded but environment-authored sets not,member_defaultdeliberately without the grant, and the high-privilege anchor ban), and a corrected routing row onmanaging-access.mdx. Export removed from the system-permission examples on all three.Verified against:
packages/spec/src/security/permission.zod.ts(ObjectPermissionSchema.allowExport— "unset/false = no export … NOT implied by viewAllRecords/modifyAllRecords", enforced atGET /data/:object/exportwith403 EXPORT_NOT_PERMITTED) andpackages/spec/src/security/high-privilege.ts(the anchor ban, and the explicit note thatmember_defaultcarries noallowExport).Record access — also silent, not wrong
Same finding.
record-access.mdxdescribes sharing rules as "grant access based on declarative criteria" and never says what an empty criteria does; neither page mentions RLSenabled: falseat all. Silent, so again the fix is an addition — a Both switches fail closed section stating both contracts and pointing a reader who audited under an earlier release back at the explain engine, since the real answer may have been wider than their metadata said.Verified against:
packages/spec/src/security/sharing.zod.ts(SharingRuleSchema— "Both now reject a match-all criteria, and the evaluator treats one as matching NOTHING") andpackages/spec/src/security/rls.zod.ts(enabled— "Disabled policies are not evaluated").Stale framing
GraphQL, elsewhere. Each of the four sites needed a different call, as the card predicted:
reference/runtime-capabilities.mdxpaired GraphQL with OData as optional framework capabilities. OData is still real (packages/spec/src/api/odata.zod.ts), GraphQL is not, so the sentence keeps OData and gains an explicit "GraphQL is not one of them — do not document it as available or optional".extend-existing-systems.mdx— "REST/GraphQL endpoints" was a passing mention; the word is simply dropped.reference/skills-cli.mdx,build/ai-skills.mdx) were quoting upstream text that has since changed, exactly as the card guessed.skills/objectstack-api/SKILL.mdonobjectstack@origin/mainnow reads "REST endpoints, auth providers, realtime channels, error envelopes, batch/versioning contracts". Both blurbs are realigned to that.Both surviving GraphQL mentions (faq, runtime-capabilities) preserve the one thing that is not removed:
graphqlremains a valid protocol on an external datasource, which is a system ObjectOS queries rather than a surface it serves (content/docs/releases/v17.mdx, "Not removed: the'graphql'protocol option on external datasource lookups").Media fields.
reference/field-types.mdxgains a What a media field stores section. The card's read was right — the page was silent about the thing that changed, not wrong about it — so nothing was corrected, only stated: an opaquesys_fileid is stored, the{ url, name, size, … }object is the expanded read form withurlderived from the/files/:fileIdresolver, and that is whyaccept/maxSizeare server-enforced rather than browser hints.configure/storage.mdxwas checked for agreement as the card asked and already agrees ("metadata persists insys_file"; "Files are tracked in thesys_filesystem object — never as raw paths in your records"), so it is untouched.Verified against:
packages/spec/src/data/field-value.zod.ts(FileReferenceIdValueSchema— "an opaquesys_fileid";FileValueSchema— "Wave 2 … makes THIS theexpandedread shape, withurlderived from the/files/:fileIdresolver rather than stored") andpackages/spec/src/data/field.zod.ts(accept/maxSize— "Offered to the file picker AND enforced on write").Approvals.
build/automation/approvals.mdxgains a Dynamic routing section covering all three 17.0 additions —expressionapprovers with their closed root set andresolveAsexpansion, author-declareddecisionOutputsresuming asnodeId.keyflow variables, and theonEmptyApproverspolicy table. The approver-type table is also completed: the page listed three kinds where the schema declares eight.Verified against:
packages/spec/src/automation/approval.zod.ts(ApproverType,APPROVER_EXPRESSION_ROOTS,resolveAs,onEmptyApprovers,decisionOutputs).Boot and readiness. The card asked whether these pages under-promise, and they did — all three described
/api/v1/readyas readiness without saying what makes it go red.deploy/docker.mdxanddeploy/kubernetes.mdxnow state the 503-on-dead-driver contract and, for k8s, why it belongs on the readiness probe and not the liveness one.operate/backup.mdxsaid to "confirm the runtime surfaces a clear 503"; that is contractual now, so the rehearsal is repointed at the recovery instead.Verified against:
content/docs/releases/v17.mdx§ "A datasource that cannot connect fails the boot (#3741, #3758, #3826)" — shipped docs rather than schema, because boot and probe behaviour is runtime, not declarable. No numbers or migration steps were invented; the 10s connection bound is quoted from that section.resources/changelog.mdx. A 17.0 entry, covering the eleven changes an ObjectOS operator or app author would act on, each linked to the page in these docs that now explains it. Also: the Support windows table pinned "14.x (current) / 13.x security fixes / ≤ 12.x unsupported", which would have been a fresh contradiction the moment a 17.0 entry sat above it. Rather than invent support dates for 17.x and 16.x — which this repository has no authority to state — the table is now expressed relative to the current major, with dates deferred to the release notes. That is the only change here that removes a concrete claim rather than fixing one, and it is deliberate.One page fixed outside the card's list
configure/data-sources.mdx— not on the card, found by grep during the GraphQL sweep./api/v1/readyand so missed it. Added a note that a datasource objects bind to must connect or the boot fails, with the concrete failure it replaces ("started clean, exited zero, then failed every read and write withDatasource 'x' is not registered").Verification
pnpm turbo run type-checkandpnpm turbo run build— both pass, both run with--force. This is load-bearing:turbo.jsondeclares noinputsfor either task, socontent/docs/**does not move the hash and the first run replayed a cached green from a sibling worktree (FULL TURBO, 55ms). Filed as #81. Forced runs: type-check 15.6s, build 59.7s, 550+ doc paths prerendered.All three translation checks, run the way
.github/workflows/translations.ymlruns them:The freshness gate reports the edited pages as stale and still passes, which is the expected shape for an English-only PR. The output validator's 104 findings are pre-existing corpus debt in
license.*/support.*locale files this PR does not touch; none isunsafe, so none blocks.Rendering. The production build prerenders static HTML, so I read the rendered output rather than the diff — all 18 changed doc pages extracted and reviewed from
.next/server/app/en/docs/**.html. Every anchor introduced was confirmed to resolve against a real generated heading id:export-is-its-own-grant,both-switches-fail-closed,media,data-lifecycle-retention.Byte hygiene:
grep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]'over all 19 files — clean.Out of scope, filed
role,group) #80 — glossary "Record Share" namesrole/group, two recipient kinds ADR-0090 renamed toposition/team. Pre-17.0 drift, different defect class.type-check/builddeclare noinputs, so a content-only change replays a cached green locally #81 — the turbo cache hazard above.#70 (the multi-Environment model, six pages) is left separate rather than folded in: different defect class, and #79 is already filed
Blocked-by:this card for the overlapping file surface.Generated by Claude Code