Context
This ticket originally concluded that the corpus generator had never had an automated publisher. Live history falsifies that premise:
- automated
chore: ticket sync [skip ci] commits advanced resources/content/** until 2026-07-17;
- the default-branch ruleset then began rejecting the local orchestrator's pushes with
GH013;
- the existing Data Sync workflow now has a working Publisher App identity and continues to advance
dev, but its generated-path allowlist excludes resources/content/**;
- the canonical long-running checkout therefore keeps regenerating the corpus locally without a delivery path. On 2026-07-28 it held 794 modified or untracked generated outputs.
This is a publication regression, not a missing-design investigation.
The Problem
The corpus currently has two incomplete halves:
githubWorkflowSync still runs every two hours in a local maintainer checkout. It can emit issues, pull requests, discussions, and release notes, but its checkout credential cannot bypass the current dev ruleset.
.github/workflows/data-sync-pipeline.yml already possesses the sanctioned Publisher App credential and successfully pushes generated data, but buildScripts/dataSyncPipeline.mjs neither runs the corpus generator nor stages resources/content/**.
Moving the existing generator into CI exposes two recovery edges:
- the first discussion bootstrap has no
updatedAt high-water mark and its first: 50 GraphQL query exceeds GitHub's resource limit; a measured outer page size of 30 succeeds while retaining complete cursor pagination;
GH_SyncService deliberately preserves successful facet output when another facet fails, but an ephemeral runner currently exits before that progress can be published.
The Fix
Extend the existing Data Sync pipeline as the sole scheduled corpus publisher:
- run the canonical corpus generator in an emission-only mode under the workflow's read identity;
- allowlist
resources/content/** and publish it through the pipeline's existing Publisher App push;
- cap the outer discussion bootstrap page at the measured safe size while retaining full pagination;
- if one corpus facet fails, publish only the integrity-checked progress from successful facets, then fail the workflow loudly;
- disable local scheduled corpus generation by default while retaining the manual
syncGithubWorkflow entry point.
No second publisher identity or new ADR is needed: this extends the already-sanctioned Data Sync ownership and credential split.
Contract Ledger Matrix
| Target Surface |
Source of Authority |
Required Behavior |
Failure Behavior |
Evidence |
resources/content/** on dev |
GH_SyncService generators |
advances from the scheduled Data Sync workflow |
failed facet rolls back; successful facets may publish; workflow remains red |
focused unit tests + scheduled-run commit |
| Corpus read authority |
Data Sync reader context |
issues, pull requests, discussions, and releases are readable |
no write credential is exposed to generation |
workflow permissions/config inspection |
| Corpus push authority |
existing Publisher App |
final allowlisted generated diff is pushed to dev |
push failure fails the workflow |
existing authenticated push path + scheduled run |
| Local orchestrator |
orchestrator.localOnly.githubWorkflowSyncEnabled |
off by default; manual CLI remains available |
no periodic dirtying of maintainer checkouts |
config/unit coverage |
Acceptance Criteria
Decision Record impact
None. The implementation extends the Publisher App / reader identity split already established by #15744 and the existing Data Sync pipeline.
Out of Scope
- Durable within-facet cursor checkpoints and interrupted-run resume (#16002).
- Discussion comment/reply completeness (#16016).
- Corpus schema or rendering-format changes.
- Any non-generated file cleanup in the canonical checkout.
Avoided Traps
- Do not give the generator a write credential or let emission invoke its legacy nested push path.
- Do not treat a green Data Sync run as corpus freshness until
resources/content/** is in its allowlist.
- Do not hide a partial facet failure merely because successful-facet progress was published.
- Do not reset the canonical dirty checkout before the CI-published commit exists.
Related
- #15744 — Publisher App / read-identity authority split
- #15972 — green-pipeline / stale-corpus alarm
- #16001 / PR #16015 — discussion
updatedAt delta high-water support
- #16002 — durable within-facet resume
- #16016 — discussion comment/reply completeness
Retrieval Hint: resources content scheduled corpus publication Data Sync Publisher App GH013 discussion bootstrap
Context
This ticket originally concluded that the corpus generator had never had an automated publisher. Live history falsifies that premise:
chore: ticket sync [skip ci]commits advancedresources/content/**until 2026-07-17;GH013;dev, but its generated-path allowlist excludesresources/content/**;This is a publication regression, not a missing-design investigation.
The Problem
The corpus currently has two incomplete halves:
githubWorkflowSyncstill runs every two hours in a local maintainer checkout. It can emit issues, pull requests, discussions, and release notes, but its checkout credential cannot bypass the currentdevruleset..github/workflows/data-sync-pipeline.ymlalready possesses the sanctioned Publisher App credential and successfully pushes generated data, butbuildScripts/dataSyncPipeline.mjsneither runs the corpus generator nor stagesresources/content/**.Moving the existing generator into CI exposes two recovery edges:
updatedAthigh-water mark and itsfirst: 50GraphQL query exceeds GitHub's resource limit; a measured outer page size of 30 succeeds while retaining complete cursor pagination;GH_SyncServicedeliberately preserves successful facet output when another facet fails, but an ephemeral runner currently exits before that progress can be published.The Fix
Extend the existing Data Sync pipeline as the sole scheduled corpus publisher:
resources/content/**and publish it through the pipeline's existing Publisher App push;syncGithubWorkflowentry point.No second publisher identity or new ADR is needed: this extends the already-sanctioned Data Sync ownership and credential split.
Contract Ledger Matrix
resources/content/**ondevGH_SyncServicegeneratorsdevorchestrator.localOnly.githubWorkflowSyncEnabledAcceptance Criteria
resources/content/**is part of the generated-data allowlist and is delivered only by the existing Publisher App final push.githubWorkflowSyncis disabled by default; the guarded manual maintenance command remains available.resources/content/**ondevand the existing per-facet watchdog reports all facets fresh.Decision Record impact
None. The implementation extends the Publisher App / reader identity split already established by #15744 and the existing Data Sync pipeline.
Out of Scope
Avoided Traps
resources/content/**is in its allowlist.Related
updatedAtdelta high-water supportRetrieval Hint:
resources content scheduled corpus publication Data Sync Publisher App GH013 discussion bootstrap