Contribute to DOS

Land changes in DOS that propagate everywhere and survive upgrades — three-copy rule, submodule-first commits, PR conventions.

Land a change in DOS that runs, distributes, and survives the next upgrade.

The three-copy rule

DOS content lives in three places, and every change to a Skill, Hook, or Workflow propagates to all three. Skip one and the change either doesn't run, doesn't distribute, or gets clobbered on upgrade.

LocationPurposeWho reads it
~/.claude/Live installThe harness, every invocation
Releases/v0.0.3/.claude/Submodule, versionedNew installs and upgrade flows
~/Durante/Packs/{PackName}/src/Pack sourceYou, when editing

Pack contributions — new workflows, new SKILL.md rows, new hooks — go through this same flow. Docs and CLI changes only touch the repo that owns them.

Edit the source first

Editing only the live install works for one session, then the next upgrade clobbers it. Edit ~/Durante/Packs/{PackName}/src/ first, then copy forward to live and submodule. Every time.

Submodule-first commits

Releases/v0.0.3/.claude is a git submodule pointing at the cc-durante-studio repo. When you change a skill, commit inside the submodule first, then commit the parent repo's updated submodule ref.

# 1. Commit inside the submodule
cd ~/Durante/Releases/v0.0.3/.claude
git add skills/MyPack/Workflows/Run.md
git commit -m "mypack: add Run workflow"

# 2. Commit the parent repo's submodule ref
cd ~/Durante
git add Releases/v0.0.3/.claude
git commit -m "bump v0.0.3 submodule: mypack Run workflow"

Reverse the order and the parent repo points at a commit that doesn't exist yet in the submodule's remote.

Pack source commits

Pack source under ~/Durante/Packs/{PackName}/src/ lives in the Durante repo directly. Commit normally, then remember to copy the change into the live install and the submodule per the three-copy rule.

cd ~/Durante
git add Packs/MyPack/src/Workflows/Run.md
git commit -m "mypack(pack): add Run workflow source"

PR conventions

  • Subject — imperative, 50 characters, no trailing period. Add Run workflow to MyPack, not Added run workflow.
  • Scope prefixsentinel: fix guard walk cap, cli: add upgrade command, docs: rewrite concepts page.
  • Body — wrap at 72 characters. Explain the why. The diff shows the what.
  • One logical change per commit. Refactors, renames, and fixes go separately.
  • Three-copy commits ship together in the same PR so reviewers see the propagation.

Voice and tone

Match DOS voice: direct, task-oriented, no marketing fluff, no exclamation points.

Commit messages

Don't

🚀 HUGE performance boost to Sentinel!! Now blazing fast 🔥🔥

Do

feat(sentinel): cache conventions per project

Walking up the tree on every PostToolUse added ~50ms to writes in large repos. Cache the resolved convention file path per project root in a weakmap keyed by the first .sentinel/ ancestor. Invalidate on SessionStart.

Where to file issues

  • DOS core and Packsdurante-tech/dos (private). Tag pack:{name}, cli, docs, or algorithm.
  • Studio app — the studio repo. Tag studio:{area}.
  • Upstream drift — DOS merges from danielmiessler/Personal_AI_Infrastructure periodically. File conflicts in DOS core with the upstream-sync tag.
  • Feature Requests — new capabilities go through File a Feature Request. The DOS team triages and decides whether to ship a new Pack or extend an existing one.

Good issues have: what you expected, what happened, the session slug if the bug fired inside an Algorithm run, and the smallest reproduction.

Before you submit

Contribution checklist

Run through this before opening a PR.

  1. Three-copy rule honored. Grep all three locations; confirm the change is in each.
  2. Submodule commit landed first. The parent commit references a hash that exists in the submodule's remote.
  3. Commit messages follow the convention. Imperative, scoped, no emoji.
  4. No secrets staged. Nothing in .env, credentials, or API keys.
  5. Tests and typecheck pass. bun test, pnpm --filter web typecheck.
  6. Docs updated if user-facing behavior changed. Guide pages, Pack README, CLI help text.

Troubleshoot

  • Submodule ref points at a missing commit. You committed the parent before pushing the submodule. Push the submodule, then re-push the parent.
  • Live install doesn't reflect your change. You skipped the copy to ~/.claude/. Three-copy rule.
  • Upgrade clobbered your change. You edited the live install directly. Move the edit to ~/Durante/Packs/ and propagate.

Next

Was this page helpful?