Before you change anything, read this file and AGENTS.md (agent guidelines; CLAUDE.md symlinks to it).
ytstack is a curated, opinionated stack. Not every idea belongs. Before proposing changes, ask: does this fit ytstack's scope, or does it belong in a separate plugin?
Belongs in ytstack:
- Improvements to existing skills that preserve the UX contracts
- Fixes to hook scripts (cross-platform, edge cases, bugs)
- New skills that clearly fit the Project-OS + cherry-pick model
- Documentation updates that keep pace with shipped behavior
Does NOT belong:
- New skills that replicate vendored superpowers / gstack skills
- Modifications to
vendor/**content (never -- wrap, don't edit) - Alternative UX contracts (one set of contracts, enforced by CI)
- Domain-specific functionality (publish a separate plugin that depends on ytstack)
Every PR MUST:
- Solve a real, observed problem. Not "might be useful" -- something that actually broke or blocked real work. Describe the session or scenario.
- Preserve the UX contracts. If your change touches a skill, re-read
docs/ux/*.mdand confirm the skill still passes. Runbin/ytstack-checklocally. - Update REVIEW-NOTES.md. If your PR closes an item there, strike it. If it opens new concerns, add them.
- Update STATE.md. If your PR is part of a milestone, bump the appropriate checkboxes.
- Show the full diff to the human partner before submitting, if working with an AI agent.
These are git-subtree mirrors. Changes drift on next pull. Also: upstream maintainers may explicitly reject forks (superpowers does). Wrap with a ytstack-namespaced skill; don't edit.
ytstack's prose and artifact formats are original work inspired by external AI-first methodology material. We do NOT:
- Paste definitions, examples, or prose from third-party sources
- Copy graphics or diagrams
- Import enumerated catalogs (e.g. skill lists) as text
We DO:
- Adapt structural concepts (tier-based context, artifact-as-memory)
- Attribute generically via
NOTICE("inspired by external AI-first methodology work") - Give credit to named projects (superpowers, gstack) where we vendor their code
docs/ux/askuserquestion-format.md, writing-style.md, skill-structure.md are mandatory. bin/ytstack-check validates them locally (run it before you commit); the rest is reviewer-enforced. PRs that violate contracts without a compelling reason + eval evidence are rejected.
One logical change per commit. Rename + rewrite + tests? Three commits. A task's work might span several commits -- that's fine, each should be independently understandable and revertable.
Commit message format:
- Task work:
M###-S##-T##: <action>(e.g.M003-S01-T10: write failing test for argon2) - Infrastructure:
chore: <action>(e.g.chore: update ROADMAP counts after M005) - Bugfix:
fix: <short desc>(e.g.fix: BSD sed compatibility in session-end hook)
docs/ux/writing-style.md is the quality contract: short sentences, concrete nouns, outcome framing, jargon gloss. Only one rule is mechanically enforced -- no em-dashes (the U+2014 character; use --). bin/ytstack-check flags them. The earlier banned-words list (delve / robust / comprehensive / nuanced) was retracted as scope creep (DECISIONS 2026-04-24); treat the rest of writing-style.md as guidance reviewers apply, not a grep gate.
"My agent might want X" is not a problem statement. Every PR must trace back to a session that hit a problem. Describe the session.
Don't touch skills outside the one you're working on. Don't "fix" unrelated UX patterns. One problem per PR.
ytstack's approach differs from generic Claude Code skill conventions in specific, deliberate ways (preamble-first, sentinel-files, cascading binary questions). PRs that restructure skills to "comply with Anthropic's skill guidance" are rejected unless they show measurable UX improvement.
See above. Wrap, don't edit.
Per ytstack's design direction, we credit external methodology work generically, not by name. PRs that add specific named attribution to public artifacts (README, PROJECT.md, etc.) are rejected. docs/references.md is the one place where upstream source projects ARE named (superpowers, gstack, GSD).
- Read
docs/ux/skill-structure.md. - Create
skills/<name>/SKILL.mdfollowing the structure (frontmatter → Anti-Pattern → Checklist → Process Flow → Preamble → Procedure → Terminal State). - Every
AskUserQuestionfollowsdocs/ux/askuserquestion-format.md(Re-ground + Simplify + RECOMMENDATION + Options with Completeness + tier). - Preamble emits the standard flags (see existing skills for the pattern).
- Test standalone first (preamble works without Claude), then integration (invoke via
claude --plugin-dir). - Add smoke-test findings to
.ytstack/REVIEW-NOTES.mdif you find gotchas. - Update
.ytstack/ROADMAP.mdandSTATE.mdtask checkboxes.
- Read Claude Code's hooks reference: https://code.claude.com/docs/en/hooks
- Decide the event (SessionStart, PreToolUse, etc.) and matcher.
- Write the script at
hooks/<name>, following the pattern of existing hooks (silent-exit for non-ytstack projects, jq-preferred JSON emission, bash+python fallbacks). - Register in
hooks/hooks.json. - Test standalone with mock
CLAUDE_PROJECT_DIR. - Add REVIEW-NOTES entry for integration-test-needed.
- Verify the license is compatible (MIT / Apache-2.0 / similar permissive).
- Add to
vendor/via:git subtree add --prefix=vendor/<name> <url> <branch> --squash
- Update
vendor/README.mdto list the new subtree. - Write wrapper skill(s) at
skills/<vendored-skill-name>/that delegate tovendor/<name>/.... - Add attribution to
NOTICE.
mainbranch is releasable at all times.- Version bumps follow semver: patch for bugfixes, minor for new skills, major for breaking changes to skill names / artifact paths.
- Each minor release tags the commit and updates
.claude-plugin/plugin.json's version field.
Open an issue at Yesterday-AI/ytstack/issues:
- Bug -- use the bug-report template. Name the skill or hook, the session that triggered it, what you expected, and what happened.
- Feature / new skill -- use the feature-request template. Trace it back to a real session (see "Speculative features" above); "might be useful" gets closed.
- Read
docs/references.mdfor sources we've leaned on. - Check
.ytstack/REVIEW-NOTES.md-- your question may already be logged. - Read
AGENTS.mdfor agent-specific guidance.