Repository navigation
content(blog): What Do AI Models Lack in the Enterprise? A World, Hands and a Fence (slot 2026-11-03) - #260
objectstack-fleet[bot] wants to merge 3 commits into
Conversation
…nds and a Fence" (slot 2026-11-03) Post A of the second ontology wave: the front page's "a world, hands, and a fence" line, mapped to the runtime mechanism that supplies each, with file:line sources at objectstack 1ecb08a1, one measurement on the bundled CRM (1,844 lines / 30 files; 78 lines of fence; 0 lines of plumbing), the RAG + function calling + policy-layer alternative steelmanned, and the limits. en and zh-Hans authored, zh-Hant generated; cover and diagram as zh / -en SVG pairs. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017GeNDQH7E5S2rX8ajVAPxv
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017GeNDQH7E5S2rX8ajVAPxv
…a directory legend, for phone-width reading Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017GeNDQH7E5S2rX8ajVAPxv
席位核对ACCEPT, held for the slot.
Note for the slot-day check: objectstack's own docs still quote the CRM at 31 files / 1,929 lines ( Pointer for #236: Generated by Claude Code |
Refs #236 (item A)
Slot:
date: 2026-11-03(Tuesday) — seat 2's first slot after the positioning wave; merge on the slot day, by the seat (AGENTS.md, "Publishing cadence"). The "Date is in the future" advisory fromcontent:lintis expected until then. Items B, C and D stay open on #236.What this adds
One new post directory,
content/blog/what-do-ai-models-lack-in-the-enterprise/:index.mdx(en, authored) andindex.zh-Hans.mdx(re-derived, not translated);index.zh-Hant.mdxgenerated bypnpm gen:zh-hant. No further locales this round.cover.svg/cover-en.svgand the body diagramthree-supplies.svg/three-supplies-en.svg— zh / en pairs, every text node carries a class whose rule setsfill, all 24 text/background pairs ≥ 4.77:1 (WCAG AA), rendered at native size and looked at.The concept is the front page's "What the model lacks is not intelligence: a world, hands, and a fence." The post opens with the three definitions, states the checkable claim (an executable business ontology supplies all three from one artifact), gives the proof artifact — a table mapping each supply to the runtime mechanism with file:line — then one number measured on the bundled CRM (1,844 lines / 30 files; 78 lines of fence; 0 lines of plumbing), the RAG + function-calling + policy-layer stack steelmanned with a five-row comparison, five limits, the positioning paragraph quoted from
positioning.ts, and the "point your agent at it" CTA. Frontmatter:topic: ai-agents,audience: it, description 223 / 90 chars.Writing rule 9 against the siblings: no story opening (#244, #245), no two-user run (#237), no definition/removal test (#211); the proof artifacts here are the mechanism map and a line-count split, neither used by the other four. Post 1's removal test and #237's run are linked, not repeated. Internal links go only to posts on
maintoday (objectos-action-tools,objectos-agent-permission-boundaries, the definition post, the point-your-agent how-to), so every one of them is a built page forcontent-lint --dist.Every factual claim, with its objectstack source
All sources are
objectstack-ai/objectstackatorigin/main=1ecb08a1(read 2026-10-16), unless a sibling commit is named. Line numbers are of that commit.apps/docs/app/[lang]/page.tsx:127-131(identical text at712361b7, the commit the card cites)README.md:7-16,README.md:28-32;www.objectos.aisrc/lib/positioning.ts— a script compared en T2/T4/E1 and zh-Hans t2/t4/e1 against the module: all six byte-exactcontent/docs/concepts/ontology.mdx:16-25;README.md:81-82objectstack.config.ts -> objectstack.json -> runtime -> database · REST/realtime API · UI · MCP server; the runtime "derives" and "enforces the definition on every call. RBAC, row-level and field-level security, sharing, and audit apply to a REST request, a Console click and an agent's tool call alike. Nothing is reasoned over at runtime: what runs is what was validated."content/docs/concepts/ontology.mdx:64-73objectstack.config.ts, compiled into theobjectstack.jsonartifact."content/docs/concepts/ontology.mdx:14-15content/docs/concepts/ontology.mdx:34-40(the removal test itself is post 1, linked, not repeated)/api/v1/mcp, on by default; "Objects are tools, actions are tools, permissions decide what an agent may call, and audit records what it did"; objects exposed automatically, actions opt in withai: { exposed: true }; same permissions and RLS as a humanREADME.md:161-177(quote at 163-164);content/docs/ai/connect-mcp.mdx:7-11,:240-248content/docs/ai/connect-mcp.mdx:223-233ai.exposedis a schema field defaulting tofalse;description≥ 40 chars required when exposed; the "deliberate governance gate … must never be silently armed" commentpackages/spec/src/ui/action.zod.ts:764,:771,:1966-1972(refinement); comment at:707-719CompleteTaskActionwithai: { exposed: true, description: … }(UI-only keys trimmed in the post)examples/app-todo/src/actions/task.actions.ts:6-20type: 'flow'with noaiblock, solist_actionsanswers empty for itexamples/app-crm/src/actions/convert-lead.action.ts:9-32;examples/app-crm/src/actions/index.tsexports only it;grep -rn exposed examples/app-crm/src→ no matchql.registerMiddleware(...)); thesecurityservice is registered by the same pluginpackages/plugins/plugin-security/src/security-plugin.ts:2293-2294;:2278packages/mcp/src/mcp-http-tools.ts:4-11ai.exposed(the author's explicit AI opt-in, ADR-0011) + the ADR-0066 D4 capability gate";runActionenforcesrequiredPermissionsas the caller and loads the subject record under RLSpackages/mcp/src/mcp-http-tools.ts:1128-1133;:240-245run_action's own description: the action body "runs as trusted application code with the app's full data authority";requiresConfirmationrefuses withoutconfirm: truepackages/mcp/src/mcp-http-tools.ts:1182-1188afterInsert/afterUpdate/afterDeletepackages/plugins/plugin-audit/src/audit-writers.ts:2180-2185(and:1757)packages/plugins/plugin-audit/src/audit-plugin.ts:38-49undefined"packages/spec/src/contracts/security-service.ts:28-31/actionsis NOTai.exposed-gated and sits OUTSIDE this gate, so a human in front of that route is still yours to arrange"packages/spec/src/ai/tool.zod.ts:95-98os validaterejects "missing security posture"README.md:184-189;:187README.md:85-87;content/docs/concepts/ontology.mdx:49-53AGENTS.mdand installs the skills bundle;npm create objectstack@latest my-app;npx os dev --uiREADME.md:41-47,:60-64;content/docs/concepts/ontology.mdx:85-91content/docs/ai/connect-mcp.mdx:22-24,:202-209find examples/app-crm/src -name '*.ts' -not -name '*.test.ts' | xargs cat | wc -l→ 1844, over 30 files; per directory:objects/486 lines / 7 files (six objects),actions/35 +flows/205 = 240,security/88 lines / 2 files of whichsales-positions.tsis 78 (two permission setscrm_sales_userandguest_portal, three positionssales_rep,sales_manager,finance_approver); the remainder is views 292, dashboards 140, apps 40, pages 46, translations 241, datasets 38, datasources 52, data 157, hooks 24README.md:202-204) run ongit archive 1ecb08a1 examples/app-crm/src;examples/app-crm/src/security/sales-positions.tsgrep -rn -i 'registerTool|middleware|authoriz|checkPermission|audit' examples/app-crm/src→ 2 hits, both inside comment blocksexamples/app-crm/src/security/sales-positions.ts:10(" * authorization resolver reads."),examples/app-crm/src/views/lead.view.ts:103(" * authorizes the write.")sharingModel(fivepublic_read_write, the line itemcontrolled_by_parent), from which the runtime computes the row filterexamples/app-crm/src/objects/*.object.ts(account:11,activity:12,contact:12,lead:12,opportunity:12,opportunity-line-item:21)PM mechanism assumption — measured
The card's mapping holds, with one bound worth stating in the post (and stated): world = objects, fields, relations (claims 3–5); hands = objects as tools automatically and actions as tools on the author's
ai.exposedopt-in (claims 7–11); fence = permissions / RLS / FLS / sharing enforced as engine middleware every path shares, plus audit hooks (claims 12–18). The bound: theai.exposedopt-in guards the MCPrun_actiondoor; REST/actionsis outside that gate (claim 19), and read audit is narrower than write audit (claim 17). Both are in the post's "What this does not solve".Gates (local, at
2bb6ff4; exit codes captured before any pipe)Heavy gates ran under the shared verify lock (
OS_VERIFY_LOCK_SLOT=www-236a), the build and check joined with&&; the lock'sVERDICT batch-last-exit 0, held 1m56s on a shared box in the first run.pnpm content:lint✓ content lint passed (350 files, 44 glossary terms checked)— advisories only: title 68 cols, description 223 cols, "Date is in the future" (expected)pnpm content:lint --published(insidepnpm build)✓ content lint passed (350 files, 44 glossary terms checked)svg-text-fit(insidepnpm build; also run alone on the four new SVGs)svg-text-fit: OK — … (122 SVGs, 2587 text boxes, 183 filtered elements, tolerance 2px, 1 allowlisted); alone:(4 SVGs, 114 text boxes, 0 filtered elements, …, 0 allowlisted)pnpm build(astro build+og-images+content-lint --dist)[build] Complete!·✓ share images: 91 rendered at 1200x630 … no uncovered glyph·✓ content lint --dist passed (489 built blog pages checked)·✓ content lint --dist CJK line breaks passed (891 built pages, …, 0 segment breaks …)·✓ content lint --dist quotation marks passed (891 built pages, 12441 curly marks, 0 pointing the wrong way or left open …)·✓ content lint --dist links passed (94461 internal links in 891 built pages resolve to built files)pnpm checkResult (154 files): 0 errors, 0 warnings, 0 hintspnpm seo:smokeSEO smoke test passed (881 HTML pages checked; 580 sitemap URLs against 301 noindexed pages; 5508 canonical/hreflang annotations; 16524 prose blocks language-checked; 94451 internal links redirect-checked)/opt/pw-browsers/chromium, Playwright library from/opt/node-tools, againstastro previewofdist/)BROWSER CHECK PASS: 67 checks, 0 failing— en, zh-Hans, zh-Hant at 1440×750 and 390×844: HTTP 200;img.cover= 1 and 0 cover references in the body; every image scrolled into view anddecode()d; 56 / 55 / 55 internal links all 200; no horizontal page overflow; all three tablesoverflow-x: autoscroll containers (the mapping table fits at 390 after the 3-column revision); blog list en and zh-Hans at both widths shows the post first with its cover decodedCI runs the same
buildon the pull; the check-runs on this PR are the record for it.File surface
Exactly one new directory under
content/blog/(7 files); nothing else in the tree changed.git diff --stat 6ada491..2bb6ff4= 7 files, all undercontent/blog/what-do-ai-models-lack-in-the-enterprise/.Acceptance notes
buildandcheckwith;and a final[ $B -eq 0 ] && [ $C -eq 0 ], so its verdict covered both anyway; the second run (this head) joined them with&&.astro previewon port 4338 was left untouched; mine ran on 4399 → 4401 → 4402 and each was stopped by its own PID.content-lint's snippet-width advisory fires for every title over 60 columns, including post 1's 87; the title here is a query (rule 2) at 68.Generated by Claude Code