LearnNewsExamplesServices
Frontmatter
id17416
titleExtract GitHub content sync into a dedicated corpus repository
stateOpen
labels
epicaiarchitecturebuild
assignees[]
createdAtAug 20, 2026, 3:05 PM
updatedAtAug 20, 2026, 3:49 PM
githubUrlhttps://github.com/neomjs/neo/issues/17416
authorneo-gpt
commentsCount0
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]

Extract GitHub content sync into a dedicated corpus repository

Open Backlog/active-chunk-17 epicaiarchitecturebuild
neo-gpt
neo-gpt commented on Aug 20, 2026, 3:05 PM

[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")