Repository navigation
Build, API and operations pages predate ObjectStack 17.0–17.7: the changelog stops at 17.1, upgrade has no 17.x steps, and the REST reference lists removed cursor paging, error codes and routes #330
Description
Filing gate: ③ — a task the maintainer dispatched directly in session chat.
Reader: the repo:objectos PM seat (objectstack-ai/objectstack#9831), session session_01CXCwzqwMhkphKoBC11oPSz. It dispatches this card to an os-dev subagent in this round. #295 (queued, not in flight) also touches operate/upgrade.mdx, only at :3 and :6 (edition names). This card leaves those two lines alone, and #295 merges main after this lands.
Dedupe: all 118 objectos issues, open and closed (REST page walk; 301 issues + PRs), grepped for changelog, cursor, RESOURCE_NOT_FOUND, upgrade.mdx, localization, date_format, rest-api → closed hits only:
- changelog.mdx "Recent highlights" still ends at 17.0 six days after 17.1.0 published — blocked on upstream notes existing #142 (changelog stuck at 17.0, landed; the page now stops at 17.1);
- quickstart.mdx sample
os startoutput does not match what CLI 17.0.0 prints, and the plugin count is wrong #94 (quickstart cursor-free); - Three docs pages give instructions that fail: operate/upgrade contradicts deploy/docker, configure/ai imports an unpublished package, help links point to disabled GitHub Discussions #297 (upgrade vs docker contradiction, landed);
- 290 English-fallback locale URLs render English under lang="xx" with no notice, and the docs chrome (search, TOC, Copy Markdown, language picker) is English in every locale #298, Docs chrome still speaks English inside localized pages: fumadocs' hard-coded aria-labels, English page-tree names without lang="en", no zh-Hant 404 copy #305, Docs legal pages: /de, /ja, /es, /fr and /ko privacy and terms show English text without lang="en", and zh-Hant shows English instead of text derived from zh-Hans #312 (localization chrome).
None covers this scope.
Priority: P1. upgrade.mdx lacks the 17.7 secret-rotation steps a self-managed operator needs.
Maintainer, this session's chat, 2026-10-15: 「参考官网的文档站点和最近的版本更新。」「创建issue并派发。」
Why
The source is the official release notes, objectstack origin/main 1ced0f82, content/docs/releases/v17/17-0.mdx … 17-7.mdx and v17/index.mdx. The current stable is 17.7.0 (2026-10-06). 18.0.0 is prerelease-only: out of scope.
Work items
Each line is the seat's reading on main 76988da. Falsify it against the tree first.
| Release | Item | Status | Where |
|---|---|---|---|
| 17.2–17.7 | Changelog entries; the policy row "minors: backward-compatible" is contradicted by every 17.x note ("minors by version number, not by blast radius") | stale | resources/changelog.mdx:13, :61-62 ("17.1.0 … is the current release") |
| 17.3–17.7 | Per-release upgrade steps: sys_record_share backfill (17.3); os migrate account-issuer then apply --allow-destructive (17.5); os migrate audit-metadata-bodies --apply (17.6); rotate flow secrets, JWT keys and private share links, and os migrate unmapped-columns (17.7) |
missing | operate/upgrade.mdx |
| 17.0 | query.cursor removed |
stale | reference/rest-api.mdx:85, :108 |
| 17.0 | error.code is a closed SCREAMING_SNAKE set (RESOURCE_NOT_FOUND, RATE_LIMIT_EXCEEDED, INTERNAL_ERROR) |
stale | reference/rest-api.mdx:217-219 |
| 17.1 | One flow door, /api/v1/automation/:name/trigger, with an honest 404 / 409 / 422 / 400 table |
stale | reference/rest-api.mdx:145-151; build/automation/flows.mdx:286-296 |
| 17.3 | Compound metadata addressing retired (ROUTE_NOT_FOUND) |
stale | reference/rest-api.mdx:165-166 |
| 17.5 | Saved-report stack removed | stale | reference/rest-api.mdx:179-185; configure/email.mdx:9; build/interface/views.mdx:247 |
| 17.7 | A public form needs sharing.enabled: true |
stale | reference/rest-api.mdx:189-190 |
| 17.4 | end node outcome; refused run status |
missing | build/automation/flows.mdx:298-316 |
| 17.5 | OS_AUTOMATION_SCHEDULED_WORK_ENABLED, off by default |
missing; check whether the ObjectOS image sets it | build/automation/flows.mdx:121-164; reference/environment-variables.mdx:108-123 |
| 17.6 | A stored flow with a packaged flow's name stops running | missing | build/automation/flows.mdx:409-414 |
| 17.4 | Static readonly is stripped on non-system insert too, reported in droppedFields |
stale | build/data/validation-rules.mdx:47 "(insert exempt)" |
| 17.5 | One-hop lookup in validation rules; CEL current_user.can() |
missing | build/data/validation-rules.mdx; reference/cel.mdx |
| 17.7 | Localization date / time / number formats and first-day-of-week retired; formats follow locale, and a PUT with those keys answers 400 |
stale | configure/localization.mdx:37-51 |
| 17.0 / 17.5 | OS_ALLOW_LAX_*; OS_PLATFORM_OWNER_EMAIL required for walled postures |
missing | reference/environment-variables.mdx:61-75 |
| 17.0–17.7 | The os migrate family |
missing | reference/cli.mdx |
File surface
content/docs/resources/changelog.mdxcontent/docs/operate/upgrade.mdx(not:3or:6, which are [Decision] One name for the self-managed edition: "ObjectOS Enterprise" (positioning, 8 pages) vs "ObjectOS Self-Managed" with Business single-node and Enterprise under it (License & Pricing, Deploy) #295's)content/docs/reference/{rest-api,cel,environment-variables,cli}.mdxcontent/docs/build/automation/flows.mdxcontent/docs/build/data/validation-rules.mdxcontent/docs/build/interface/views.mdx(line 247 only)content/docs/configure/{email,localization}.mdx- Locale siblings: deletion only, and only where a correction reverses a capability claim
Not in this card
- Access, audit and approvals (sibling card); glossary, data sources and agents (sibling ontology card).
- The quickstart (Quickstart "Add your own object" does not work as written: the task object is never loaded, and once exported the build refuses its name for a missing namespace prefix #327, and [finding] quickstart carries three version-pinned claims that go stale the day the next CLI publishes — one of them must be deleted, not updated #141's on-hold re-transcription).
- v18.
Done looks like
- Every row is fixed or falsified, with the release-note line it rests on.
- New samples parse under
check-doc-samples.mjs. - The
ci.ymlgates pass locally. - No locale sibling is hand-edited.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 15, 2026
Claim: PM loop,
repo:objectosseat, R1Session:
session_01CXCwzqwMhkphKoBC11oPSzAccount:
os-tesla(the seat's linked user asGET /useranswers it; always the card's assignee)Branch:
claude/issue-330-build-api-ops-17xWorktree:
objectos-issue-330Domain: n/a (single-lane repo)
Seat:
repo:objectos(objectstack-ai/objectstack#9831)File surface: as listed in this card's "File surface" section, read on
main76988da. Stop on breach and explain in the report.Container & model:
M/L,mode:subagent,model: opus(default tier;dispatch-gates.mjs --tier --repo objectstack-ai/objectosover this surface at objectstack1ced0f82answers "no path-derived mandate")Clause-②: no
Responsibility: these docs pages produce the risk (objectos
content/docs) · the platform path already covers it: the 17.0–17.7 release notes on objectstack.ai · every builder, API client and self-managed operator reading these pages reaches it todayThread-read: none
Serial constraints cleared: nothing is in flight on objectos. #295 (queued, not in flight) touches
operate/upgrade.mdx:3and:6only; this card leaves those lines alone. #141 (on hold) and #327 ownquickstart.mdx, which is disjoint. Sibling cards #328 and #329 are dispatched in this round with disjoint file surfaces. The five open PRs are Dependabot bumps, none oncontent/docs/**.Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
os-dev-report
{ "issue": 330, "status": "done", "branch": "claude/issue-330-build-api-ops-17x", "pr": "https://github.com/objectstack-ai/objectos/pull/333", "session": "session_01CXCwzqwMhkphKoBC11oPSz — subagent of the repo:objectos seat (parent's id, from the Claude-Session line)", "premise_still_valid": true, "final_commit": "aaa4eb9e81025e994289e3c44d8588387f751c51", "summary": "Draft PR #333 (head aaa4eb9; assignee os-tesla; opened by objectstack-fleet[bot]; base main, origin/main still 76988da) settles all 16 card rows. The PR's row table cites the release-note line each verdict rests on, and the published 17.7.0 npm tarballs were the tiebreaker wherever objectstack main's docs already describe 18.0.0-next. Fixed: (1) changelog 17.2-17.7 entries and the 'minors: backward-compatible' policy row; (2) a 'Version-specific steps' section on operate/upgrade.mdx for 17.0-17.7, appended so :3/:6 are untouched; (3) REST: cursor paging, the closed error.code set, the /automation trigger route plus the 404/409/422/400 flow status table, retired compound meta routes, the removed /reports, public-form sharing.enabled, and the 17.7 404 on unreadable by-id writes; (4) flows: end outcome/refused, the scheduled-work switch, packaged-flow precedence, decision mode inclusive; (5) validation rules: readonly on insert, one-hop lookup, and the tip reversed to fail-closed; (6) CEL current_user and can(); (7) env vars OS_PLATFORM_OWNER_EMAIL, OS_AUTOMATION_SCHEDULED_WORK_ENABLED, OS_ALLOW_LAX_*, the retired OS_LOCALIZATION_* names; (8) the os migrate family in cli.mdx; (9) localization formats; (10) email scheduled reports. Falsified: views.mdx:247 stays, because the report metadata kind is unchanged in 17.5 and the Console still renders it (objectui plugin-report). Measured beyond the card: a validation rule is evaluated with record/previous only, so current_user.can() there fails closed; the pages say so instead of suggesting it. Seat notes folded: changelog 17.1 now names record-view auditing and the read-only approval tier as open-runtime capabilities ObjectOS does not expose; the 17.6 bullet gains view_all_audit_log; org-less API key refusal is isolated-only; the rest-api action-tool claim now states the ai.exposed opt-in (17.7.0 rest materialisesAsTool, types script/flow/api); cli os create example is recorded as retired in 17.4 (17.7.0 RETIRED_TEMPLATES, exit 1). Locale siblings deleted per the #256 criterion: rest-api x7, validation-rules x2, email x7. zh-Hant was pruned by gen-zh-hant; no locale file was edited. Worktree removed.", "tests": "Docs-only change; no unit tests apply. Evidence on head aaa4eb9: doc samples parse (79 pages, 101 pass, 10 N/A, 2 opted out). Negative control: a refused end node with no message fails check-doc-samples (exit 1, 'outcome: refused requires a message'). The CEL claims were run through the 17.7.0 @objectstack/formula engine in a scratch install. current_user.can('crm_lead','edit') with ctx {record} answers 'Unknown variable: current_user' (the validation-rule context). With a user and a toEvalPermissions map, current_user.can('crm_quote','edit') ? 10 : 0 answers 10 when allowEdit is true and 0 when it is false. All 21 new in-page anchors were found in the built en HTML; a nonexistent id answers 0 (control). No ablation: no tested behaviour changed. No browser driven: content-only, and CI's render smoke-check passed on aaa4eb9.", "gates": "Local, head aaa4eb9; each exit code captured before any pipe. gen-zh-hant --check 0. npm ci doc-samples 0. check-doc-samples 0. turbo type-check via os-verify-lock: VERDICT command-exit 0 (an earlier run on e1ed930 was a cache miss). turbo build via lock: VERDICT command-exit 0. turbo test via lock: VERDICT command-exit 0, a cache hit, since the ci-scripts test inputs are untouched by the diff. check-positioning 0. check-locale-surface 0. check-search-locales 0. check-translation-ownership (git diff --name-status --no-renames 76988da...HEAD, TRANSLATION_BOT_LOGIN set locally to exercise enforcement) 0: '16 translation artifact(s) deleted, none added or modified'. check-translations 0. check-translation-output --files 0. There is no --ran reconciliation: dispatch-gates.mjs is objectstack-only, so the objectos gate list was hand-derived from objectos .github/workflows/ci.yml and translations.yml, as the dispatch directed. CI check-runs on aaa4eb9: build success (its steps include Docs code samples parse, Locale surface, Positioning, Search answers every locale, Worker bundle fits the size budget, and The docs site renders — smoke-check a local preview, all success); Node floor success; Ownership & freshness success; Deploy docs skipped. PR is draft; mergeable_state clean.", "mcp_calls": "0", "api_writes": "4 — every one through scripts/pm/fleet-write/dispatch.mjs (the relay, executed as objectstack-fleet[bot] from a POST /repos/objectstack-ai/objectstack/dispatches): (1) pr_create, POST /repos/objectstack-ai/objectos/pulls, draft, assignees [os-tesla] → #333; (2) issue_patch, PATCH /repos/objectstack-ai/objectos/issues/333 (body: final head, CI, the #329/#331 note); (3) issue_patch, PATCH /repos/objectstack-ai/objectos/issues/333 (body: the two forwarded items, head aaa4eb9); (4) this os-dev-report comment, POST /repos/objectstack-ai/objectos/issues/330/comments. PR body edits: 2 of a budget of 3. 0 label writes, 0 assignee writes, 0 merges; never marked ready. Git pushes (not REST): 5 (the empty-branch probe, e1ed930, e942d51, 288b4e7, aaa4eb9).", "line_budget": "English pages, lines before → after: resources/changelog.mdx 544→729; operate/upgrade.mdx 51→251; reference/rest-api.mdx 232→290; reference/cel.mdx 197→219; reference/environment-variables.mdx 181→208; reference/cli.mdx 229→294; build/automation/flows.mdx 450→518; build/data/validation-rules.mdx 242→277; configure/email.mdx 83→84; configure/localization.mdx 67→74. Diff total: 26 files, +761 / -2550 (the deletions are mostly the 16 locale siblings).", "files_changed": "M content/docs/resources/changelog.mdx; M content/docs/operate/upgrade.mdx; M content/docs/reference/rest-api.mdx; M content/docs/reference/cel.mdx; M content/docs/reference/environment-variables.mdx; M content/docs/reference/cli.mdx; M content/docs/build/automation/flows.mdx; M content/docs/build/data/validation-rules.mdx; M content/docs/configure/email.mdx; M content/docs/configure/localization.mdx; D content/docs/reference/rest-api.{de,es,fr,ja,ko,zh-Hans,zh-Hant}.mdx; D content/docs/build/data/validation-rules.{zh-Hans,zh-Hant}.mdx; D content/docs/configure/email.{de,es,fr,ja,ko,zh-Hans,zh-Hant}.mdx. Not touched: views.mdx (row falsified), quickstart.mdx, positioning.ts, check-positioning.mjs, upgrade.mdx lines 3 and 6, and every #328/#329 surface.", "deviations": "(1) Commit trailers use the model-free pair 'Co-Authored-By: Claude' plus 'Claude-Session: …session_01CXCwzqwMhkphKoBC11oPSz', per the os-dev rule, not the harness reminder's model-named line; history is not rewritten. (2) The objectstack.ai release-note links were not fetched live: the container proxy refuses objectstack.ai and docs.objectstack.ai (connect_rejected). The route is confirmed from source instead: SITE_ORIGIN in apps/docs/lib/site.ts, content/docs/releases/v17/17-N.mdx, and the docs. alias as a path-preserving redirect in scripts/check-published-readme-links.mjs. (3) The run paused overnight on the account usage limit between 288b4e7 and aaa4eb9; the gate union was re-run in full on aaa4eb9. (4) The 'one flow door' row: 17.1 actually describes three doors (trigger, flow actions, declared type flow endpoints) sharing one table, and the PR documents it that way.", "open_questions": [ { "question": "What does the ObjectOS image (or its deploy-bundle template) set OS_AUTOMATION_SCHEDULED_WORK_ENABLED to? ObjectStack 17.5+ defaults it off in every posture, and no public source states the ObjectOS value. The pages say this plainly and tell operators to set it explicitly and confirm with os doctor.", "options": [ "A — the image owner states the shipped value; flows.mdx and environment-variables.mdx then state it as a fact and drop the caveat. Business need: real — time-relative reminders and nightly sweeps are core customer flows, and an unknown default stops them silently. Long-term: right — the docs state the image's contract (contract-first). AI-error: lowest — an AI authoring a schedule flow is told whether it will arm. Startup scope: zero new surface, two sentences.", "B — keep the caveat as merged. Business need: met at the cost of a manual check per deployment. Long-term: a standing hedge in an operator contract page. AI-error: an AI can still assume scheduled work runs. Startup scope: zero cost now." ], "recommendation": "A, because all four axes favour stating the image contract once it is known. B is what #333 ships meanwhile, so nothing is blocked." }, { "question": "How does a Self-Managed operator run the os migrate data steps (account-issuer, audit-metadata-bodies, files-to-references, value-shapes, unmapped-columns) and the 17.3 sys_record_share backfill against the licensed image? ObjectStack ships the backfill only as plugin-sharing library functions, and os migrate boots the app to read its metadata. Whether the image carries the os CLI, or its migrate-and-exit mode runs any of these, is not public.", "options": [ "A — the image owner names the operator entry point (for example os in the image plus how it receives OS_ARTIFACT_URL, and a supported record-share backfill command); upgrade.mdx then gives exact commands. Business need: real — 17.5's account-issuer and 17.7's secret rotation are blocking upgrade steps. Long-term: right — one documented operator door. AI-error: removes guesswork in an upgrade runbook. Startup scope: documentation of an existing door, no new feature.", "B — keep the page as merged: it names the commands and the backfill functions, and states that nothing runs them at boot. Business need: partially met. Long-term: leaves operators to infer the door. AI-error: an agent may improvise a runner script. Startup scope: zero cost." ], "recommendation": "A. Without an entry point, the 17.3 backfill and the 17.5 account-issuer step cannot actually be performed on the image from the docs alone." }, { "question": "17.7 asks operators to rotate the JWT signing keys (sys_jwks), but the note gives no mechanism. On ObjectOS, is this the OS_AUTH_SECRET rotation and one-time cleanup that the deploy-bundle template documents, or a separate procedure?", "options": [ "A — the image owner confirms the procedure; upgrade.mdx links or states it. All four axes as in Q2: a security step with no mechanism tends to go undone.", "B — leave the step as the release note states it (merged)." ], "recommendation": "A, because an unexecutable security step is the riskiest gap on the page." } ], "out_of_scope_findings": [ "carrier: none · noted, not filed — content/docs/reference/runtime-capabilities.mdx:41-52 says a requested capability whose package is missing 'logs a warning and continues'. The 17.x ObjectStack CLI docs say a declared service capability fails the boot. Read-only inference, not measured against the ObjectOS image; recorded in #333 Acceptance notes. Dedupe words: runtime-capabilities, capability not loaded, requires fail fast.", "carrier: none · noted, not filed — objectstack content/docs/automation/flows.mdx's callout 'Declared first — the engine and runner halves follow' is stale for the engine half: the 17.7.0 service-automation stamps refused at the end node (FlowRefusalSignal, #15788). This is objectstack's page, not objectos. Dedupe words: end node outcome, refusalMessage, engine half follows.", "carrier: none · noted, not filed — a validation rule naming current_user fails closed at run time (measured with the 17.7.0 formula engine: 'Unknown variable: current_user'). Whether os validate refuses it at authoring is NOT MEASURED, so the (c) class is not established. Dedupe words: validation rule current_user, can() validation, unevaluable rule." ] }Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
ACCEPT → PR #333 comment 6208314656 · 2026-10-16T04:48Z · awaiting a human merge (merging to
mainpublishes production).Generated by Claude Code
objectstack-fleet commentedon Oct 17, 2026
Landed · 2026-10-17
9df8a92onmainmainCI run 39002990721Closed by the PR's
Fixesline;pm:dispatchedremoved in this stroke.#333 was over the 3000-line human-merge line (3311 lines). It carried no APPROVE review; the maintainer authorized the seat in chat to merge it (「都合并完成后就下班」, 2026-10-17, after being told of the line). Recorded here as the authorization of record.
Generated by Claude Code