content(blog): ADR-0015 turn-key federation has shipped — correct the closing roadmap paragraph in all eight locales - #176
Merged
Conversation
…ve design"
The closing "What Has Shipped vs. What Is Coming" section told readers that
one-step schema import, binding to externally owned schemas, and the
write-safety gates were still being designed under ADR-0015 (status:
Proposed). All three landed. Measured against objectstack origin/main:
- one-step schema import — `os datasource list-tables` and
`os datasource introspect <name> --table <table>`
(packages/cli/src/commands/datasource/)
- binding to externally owned schemas — `Datasource.schemaMode`
('managed' | 'external' | 'validate-only') and `Object.external`
(remoteName / remoteSchema / columnMap), in
packages/spec/src/data/{datasource,object}.zod.ts
- write-safety gates — the double opt-in `external.allowWrites` on the
datasource plus `external.writable` on the object
- ADR-0015 is "Accepted — backend/REST/CLI implemented; Studio UI + extra
dialect drivers pending"; ADR-0062 (Accepted 2026-06-22) supersedes its
runtime half
The paragraph now names what shipped and how to use it, keeps the
federation write gate distinct from a read-only GRANT on a managed
datasource (the FAQ's advice is unchanged), and states what is genuinely
still pending. The post's connect-not-rebuild argument is untouched.
Wording and facts kept consistent with
content/blog/how-to-move-an-internal-system-to-metadata (PR #147).
Correction to a live post: sets `updated`, leaves `date` alone. Carried
into all six authored locales; zh-Hant regenerated with `pnpm gen:zh-hant`.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FeA1nwBz1ohH65dvffUGKr
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 free
to 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 #149
Head SHA for every measurement below:
bb17f28.What the post claimed
The closing section of
extend-existing-systems-with-ai, "What Has Shipped vs. What Is Coming", ended with:All three named items have landed. The paragraph's last word on the subject told a reader that the write-safety gates are unbuilt — the one thing a reader most needs to believe exists before pointing anything at a production database.
What ships
Verified against
objectstackorigin/main@dbf1152before a word was written. (Placeholders written asNAME/TABLEhere because GitHub's body sanitizer strips short angle-bracket fragments; the post itself uses the angle-bracket spelling and renders it correctly.)os datasource list-tables NAMEandos datasource introspect NAME --table TABLE—packages/cli/src/commands/datasource/{list-tables,introspect}.ts, overGET /api/v1/datasources/:name/external/tablesandPOST …/tables/:remote/draft.os datasource validate NAME(validate.ts) checks declarations against the live schema on demand.Datasource.schemaMode—'managed'/'external'/'validate-only'— andexternal.validation.onMismatch('fail'/'warn'/'ignore', defaultfail) inpackages/spec/src/data/datasource.zod.ts;Object.externalwithremoteName/remoteSchema/columnMapinpackages/spec/src/data/object.zod.ts.external.allowWriteson the datasource ("Individual objects must also opt in via object.external.writable") plusexternal.writableon the object ("ADR-0015 requires BOTH … either one alone leaves the object read-only").The corrected paragraph says all of that in the post's own register, and keeps the still pending half honest: the Studio UI for federation and drivers for more SQL dialects.
Two things deliberately preserved. The post's connect-not-rebuild argument is untouched — only the roadmap paragraph was stale. And the federation write gate is kept distinct from a read-only connection: the correction states that
allowWrites/writableanswer who owns this database and apply to an external datasource, while read-only on a database ObjectStack owns is still a databaseGRANT. The FAQ's "bind to a read-only connection or DB user" was already correct and is unchanged; this is the confusion the issue warned an update could introduce.Not overstated. The docs page this post links carries a separately known-stale section tracked as objectstack-ai/objectos#250 — different repo, untouched here, and nothing in this PR leans on it.
Consistency with #147.
how-to-move-an-internal-system-to-metadata(PR #147, merges on its 2026-09-17 slot) links to this post and describes the same surface. Read fromorigin/claude/issue-91-how-to-move-an-internal-system-to-metadataand matched in both facts and vocabulary:schemaMode: 'external'as an ownership declaration that forbids DDL, boot validation withonMismatch: 'fail'(andvalidate-onlyto warn while drafting),list-tables/introspectfor the drafts, and "two explicit opt-ins, in two files" for writes. That branch was not edited.Which locales carried it
All eight files in the post directory:
index.mdx(en)index.zh-Hans.mdxindex.ja.mdxindex.de.mdx,index.es.mdx,index.fr.mdx,index.ko.mdxindex.zh-Hant.mdxpnpm gen:zh-hant; never hand-edited.pnpm buildregenerates it and leaves the tree clean, which is the proof the committed file is the generator's output.Frontmatter
tagsare[]in every locale and stay[]— nothing added, nothing #160 dropped restored.One rendering fix inside the same sentence
The zh-Hans sentence being rewritten used
**开箱即用联邦(turn-key federation)**体验, whose closing**sits after a full-width). Under CommonMark's flanking rule that run cannot close, so readers were shown literal asterisks (verified in the built HTML and in the browser). Since the correction rewrites that exact sentence, the delimiter was moved off the punctuation —**开箱即用联邦(turn-key federation)体验**— and zh-Hant regenerated. The built page now contains zero literal**, where it had two.This is a site-wide class (24 built pages across ja/ko/zh-Hans/zh-Hant); the other 22 are not touched here and are filed separately.
Gates
Run through the shared verify lock as one chain after the final commit, exit code captured before any pipe.
git rev-parse --short HEADat the time of the run:bb17f28.pnpm content:lint✓ content lint passed (334 files, 44 glossary terms checked)pnpm check(astro check)Result (134 files):·- 0 errors·- 0 warnings·- 0 hintspnpm build✓ zh-Hant: generated 46, kept 0 hand-maintained·✓ content lint passed (334 files, 44 glossary terms checked)·[build] 866 page(s) built in 50.47spnpm seo:smokeSEO smoke test passed (865 HTML pages checked)os-verify-lock: VERDICT command-exit 0 · held the lock 64s (1m04s) · waited 0sGATES_EXIT=0, andgit status --porcelainis empty afterwards — the build'sgen:zh-hantpass reproduced the committed zh-Hant byte for byte.Browser verification
Served the built
dist/overpython3 -m http.serveron 127.0.0.1 and drove Chromium (/opt/pw-browsers/chromium) through the global Playwright. Pages:/en/,/en/blog/extend-existing-systems-with-ai/,/zh-Hans/blog/extend-existing-systems-with-ai/; viewports 1440×900 and 390×844. Every page: full scroll so lazy images enter the viewport, thenimg.decode()on each.scrollWidth === clientWidth/en/, 2 per post page; 0 broken/…hrefs per page, 0 non-200Updated Sep 2, 2026(en) and更新于 2026年9月2日(zh-Hans),datetime="2026-09-02"Screenshots of the corrected section were read at both widths: the three bullets, the inline code spans and the ADR links render correctly, the code spans wrap inside the column at 390px, and the zh-Hans bold now renders bold instead of asterisks.
datetime="2026-09-02"is present in all eight built locale pages.The
updatedvalueupdated: 2026-09-02T10:00:00+08:00— added to the seven authored locale files and propagated into the generatedzh-Hant.date: 2026-05-30is untouched in every file. The value matches the convention already in the repo (ai-ontology-open-protocol,forward-deployed-engineer-tools), sorts afterdate, and is not in the future forcontent-lint's window;astro checkenforces the same ordering through the collection'ssuperRefine.Filed out of scope
**— 24 built pages across ja / ko / zh-Hans / zh-Hant #174 — bold that closes against CJK punctuation renders as literal**; 24 built pages in ja/ko/zh-Hans/zh-Hant, one lint rule closes the class.extend-existing-systems-with-ai: the datasource code sample no longer parses —config.connection,userand an inlinedpasswordare all rejected now that per-driver config is enforced #175 — this post's datasource code sample no longer parses (config.connection,user, an inlinedpassword) since per-driver config became enforced; all 8 locale files, and the placedefineDatasourcebelongs.Neither is touched by this branch.
Generated by Claude Code