Load BEFORE any action that touches the public surface of this repo -- committing new file types, vendoring or deriving from upstream code, adding a dependency or plugin, publishing/README changes, or deciding whether something belongs in this repo at all. Covers what may NEVER land in the tree (secrets, employer config, 1Password vault names, per-model audit files), the enforcement stack (block_secrets hooks, retired-ECC-derived pre-commit scan, public-safety.test.sh, .gitignore), MIT/NOTICE licensing duties, the upstream trust map (the retired Superpowers, the retired ECC, the compromised GSD original), and the public/private split. Trigger phrases -- "is this safe to commit", "can this go in the repo", "add this upstream tool", "update NOTICE", "license question", "is the repo safe to be public", "should this be private". NOT for the mechanics of committing (dotfiles-change-control), running the test suites (dotfiles-validation-and-qa), or why a hook blocked you (dotfiles-debugging-playbook).
Install
npx skillscat add taloncjones/dotfiles/dotfiles-external-positioning Install via the SkillsCat registry.
Dotfiles External Positioning
Public-repo posture for github.com/taloncjones/dotfiles. This repo is PUBLIC
on purpose and must stay public: fresh machines and cloud containers HTTPS-clone
it with no SSH keys or GitHub grants (README.md step 2; the cloud plugin
declaration in .claude/settings.json depends on the same property). Everything
in the tree is therefore world-readable forever -- git history included. This
skill defines what may never land here, the machinery that enforces it, the
licensing duties when borrowing upstream code, and the trust posture toward
each upstream.
Front-loaded warnings
- [WARNING] Git history is public too. The safety scans check the CURRENT tree
only. If a secret ever gets committed and later removed, it is still in
history: rotate the credential immediately -- deleting the file is not
remediation. - [WARNING] Never reinstall the original
get-shit-done-ccnpm package. It was
compromised via a token rug-pull with retained publish access. Treat it as
hostile. No GSD variant is sanctioned anymore: the community redux fork
(@opengsd/get-shit-done-redux) had its install path removed, andgsd-uninstallinzsh/functions.zshactively purges both. - [WARNING] Employer names, work emails, and work URLs are banned from the
tree, and NO automated scan catches them --git/hooks/public-safety.test.sh
checks paths and secret patterns only. This one is enforced by review alone.
Work identity lives exclusively in machine-local files
(~/.gitconfig-work,~/.ssh/config_local,~/.ssh/id_ed25519_work.pub),
written bybin/identity-setup, never tracked. - [WARNING] When you vendor, port, or adapt upstream code, updating
NOTICE
is part of the change, not a follow-up. MIT requires the upstream copyright
and permission notice to travel with the code.
What may NEVER land in the tree
| Category | Rule | Where the boundary lives |
|---|---|---|
| Secrets, keys, tokens | Never. Only .pub public keys are tracked, deliberately: ssh/keys/id_ed25519_personal.pub is the single tracked key file. |
.gitignore security section (id_*, !*.pub, *.pem, *.key, *.p12, *.pfx, .env.*, *credentials*); hooks below |
| Employer/work config | Names, emails, hosts, org URLs stay machine-local. The repo ships only a commented TEMPLATE: git/work/.gitconfig-work.tmpl (seeded once to ~/.gitconfig-work). |
Template-seed pattern; identity-setup wizard writes the real values outside the repo |
| 1Password vault/item names | The tracked ssh/configs/agent.toml carries placeholder personal entries and a commented work stanza; real work vault/item names go only in the machine-local seed copy at ~/.config/1Password/ssh/agent.toml. |
Seed-once copy on first install (see the symlink table in the architecture skill's references/install-layout.md) |
| Per-model audit files | claude/Fable5.md and claude/Opus4.md are derived from private session transcripts and must never be committed. claude/operating-principles.md is the sanitized, committed distillation. |
claude/.gitignore:5-6 |
| Machine-local settings | settings.json per Claude config dir, settings.local.json, .env*, *.local, .netrc, *.tfstate. |
.gitignore security section |
| Local user paths | No literal /Users/<name> owner home prefix (or any absolute home path) in tracked content. The scan greps for the owner's exact prefix; writing it out here would trip the scan, which is why this row does not. |
public-safety.test.sh assertion 2 |
| Personal backlog files | No tracked todo.md (the cross-session backlog lives in the untracked .todos/ state, hydrated by git/hooks/post-checkout). |
public-safety.test.sh assertion 1 |
| GUI-signing config on cloud | Never copy the 1Password op-ssh-sign signing block into a cloud container -- every commit would fail (no 1Password app). bootstrap-cloud.sh sets commit.gpgsign false and copies identity only (commit 2304015). |
bootstrap-cloud.sh (search gpgsign) |
Decision rule when unsure: if the value differs per machine, per employer, or
per account, it does not belong in the tree -- it belongs in a machine-local
file seeded from a tracked placeholder template. That is the established
pattern (.gitconfig-work.tmpl, agent.toml, settings.json.tmpl).
Enforcement stack (defense in depth)
Four layers between a secret and the public tree. Do not treat any single
layer as sufficient; each has known gaps (listed).
| Layer | When it fires | What it catches | Gap |
|---|---|---|---|
claude/hooks/block_secrets.py (+ Codex twin codex/hooks/block_secrets.py) |
PreToolUse on Read/Edit/Write in a Claude session | Access to .env*, key files, credentials/secrets path segments. Segment-based matching (commit 52f807d) -- exact filenames/segments, not substring, so secrets_manager/util.py passes. .pub always allowed. |
Session-time only; fails open on exceptions; does not see bash echo > file |
git/hooks/pre-commit (derived from the retired ECC, via core.hooksPath=~/.config/git/hooks) |
Every git commit |
High-signal secret regexes in ADDED lines only (OpenAI/GitHub/AWS keys, private key blocks, generic password=... assignments) |
Behavioral suite exists (git/hooks/pre-commit.test.sh, see dotfiles-validation-and-qa); bypassable via ECC_SKIP_GIT_HOOKS=1 / ECC_SKIP_PRECOMMIT=1 -- emergencies only, per dotfiles-change-control |
git/hooks/public-safety.test.sh |
bin/dotfiles-tests (suite 7 of 9) and CI (.github/workflows/tests.yml) on every push to main and every PR |
Whole-tree scan: tracked todo.md, the owner's literal /Users/<name> home prefix, high-confidence secret patterns (AWS, OpenAI, GitHub, Slack, GitLab, Google, age, private key blocks) |
Current tree only, not history; no employer-name detection |
.gitignore security section |
git add |
Keeps whole classes of files (id_*, *.pem, .env.*, *credentials*) out of the index by default |
git add -f bypasses silently |
Run before anything public-facing (new file types, README claims, vendoring):
cd ~/dotfiles
sh git/hooks/public-safety.test.sh # the public-posture gate alone
bin/dotfiles-tests # all suites, the full pre-push barIf public-safety.test.sh fails on your change, fix the content -- do not
widen its exclusion globs. The only legitimate exclusions are the test file
itself and .pub keys.
Licensing and attribution
- License: MIT,
LICENSE(Copyright (c) 2026 Talon Jones). - Third-party notices:
NOTICE. It currently lists exactly two upstreams:- The retired ECC --
claude/rules/(curated vendored subset) and the
adaptedgit/hooks/pre-commit+git/hooks/pre-push. - GSD redux fork --
claude/statusline.js(ported statusline render).
- The retired ECC --
When vendoring or deriving from any upstream, in the same PR:
- Confirm the upstream license is MIT-compatible; if not, do not vendor.
- Add/extend the
NOTICEentry: paths in this repo, upstream URL,
license, copyright line. - No AI-attribution or "generated by" lines (house rule, hook-enforced).
- If the vendored content is installer-reproducible (like the retired ECC's rules), prefer keeping it UNTRACKED with a re-vendor command
(claude/rules/.gitignoremodel) over committing upstream bytes --
less churn, no license text drift. Adapted-and-diverged code (like the
git hooks) is tracked and NOTICE-listed. - Run
sh git/hooks/public-safety.test.sh-- vendored code is a common
secret-pattern false-positive source and occasionally a true one.
Upstream ecosystem map
| Upstream | Pinned source | Trust posture | Repo integration |
|---|---|---|---|
| ECC v2 (Everything Claude Code) -- RETIRED (2026-09) | was https://github.com/affaan-m/ECC.git (plugin id ecc@ecc; the ECC_REPO_URL var and ecc-install/ecc-sync-rules functions are removed) |
Was trusted-but-verified while installed: reproducible vendoring, plugin installed from a pinned git URL. Fully retired: no plugin, no vendored rules, ecc-uninstall sweeps leftovers. |
git/hooks/pre-commit/pre-push remain as tracked, adapted-and-diverged code (NOTICE-listed); everything else is gone |
| Superpowers -- RETIRED (2026-09) | was https://github.com/anthropics/claude-plugins-official.git (official marketplace, plugin id superpowers@claude-plugins-official) |
Was trusted (Anthropic-official) while installed. Fully retired: no plugin remains; superpowers-uninstall sweeps leftovers. |
claude/skills/brainstorming/, writing-specs/, writing-plans/ are tracked, adapted-and-diverged code (NOTICE-listed); the plugin itself is gone |
GSD original (get-shit-done-cc npm) |
none -- COMPROMISED | HOSTILE. Token rug-pull with retained npm publish access. Never reinstall. gsd-uninstall purges the package, its npx caches, and all leftover state (retirement completed at commit 9ad4dc8). |
Nothing remains installed |
| GSD redux fork | npm @opengsd/get-shit-done-redux; repo https://github.com/open-gsd/gsd-core per NOTICE (formerly get-shit-done-redux) |
Retired (install path removed 2026-07-10); the package is referenced only by gsd-uninstall's official-uninstaller call. Only the ported statusline survives, as tracked code. |
claude/statusline.js, NOTICE-listed |
Supply-chain rules (paid for in incidents)
- Pin by git URL, not by name. A marketplace/plugin name resolves through
mutable registries; a git URL is what you audited. Cloud
(.claude/settings.jsonextraKnownMarketplaces) still pins this way; the
retired Superpowers and ECC install paths did too, via a pinned
official-marketplace URL (the retired ECC'sECC_REPO_URLdid the same
before removal) -- keep any future plugin install to this same pattern. - Prefer reproducible, auditable artifacts over trusting installers. A
pinned git clone holds bytes you can diff; an installer runs code you did
not read. (The retired ECC'secc-sync-rulesvendoring copy was itself
retired 2026-07-02 once nothing consumed it, ahead of ECC's own retirement.) - Verify what an installer wrote; exit 0 is not evidence. The cloud
plugin saga proved installs can exit 0 without installing (commits 722c653,
f91d7d2 -- verifyinstalled_plugins.json, the gold standard inbootstrap-cloud.sh). Machine-path installers still grep CLI output
instead -- a known open weak point, not a pattern to copy. - Assume publish access outlives maintainer intent. The GSD rug-pull
(rule source) happened AFTER the package was abandoned. A dead upstream is
a risk, not a comfort. - Never run an upstream's own sync/install scripts against your global
state unaudited. The abandoned Codex mirror (pre-public) showed the
retired ECC's sync script overwritingcore.hooksPathand writing through
symlinks into this repo. Use the owned native plugin staging lifecycle instead.
The public/private split
Why public is load-bearing (do not flip to private):
- Fresh machines HTTPS-clone before any SSH key exists (README.md, install
step 2). - Cloud containers clone with no GitHub grant; the optional Setup-script
bootstrap in the repo CLAUDE.md relies on it explicitly ("the repo is
public, so no GitHub grant is needed"). - The plugin marketplaces are pinned by public git URL from this repo's
committed.claude/settings.json-- the whole first-session cloud story
assumes anonymous clone.
Private overlay repo -- OPEN candidate, not built. If genuinely private
config ever needs version control (work SSH host lists, employer gitconfig
values, private skills), the design boundary it would own:
- Everything currently machine-local-by-policy:
~/.gitconfig-workvalues,~/.ssh/config_local, realagent.tomlvault names, per-model audit files
(Fable5.md/Opus4.md), work-accountsettings.jsondeltas. - It would layer ON TOP of this repo (seed-file replacement after
bootstrap.sh), never fork it; this repo's templates remain the public
contract. - Status: candidate only. Today the answer to "where does private config go"
is machine-local files written byidentity-setup, and cloud containers
are personal-account only (no work story in cloud -- open weak point).
Reproducibility standard
Anything claimed in README.md must work on a fresh machine -- the repo's
public credibility is the install path. Cheapest proof: a fresh claude.ai/code
cloud container (ephemeral, clean clone every session).
# In a fresh cloud container the platform clones the repo; no plugin is
# declared any more (Superpowers and ECC are both retired), so verify the
# assets/settings/identity claim chain held instead:
readlink ~/.claude/CLAUDE.md # points into the cloned checkout
cat ~/.claude/plugins/installed_plugins.json # ground truth: expect no entries
bin/dotfiles-tests # all suites green on a clean cloneFor macOS/Linux-machine claims a container cannot prove (Homebrew, defaults,
1Password agent): label them "asserted, not demonstrated" until run on real
hardware, per operating-principles.md. Do not merge a README claim you have
not executed somewhere.
When NOT to use this skill
| You actually want | Go to |
|---|---|
| Commit/branch/PR mechanics, gate order, hook bypass policy | dotfiles-change-control |
| Run the test suites as evidence, add a test, coverage gaps | dotfiles-validation-and-qa |
| A hook blocked you and you do not know why | dotfiles-debugging-playbook |
| History of the GSD retirement / Codex mirror / cloud saga in full | dotfiles-failure-archaeology |
| Plugin/marketplace mechanics (how installs actually work) | claude-code-platform-reference |
| Prove a symlink/identity/plugin state from first principles | dotfiles-verification-toolkit |
| Recreate a machine or container from scratch | dotfiles-build-and-env |
Provenance and maintenance
Facts verified against the working tree on 2026-07-02 (HEAD = 26eae6d).
Volatile items and their one-line re-verification commands:
| Fact (as of 2026-07-02) | Re-verify with |
|---|---|
Tracked key files = exactly ssh/keys/id_ed25519_personal.pub |
git ls-files ssh/keys |
| public-safety suite is 3 assertions (todo.md, owner home prefix, secret regexes) | cat git/hooks/public-safety.test.sh |
| dotfiles-tests runs all suites incl. public-safety | bin/dotfiles-tests --list |
| NOTICE lists retired ECC (pre-commit/pre-push; rules entry historical) and GSD redux (statusline.js) | cat NOTICE |
| Fable5.md/Opus4.md gitignored | cat claude/.gitignore |
| ECC pinned URL removed (retired) | ! grep -q 'ECC_REPO_URL' zsh/functions.zsh |
| Cloud plugin/marketplace pins | cat .claude/settings.json |
| GSD redux repo name (NOTICE says gsd-core) | grep -n 'open-gsd' NOTICE |
pre-commit bypass vars, named for the retired ECC (ECC_SKIP_GIT_HOOKS, ECC_SKIP_PRECOMMIT) |
grep -n 'ECC_SKIP' git/hooks/pre-commit git/hooks/pre-push |
| Cloud disables commit signing | grep -n 'gpgsign' bootstrap-cloud.sh |
| CI runs suites on push to main + PRs | head -20 .github/workflows/tests.yml |
| Commit hashes cited (52f807d, 5b799dd, 9ad4dc8, 2304015, 722c653, f91d7d2, e140ab3, c0a9072) | git show --stat <hash> |
Standing open items relevant here: private overlay repo (candidate, unbuilt);
machine-path installer trusting CLI output instead ofinstalled_plugins.json; no automated employer-name scan; ECC retired 2026-09 (pre-commit/pre-push are now the only surviving ECC-derived pieces); cloud has no work-account story.