Skip to content

docs(deployment): promote Docker to the lead path in self-hosting - #8960

Merged
os-project-manager merged 1 commit into
mainfrom
claude/issue-8911-docker-lead-path
Aug 16, 2026
Merged

os-project-manager merged 1 commit into
mainfrom
claude/issue-8911-docker-lead-path

Conversation

@os-project-manager

Copy link
Copy Markdown
Collaborator

Fixes #8911

Docker is not one option among three — it is how the platform ships. docker/Dockerfile and .github/workflows/docker-publish.yml build and publish ghcr.io/objectstack-ai/objectstack on every framework release; the page's ordering told a new reader the opposite, and ordering is the strongest signal a docs page has.

This is the re-framing the card asked for, not a rewrite. Prose that was already correct is left alone.

What changed — one file, content/docs/deployment/self-hosting.mdx

  • Docker leads. ## Option 2 — Docker (official image) becomes ## Docker (official image) — the standard path and moves to the front of the deployment paths. The Option 1/2/3 peer numbering is gone from all three headings — that numbering was the thing asserting they were equals.
  • Compose and Kubernetes are shapes of the same path. Compose gains one lead-in sentence tying build: . back to the Dockerfile in the section above; the Kubernetes subsection already opened with "The same image works unchanged" and is untouched.
  • Bare Node.js is demoted, not deleted. It moves after the Docker family and opens with a new sentence on when it is genuinely the right choice (no container runtime available or permitted, an existing systemd / configuration-management estate, debugging directly on the box). Its body is byte-identical across the move — git hash-object reads e48b3aed70947447d4d21e3373b4f6cffcef8129 on both sides.
  • Intro paragraph and frontmatter description re-ordered to match. The It assumes you have read… sentence that docs(deployment): retire the Vercel and ObjectQL-migration pages, re-point their inbound redirects, and fix the prose links into them #8947 rewrote is preserved exactly as it landed.
  • OS_ARTIFACT_URL stays on this page, unchanged, as Axis A operational detail. Its heading text is deliberately untouched: environment-variables.mdx, cli.mdx and docker/Dockerfile all point at the #artifact-pinned-boot-os_artifact_url anchor.

Image facts, verified from the tree

Per the card, no image reference was copied out of the existing prose.

Claim in the prose Checked against Verdict
Registry and name ghcr.io/objectstack-ai/objectstack docker-publish.yml IMAGE:, docker/Dockerfile header correct
Tag ladder: exact / major.minor / major / latest docker-publish.yml metadata-action tags: correct
latest only on stable publishes enable=${{ !contains(version, '-') }} correct — now stated in the prose
Published multi-arch platforms: linux/amd64,linux/arm64 correct
non-root user, health check, OS_ARTIFACT_PATH / OS_PORT=8080 preset docker/Dockerfile correct
Example version 14.8.0 packages/cli/package.json is 17.0.0 stale — fixed

14.8.0 appeared five times while the CLI is at 17.0.0 (GA'd 2026-08-14, per content/docs/releases/v17.mdx) — three majors stale, in what this PR makes the lead position, which is the failure the card called out as worse than the ordering itself. All five now read 17.0.0.

One bounded in-place fix, named with its evidence

The Dockerfile (self-built runtime, equivalent) block claimed equivalence with the official image while omitting two things docker/Dockerfile actually does: it ran as root (missing RUN chown node:node /srv/app and USER node, source lines 52-53) and hard-coded 8080 in the health check where the real one reads process.env.OS_PORT||8080 (source line 63). Same defect class as the card (Docker prose drifted from the tree), mechanical, correct form pinned verbatim by the source file, no other claim on this file, same gate families. Fixed here rather than filed, because the prose two paragraphs above advertises non-root as a property of the image being described.

Verification

Gates run at e9a250f, the final commit:

  • pnpm check:docs-audit-scope — scope in sync with content/docs/, 177 hand-written docs; release-owned pages review-only
  • pnpm check:role-word — 43 baselined files, no new occurrences (this page has zero and is not baselined)
  • pnpm check:nul-bytes — 5935 text files scanned, no raw ASCII control bytes

The set was re-derived against the actual changed path with node scripts/pm/dispatch-gates.mjs content/docs/deployment/self-hosting.mdx, which returns exactly check:docs-audit-scope and check:role-word; check:nul-bytes is the any-edit convention. No links were added or removed, and the only inbound-linked anchor on this page is preserved.

Docs-only, no user-visible package change — skip-changeset.


Generated by Claude Code

)

