From cc598065fae9a8c05a4103336e9050c5f6907816 Mon Sep 17 00:00:00 2001 From: Anthony Ettinger Date: Fri, 14 Aug 2026 01:06:53 +0000 Subject: [PATCH] feat(tcfeed): keep repositories nobody has starred out of the table MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Nine of the seventeen repositories asked in today's batch had under fifteen stars and five had two or fewer. In several the request arrived as issue #1 and pull request #1 of a repository nobody has looked at yet โ€” coldmill, EntityIdentifierResolver, gomorph, svarm, claude-bridge. Two reasons to stop, and the second is the one that matters: They will not be read. A repository with no stars and no issues has no maintainer attention to win. The whole premise of asking first is that somebody is there to answer. It is the shape of activity the acceptable use policy is least forgiving about. Bulk unsolicited pull requests are judged on the pattern, not on each one, and "opened issue #1 in forty repositories with no stars" is that pattern described exactly. TCFEED_MIN_STARS, default 5, 0 turns it off. Five rather than fifteen because the aim is to drop repositories that are unattended, not small ones โ€” nsproxy at 84 stars and ZeroDroid at 6 are real projects with real users, and the floor should not have an opinion about them. Placed above the scan, so a repository under the floor is never cloned. It costs one metadata call and saves a clone. Remembered rather than reconsidered, which is the one real trade here: a star count can change where `archived` cannot, so a repository that grows past the floor later will not come back. Re-deciding it every run would instead burn one of the twenty slots each time and crowd out candidates that would actually be scanned. Verified both directions against an isolated cache: at 999999 every repository is gated and nothing is cloned, and the table comes back empty; at 0 no repository is gated and the table builds as before. Co-Authored-By: Claude Opus 5 --- bin/tcfeed.ts | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/bin/tcfeed.ts b/bin/tcfeed.ts index 1eb596e0..fec04687 100755 --- a/bin/tcfeed.ts +++ b/bin/tcfeed.ts @@ -55,6 +55,8 @@ * * TCFEED_MIN_GAP seconds between feed fetches, default 120 * TCFEED_MAX repos cloned per run, default 20 + * TCFEED_MIN_STARS floor a repository must clear to reach the table, + * default 5, 0 turns it off โ€” see the gate in feedCommand() * TCFEED_PAUSE seconds between clones, default 1 * TCFEED_SUB subreddit, default coolgithubprojects * TCFEED_GH results taken from the search, default 25, 0 turns it off @@ -2324,6 +2326,7 @@ async function main(): Promise { // rather than a mirror of the feed. const max = num('TCFEED_MAX', 20); const pause = num('TCFEED_PAUSE', 1); + const MIN_STARS = num('TCFEED_MIN_STARS', 5); const rows: Row[] = []; let scanned = 0; @@ -2352,6 +2355,21 @@ async function main(): Promise { remember(repo); continue; } + // Nine of the seventeen repositories asked in one batch had under fifteen + // stars and several had none, where our request arrived as issue #1 in a + // repository nobody has looked at yet. That is the least likely thing here + // to be read at all, and it is the shape of activity the acceptable use + // policy is least forgiving about. Placed above the scan so a repository + // under the floor is never cloned. + // + // Remembered rather than left to be reconsidered: a star count can change + // where `archived` cannot, but re-deciding it every run costs one of the + // twenty slots each time and crowds out candidates that would be scanned. + if (about.stars < MIN_STARS) { + console.log(`ยท ${repo} (${about.stars} ${about.stars === 1 ? 'star' : 'stars'})`); + remember(repo); + continue; + } const report = path.join(cache, 'reports', `${repo.replace(/\//g, '__')}.json`); const counted = await scan(scanner, repo, report);