feat(sync): add the Track B distribution caller workflow - #63
Conversation
|
Claude finished @kyle-sexton's task in 1m 33s —— View job Code Review
File reviewed: This is a clean, well-scoped activation PR. The deliberate deviation from the plan-doc snippet is correctly reasoned and well-documented. No blocking issues found. What looks goodSHA pinning — Full SHA (
Permission footprint —
Header comment — The Nits / low-risk observations1. Missing concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: trueA 2. No Plan-doc checklist status (informational)This PR correctly lands only the ungated "Author the Verdict: approve with the above nits noted. Both are cosmetic/conventions issues, not correctness or security problems. The |
Calls the ci-workflows standards-sync engine (SHA-pinned per D5) with the App secrets wired. Dispatch-only for the staged activation: the push-paths and weekly-schedule triggers land in a follow-up once the single-target pilot is confirmed, so neither a modules-touching merge nor the Monday cron can fire a full-fleet real sync before then. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GbDWhcUtduCejgi7mcbMfy
…on governance (#123) ## Summary Closes decisions **#27**, **#63**, and **#65** from the [Decisions Log](https://claude.ai/code/artifact/232ecdce-8316-4880-8c0a-dc3c7dcf3a63) (evidence/rationale: https://claude.ai/code/artifact/3160ae0e-c02f-4619-8de3-60d73faa1100). ### #63 metadata-standards-copy-vs-cite-doctrine Decision: **keep the "copy" adoption path, require back-link + drift-check.** Adds `distribution/governance-process.md`. `conventions/README.md` already documents two adoption paths for reasoning-only prose — copy into the consumer's tree, or point at this repo. The copy path stays available (prose has no runtime coupling to enforce reconciliation the way `sync-manifest.yml` does), but a copy now carries two mandatory requirements: - **Back-link** — every copied file cites its exact canonical source (repo + path, inline header where the format allows it), using the same stable-anchor citation discipline `reference-dont-duplicate.md` already prescribes for the "Expose" file role. - **Drift-check** — the adopting repo owns a periodic diff of its copy against the current canonical source, with a named owner and trigger, mirroring the recheck-trigger discipline `documentation-and-citations.md` already requires for time-bound external claims. The doc is explicit that this is distinct from a `managed` `sync-manifest.yml` component, which already reconciles automatically and deliberately carries no downstream receipt — the back-link/drift-check burden applies only where nothing else keeps a copy current. ### #65 naming-cross-doc-reconciliation-process-ownership Decision: **establish a standing cross-reference review step for normative-doc changes.** Same doc adds the standing process step: before a change to a normative doc (`naming.md`, `process/issue-tracker.md`, `review/code-quality.md`, and any other file in the catalog stating a rule another doc cites or assumes) merges, a cross-reference check confirms no other doc now contradicts it. Ownership is named explicitly rather than left implicit: `required_approving_review_count` stays at `0` org-wide (decision #11, single-maintainer), so there is no independent blocking reviewer to gate this. The step is documented as a **self-review checklist item the author performs before merge**, with a documented future automation path — extending the periodic cross-plugin-source consistency check (decision #37, for `claude-code-plugins`) to this repo's own normative docs once that check exists, so the control stops depending solely on author diligence. `conventions/README.md` gets a new "Changing a normative file" pointer to this requirement; `distribution/README.md` gets a pointer alongside its existing `THREAT-MODEL.md` reference. ### #27 tooling-gov-conventions-graduate-to-enforced Decision: **graduate mechanically-checkable rules into sync-manifest-tracked components.** Reviewed every file under `conventions/` against `enforceability-tiers.md`'s deterministic/detect-then-judge/reasoning-only split. Finding: **no ungraduated deterministic rule exists to graduate.** Every deterministic (mechanically-checkable) rule already points to its owning component instead of restating it: | Convention area | Deterministic rule | Owning component | Tracked in `sync-manifest.yml`? | |---|---|---|---| | Secrets (`review/security.md`) | no secrets in source | `gitleaks` | yes | | Comments (`review/code-quality.md`) | debt markers / tracker provenance | `comment-hygiene` | yes (`comment-hygiene-action`) | | Citations (`documentation-and-citations.md`) | cited URL resolves | link check | yes (`lychee`) | | TypeScript/JS (`review/overlays/typescript.md`) | lint/format/import order, type correctness | `biome`, `tsconfig` | **no** — deliberately native-package (`extends`) adoption per `distribution/README.md`'s ownership model, not exact materialization | | Python (`review/overlays/python.md`) | lint/format, type correctness | `ruff`, `pyright` | yes | | .NET (`review/overlays/dotnet.md`) | analyzers, code style, banned symbols | `dotnet-analysis` | yes | | Container build (`container-supply-chain.md`) | Docker Build checks, OSV scans | *(none yet)* | **no** — the convention itself explicitly defers this pending live-consumer admission evidence per `docs/component-lifecycle.md`; graduating it without that evidence would violate the same lifecycle contract | | PR titles (`review/code-quality.md`) | Conventional Commits format | *(ci-workflows `pr-title.yml`)* | out of this repo's materialization surface — owned by `ci-workflows`, per README.md's ownership boundaries | | Naming (`naming.md`), label/issue-tracker usage (`process/issue-tracker.md`), duplication (`reference-dont-duplicate.md`) | — | — | self-declared reasoning-only; no deterministic subset exists to graduate | No `sync-manifest.yml` change is included. The one adjacent orphan noticed in passing — `components/lefthook-typescript` exists, is fully built, but is not registered in `sync-manifest.yml` for any target — is tooling infrastructure, not a `conventions/` rule, and assigning it to a target's `managed:` list is a separate adoption decision requiring its own admission evidence; flagging it here for a follow-up rather than folding it into this PR. ## Test plan - [x] `npx markdownlint-cli2` — 0 errors across the full repo (71 files, including the new/changed docs) - [x] `lychee` — 21/21 links OK on the changed files (0 errors) - [x] `typos` — clean on the changed files - [x] `lefthook` pre-commit (typos, editorconfig, gitleaks, markdownlint) — all passed at commit time - [ ] Maintainer confirms the #27 classification table before merge — no code/config changed, so this PR is prose-only and carries no behavioral risk 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>


Summary
Activates the Track B config-distribution caller per the plan doc's activation checklist (docs/dedup-program/config-distribution-plan.md):
melodic-software/ci-workflows/.github/workflows/standards-sync.yml@9cf6d13(latest main, includes thetargetsfilter from ci-workflows#56), SHA-pinned per D5.STANDARDS_SYNC_APP_ID/STANDARDS_SYNC_APP_PRIVATE_KEY(already set on this repo; App verified installed on the org with exactlycontents:write+pull_requests:write).workflow_dispatchonly. The snippet'spush(paths) + weeklyscheduletriggers would let a modules-touching merge or the Monday 06:00 UTC cron fire a full-fleet REAL sync before the single-target pilot is confirmed (inputs.dry-run || falseevaluates to a real run on both events). They land in a follow-up PR after the pilot — the header comment carries the snippet's|| falseinversion warning forward.targetspassthrough so the pilot can run againstmelodic-software/github-iacalone.Verification
actionlint + zizmor clean locally; the dry-run dispatch (engine plan job needs no secrets) is the next activation step.
🤖 Generated with Claude Code
https://claude.ai/code/session_01GbDWhcUtduCejgi7mcbMfy
Note
Medium Risk
Enables org-wide config distribution PRs via a GitHub App once dry-run is turned off; staged dispatch limits blast radius but misconfiguration or premature activation could still open many PRs.
Overview
Adds
.github/workflows/sync.yml, the Track B caller that invokes the SHA-pinned reusablestandards-syncengine inci-workflowsto distribute manifest-driven config and open per-repo PRs.Activation is staged: only
workflow_dispatchwithdry-rundefaulting to true and an optionaltargetsallowlist for a single-repo pilot.pushand weekly schedule triggers are intentionally deferred so merges or cron cannot run a full-fleet real sync before the pilot. The job passesSTANDARDS_SYNC_APP_*secrets and keepscontents: readon the caller.Reviewed by Cursor Bugbot for commit 39b2fcb. Bugbot is set up for automated code reviews on this repo. Configure here.