Skip to content

fix(lychee): add the five missing private repos to the exclusions#214

Merged
kyle-sexton merged 3 commits into
mainfrom
fix/lychee-private-repo-excludes
Jul 20, 2026
Merged

fix(lychee): add the five missing private repos to the exclusions#214
kyle-sexton merged 3 commits into
mainfrom
fix/lychee-private-repo-excludes

Conversation

@kyle-sexton

Copy link
Copy Markdown
Contributor

Closes #212

Summary

The private-repo exclusion list named 4 of the org's 9 private repositories. Missing: itinerary-planner, knowledge-corpus, medley-archive, melodic-main-archive, songwriting.

A link to any of the five 404s in the online link lane for precisely the reason the list exists to prevent — the calling repo's GITHUB_TOKEN cannot read another private repo. Latent rather than breaking today, since no tracked file currently links to them. The block's own comment states the rule it drifted from: "Keep in sync with actual visibility: add newly created private repos here."

medley-archive is ordered before medley in the alternation so the longer name cannot be shadowed by a prefix match.

Test plan

Verified empirically with lychee --dump over a fixture covering all 9 private repos plus .git and github.com/ghraw variants, comparing old config against new.

  • Old config leaked 8 private URLs:
itinerary-planner, knowledge-corpus, medley-archive, melodic-main-archive,
songwriting, medley-archive.git,
github.com/ghraw/.../medley-archive/..., raw.../songwriting/...
  • New config excludes all 9, including the .git and raw. variants.
  • The 3 public repos still survive exclusion and stay checkedstandards, ci-workflows, .github — confirming the change does not over-exclude.
  • medley vs medley-archive disambiguation confirmed by the fixture, not by reasoning about alternation order.
  • lefthook pre-commit: typos, gitleaks, editorconfig all pass.

