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.
| Location | Purpose | Who reads it |
|---|---|---|
~/.claude/ | Live install | The harness, every invocation |
Releases/v0.0.3/.claude/ | Submodule, versioned | New installs and upgrade flows |
~/Durante/Packs/{PackName}/src/ | Pack source | You, 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, notAdded run workflow. - Scope prefix —
sentinel: 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
🚀 HUGE performance boost to Sentinel!! Now blazing fast 🔥🔥
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 Packs —
durante-tech/dos(private). Tagpack:{name},cli,docs, oralgorithm. - Studio app — the studio repo. Tag
studio:{area}. - Upstream drift — DOS merges from
danielmiessler/Personal_AI_Infrastructureperiodically. File conflicts in DOS core with theupstream-synctag. - 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.
- Three-copy rule honored. Grep all three locations; confirm the change is in each.
- Submodule commit landed first. The parent commit references a hash that exists in the submodule's remote.
- Commit messages follow the convention. Imperative, scoped, no emoji.
- No secrets staged. Nothing in
.env, credentials, or API keys. - Tests and typecheck pass.
bun test,pnpm --filter web typecheck. - 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
Extend a Pack
The workflow authorship flow that feeds this contribution pipeline.
File a Feature Request
The right path for net-new Pack ideas.
Was this page helpful?