DX Harness Audits, scaffolds, and maintains the developer-experience harness of a repository. The harness is the meta-tooling that makes a dev loop fast: one-command bootstrap, one-command reset, one-command seed, discoverable conventions, agent-friendly entry points. This skill exists because dev-experience attrition is real: harnesses rot, manual steps creep back in, conventions drift, and the cost is paid in micro-friction every day. The skill detects attrition systematically and applies canonical fixes. When to Apply Trigger this skill when: - A user describes a repeated manual chore ("ev…

\\n'\n[[ \",${LANGS},\" == *\",rust,\"* ]] && \\\n CLEAN_ARTIFACTS=\"${CLEAN_ARTIFACTS}rm -rf target 2>/dev/null || true\"

DX Harness Audits, scaffolds, and maintains the developer-experience harness of a repository. The harness is the meta-tooling that makes a dev loop fast: one-command bootstrap, one-command reset, one-command seed, discoverable conventions, agent-friendly entry points. This skill exists because dev-experience attrition is real: harnesses rot, manual steps creep back in, conventions drift, and the cost is paid in micro-friction every day. The skill detects attrition systematically and applies canonical fixes. When to Apply Trigger this skill when: - A user describes a repeated manual chore ("ev…

\\n'\n[[ \",${LANGS},\" == *\",python,\"* ]] && \\\n CLEAN_ARTIFACTS=\"${CLEAN_ARTIFACTS}find . -type d -name __pycache__ -prune -exec rm -rf {} + 2>/dev/null || true\"

DX Harness Audits, scaffolds, and maintains the developer-experience harness of a repository. The harness is the meta-tooling that makes a dev loop fast: one-command bootstrap, one-command reset, one-command seed, discoverable conventions, agent-friendly entry points. This skill exists because dev-experience attrition is real: harnesses rot, manual steps creep back in, conventions drift, and the cost is paid in micro-friction every day. The skill detects attrition systematically and applies canonical fixes. When to Apply Trigger this skill when: - A user describes a repeated manual chore ("ev…

\\n'\n\nOUT_DIR=$(scratch_dir \"reset\")\nTMPL=\"${DX_SKILL_DIR}/assets/templates/reset.sh.tmpl\"\n[[ -f \"$TMPL\" ]] || die \"Template missing: $TMPL\"\n\nrender_template \"$TMPL\" \"${OUT_DIR}/reset.sh\" \\\n \"DOWN_SERVICES=${DOWN_SERVICES}\" \\\n \"CLEAN_ARTIFACTS=${CLEAN_ARTIFACTS}\"\n\nchmod +x \"${OUT_DIR}/reset.sh\"\nlog \"Wrote reset to ${OUT_DIR}/reset.sh\"\nprintf '%s\\n' \"$OUT_DIR\"\n","content_type":"application/x-sh; charset=utf-8","language":"bash","size":1737,"content_sha256":"8131a7bd936a70ae6fb8c6015375f0724c0b52e6124e941259a3100289e735bf"},{"filename":"scripts/scaffold-seed.sh","content":"#!/usr/bin/env bash\n# scaffold-seed.sh — render seed.sh into a scratch dir\n# Part of: dx-harness\n#\n# Generates a seed script that creates a canonical test user\n# ([email protected] / password) and minimal fixtures. Idempotent: re-running\n# does not error or duplicate. The credentials are written to AGENTS.md too\n# so devs and agents find them without asking.\n#\n# Usage:\n# bash scaffold-seed.sh \u003cfingerprint-json>\n\nset -euo pipefail\nSCRIPT_DIR=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\" && pwd)\"\n# shellcheck disable=SC1091\nsource \"${SCRIPT_DIR}/lib/common.sh\"\n\nrequire_jq\n[[ $# -eq 1 ]] || die \"Usage: $0 \u003cfingerprint-json>\"\nFP=\"$1\"\n[[ -f \"$FP\" ]] || die \"Fingerprint file not found: $FP\"\n\nDB_KIND=$(jq -r '.db_kind // \"\"' \"$FP\")\nLANGS=$(jq -r '.languages | join(\",\")' \"$FP\")\n\n# Real bcrypt hash of literal string \"password\" (cost 10).\n# Generated with `htpasswd -bnBC 10 \"\" password | cut -d: -f2`.\n# Most bcrypt libraries (bcryptjs, passlib, golang.org/x/crypto/bcrypt) accept $2a$ and $2b$.\nBCRYPT_PASSWORD='$2b$10$EixZaYVK1fsbw1ZfbX3OXePaWxn96p36WQoeG6Lruj3vjPGga31lW'\n\n# Choose the seed strategy by framework / DB\nSEED_BODY=\"\"\ncase \"$DB_KIND\" in\n prisma)\n SEED_BODY='npx prisma db seed'\n ;;\n postgres|unknown-sql)\n SEED_BODY=\"psql \\\"\\${DATABASE_URL:?DATABASE_URL must be set}\\\" \u003c\u003cSQL\n-- Idempotent: use ON CONFLICT DO NOTHING\nINSERT INTO users (id, email, password_hash, created_at)\nVALUES (1, '[email protected]', '${BCRYPT_PASSWORD}', NOW())\nON CONFLICT (id) DO NOTHING;\nSQL\"\n ;;\n mysql)\n SEED_BODY=\"mysql \\\"\\${DATABASE_URL:?DATABASE_URL must be set}\\\" \u003c\u003cSQL\nINSERT IGNORE INTO users (id, email, password_hash, created_at)\nVALUES (1, '[email protected]', '${BCRYPT_PASSWORD}', NOW());\nSQL\"\n ;;\n mongodb)\n SEED_BODY=\"mongosh \\\"\\${DATABASE_URL:?DATABASE_URL must be set}\\\" --eval \\\"\ndb.users.updateOne(\n { email: '[email protected]' },\n { \\\\\\$setOnInsert: { email: '[email protected]', passwordHash: '${BCRYPT_PASSWORD}', createdAt: new Date() } },\n { upsert: true }\n)\\\"\"\n ;;\n *)\n SEED_BODY='echo \"TODO: customize seed for your stack — see references/fix-recipes.md (scaffold-seed)\"'\n ;;\nesac\n\nOUT_DIR=$(scratch_dir \"seed\")\nTMPL=\"${DX_SKILL_DIR}/assets/templates/seed.sh.tmpl\"\n[[ -f \"$TMPL\" ]] || die \"Template missing: $TMPL\"\n\nrender_template \"$TMPL\" \"${OUT_DIR}/seed.sh\" \\\n \"SEED_BODY=${SEED_BODY}\" \\\n \"[email protected]\" \\\n \"TEST_PASSWORD=password\"\n\nchmod +x \"${OUT_DIR}/seed.sh\"\nlog \"Wrote seed to ${OUT_DIR}/seed.sh\"\nprintf '%s\\n' \"$OUT_DIR\"\n","content_type":"application/x-sh; charset=utf-8","language":"bash","size":2490,"content_sha256":"bd1842968e33fda8c54779a0257a049a5a84f0bdb9a62e1b604ffda5d2db549c"},{"filename":"scripts/time-to-first-commit.sh","content":"#!/usr/bin/env bash\n# time-to-first-commit.sh — measure TTFC in isolation\n# Part of: dx-harness\n#\n# A single-purpose primitive: clone-equivalent (fresh worktree) → bootstrap → test,\n# emit wall-clock JSON. Useful when you want just the metric, without the rest of\n# the verify checklist.\n#\n# Usage:\n# bash time-to-first-commit.sh # detect from $PWD\n# bash time-to-first-commit.sh \u003cfingerprint-json>\n\nset -euo pipefail\nSCRIPT_DIR=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\" && pwd)\"\n# shellcheck disable=SC1091\nsource \"${SCRIPT_DIR}/lib/common.sh\"\n\nrequire_jq\n\nif [[ $# -ge 1 ]]; then\n FP=\"$1\"\nelse\n FP=$(mktemp -t dx-fp-XXXXXX.json)\n bash \"${SCRIPT_DIR}/discover.sh\" > \"$FP\"\n trap 'rm -f \"$FP\"' EXIT\nfi\n\nBOOTSTRAP=$(jq -r '.bootstrap_command // \"\"' \"$FP\")\nTEST_RUNNER=$(jq -r '.test_runner' \"$FP\")\n\n[[ -n \"$BOOTSTRAP\" ]] || die \"No bootstrap command detected — TTFC undefined. Scaffold one first.\"\n\n# Resolve test command (must be runnable)\ncase \"$TEST_RUNNER\" in\n vitest) TEST_CMD=\"npx vitest run --reporter=dot --bail=1 --silent\" ;;\n jest) TEST_CMD=\"npx jest --bail=1 --silent\" ;;\n pytest) TEST_CMD=\"pytest -x -q\" ;;\n cargo-test) TEST_CMD=\"cargo test --quiet\" ;;\n go-test) TEST_CMD=\"go test ./...\" ;;\n npm-test) TEST_CMD=\"npm test --silent\" ;;\n *) TEST_CMD=\"\" ;;\nesac\n\nWT=$(scratch_dir \"ttfc\")\nmake_worktree \"$WT\" >/dev/null\nregister_worktree_cleanup \"$WT\"\n\nbootstrap_start=$(python3 -c 'import time;print(int(time.time()*1000))')\n( cd \"$WT\" && eval \"$BOOTSTRAP\" ) >/dev/null 2>&1 || true\nbootstrap_end=$(python3 -c 'import time;print(int(time.time()*1000))')\n\ntest_start=$bootstrap_end\nif [[ -n \"$TEST_CMD\" ]]; then\n ( cd \"$WT\" && eval \"$TEST_CMD\" ) >/dev/null 2>&1 || true\nfi\ntest_end=$(python3 -c 'import time;print(int(time.time()*1000))')\n\njq -n \\\n --argjson bootstrap_ms \"$((bootstrap_end - bootstrap_start))\" \\\n --argjson test_ms \"$((test_end - test_start))\" \\\n --argjson total_ms \"$((test_end - bootstrap_start))\" \\\n --arg bootstrap_cmd \"$BOOTSTRAP\" \\\n --arg test_cmd \"${TEST_CMD:-(none)}\" \\\n --arg generated_at \"$(date -u +%Y-%m-%dT%H:%M:%SZ)\" \\\n '{\n schema_version: 1,\n generated_at: $generated_at,\n bootstrap_ms: $bootstrap_ms,\n test_ms: $test_ms,\n total_ms: $total_ms,\n bootstrap_cmd: $bootstrap_cmd,\n test_cmd: $test_cmd\n }'\n","content_type":"application/x-sh; charset=utf-8","language":"bash","size":2338,"content_sha256":"5487edefc132528807eef667bc548a1f0992261adf8d9ea8a286748f26cfae2c"},{"filename":"scripts/track-attrition.sh","content":"#!/usr/bin/env bash\n# track-attrition.sh — append audit to log, diff vs previous\n# Part of: dx-harness\n#\n# Persists each audit run keyed by repo_hash. Reads the previous audit for the\n# same repo and prints a short diff: new findings (regressions), missing findings\n# (wins), score-of-scores trend.\n#\n# Storage: ${CLAUDE_PLUGIN_DATA}/dx-harness/audits.log (NDJSON, append-only)\n#\n# Usage:\n# bash track-attrition.sh \u003caudit-json>\n\nset -euo pipefail\nSCRIPT_DIR=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\" && pwd)\"\n# shellcheck disable=SC1091\nsource \"${SCRIPT_DIR}/lib/common.sh\"\n\nrequire_jq\n\n[[ $# -eq 1 ]] || die \"Usage: $0 \u003caudit-json>\"\nAUDIT_FILE=\"$1\"\n[[ -f \"$AUDIT_FILE\" ]] || die \"Audit file not found: $AUDIT_FILE\"\n\nLOG_FILE=$(config_get \"audit_log_path\" \"${DX_DATA_DIR}/audits.log\")\n# config_get already runs safe_expand; nothing more to do.\nmkdir -p \"$(dirname \"$LOG_FILE\")\"\n\nREPO_HASH=$(jq -r '.fingerprint_hash // \"\"' \"$AUDIT_FILE\")\n[[ -n \"$REPO_HASH\" && \"$REPO_HASH\" != \"null\" ]] || die \"Audit missing fingerprint_hash\"\n\n# --- find previous entry for this repo (last line where fingerprint_hash matches) ---\nPREV=\"\"\nif [[ -f \"$LOG_FILE\" ]]; then\n PREV=$(grep -F \"\\\"fingerprint_hash\\\":\\\"${REPO_HASH}\\\"\" \"$LOG_FILE\" | tail -1 || true)\nfi\n\n# --- append current ---\nCOMPACT=$(jq -c '.' \"$AUDIT_FILE\")\nprintf '%s\\n' \"$COMPACT\" >> \"$LOG_FILE\"\n\n# --- print trend summary ---\nCUR_TOTAL=$(jq -r '.total_findings // 0' \"$AUDIT_FILE\")\nCUR_IDS=$(jq -r '.findings[]?.id' \"$AUDIT_FILE\" | sort -u)\n\nif [[ -z \"$PREV\" ]]; then\n printf 'Trend: first audit for this repo (hash %s). %d findings recorded.\\n' \"$REPO_HASH\" \"$CUR_TOTAL\"\n exit 0\nfi\n\nPREV_TOTAL=$(printf '%s' \"$PREV\" | jq -r '.total_findings // 0')\nPREV_IDS=$(printf '%s' \"$PREV\" | jq -r '.findings[]?.id' | sort -u)\n\nNEW_IDS=$(comm -23 \u003c(printf '%s' \"$CUR_IDS\") \u003c(printf '%s' \"$PREV_IDS\") || true)\nRESOLVED_IDS=$(comm -13 \u003c(printf '%s' \"$CUR_IDS\") \u003c(printf '%s' \"$PREV_IDS\") || true)\n\nDELTA=$((CUR_TOTAL - PREV_TOTAL))\nSIGN=\"=\"\n[[ $DELTA -gt 0 ]] && SIGN=\"+\"\n[[ $DELTA -lt 0 ]] && SIGN=\"\" # negative already prints with -\n\nprintf 'Trend: %d findings (%s%d vs previous audit).\\n' \"$CUR_TOTAL\" \"$SIGN\" \"$DELTA\"\n\nif [[ -n \"$NEW_IDS\" ]]; then\n printf ' Regressions (new findings):\\n'\n printf ' - %s\\n' $NEW_IDS\nfi\nif [[ -n \"$RESOLVED_IDS\" ]]; then\n printf ' Wins (resolved since last audit):\\n'\n printf ' - %s\\n' $RESOLVED_IDS\nfi\n","content_type":"application/x-sh; charset=utf-8","language":"bash","size":2392,"content_sha256":"1b0c05472aee9db0e6e132e298e718f54c2d4e0a7330884438edfc4964eb2dc7"},{"filename":"scripts/verify.sh","content":"#!/usr/bin/env bash\n# verify.sh — assert the harness actually works\n# Part of: dx-harness\n#\n# Creates a fresh git worktree in $TMPDIR, runs the detected bootstrap command,\n# times it, runs reset if present, runs the test command, asserts pass.\n# Cleans up the worktree on exit.\n#\n# Output: PASS/FAIL report. Exit 0 if all pass, 1 if any FAIL.\n#\n# Usage:\n# bash verify.sh # detect everything from current repo\n# bash verify.sh \u003cfingerprint-json> # use a pre-computed fingerprint\n\nset -euo pipefail\nSCRIPT_DIR=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\" && pwd)\"\n# shellcheck disable=SC1091\nsource \"${SCRIPT_DIR}/lib/common.sh\"\n\nrequire_jq\n\nTTFC_TARGET=$(config_get \"ttfc_target_seconds\" 60)\n\nif [[ $# -ge 1 ]]; then\n FP=\"$1\"\nelse\n FP=$(mktemp -t dx-fp-XXXXXX.json)\n bash \"${SCRIPT_DIR}/discover.sh\" > \"$FP\"\n trap 'rm -f \"$FP\"' EXIT\nfi\n\nBOOTSTRAP=$(jq -r '.bootstrap_command // \"\"' \"$FP\")\nTASK_RUNNER=$(jq -r '.task_runner' \"$FP\")\nTEST_RUNNER=$(jq -r '.test_runner' \"$FP\")\nROOT=$(jq -r '.repo_root' \"$FP\")\n\n[[ -d \"$ROOT\" ]] || die \"repo_root invalid: $ROOT\"\n\n# Pick test command from fingerprint\ncase \"$TEST_RUNNER\" in\n vitest) TEST_CMD=\"npx vitest run\" ;;\n jest) TEST_CMD=\"npx jest\" ;;\n pytest) TEST_CMD=\"pytest\" ;;\n cargo-test) TEST_CMD=\"cargo test\" ;;\n go-test) TEST_CMD=\"go test ./...\" ;;\n npm-test) TEST_CMD=\"npm test\" ;;\n \"\") TEST_CMD=\"\" ;;\n *) TEST_CMD=\"$TEST_RUNNER\" ;;\nesac\n\nWT=$(scratch_dir \"verify-wt\")\nmake_worktree \"$WT\" >/dev/null\nregister_worktree_cleanup \"$WT\"\n\nPASS=0\nFAIL=0\nreport=\"\"\n\nassert() {\n local label=\"$1\" cond=\"$2\" detail=\"${3:-}\"\n if [[ \"$cond\" == \"true\" ]]; then\n report+=\" PASS: ${label}\"

DX Harness Audits, scaffolds, and maintains the developer-experience harness of a repository. The harness is the meta-tooling that makes a dev loop fast: one-command bootstrap, one-command reset, one-command seed, discoverable conventions, agent-friendly entry points. This skill exists because dev-experience attrition is real: harnesses rot, manual steps creep back in, conventions drift, and the cost is paid in micro-friction every day. The skill detects attrition systematically and applies canonical fixes. When to Apply Trigger this skill when: - A user describes a repeated manual chore ("ev…

\\n'\n [[ -n \"$detail\" ]] && report+=\" ${detail}\"

DX Harness Audits, scaffolds, and maintains the developer-experience harness of a repository. The harness is the meta-tooling that makes a dev loop fast: one-command bootstrap, one-command reset, one-command seed, discoverable conventions, agent-friendly entry points. This skill exists because dev-experience attrition is real: harnesses rot, manual steps creep back in, conventions drift, and the cost is paid in micro-friction every day. The skill detects attrition systematically and applies canonical fixes. When to Apply Trigger this skill when: - A user describes a repeated manual chore ("ev…

\\n'\n PASS=$((PASS + 1))\n else\n report+=\" FAIL: ${label}\"

DX Harness Audits, scaffolds, and maintains the developer-experience harness of a repository. The harness is the meta-tooling that makes a dev loop fast: one-command bootstrap, one-command reset, one-command seed, discoverable conventions, agent-friendly entry points. This skill exists because dev-experience attrition is real: harnesses rot, manual steps creep back in, conventions drift, and the cost is paid in micro-friction every day. The skill detects attrition systematically and applies canonical fixes. When to Apply Trigger this skill when: - A user describes a repeated manual chore ("ev…

\\n'\n [[ -n \"$detail\" ]] && report+=\" ${detail}\"

DX Harness Audits, scaffolds, and maintains the developer-experience harness of a repository. The harness is the meta-tooling that makes a dev loop fast: one-command bootstrap, one-command reset, one-command seed, discoverable conventions, agent-friendly entry points. This skill exists because dev-experience attrition is real: harnesses rot, manual steps creep back in, conventions drift, and the cost is paid in micro-friction every day. The skill detects attrition systematically and applies canonical fixes. When to Apply Trigger this skill when: - A user describes a repeated manual chore ("ev…

\\n'\n FAIL=$((FAIL + 1))\n fi\n}\n\n# --- 1. Bootstrap exists ---\nif [[ -n \"$BOOTSTRAP\" ]]; then\n assert \"bootstrap command exists\" \"true\" \"detected: ${BOOTSTRAP}\"\nelse\n assert \"bootstrap command exists\" \"false\" \"no bootstrap.sh / just bootstrap / make bootstrap\"\nfi\n\n# --- 2. Bootstrap runs successfully in scratch worktree ---\nBOOTSTRAP_MS=0\nif [[ -n \"$BOOTSTRAP\" ]]; then\n log \"Running bootstrap in scratch worktree: $WT\"\n bootstrap_log=$(mktemp -t dx-bootstrap-log-XXXXXX)\n set +e\n start_ms=$(python3 -c 'import time;print(int(time.time()*1000))')\n ( cd \"$WT\" && eval \"$BOOTSTRAP\" ) > \"$bootstrap_log\" 2>&1\n rc=$?\n end_ms=$(python3 -c 'import time;print(int(time.time()*1000))')\n set -e\n BOOTSTRAP_MS=$((end_ms - start_ms))\n if [[ $rc -eq 0 ]]; then\n assert \"bootstrap completes successfully\" \"true\" \"took ${BOOTSTRAP_MS}ms\"\n else\n tail_excerpt=$(tail -n 5 \"$bootstrap_log\" | tr '\\n' '|')\n assert \"bootstrap completes successfully\" \"false\" \"exit=${rc}, tail: ${tail_excerpt}\"\n fi\n rm -f \"$bootstrap_log\"\nfi\n\n# --- 3. TTFC under target ---\ntarget_ms=$((TTFC_TARGET * 1000))\nif [[ \"$BOOTSTRAP_MS\" -gt 0 && \"$BOOTSTRAP_MS\" -le \"$target_ms\" ]]; then\n assert \"time-to-first-commit under target\" \"true\" \"${BOOTSTRAP_MS}ms \u003c= ${target_ms}ms (target ${TTFC_TARGET}s)\"\nelif [[ \"$BOOTSTRAP_MS\" -gt 0 ]]; then\n assert \"time-to-first-commit under target\" \"false\" \"${BOOTSTRAP_MS}ms > ${target_ms}ms (target ${TTFC_TARGET}s)\"\nfi\n\n# --- 4. Reset roundtrip (if reset.sh exists) ---\n# Asserts the harness's central promise: after reset, the env is ready again\n# without manual steps (re-register, re-login, hand-edit DB).\nif [[ -x \"${WT}/reset.sh\" ]]; then\n log \"Running reset roundtrip in scratch worktree\"\n reset_log=$(mktemp -t dx-reset-log-XXXXXX)\n set +e\n ( cd \"$WT\" && ./reset.sh ) > \"$reset_log\" 2>&1\n reset_rc=$?\n set -e\n if [[ $reset_rc -eq 0 ]]; then\n assert \"reset.sh completes successfully (env re-prepared without manual steps)\" \"true\" \"\"\n else\n tail_excerpt=$(tail -n 5 \"$reset_log\" | tr '\\n' '|')\n assert \"reset.sh completes successfully (env re-prepared without manual steps)\" \"false\" \"exit=${reset_rc}, tail: ${tail_excerpt}\"\n fi\n rm -f \"$reset_log\"\nfi\n\n# --- 5. Test command exists and passes ---\nif [[ -n \"$TEST_CMD\" ]]; then\n set +e\n test_log=$(mktemp -t dx-test-log-XXXXXX)\n ( cd \"$WT\" && eval \"$TEST_CMD\" ) > \"$test_log\" 2>&1\n rc=$?\n set -e\n if [[ $rc -eq 0 ]]; then\n assert \"tests pass\" \"true\" \"command: ${TEST_CMD}\"\n else\n tail_excerpt=$(tail -n 5 \"$test_log\" | tr '\\n' '|')\n assert \"tests pass\" \"false\" \"exit=${rc}, command: ${TEST_CMD}, tail: ${tail_excerpt}\"\n fi\n rm -f \"$test_log\"\nelse\n assert \"test command exists\" \"false\" \"no test runner detected\"\nfi\n\n# --- 6. AGENTS.md present ---\nif [[ \"$(jq -r '.agents_md_present' \"$FP\")\" == \"true\" ]]; then\n assert \"AGENTS.md present\" \"true\" \"path: $(jq -r '.agents_md_path' \"$FP\")\"\nelse\n assert \"AGENTS.md present\" \"false\" \"no AGENTS.md / CLAUDE.md found\"\nfi\n\n# --- Summary ---\necho \"\"\necho \"Verify report (worktree: $WT):\"\necho \"$report\"\necho \"Results: ${PASS} passed, ${FAIL} failed\"\n\nif [[ \"$BOOTSTRAP_MS\" -gt 0 ]]; then\n echo \"TTFC (bootstrap wall-clock): ${BOOTSTRAP_MS}ms\"\nfi\n\n[[ $FAIL -eq 0 ]] || exit 1\n","content_type":"application/x-sh; charset=utf-8","language":"bash","size":5118,"content_sha256":"3800be1b35a73be3c0e2ec9350f50586043a20062603886853cf70a04ea6335e"}],"content_json":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"text":"DX Harness","type":"text"}]},{"type":"paragraph","content":[{"text":"Audits, scaffolds, and maintains the developer-experience harness of a repository. The harness is the meta-tooling that makes a dev loop fast: one-command bootstrap, one-command reset, one-command seed, discoverable conventions, agent-friendly entry points.","type":"text"}]},{"type":"paragraph","content":[{"text":"This skill exists because dev-experience attrition is real: harnesses rot, manual steps creep back in, conventions drift, and the cost is paid in micro-friction every day. The skill detects attrition systematically and applies canonical fixes.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"When to Apply","type":"text"}]},{"type":"paragraph","content":[{"text":"Trigger this skill when:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"A user describes a ","type":"text"},{"text":"repeated manual chore","type":"text","marks":[{"type":"strong"}]},{"text":" (\"every time I reset the db I have to re-register\", \"I always run these three commands before working\")","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"A user mentions ","type":"text"},{"text":"slow onboarding","type":"text","marks":[{"type":"strong"}]},{"text":" or asks \"how do I get this running\"","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"A new repo is being ","type":"text"},{"text":"bootstrapped","type":"text","marks":[{"type":"strong"}]},{"text":" and needs a harness from day one","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"A user explicitly asks to ","type":"text"},{"text":"audit DX","type":"text","marks":[{"type":"strong"}]},{"text":" or ","type":"text"},{"text":"measure time-to-first-commit (TTFC)","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"A user asks to ","type":"text"},{"text":"fix","type":"text","marks":[{"type":"strong"}]},{"text":" missing bootstrap/reset/seed scripts or AGENTS.md","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"A periodic ","type":"text"},{"text":"maintenance pass","type":"text","marks":[{"type":"strong"}]},{"text":" is needed (e.g., after a release, after onboarding a new engineer)","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Workflow Overview","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"┌────────────────────────────────────────────────────────────┐\n│ 1. DISCOVER scripts/discover.sh → repo-fingerprint │\n│ 2. AUDIT scripts/audit.sh → dx-audit.json │\n│ 3. PRIORITIZE scripts/prioritize.sh → ranked findings │\n│ 4. SCAFFOLD scripts/scaffold-*.sh → scratch dir │\n│ 5. CONFIRM show diff to user; user picks what to apply│\n│ 6. VERIFY scripts/verify.sh → assertions + timing │\n│ 7. TRACK scripts/track-attrition.sh → audit log │\n└────────────────────────────────────────────────────────────┘","type":"text"}]},{"type":"paragraph","content":[{"text":"All scaffolded edits land in a scratch directory first (","type":"text"},{"text":"${TMPDIR}/dx-harness-\u003ctimestamp>/","type":"text","marks":[{"type":"code_inline"}]},{"text":"). The user reviews the diff and chooses what to copy back into the repo. No surprise writes to the working tree.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Tool Requirements","type":"text"}]},{"type":"paragraph","content":[{"text":"Required: ","type":"text"},{"text":"bash","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"git","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"node","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"jq","type":"text","marks":[{"type":"code_inline"}]},{"text":".","type":"text"}]},{"type":"paragraph","content":[{"text":"Detected at runtime (the skill adapts — it never forces a migration):","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Toolchain","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Detection signal","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"npm/pnpm/yarn/bun","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"package.json","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"pnpm-lock.yaml","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"yarn.lock","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"bun.lockb","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"cargo","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Cargo.toml","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"go modules","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"go.mod","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Python (uv/poetry/pip)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"pyproject.toml","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"uv.lock","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"poetry.lock","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"requirements.txt","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"just","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Justfile","type":"text","marks":[{"type":"code_inline"}]},{"text":" or ","type":"text"},{"text":"justfile","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"make","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Makefile","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"docker compose","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"docker-compose.yml","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"compose.yaml","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"database (postgres)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"docker-compose.yml","type":"text","marks":[{"type":"code_inline"}]},{"text":" services, ","type":"text"},{"text":"DATABASE_URL","type":"text","marks":[{"type":"code_inline"}]},{"text":" env reference","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Risk Level","type":"text"}]},{"type":"paragraph","content":[{"text":"Write.","type":"text","marks":[{"type":"strong"}]},{"text":" The skill writes files but does not delete user data, force-push, or run destructive ops. Default mode stages everything in a scratch directory; the user explicitly approves each application. Verification runs in a separate git worktree so timing measurements never touch the working tree.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Setup","type":"text"}]},{"type":"paragraph","content":[{"text":"On first invocation, the skill checks ","type":"text"},{"text":"config.json","type":"text","marks":[{"type":"code_inline"}]},{"text":" and prompts via ","type":"text"},{"text":"AskUserQuestion","type":"text","marks":[{"type":"code_inline"}]},{"text":" for any empty required fields. See ","type":"text"},{"text":"config.json","type":"text","marks":[{"type":"link","attrs":{"href":"config.json","title":null}}]},{"text":" for fields and defaults.","type":"text"}]},{"type":"paragraph","content":[{"text":"Key defaults:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"ttfc_target_seconds: 60","type":"text","marks":[{"type":"code_inline"}]},{"text":" — the time-to-first-commit goal in seconds","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"apply_mode: \"scratch\"","type":"text","marks":[{"type":"code_inline"}]},{"text":" — scaffolded edits go to scratch dir first; user copies in","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"audit_log_path: \"${CLAUDE_PLUGIN_DATA}/dx-harness/audits.log\"","type":"text","marks":[{"type":"code_inline"}]},{"text":" — persistent attrition history","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Quick Reference","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Run a full audit + scaffold pass","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"bash scripts/discover.sh > /tmp/fingerprint.json\nbash scripts/audit.sh /tmp/fingerprint.json > /tmp/audit.json\nbash scripts/prioritize.sh /tmp/audit.json","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Scaffold one specific harness piece","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"bash scripts/scaffold-bootstrap.sh /tmp/fingerprint.json\nbash scripts/scaffold-reset.sh /tmp/fingerprint.json\nbash scripts/scaffold-seed.sh /tmp/fingerprint.json\nbash scripts/scaffold-agents-md.sh /tmp/fingerprint.json\nbash scripts/scaffold-justfile.sh /tmp/fingerprint.json","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Verify the harness works end-to-end","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"bash scripts/verify.sh\n# runs bootstrap in a scratch worktree, times it, asserts TTFC \u003c target","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Track attrition over time","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"bash scripts/track-attrition.sh /tmp/audit.json\n# appends to audits.log, prints diff vs previous run","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"How to Use","type":"text"}]},{"type":"paragraph","content":[{"text":"The workflow scripts produce JSON between steps so they compose. The agent should read ","type":"text"},{"text":"references/workflow.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/workflow.md","title":null}}]},{"text":" for full step-by-step orchestration, including error handling and when to stop and ask the user.","type":"text"}]},{"type":"paragraph","content":[{"text":"For deeper context:","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"File","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Read When","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"references/workflow.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/workflow.md","title":null}}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Executing the workflow (always start here)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"references/audit-checklist.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/audit-checklist.md","title":null}}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Understanding what ","type":"text"},{"text":"audit.sh","type":"text","marks":[{"type":"code_inline"}]},{"text":" checks and why","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"references/fix-recipes.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/fix-recipes.md","title":null}}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Choosing which scaffold script applies for a finding","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"references/attrition-patterns.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/attrition-patterns.md","title":null}}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Reading git history for DX-rot signals","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Gotchas","type":"text"}]},{"type":"paragraph","content":[{"text":"See ","type":"text"},{"text":"gotchas.md","type":"text","marks":[{"type":"link","attrs":{"href":"gotchas.md","title":null}}]},{"text":" — accumulated failure points discovered over time. Always append new ones rather than rewriting.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Related Skills","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"dev-skill:*","type":"text","marks":[{"type":"code_inline"}]},{"text":" — for creating new agent-friendly skills (often the ","type":"text"},{"text":"output","type":"text","marks":[{"type":"em"}]},{"text":" of an AGENTS.md scaffolding pass references skills)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"bug-review","type":"text","marks":[{"type":"code_inline"}]},{"text":" — pairs naturally: bad DX often surfaces as repeat bug categories","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}}]},"metadata":{"date":"2026-06-05","name":"dx-harness","author":"@skillopedia","source":{"stars":153,"repo_name":"dot-skills","origin_url":"https://github.com/pproenca/dot-skills/blob/HEAD/skills/.experimental/dx-harness/SKILL.md","repo_owner":"pproenca","body_sha256":"5116fc36dd1a599b264b650f15e5b860e4a406611ab1f324ed9baeb41c3451eb","cluster_key":"82df25a2eb714a3c4103a8434c09dea40f3c460ff778d0832fe67cb5e9061aeb","clean_bundle":{"format":"clean-skill-bundle-v1","source":"pproenca/dot-skills/skills/.experimental/dx-harness/SKILL.md","attachments":[{"id":"b7bad48b-9a2b-5f05-a760-d50c6ca18782","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/b7bad48b-9a2b-5f05-a760-d50c6ca18782/attachment.tmpl","path":"assets/templates/AGENTS.md.tmpl","size":1519,"sha256":"83fe5f5164d1174c9b15ad952d82b70dac11bffd009dd98429649cb1548c915c","contentType":"text/plain; charset=utf-8"},{"id":"416049d9-d54c-52fc-ad60-e087e86c25fc","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/416049d9-d54c-52fc-ad60-e087e86c25fc/attachment.tmpl","path":"assets/templates/Justfile.tmpl","size":736,"sha256":"b12682b511566f1b7aa2dce07e1762d451a6d374ab9735c476b27fdb61a17521","contentType":"text/plain; charset=utf-8"},{"id":"cbf45010-37a3-529b-b028-427c2d80d23f","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/cbf45010-37a3-529b-b028-427c2d80d23f/attachment.tmpl","path":"assets/templates/Makefile.tmpl","size":667,"sha256":"a431d42de31226ad9a9d1c2d45d211247c97d677597065364f70d5bb58b61043","contentType":"text/plain; charset=utf-8"},{"id":"c8281017-4d9d-5c89-8dec-b3ca88f8f4b1","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/c8281017-4d9d-5c89-8dec-b3ca88f8f4b1/attachment.tmpl","path":"assets/templates/bootstrap.sh.tmpl","size":1233,"sha256":"9e7449f46b2abe6ff2c22159a184a8f228ece7318410ad2d0587705372a16847","contentType":"text/plain; charset=utf-8"},{"id":"910b603d-583c-5636-ae26-3052eeddbb3d","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/910b603d-583c-5636-ae26-3052eeddbb3d/attachment.tmpl","path":"assets/templates/reset.sh.tmpl","size":1207,"sha256":"b48678623adeff4c01d850a654e43eaa0b7e7cc11378db9414d0e257f5dc4c32","contentType":"text/plain; charset=utf-8"},{"id":"19f84cb4-d7a9-546b-b239-48abed801eea","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/19f84cb4-d7a9-546b-b239-48abed801eea/attachment.tmpl","path":"assets/templates/seed.sh.tmpl","size":1457,"sha256":"ae22f7779a3e0be207e9d575bae7f6e60ccc61cbd8162dfd7dd723a3de475eb7","contentType":"text/plain; charset=utf-8"},{"id":"9437733f-a761-515f-81b1-571e364d376e","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/9437733f-a761-515f-81b1-571e364d376e/attachment.json","path":"config.json","size":1357,"sha256":"86e2596f4ce6e6df136435ab159d0c8cdfd8199616a27cd75df30348b99c4b12","contentType":"application/json; charset=utf-8"},{"id":"8b4ff6df-8277-5056-b2be-bec7c8a701c6","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/8b4ff6df-8277-5056-b2be-bec7c8a701c6/attachment.md","path":"gotchas.md","size":523,"sha256":"bbf8e55d92fb9c6832982d73d497ad134e606aa618d62cd5b22fdc95ad34f3e6","contentType":"text/markdown; charset=utf-8"},{"id":"2c68a5a7-6cad-57b8-a6ad-4d56181b584e","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/2c68a5a7-6cad-57b8-a6ad-4d56181b584e/attachment.json","path":"metadata.json","size":914,"sha256":"a48adcf03e6202ded3b0a2583ee1fd46217193dbecd43a22c2828c75bdc4c2d2","contentType":"application/json; charset=utf-8"},{"id":"18510116-85a9-52d4-8e07-c30739e1e582","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/18510116-85a9-52d4-8e07-c30739e1e582/attachment.md","path":"references/attrition-patterns.md","size":4504,"sha256":"0932b632010327f2cdf1bb4cc7a7fb43518befaa8fdac8cec377cf05a4c6e00e","contentType":"text/markdown; charset=utf-8"},{"id":"c5b09add-95cb-5cb0-92cb-15f9449324a3","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/c5b09add-95cb-5cb0-92cb-15f9449324a3/attachment.md","path":"references/audit-checklist.md","size":7769,"sha256":"b9401e3f6a66cacf57ca76218afd4fc4701cf5206f5bea293fc375aacfd7eb7b","contentType":"text/markdown; charset=utf-8"},{"id":"0487d60f-7f16-5aff-ab35-be0053496adc","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/0487d60f-7f16-5aff-ab35-be0053496adc/attachment.md","path":"references/fix-recipes.md","size":6669,"sha256":"cfb5d0cd869969a9dd150a676f24b836c97b66c1aa14c0bbf17f5108cadffc5b","contentType":"text/markdown; charset=utf-8"},{"id":"4b203d77-3072-5e78-b138-78ae7ea41362","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/4b203d77-3072-5e78-b138-78ae7ea41362/attachment.md","path":"references/workflow.md","size":7202,"sha256":"8a30208643e4a41c1cc7426e43e92e1d377580b77d38558caa267c4df3e18453","contentType":"text/markdown; charset=utf-8"},{"id":"704ada62-1ba8-5ffa-95f1-a652238e644c","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/704ada62-1ba8-5ffa-95f1-a652238e644c/attachment.sh","path":"scripts/audit.sh","size":8187,"sha256":"cd17a998976d35c4086107ca5ddf38a3bec7609e7994736a54cc9398f6d54e4c","contentType":"application/x-sh; charset=utf-8"},{"id":"22a7c5de-51cf-5ef1-bfda-c710bf60ec97","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/22a7c5de-51cf-5ef1-bfda-c710bf60ec97/attachment.sh","path":"scripts/discover.sh","size":2678,"sha256":"1c6b89d394918c4c9404073bb2e9fc13152e0ee2c512688e162949590058bf76","contentType":"application/x-sh; charset=utf-8"},{"id":"41c2b940-efb3-5986-b995-7f85b77cc80a","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/41c2b940-efb3-5986-b995-7f85b77cc80a/attachment.sh","path":"scripts/lib/common.sh","size":4757,"sha256":"ecfda71c859bb070e1a07295ec159c879e4b7a9a31b6ca986e925603973c35ad","contentType":"application/x-sh; charset=utf-8"},{"id":"a7640393-89a5-5189-8e21-34b35995b808","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/a7640393-89a5-5189-8e21-34b35995b808/attachment.sh","path":"scripts/lib/detectors.sh","size":5940,"sha256":"5d2ed3bff3ccacb7206c143da9e8e480f6792f6511f8c56c5eedcc622fbe9899","contentType":"application/x-sh; charset=utf-8"},{"id":"abffde1e-81ae-5eb9-9afb-6f7dd01c3a4c","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/abffde1e-81ae-5eb9-9afb-6f7dd01c3a4c/attachment.sh","path":"scripts/prioritize.sh","size":974,"sha256":"4898a7e6776cc7954bb2cb07ad68e904f0723ac730bbd4d9cf40fdaf0737a189","contentType":"application/x-sh; charset=utf-8"},{"id":"9009d442-4bb2-5004-bbae-8c1815c1eee4","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/9009d442-4bb2-5004-bbae-8c1815c1eee4/attachment.sh","path":"scripts/scaffold-agents-md.sh","size":2534,"sha256":"3f31b87e7ca0840b9f8545cf448bcc2eda6f273748cf5977836b2a753d565055","contentType":"application/x-sh; charset=utf-8"},{"id":"5108d1b1-c91e-539f-ae73-3d14226aa8d8","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/5108d1b1-c91e-539f-ae73-3d14226aa8d8/attachment.sh","path":"scripts/scaffold-bootstrap.sh","size":2322,"sha256":"0293ba3dc6424f60fe329e154313b28ae1bc03ede2b1e6cac93a2e8b23c53f43","contentType":"application/x-sh; charset=utf-8"},{"id":"d9cbf4ed-d643-5874-83e9-4ea71cc0609b","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/d9cbf4ed-d643-5874-83e9-4ea71cc0609b/attachment.sh","path":"scripts/scaffold-justfile.sh","size":3559,"sha256":"1ef5e912caeda09512389e441ee041fbc563baf9f59fbd9a4097e3fedc3506e2","contentType":"application/x-sh; charset=utf-8"},{"id":"e7d75bc1-3a98-556b-aecc-19f02f402ea5","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/e7d75bc1-3a98-556b-aecc-19f02f402ea5/attachment.sh","path":"scripts/scaffold-reset.sh","size":1737,"sha256":"8131a7bd936a70ae6fb8c6015375f0724c0b52e6124e941259a3100289e735bf","contentType":"application/x-sh; charset=utf-8"},{"id":"2d9b9b52-0cef-5a02-825a-ceab26306a44","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/2d9b9b52-0cef-5a02-825a-ceab26306a44/attachment.sh","path":"scripts/scaffold-seed.sh","size":2490,"sha256":"bd1842968e33fda8c54779a0257a049a5a84f0bdb9a62e1b604ffda5d2db549c","contentType":"application/x-sh; charset=utf-8"},{"id":"ae750f68-7a77-5cf6-9300-d9331b60d5c9","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/ae750f68-7a77-5cf6-9300-d9331b60d5c9/attachment.sh","path":"scripts/time-to-first-commit.sh","size":2338,"sha256":"5487edefc132528807eef667bc548a1f0992261adf8d9ea8a286748f26cfae2c","contentType":"application/x-sh; charset=utf-8"},{"id":"ba3e4e7e-ccf9-59ca-9e3f-fafc1b6aec38","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/ba3e4e7e-ccf9-59ca-9e3f-fafc1b6aec38/attachment.sh","path":"scripts/track-attrition.sh","size":2392,"sha256":"1b0c05472aee9db0e6e132e298e718f54c2d4e0a7330884438edfc4964eb2dc7","contentType":"application/x-sh; charset=utf-8"},{"id":"0a3370ff-c894-5f28-925e-c07e011418d4","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/0a3370ff-c894-5f28-925e-c07e011418d4/attachment.sh","path":"scripts/verify.sh","size":5118,"sha256":"3800be1b35a73be3c0e2ec9350f50586043a20062603886853cf70a04ea6335e","contentType":"application/x-sh; charset=utf-8"}],"bundle_sha256":"1d812179e5b628c3d2d3537ce421c1d03771042405e5a4eb59762220d49e7fbb","attachment_count":26,"text_attachments":20,"attachment_storage":"skillopedia-attachments-v1","binary_attachments":6,"excluded_attachments":[]},"cluster_size":1,"skill_md_path":"skills/.experimental/dx-harness/SKILL.md","import_metadata":{"date":"2026-06-05","author":"@skillopedia","version":"v1","category":"security","category_label":"Security"},"exact_dupes_collapsed_into_this":0},"version":"v1","category":"security","import_tag":"clean-skills-v1","description":"Developer-experience friction auditing and fixing — slow onboarding, repeated manual setup steps, missing bootstrap/reset/seed scripts, undiscoverable conventions. Audits the repo, scores findings, scaffolds canonical fixes (bootstrap.sh, reset.sh, seed.sh, AGENTS.md, task-runner entries), then verifies the harness end-to-end in a scratch worktree against a 60-second time-to-first-commit target. Triggers on phrases like \"audit dx\", \"fix dev friction\", \"time to first commit\", \"set up the harness\", \"I keep doing X manually\", \"every time I reset the db I have to...\", and on new-repo bootstrapping. Even if the user doesn't say \"DX\" — if they describe a repeated manual chore in their dev loop, this skill applies."}},"renderedAt":1782981052449}

DX Harness Audits, scaffolds, and maintains the developer-experience harness of a repository. The harness is the meta-tooling that makes a dev loop fast: one-command bootstrap, one-command reset, one-command seed, discoverable conventions, agent-friendly entry points. This skill exists because dev-experience attrition is real: harnesses rot, manual steps creep back in, conventions drift, and the cost is paid in micro-friction every day. The skill detects attrition systematically and applies canonical fixes. When to Apply Trigger this skill when: - A user describes a repeated manual chore ("ev…