Related

  • Follows the same maintenance pattern as fix(lychee): drop claude-code-plugins and standards from the private-repo exclusions #204 (fix(lychee): drop claude-code-plugins and standards from the private-repo exclusions), which moved entries the other direction when repos went public.
  • Surfaced by a repo hygiene sweep of melodic-software/.github (chore: fix drifted references and workflow schema gap .github#29). Not fixable there — lychee is an upstream-managed component, so the change belongs here and reaches consumers through the reconciliation sync.
  • Worth considering separately: this list is hand-maintained against a queryable fact (gh repo list --visibility private), so it will drift again. A generation or CI-check step would remove the class of problem rather than this instance. Not in scope here.

The private-repo exclusion list named 4 of the org's 9 private
repositories. itinerary-planner, knowledge-corpus, medley-archive,
melodic-main-archive, and songwriting were absent, so a link to any of
them 404s in the online lane for exactly the reason the list exists to
prevent: the calling repo's GITHUB_TOKEN cannot read another private
repo.

Latent rather than breaking today, since no tracked file currently links
to the five. The comment already states the rule this drifted from:
"add newly created private repos here".

medley-archive precedes medley in the alternation so the longer name
cannot be shadowed by a prefix match.

Verified with `lychee --dump` over a fixture covering all 9 private repos
plus .git and github.com/ghraw variants: the old config leaked 8
private URLs, the new config excludes all of them, and the 3 public repos
(standards, ci-workflows, .github) still survive exclusion and stay
checked.
@claude

claude Bot commented Jul 20, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 1m 14s —— View job


Review

  • Gather context
  • Read changed file and REVIEW.md
  • Analyze the diff
  • Post review feedback

Verdict: Approve — clean maintenance fix, no issues found.

What the change does

Two alternation groups in lychee.toml gain five repo names (itinerary-planner, knowledge-corpus, medley-archive, melodic-main-archive, songwriting), bringing the private-repo exclusion list from 4 to 9 repos. Both the github.com and github.com/ghraw patterns are updated in lockstep, which is exactly right — a missed update to the raw. pattern would still let raw-content links through.

Regex correctness

The boundary anchor (\.git)?([/#?]|$) on the github.com pattern correctly prevents any prefix-shadowing between medley and medley-archive: after matching medley, the - in -archive is not in [/#?] and is not end-of-string, so the alternation falls through to try medley-archive. The ordering noted in the PR body is belt-and-suspenders rather than strictly necessary, but it does no harm and is marginally more readable.

The github.com/ghraw pattern ends with / rather than ([/#?]|$), which is appropriate — those URLs always carry a ref/path component after the repo name, so / is mandatory in that URL structure and serves as an equivalent boundary.

Both patterns are internally consistent: the same nine repo names, in the same alphabetical order, in both lines.

REVIEW.md checklist

None of the blocking criteria in REVIEW.md are triggered: no handler with object IDs, no tenant-scoped data, no secrets, no parameterization concern, no high-risk auth action, no multi-record atomicity requirement. All applicable checks pass.

No nits.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 55da9e0f90

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread lychee.toml
The contract test pins the private-repo exclusion regexes as exact
literals and asserts exclusion against a fixture, so widening the
inventory without updating both made the suite fail.

Updates the two pinned literals and extends the exclusion loop from 4 to
all 9 private repos. The fixture gains the five new repos as well: the
loop asserts a URL is absent from the dump, which passes vacuously for
any repo the fixture never mentions, so the fixture entries are what make
the new assertions real.

Adds a raw-content assertion for medley-archive. It is a superstring of
medley, so it proves the longer name matches on its own rather than being
shadowed by the shorter alternation arm.

Verified by mutation: removing songwriting from the config fails
assertion [13] (fixture-backed exclusion), not only the literal
comparison, confirming the added coverage is not vacuous.
@claude

claude Bot commented Jul 20, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 2m 46s —— View job


Review

  • Gather context
  • Read changed files
  • Analyze the diff
  • Post review feedback

Verdict: Approve — the second commit squarely addresses the Codex finding, and all three files are consistent end-to-end.

What changed

The PR adds five missing private repos (itinerary-planner, knowledge-corpus, medley-archive, melodic-main-archive, songwriting) to the lychee exclusion list, then (in a follow-up commit) wires up the contract test and fixture to cover them. Three files move together:

File Role
lychee.toml:43-44 The two exclusion patterns (github.com + github.com/ghraw)
lychee.test.sh:22,27,36-37,49-50 Contract test: exact-string asserts + dump loop + prefix disambiguation assert
fixtures/good/Exclusions.md:6-16 Lychee input: all 9 private repos as github.com URLs, dotfiles + medley-archive as raw URLs

All three agree on the same nine repos in the same alphabetical order. The alternation in both TOML patterns is identical, which is the only property the raw-url pattern requires (beyond consistent ordering, the /$ boundary there already prevents shadowing).

Codex finding (resolved)

The Codex comment flagged that lychee.test.sh's assert_eq calls still expected only four repos after the first commit. The second commit fixes exactly that: lines 22, 27, 36–37, and 49–50 are all updated and the assert_eq expected strings byte-match the new TOML lines.

Regex boundary analysis

github.com pattern — ends with (\.git)?([/#?]|$). After matching medley, the next character in a medley-archive URL is -, which is not in [/#?] and not end-of-string, so the engine backtracks and tries medley-archive correctly. Ordering (medley-archive before medley) is belt-and-suspenders as before; the boundary alone is sufficient, but the ordering does no harm.

github.com/ghraw pattern — ends with /. A medley match against medley-archive/main/README.md would need / next but finds -, so the engine retries with medley-archive. Same safety property, simpler terminator because raw URLs always carry a ref/path.

The new assert_not_contains at line 49–50 empirically validates this for the raw-content case using the fixture URL, which is exactly the right way to prove it rather than reason about alternation order.

Coverage

  • All 9 repos are in the for repo in dump loop (lines 36–37) — github.com exclusion is verified for each.
  • dotfiles and medley-archive raw URLs are explicitly asserted absent from dump (lines 45–50). The other repos lack raw fixtures, but the alternation pattern covers them equally; only medley-archive needed a specific raw test for the prefix-disambiguation proof.
  • Public siblings (standards, ci-workflows, claude-code-plugins, ci-runner) remain in the fixture and asserted present in the dump — confirming no over-exclusion.

REVIEW.md checklist

No blocking criteria are triggered: no object-level auth, no tenant scope, no secrets, no injection surface, no audit requirement, no multi-record atomicity concern.

No nits.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 5688944b6a

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread lychee.toml
The component README restated the private-repo inventory as a four-entry
list, so widening the config left the maintainer-facing doc wrong. That
is the second copy causing the drift, not just a stale line: any future
visibility change would desync it again.

Replaces the enumeration with a pointer to the alternations in
lychee.toml, which owns the fact. Keeps the surrounding description of
what the exclusion is for.
@claude

claude Bot commented Jul 20, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 1m 1s —— View job


Review

  • Gather context
  • Read changed files
  • Analyze the diff
  • Post review feedback

Verdict: Approve — all three commits land cleanly together; no issues found.

What the third commit does

c5c904b resolves the Codex P2 finding by replacing the stale four-repo inline list in components/lychee/README.md with a pointer to lychee.toml's exclude block. This is the right fix: a second copy would drift again for the same reason the original copy drifted. The relative path ../../lychee.toml resolves correctly from components/lychee/README.md to the repo root.

End-to-end consistency across all four files

File Role Status
lychee.toml:43-44 Canonical exclusion patterns (github.com + github.com/ghraw) 9 repos, identical alternation in both lines
lychee.test.sh:22,27,36-37,49-50 Contract test: pinned literal asserts + dump loop + raw prefix-disambiguation assert Updated to match; mutation-tested by the author
fixtures/good/Exclusions.md Lychee input: all 9 repos as github.com URLs, dotfiles + medley-archive as raw URLs Covers all 9; raw fixture enables the superstring test
components/lychee/README.md:14-17 Maintainer-facing docs No longer a second copy — now a pointer

All four files agree. No divergence.

REVIEW.md checklist

None of the blocking criteria apply: no object-level auth, no tenant scope, no secrets, no parameterized-input concern, no audit requirement, no multi-record atomicity. All applicable checks pass.

No nits.

@kyle-sexton
kyle-sexton merged commit f10b7aa into main Jul 20, 2026
42 checks passed
@kyle-sexton
kyle-sexton deleted the fix/lychee-private-repo-excludes branch July 20, 2026 19:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

lychee.toml private-repo exclude list is missing 5 private repos

1 participant