[PROVISIONAL_UNGRADUATED: D#17247]
Scope: high-blast reservation, unassigned, and not implementation-authorizing. The source Discussion remains pre-quorum. This shell preserves the now-actionable lane without turning operator direction into a substitute for peer graduation.
Problem scope
Operator direction on 2026-08-20 established the concrete goal: move the GitHub issue / pull-request / Discussion sync and its generated mirror into a dedicated repository, ingest that repository through the multi-repo Agent OS, and stop presenting mirror churn as engine-code activity. That is the substantive rationale for this reservation; it is not a graduation signal.
The distortion is live and measured. During the 24 hours ending 2026-08-20T12:50Z, resources/content/** produced 22 commits, 145 file touches, 8,950 insertions, and 600 deletions on dev. The latest hourly sync alone changed 13 files by +979/-69. These are legitimate GitHub-mirror changes, but they appear in Neo's pulse and history as product-code growth.
The current lane is not one directory move:
SyncService emits the Markdown corpus and derives Portal indexes / SEO artifacts.
buildScripts/dataSyncPipeline.mjs and .github/workflows/data-sync-pipeline.yml publish the generated commit and copy content into neomjs/pages.
TicketSource, PullRequestSource, and DiscussionSource split the corpus into semantic KB chunks.
IssueIngestor projects typed ISSUE / PULL_REQUEST / DISCUSSION nodes and relationships into the Native Edge Graph.
- The tenant-ingestion layer already isolates Chroma rows by
{tenantId, repoSlug}, but the specialized GitHub layer still names artifacts issue-N, pr-N, and discussion-N.
- Portal routes currently assume the logical mount
resources/content/**.
The repository that stores a mirror and the repository whose GitHub objects it represents are different identities. A future corpus checkout may be neomjs/githubsync, while its issue #17411 still belongs to neomjs/neo. One repoSlug cannot truthfully represent both.
This needs an Epic because the outcome crosses independently reviewable contracts: generated-corpus custody, GitHub artifact identity, graph and vector ingestion, Portal / Pages materialization, CI authority, and reversible cutover. No single PR can fully deliver and Resolves this outcome.
Architectural reality
Structure-map gate executed on 2026-08-20:
| Owning surface |
Files |
LOC |
ai/services/github-workflow |
15 |
6,701 |
ai/services/github-workflow/sync |
7 |
2,387 |
ai/services/ingestion |
8 |
1,977 |
ai/services/knowledge-base/source |
17 |
951 |
ai/daemons/orchestrator/services |
43 |
12,708 |
ADR 0004 remains the authority for the corpus's universal ordinal-100 on-disk shape and its regeneratable-cache semantics. This lane changes custody, provenance, and delivery; it does not license a second content-path primitive.
D#16794 is an adjacent authority, not a duplicate. It converged on one admitted writer, a revisioned GitMirror feed, and truthful per-facet projection receipts. Its 2026-08-20 revalidation against this Epic found that those three contracts survive a dedicated corpus source, while the A5/B5 bootstrap seed does not: /app/.neo-revision names a neomjs/neo commit and cannot be an ancestor of a neomjs/githubsync head. Different histories mean no baked seed exists; first acquisition must fully materialize.
That cost is measured, not hypothetical. #16557 observed a cold blobless first ingest reading 23,931 paths at ~0.42 s each — roughly 2.8 hours — and 24,834 repository clones on the affected day. The dedicated-repo option must state whether this is paid once per named plane volume or again on image/container recreation, and what revision witness replaces the cross-history ancestry check. A dedicated source must revalidate D#16794 rather than creating a parallel projection writer.
The completed tenant-repo ingestion Epic #11731 supplies repository acquisition and tenant-safe vector storage. Generic tenant ingestion alone is insufficient here: it preserves searchable text but not the typed GitHub graph identities and relationship semantics owned by the specialized ingestors.
Intended solution shape
A dedicated generated-corpus repository — working name neomjs/githubsync — becomes the one versioned home for the GitHub mirror. One admitted writer emits the existing ADR-0004 path shape plus an explicit corpus manifest that distinguishes:
- corpus identity — where the files live and at which revision;
- subject identity — the GitHub repository whose objects are mirrored;
- artifact identity — opaque GitHub global node ID, kind, current repository slug, number, and URL.
Public references use GitHub's repository-qualified form across boundaries. Existing issue-N / pr-N / discussion-N graph and retrieval trails remain resolvable through legacy aliases scoped to the historical neomjs/neo corpus; seven years of prose and edges are not mass-rewritten.
Agent OS consumes the dedicated corpus through one revision-aware source path that composes tenant isolation with the specialized GitHub graph projection. Per-facet receipts distinguish GitHub-to-corpus freshness from corpus-to-Graph freshness, so a dormant projector cannot look identical to a healthy no-op.
Portal and Pages consume the corpus at the stable logical resources/content/** mount and derive their JSON / sitemap / llms.txt outputs without committing hourly mirror bodies into the engine repository. The binding may be a checkout, build input, or deployment mount; this Epic does not pre-decide a Portal repository split.
Cutover is evidence-led and reversible: old and new emission run in shadow, corpus / index hashes and consumer outcomes are compared, then the Neo writer is retired. The working-tree mirror leaves Neo only after Graph, KB, Portal, and Pages parity is demonstrated. Historical pack rewriting is a separate irreversible lane.
Provisional divergence matrix
| Option |
Position |
When this would be right |
Evidence / falsifier |
| A — dedicated corpus repository first; no Neo history rewrite |
Recommendation for graduation review |
Generated-content custody and consumer parity can move independently of the wider code split |
Evidence: multi-repo ingestion exists; mirror churn is measured; ADR 0004 makes the corpus regeneratable. Falsifiers: shadow output cannot preserve typed Graph, KB retrieval, and Portal route parity from one revisioned source; or cold acquisition/recreation cannot meet a declared budget without reintroducing broad eager history |
| B — keep the mirror in Neo; suppress or relabel generated activity only |
Alternative |
The only problem is presentation in GitHub insights |
Falsifier: custody also couples Agent OS projection, Portal derivation, Pages publication, repository size, and every clone to the engine checkout |
| C — move Portal and content together into one website repository |
Alternative |
Portal is the sole meaningful consumer and the corpus is website-owned |
Falsifier: Agent OS independently consumes the same corpus for KB and Native Graph; application ownership must not become data authority by convenience |
| D — extract the corpus and rewrite Neo history in the same cut |
Alternative |
The irreversible pack reclaim is required for the extraction to deliver value |
Falsifier: future churn, custody, and pulse improve without changing one historical SHA; combining them makes a reversible cut depend on a fork-breaking operation |
Decision Record impact
depends-on ADR 0004 — the universal ordinal-100 corpus shape and regeneratable-cache principle stay authoritative.
Decision Record: OPTIONAL pending D#17247 convergence — graduation must decide whether repository custody + canonical cross-repo GitHub identity amend ADR 0004 or warrant a separate ADR.
Out of scope
- Extracting the Portal application into its own repository. That remains an adjacent option whose engine-website identity, route ownership, release cadence, and deployment economics need their own evidence.
- The wider engine / core / Agent OS / Fleet Manager split.
- npm package boundaries and Worker-scope module resolution.
- A
v13.2-alpha.1 release; release timing neither blocks nor completes this lane.
- Rewriting Neo's Git history or deleting historical GitHub artifacts.
- Moving existing pull requests, Discussions, or the seven-year issue corpus between GitHub trackers.
- Treating the eventual linked sub-set as a prose registry. Subs, once created, are discovered through native parent-child relationships.
Avoided traps
- Generic tenant ingestion as the whole answer. It does not reproduce typed Graph nodes, structural edges, or per-facet projection truth.
- One overloaded
repoSlug. Corpus repository and subject repository are different facts.
- A second sync / projection authority. D#16794's one-writer and receipt findings compose here.
- Copying the current pipeline into every consumer. That recreates the coupling under several repos.
- Bundling the history rewrite. It converts a reversible migration into a one-shot public event.
- Smuggling Portal extraction into a data-custody Epic. The content plane must remain usable whether Portal stays or moves.
- Reading direct operator rationale as cross-family graduation. This artifact remains provisional until the source Discussion's gates are satisfied.
Signal Ledger
PROVISIONAL — refresh from the current source-Discussion anchor before graduation.
- Operator substantive rationale, 2026-08-20: dedicated GitHub-content repository + multi-repo ingestion + removal of false code-churn signal. This authorizes reservation only.
- D#17247 author-family signal: not present at the current body anchor.
- Non-author active-family
[GRADUATION_APPROVED]: not present for this extracted lane.
- Quorum: not met.
Unresolved Dissent
- D#17247's divergence window remains open; no
[DIVERGENCE_FOLDED] marker or graduation proposal covers this extracted lane.
- D#16794 revalidation preserves one writer /
GitMirror / per-facet receipts, but voids the baked Neo-revision seed. Open: once-per-volume versus once-per-recreate cold-start cost, and the replacement for cross-history ancestry as the staleness witness.
- Portal custody is deliberately unresolved rather than silently inherited.
Unresolved Liveness
Must be refreshed from AgentIdentity.participationStatus at graduation. No absent family signal is treated as consent.
Discussion Criteria Mapping
PROVISIONAL — refresh after D#17247 incorporates this lane.
- D#17247 OQ1 (multi-repo serving): tenant-repo acquisition is delivered by
#11731; specialized GitHub projection and end-to-end serving remain to be proven here.
- D#17247 OQ4 (ticket-number fork): DevIndex now has its own tracker, so repository-qualified identity is no longer optional.
- D#17247 OQ6 (Data Sync ownership): this Epic reserves the content-plane answer without deciding unrelated per-product pipelines.
- D#17247 OQ7 (substrate residence): Agent OS consumes the corpus as a repository source; engine contributors do not inherit Agent OS substrate.
- D#16794 Decisions A/B/C: one admitted writer, revisioned feed, and per-facet projection receipts are inputs to convergence.
Creation notes
Live latest-open sweep: checked the latest 20 open issues at 2026-08-20T12:59Z; no equivalent found. Exact live search for githubsync, dedicated corpus repository, and GitHub content sync found no equivalent Epic. A2A recent-claim sweep found no competing claim.
Related
- D#17247 — repository split
- D#16794 — corpus-to-Graph projection ownership
#17238 — generated-state history and DevIndex extraction
#17376 — irreversible generated-artifact history reclaim
#17377 — DevIndex tenant registration
#16557 — measured cold blobless acquisition / first-ingest cost
#11731 — completed server-side tenant-repo ingestion
#11372 / ADR 0004 — universal GitHub content architecture
Origin Session ID: 23eef14d-923b-438d-beef-2e27377c65e1
Retrieval Hint: query_raw_memories("githubsync dedicated corpus repository subjectRepoSlug corpusRepoSlug D17247 D16794")
Problem scope
Operator direction on 2026-08-20 established the concrete goal: move the GitHub issue / pull-request / Discussion sync and its generated mirror into a dedicated repository, ingest that repository through the multi-repo Agent OS, and stop presenting mirror churn as engine-code activity. That is the substantive rationale for this reservation; it is not a graduation signal.
The distortion is live and measured. During the 24 hours ending 2026-08-20T12:50Z,
resources/content/**produced 22 commits, 145 file touches, 8,950 insertions, and 600 deletions ondev. The latest hourly sync alone changed 13 files by +979/-69. These are legitimate GitHub-mirror changes, but they appear in Neo's pulse and history as product-code growth.The current lane is not one directory move:
SyncServiceemits the Markdown corpus and derives Portal indexes / SEO artifacts.buildScripts/dataSyncPipeline.mjsand.github/workflows/data-sync-pipeline.ymlpublish the generated commit and copy content intoneomjs/pages.TicketSource,PullRequestSource, andDiscussionSourcesplit the corpus into semantic KB chunks.IssueIngestorprojects typed ISSUE / PULL_REQUEST / DISCUSSION nodes and relationships into the Native Edge Graph.{tenantId, repoSlug}, but the specialized GitHub layer still names artifactsissue-N,pr-N, anddiscussion-N.resources/content/**.The repository that stores a mirror and the repository whose GitHub objects it represents are different identities. A future corpus checkout may be
neomjs/githubsync, while its issue#17411still belongs toneomjs/neo. OnerepoSlugcannot truthfully represent both.This needs an Epic because the outcome crosses independently reviewable contracts: generated-corpus custody, GitHub artifact identity, graph and vector ingestion, Portal / Pages materialization, CI authority, and reversible cutover. No single PR can fully deliver and
Resolvesthis outcome.Architectural reality
Structure-map gate executed on 2026-08-20:
ai/services/github-workflowai/services/github-workflow/syncai/services/ingestionai/services/knowledge-base/sourceai/daemons/orchestrator/servicesADR 0004 remains the authority for the corpus's universal ordinal-100 on-disk shape and its regeneratable-cache semantics. This lane changes custody, provenance, and delivery; it does not license a second content-path primitive.
D#16794 is an adjacent authority, not a duplicate. It converged on one admitted writer, a revisioned
GitMirrorfeed, and truthful per-facet projection receipts. Its 2026-08-20 revalidation against this Epic found that those three contracts survive a dedicated corpus source, while the A5/B5 bootstrap seed does not:/app/.neo-revisionnames aneomjs/neocommit and cannot be an ancestor of aneomjs/githubsynchead. Different histories mean no baked seed exists; first acquisition must fully materialize.That cost is measured, not hypothetical.
#16557observed a cold blobless first ingest reading 23,931 paths at ~0.42 s each — roughly 2.8 hours — and 24,834 repository clones on the affected day. The dedicated-repo option must state whether this is paid once per named plane volume or again on image/container recreation, and what revision witness replaces the cross-history ancestry check. A dedicated source must revalidate D#16794 rather than creating a parallel projection writer.The completed tenant-repo ingestion Epic
#11731supplies repository acquisition and tenant-safe vector storage. Generic tenant ingestion alone is insufficient here: it preserves searchable text but not the typed GitHub graph identities and relationship semantics owned by the specialized ingestors.Intended solution shape
A dedicated generated-corpus repository — working name
neomjs/githubsync— becomes the one versioned home for the GitHub mirror. One admitted writer emits the existing ADR-0004 path shape plus an explicit corpus manifest that distinguishes:Public references use GitHub's repository-qualified form across boundaries. Existing
issue-N/pr-N/discussion-Ngraph and retrieval trails remain resolvable through legacy aliases scoped to the historicalneomjs/neocorpus; seven years of prose and edges are not mass-rewritten.Agent OS consumes the dedicated corpus through one revision-aware source path that composes tenant isolation with the specialized GitHub graph projection. Per-facet receipts distinguish GitHub-to-corpus freshness from corpus-to-Graph freshness, so a dormant projector cannot look identical to a healthy no-op.
Portal and Pages consume the corpus at the stable logical
resources/content/**mount and derive their JSON / sitemap /llms.txtoutputs without committing hourly mirror bodies into the engine repository. The binding may be a checkout, build input, or deployment mount; this Epic does not pre-decide a Portal repository split.Cutover is evidence-led and reversible: old and new emission run in shadow, corpus / index hashes and consumer outcomes are compared, then the Neo writer is retired. The working-tree mirror leaves Neo only after Graph, KB, Portal, and Pages parity is demonstrated. Historical pack rewriting is a separate irreversible lane.
Provisional divergence matrix
Decision Record impact
depends-on ADR 0004 — the universal ordinal-100 corpus shape and regeneratable-cache principle stay authoritative.
Decision Record: OPTIONAL pending D#17247 convergence — graduation must decide whether repository custody + canonical cross-repo GitHub identity amend ADR 0004 or warrant a separate ADR.
Out of scope
v13.2-alpha.1release; release timing neither blocks nor completes this lane.Avoided traps
repoSlug. Corpus repository and subject repository are different facts.Signal Ledger
PROVISIONAL — refresh from the current source-Discussion anchor before graduation.
[GRADUATION_APPROVED]: not present for this extracted lane.Unresolved Dissent
[DIVERGENCE_FOLDED]marker or graduation proposal covers this extracted lane.GitMirror/ per-facet receipts, but voids the baked Neo-revision seed. Open: once-per-volume versus once-per-recreate cold-start cost, and the replacement for cross-history ancestry as the staleness witness.Unresolved Liveness
Must be refreshed from
AgentIdentity.participationStatusat graduation. No absent family signal is treated as consent.Discussion Criteria Mapping
PROVISIONAL — refresh after D#17247 incorporates this lane.
#11731; specialized GitHub projection and end-to-end serving remain to be proven here.Creation notes
Live latest-open sweep: checked the latest 20 open issues at 2026-08-20T12:59Z; no equivalent found. Exact live search for
githubsync,dedicated corpus repository, andGitHub content syncfound no equivalent Epic. A2A recent-claim sweep found no competing claim.Related
#17238— generated-state history and DevIndex extraction#17376— irreversible generated-artifact history reclaim#17377— DevIndex tenant registration#16557— measured cold blobless acquisition / first-ingest cost#11731— completed server-side tenant-repo ingestion#11372/ ADR 0004 — universal GitHub content architectureOrigin Session ID: 23eef14d-923b-438d-beef-2e27377c65e1
Retrieval Hint:
query_raw_memories("githubsync dedicated corpus repository subjectRepoSlug corpusRepoSlug D17247 D16794")