Context
The Day-0 Cloud Deployment Tutorial's Milestone 6 — Optional Clone / Server-Side Source reads:
Server-side clone is not part of the MVP push path. If the deployment receives only {repo, ref, sha} metadata and must fetch content itself, stop and route to #11731. That path needs a credential-storage and clone-trust contract before implementation.
This framing is materially stale as of 2026-05-27. Epic #11731's substrate has fully shipped. Pull mode is a first-class production option, not a future-deferred path.
Operators reading the Day-0 tutorial today see "deferred to #11731" and miss the entire shipped pull-mode surface — they either skip the milestone or route off the canonical path looking for non-existent design docs.
The Problem
Three claims in Milestone 6 that are no longer accurate:
"Server-side clone is not part of the MVP push path" — accurate as written (push and pull are separate paths), but the phrasing implies pull mode is unavailable. It IS available; it's just additive to push, not part of it.
"That path needs a credential-storage and clone-trust contract before implementation" — the contract has shipped:
The expected-result placeholders (server-side clone: deferred to #11731 or operator-owned Source registered intentionally) don't reflect the actual shipped path. An operator reading the tutorial should see a concrete pull-mode setup recipe, not a deferred-status marker.
The Architectural Reality
The Fix
Rewrite Milestone 6 to:
- Reframe: "Optional Pull Mode / Server-Side Tenant Repo Sync" (push remains primary; pull is additive for tenants who want orchestrator-owned ingestion cadence rather than git-hook-driven publish).
- Concrete pull-mode setup recipe (parallel to Milestone 3's push recipe):
- Configure
tenantRepos[] entry in the operator overlay.
- Set
NEO_GITLAB_<SCOPE>_TOKEN (or analog) for the credential indirection.
- Trigger first sync via
node ai/scripts/maintenance/syncTenantRepos.mjs --repo-slug <slug>.
- Verify chunks via
ask_knowledge_base.
- Remove the "deferred to #11731" framing and the
server-side clone: deferred to #11731 expected-result block.
- Cross-link to
TenantIngestionModel.md for the operator decision model + HookWiring.md for the push-vs-pull selection guide.
- Preserve Custom Sources reference at the bottom — the "operator owns full-corpus build" case is genuinely orthogonal to pull-mode-via-tenantRepos[] and still routes through
Source.extract.
Decision Record impact
aligned-with ADR 0014 — documentation-only update. ADR 0014 already names tenant-repo-sync as a cloud-deployable lane; this PR just updates the tutorial to reflect the shipped state.
Contract Ledger
| Target Surface |
Source of Authority |
Proposed Behavior |
Fallback / Edge Case |
Docs |
Evidence |
Day0Tutorial.md Milestone 6 heading |
This ticket |
Rename to "Optional Pull Mode / Server-Side Tenant Repo Sync"; remove "deferred to #11731" framing |
Keep "Custom Sources" sub-reference for the full-corpus-build path (it's genuinely a different operator pattern) |
The doc itself |
Diff inspection — no remaining deferred to #11731 in Milestone 6 body |
Day0Tutorial.md Milestone 6 body |
This ticket + TenantIngestionModel.md + HookWiring.md (already operator-canonical) |
Concrete pull-mode setup recipe parallel to Milestone 3 (tenantRepos[] entry → credential → trigger → verify) |
Skipping-Milestone-6 expected-result still allowed for push-only deployments; explicitly framed as "this milestone is optional if push covers your tenant content" |
Cross-linked to TenantIngestionModel.md + HookWiring.md |
Diff inspection — new section has the 4-step pull setup with file:line / command anchors |
Expected-result placeholders (server-side clone: deferred to #11731) |
This ticket |
Replace with concrete result: tenant repo synced + N chunks ingested + ask_knowledge_base returns refs |
Keep "skipped — push covers our content" as a valid expected-result for operators who don't need pull |
The doc itself |
Diff inspection — old placeholder text removed |
| Cross-links to sibling docs |
learn/agentos/cloud-deployment/TenantIngestionModel.md + learn/agentos/cloud-deployment/HookWiring.md |
Add explicit pointers from Milestone 6 body |
Existing Related section retains all current links |
Already canonical |
New "Related" links inside Milestone 6 body |
Non-overlap with CustomSources.md workflow |
CustomSources.md (the full-corpus-build path remains the right surface for operator-owned source territories) |
Preserve the existing pointer at the bottom of Milestone 6 for the genuinely-different "operator runs own full-corpus build" pattern |
Both shapes can coexist in a single deployment (pull-mode for some tenants + Custom-Source for operator-owned content) |
CustomSources.md |
Diff inspection — Custom Sources link retained, framed correctly as orthogonal not redundant |
Acceptance Criteria
Out of Scope
- Adding new operational features to pull-mode itself — the substrate is shipped; this is doc-only.
- Restructuring Day0Tutorial.md beyond Milestone 6 — Milestones 0-5 + 7 remain canonical.
- Rewriting
TenantIngestionModel.md or HookWiring.md — they're already canonical and accurate; Milestone 6 just needs to point at them.
- Telemetry / health-payload changes — covered by #11791 (operator docs + health/telemetry for tenant-repo ingestion).
Avoided Traps
- Deleting Milestone 6 entirely: tempting since the "deferred" framing is stale, but Day0 numbering is referenced elsewhere; deleting a milestone reshuffles operator expectations. Reframe in place.
- Folding pull-mode into Milestone 3 (push): would compress the push-vs-pull selection conversation. Keeping them in separate milestones preserves the operator decision-axis.
Related
- Parent: #11791 (operator docs + health/telemetry umbrella for tenant-repo ingestion). This Day-0 update is a focused sub-piece.
- Substrate that shipped (motivating the rewrite): #11731 Epic + #11787, #11788, #11789, #11790 subs + #12030, #12045, #12050 follow-ons.
- Empirical session anchor: first cloud-deployment exercise 2026-05-26 — pull-mode validated end-to-end in production-shape stack.
Context
The Day-0 Cloud Deployment Tutorial's Milestone 6 — Optional Clone / Server-Side Source reads:
This framing is materially stale as of 2026-05-27. Epic #11731's substrate has fully shipped. Pull mode is a first-class production option, not a future-deferred path.
Operators reading the Day-0 tutorial today see "deferred to #11731" and miss the entire shipped pull-mode surface — they either skip the milestone or route off the canonical path looking for non-existent design docs.
The Problem
Three claims in Milestone 6 that are no longer accurate:
"Server-side clone is not part of the MVP push path" — accurate as written (push and pull are separate paths), but the phrasing implies pull mode is unavailable. It IS available; it's just additive to push, not part of it.
"That path needs a credential-storage and clone-trust contract before implementation" — the contract has shipped:
TenantRepoAccessContract(#11787) defines thecloneUrl/credentialRefseparation.GitMirror(#11788) resolves credentialRef at theGIT_ASKPASSsubprocess boundary only; supportsenv:,ssh:,file:(#12032 / #12046) schemes.TenantRepoIngestEnvelopeBuilder(#11789).TenantRepoSyncService(#11790) with thetenant-repo-syncorchestrator lane.RawRepoSource,branchRefschema, Tier-1tenantRepoMirrorRootfallback.The expected-result placeholders (
server-side clone: deferred to #11731oroperator-owned Source registered intentionally) don't reflect the actual shipped path. An operator reading the tutorial should see a concrete pull-mode setup recipe, not a deferred-status marker.The Architectural Reality
learn/agentos/cloud-deployment/Day0Tutorial.md:567-588— Milestone 6 body.learn/agentos/cloud-deployment/TenantIngestionModel.md— canonical operator-facing push + pull semantics. Already documents the pull-mode surface.learn/agentos/cloud-deployment/HookWiring.md— push surfaces (ai:kb-push-client,ingest_source_files,ai:ingest-tenant); doesn't cover pull because pull doesn't have a hook surface — orchestrator-owned.learn/agentos/cloud-deployment/CustomSources.md—Source.extractcontract +SourceRegistryregistration (still the right link for the full-corpus-build path).The Fix
Rewrite Milestone 6 to:
tenantRepos[]entry in the operator overlay.NEO_GITLAB_<SCOPE>_TOKEN(or analog) for the credential indirection.node ai/scripts/maintenance/syncTenantRepos.mjs --repo-slug <slug>.ask_knowledge_base.server-side clone: deferred to #11731expected-result block.TenantIngestionModel.mdfor the operator decision model +HookWiring.mdfor the push-vs-pull selection guide.Source.extract.Decision Record impact
aligned-with ADR 0014— documentation-only update. ADR 0014 already names tenant-repo-sync as a cloud-deployable lane; this PR just updates the tutorial to reflect the shipped state.Contract Ledger
Day0Tutorial.mdMilestone 6 headingdeferred to #11731in Milestone 6 bodyDay0Tutorial.mdMilestone 6 bodyTenantIngestionModel.md+HookWiring.md(already operator-canonical)TenantIngestionModel.md+HookWiring.mdserver-side clone: deferred to #11731)tenant repo synced + N chunks ingested + ask_knowledge_base returns refslearn/agentos/cloud-deployment/TenantIngestionModel.md+learn/agentos/cloud-deployment/HookWiring.mdCustomSources.mdworkflowCustomSources.md(the full-corpus-build path remains the right surface for operator-owned source territories)CustomSources.mdAcceptance Criteria
TenantIngestionModel.md+HookWiring.mdadded inside Milestone 6 body.Out of Scope
TenantIngestionModel.mdorHookWiring.md— they're already canonical and accurate; Milestone 6 just needs to point at them.Avoided Traps
Related