Docker is not one option among three — it is how the platform ships:
docker/Dockerfile and .github/workflows/docker-publish.yml build and
publish ghcr.io/objectstack-ai/objectstack on every framework release.
The page's ordering said the opposite, and ordering is the strongest
signal a docs page has.

Re-framing, not a rewrite: the "Option 1/2/3" peer numbering is gone,
the Docker section leads, Compose and Kubernetes read as shapes of that
same path, and bare Node.js (systemd) moves after them as the minority
path with a sentence on when it is the right choice. Its body is
byte-identical to before the move.

Image facts re-verified against the tree rather than copied from the
prose: the registry/name and the tag ladder are as documented, but the
example version was pinned at 14.8.0 while packages/cli is 17.0.0
(GA'd 2026-08-14) — a stale tag in what is now the lead position. Also
made the "self-built runtime, equivalent" Dockerfile actually
equivalent to docker/Dockerfile: non-root user and the OS_PORT-aware
health check it was missing.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011RB4waLuNbdruCo6X9oobm
@vercel

vercel Bot commented Aug 16, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectstack Ignored Ignored Aug 16, 2026 3:05am

Request Review

@github-actions github-actions Bot added size/m documentation Improvements or additions to documentation labels Aug 16, 2026
@os-project-manager os-project-manager added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 16, 2026 — with Claude
@os-project-manager
os-project-manager marked this pull request as ready for review August 16, 2026 03:10
@os-project-manager
os-project-manager added this pull request to the merge queue Aug 16, 2026
Merged via the queue into main with commit b50c0ef Aug 16, 2026
27 checks passed
@os-project-manager
os-project-manager deleted the claude/issue-8911-docker-lead-path branch August 16, 2026 03:25
akarma-synetal pushed a commit to akarma-synetal/framework that referenced this pull request Aug 17, 2026
…jectstack-ai#9016)

docker/README.md pinned its FROM, docker run, and OS_CLI_VERSION build-arg
examples at 14.8.0 while packages/cli is at 17.0.0 -- three majors stale.
A reader who copies the FROM line gets a v14 runtime paired with a current
v17-built artifact, and the engines.protocol gate refuses that pairing by
design, so the copy-paste path ended in a boot failure caused by one stale
digit.

Same defect class PR objectstack-ai#8960 fixed in content/docs/deployment/self-hosting.mdx
for objectstack-ai#8911; this file was outside that card's scope.

Fixes objectstack-ai#8961


Claude-Session: https://claude.ai/code/session_011RB4waLuNbdruCo6X9oobm

Co-authored-by: Claude <noreply@anthropic.com>
akarma-synetal pushed a commit to akarma-synetal/framework that referenced this pull request Aug 17, 2026
…ectstack-ai#9018) (objectstack-ai#9065)

The same "example image tag N majors behind packages/cli" staleness was found
and hand-fixed twice, independently: content/docs/deployment/self-hosting.mdx
(objectstack-ai#8911, PR objectstack-ai#8960) and docker/README.md (objectstack-ai#8961, PR objectstack-ai#9016). Two occurrences of an
identical drift is the threshold both prior cards named as the point where a
mechanical guard beats fixing the third one by hand.

Adds scripts/check-docs-image-tag.mjs (dependency-free, pure filesystem), the
check:docs-image-tag root script, and a step in lint.yml's required ESLint job
-- the job whose REQUIRED_CONTEXTS `carries` field records "the whole check:*
gate family", verified in the ledger rather than recalled.

Three anchored patterns over three explicitly enumerated surfaces: the ghcr
image tag, the OS_CLI_VERSION build arg, and the @objectstack/cli@ npm pin.
Only tags opening with three dot-separated integer groups are compared, which
is what excludes docker/README.md's own X.Y.Z tag-table metavariable. A surface
that yields no concrete pin fails rather than passing, so the enumeration
cannot rot into a silent no-op.

Both target surfaces were repaired within the day, so the live corpus is
guaranteed green and a passing run cannot distinguish a working gate from a
blind one. Every limb therefore carries a positive control in --self-test over
a temp fixture running the real checkSurfaces path, paired with a clean fixture
asserting zero findings, plus a live control proving the X.Y.Z metavariable is
still in docker/README.md and still excluded there.


Claude-Session: https://claude.ai/code/session_011RB4waLuNbdruCo6X9oobm

Co-authored-by: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/m skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

docs(deployment): promote Docker to the lead path in self-hosting — it is how the platform actually ships

2 participants