Skip to content

Add the shared project-status workflow - #7

Merged
AdamXweb merged 2 commits into
mainfrom
feat/project-status
Aug 8, 2026
Merged

Add the shared project-status workflow#7
AdamXweb merged 2 commits into
mainfrom
feat/project-status

Conversation

@adamXbot

@adamXbot adamXbot commented Aug 8, 2026

Copy link
Copy Markdown
Collaborator

The engine behind the portfolio status system. One implementation, three consumers — privacykey/.github, adamXbot/.github and AdamXweb/AdamXweb each keep their own status.json and call this.

Why per-account rather than one central hub

A single hub needs one credential that can read all three identities, stored in a public repo. Per-account, each token is scoped to its own owner, so a leak costs one identity instead of three. It also means a privacykey product's badge is served from a privacykey repo rather than a personal profile.

The unified list on the personal profile survives: --aggregate pulls the other hubs' status.json over plain HTTPS with no token, because every hub is public and each already withholds its private repos.

What's here

  • actions/project-status/tiers.json — canonical tier definitions, shared so three copies can't drift
  • actions/project-status/build.mjs — regenerates badges, STATUS.md, profile section; --check catches hand-edits
  • actions/project-status/drift.mjs — weekly reality check
  • .github/workflows/project-status.yml — the reusable workflow

Verified

All three hubs build; aggregation produces 24 listed rows on the profile; an unreachable hub fails loudly rather than silently publishing a partial list; a listed: true + public: false combination is a hard build failure.

The drift checker was rewritten after testing. The first version re-derived each tier from activity signals and flagged 28 of 61 repos, nearly all false — it read startup_failure (the current Actions billing block) and reusable workflow_call workflows as broken repos. It now reports facts only, and finds 11 real issues across the portfolio.

Needs a v1 retag after merge.

🤖 Generated with Claude Code

Each account keeps its own status hub and calls this, so a privacykey badge is
served from a privacykey repo and no credential has to reach across the three
identities. A leaked token costs one account rather than all of them.

Tier definitions live in actions/project-status/tiers.json rather than in each
hub, because a tier's promise is a claim made on two dozen public repos and
three copies of it would drift.

build.mjs regenerates badges, STATUS.md and the collapsed profile section from
status.json, and refuses to run if a repo is marked listed while private — the
badges directory is browsable, so that mistake would publish an index of
unreleased work. --aggregate lets one hub render another's listed repos without
a token, since every hub is public and already withholds its private entries.

drift.mjs reports facts rather than re-deriving tiers: a version that inferred
tiers from activity flagged 28 of 61 repos, almost all falsely, because those
signals can't separate a billing block from an abandoned repo or a reusable
workflow from a broken one. It now reports only what is objectively true and
worth acting on — a dead link, a tap behind its own release, an ignored queue.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The adamXbot caller passes collapsed: false so its org profile renders the
project list expanded, but the input was never declared, so the call would
have failed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
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.

2 participants