Skip to content

feat(upstream): admission rule, David pick-only, shared agent context - #56

Draft
thecolormaroun wants to merge 1 commit into
refactor/david-matt-import-cleanupfrom
feat/upstream-admission-rule
Draft

thecolormaroun wants to merge 1 commit into
refactor/david-matt-import-cleanupfrom
feat/upstream-admission-rule

Conversation

@thecolormaroun

Copy link
Copy Markdown
Owner

Based on #55 (refactor/david-matt-import-cleanup), and this PR targets that branch. Merge #55 first, then retarget this PR to main (GitHub does it automatically when #55's branch is deleted) and rebase, because #55 is squash-merged. Draft; not merged, not installed.

1. Admission rule

docs/upstream-policy.md. A repo can be a tracked provider ("tracking": "weekly", on the weekly maintenance lane) only if all four hold:

  1. It has an OSI license file.
  2. It's published for other people: a README written for users, stable skill paths, real commits rather than snapshot dumps.
  3. Its maintainer doesn't silently delete skills, or it ships versioned releases.
  4. Its skills are general-purpose, not tied to the author's machine, accounts, agents or private repos.

Anything else is "pick-only": Stack imports one reviewed skill, which becomes Stack-owned and stops tracking upstream.

Enforced in code:

  • Every provider in registry/upstreams.json has "tracking" (schema updated). scripts/stack-maintenance.py rejects a missing or unknown value.
  • The audit never observes a pick-only provider. Its observation row is pick_only, so prepare can't propose it. Supplied refs may include or leave out pick-only providers; a missing weekly one still fails closed.
  • scripts/materialize-maintenance-proposal.py and scripts/discover-upstream-updates.py refuse a provider that isn't weekly.
  • scripts/import-pinned-skills.py refuses a pick-only provider before any network access. For a weekly one it checks an OSI license id, a regular license file and a README in the exact upstream checkout. Criteria 2–4 need a person, so they live in the audit table.
  • tests/test_upstream_admission.py covers all of this and requires every provider to have a row in the audit table.

I didn't edit ~/.claude/scheduled-tasks/stack-upstream-sync/SKILL.md; another session owns it.

2. davidondrej/skills is now pick-only

This reverses part of #55. #55 kept David's 12 surviving skills on the lane. They're now Stack-owned at their last inspected commit (5c99080), the same way #55 converted the others: moved into family roots, names and commands unchanged, origin and MIT notice kept.

david-anti-sleep, david-deepapi, david-fable-safe-prompt, david-read-all-adrs (engineering) · david-browser-harness (qa) · david-cmux, david-codex-subagent, david-goal-loop, david-handoff (orchestration) · david-deep-research (knowledge) · david-effective-agent-skills, david-setup-help (platform)

David has no import rule and no allowlisted root left, and skills/imported/david/ is gone. The provider row stays as a pick-only record. This also clears Monday's blocker: upstream flattened every path on 2026-11-09 (ad5bedd), so the lane would have failed on all 12.

3. Provider audit

Audited at each repo's HEAD on 2026-11-13. Nothing changed except David.

Provider Repo Verdict Fails Mode now
matt mattpocock/skills Pass None. Removals are in CHANGELOG; 10 releases weekly
emil emilkowalski/skills Pass None. No releases, but nothing ever removed weekly
stewdio StewdioAI/blank-page Pick-only 3 (ten days old, no releases or track record) weekly
gstack garrytan/gstack Pick-only 4 (63 of 71 SKILL.md files call ~/.claude/skills/gstack/bin) weekly
compound-engineering EveryInc/compound-engineering-plugin Pass None. 242 releases weekly
impeccable pbakaus/impeccable Pass None. Apache-2.0 Stack-owned copy
taste-skill Leonxlnx/taste-skill Pick-only 2 (layout restructured 4 times in 8 months) Stack-owned copy
ui ibelick/ui-skills Pass None. 8 releases not yet a provider
david davidondrej/skills Pick-only 2, 3, 4 (every commit is "Publish sanitized skills snapshot"; 18 skills gone without notice; history rewritten; cmux and Pi coupling) pick-only

Decisions for you, recorded in the policy doc:

  • gstack fails only because each skill needs gstack's own public runtime. Accept that kind of dependency and it passes.
  • stewdio is worth re-auditing after its first release.
  • Upstream merged the impeccable and taste-skill collections into single skills, so Stack's copies are stale relative to them.

4. Shared agent context

  • AGENTS.md is the single instruction file. It's config/CLAUDE.md moved with git mv (history kept) plus two sections: shared agent context and upstream skills. CLAUDE.md at the root is a symlink to it. config/CLAUDE.md had no root counterpart and no loader; only a doc test read it, and that test now reads AGENTS.md.
  • docs/context/state.md: current state, open PRs, blockers, what's installed. Rewritten each time.
  • docs/context/decisions.md: append-only, dated, one line per decision with its PR. Backfilled with fix(runtime): publish the Claude target as a skills-dir plugin #46 (skills-dir plugin runtime), refactor(design): drop Twombly from micro-branch; the local board is the only canvas #52 (Twombly dropped as a paid product), and this PR twice (David pick-only, admission rule).
  • docs/context/handoff.md: author, date, done, next.
  • The AGENTS.md rule: read state.md and handoff.md before starting; update both before ending a session that changed anything; no secrets or personal data. I added one exemption: scheduled automations that run from dedicated clean clones don't edit these files, because writing them would dirty a checkout that must stay clean. Their receipts are the record.
  • tests/test_agent_context.py fails if CLAUDE.md stops being a symlink to AGENTS.md, if any context file is missing, or if the files contain home paths, tokens or email addresses. These files ship with docs/ in the published runtime, and the publisher already rejects /Users/... paths.

Watch out

  • The ibelick pin adds provider ibelick. Whichever PR lands second has to give it "tracking": "weekly", or validate_upstream_metadata fails. It passes the rule.
  • Expect conflicts in generated files with feat(emil): import new emil skills (gestures, learn-taste) #54 and the ibelick pin. Rebase and regenerate; don't hand-edit them.

Validation

  • python3 -m unittest discover -s tests: 549 tests, all pass.
  • Registry, classifier and layout checks pass. A classifier rerun is a no-op.

🤖 Generated with Claude Code

Admission rule (docs/upstream-policy.md): a repo is tracked weekly only
with an OSI license file, publication for other users (user README,
stable paths, real commits), no silent deletions or versioned releases,
and general-purpose skills. Anything else is pick-only.

Every provider in registry/upstreams.json now has "tracking": "weekly" or
"pick-only". The maintenance lane rejects a missing mode and never
observes or proposes a pick-only provider; the materializer and discovery
refuse one; import-pinned-skills.py refuses one before any network access
and checks the license id, license file and README for a weekly one.

davidondrej/skills is pick-only. Its 12 remaining skills become
Stack-owned at their last inspected commit, its import rule and allowlist
root are removed. The other providers were audited and left unchanged.

AGENTS.md (moved from config/CLAUDE.md) is the single instruction file;
CLAUDE.md is a symlink to it. docs/context holds state, append-only
decisions and the latest handoff, with a rule that every agent reads and
updates them.

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

1 participant