[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M7B0PJ09C7Q7SHXCS3X91DMF":3,"skill-same:01M7B0PJ09C7Q7SHXCS3X91DMF":62},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":19,"linkOnly":20,"markdownContent":21,"markdownBody":22,"frontMatter":23,"refName":24,"commitSha":25,"skillDirectory":26,"forksCount":14,"repositoryHtmlUrl":27,"repositoryHomepageUrl":6,"ownerHtmlUrl":28,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":29,"install":30,"resources":43},"01M7B0PJ09C7Q7SHXCS3X91DMF","collab-proof",null,"Use when you want to understand what Claude contributed vs what you drove in a session. Triggers on: \u002Fcollab-proof, session retrospective, ai contribution analysis, collaboration evidence, what did claude do.","Bhomik04\u002Fava-","Bhomik04","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F110253138?v=4","01M7AZ8PC968MDM5Y1W13JHHBN","bhomik goyal","01M7AZ8PDERKY1AFG9VZ8J0WSX",0,"MIT","https:\u002F\u002Fgithub.com\u002FBhomik04\u002Fava-\u002Fblob\u002Fmain\u002Fskills\u002Fimported\u002Fclaude-skills\u002Fengineering\u002Fcollab-proof\u002Fskills\u002Fcollab-proof\u002FSKILL.md",[],[],"2026-11-15 14:19:17",false,"---\nname: \"collab-proof\"\ndescription: \"Use when you want to understand what Claude contributed vs what you drove in a session. Triggers on: \u002Fcollab-proof, session retrospective, ai contribution analysis, collaboration evidence, what did claude do.\"\nlicense: MIT\n---\n\n# collab-proof\n\nSurfaces AI collaboration evidence the developer didn't consciously record.\nVela 3-layer pipeline × ADHD 4-frame reasoning — prompt-native, zero dependencies.\n\n---\n\n## Layer 01 — Signal detection\n\nRun `git log --oneline -10` and `git diff --stat HEAD~3..HEAD` first.\n\nClassify signal level using this rubric (pick the highest that matches):\n\n**HIGH** → full artifacts (DECISIONS.md + session-history + WORKLOG + HTML)\n- New file created, OR\n- 4+ files modified, OR\n- Explicit option comparison in conversation (\"vs\", \"instead of\", \"chose X over Y\"), OR\n- Design discussion lasted 15+ exchanges, OR\n- **Bug with root cause diagnosis** — conversation contains WHY the bug happened\n  (not just \"fixed X\" but \"the bug was caused by Y because Z\")\n\n**BUG_FIXING special rule** — override file count:\nEven if only 1 file changed, classify as HIGH if the conversation contains:\n- Root cause explanation (\"the bug was...\", \"this happened because...\", \"the issue is...\")\n- Diagnosis process (\"I checked...\", \"turned out...\", \"the problem was...\")\n- Fix rationale (\"chose this approach because...\", \"instead of X, used Y because...\")\nFile count doesn't matter for bugs — a well-diagnosed single-file fix is more valuable\nthan a 10-file feature with no discussion.\n\n**MEDIUM** → WORKLOG only\n- 1–3 files modified with no root cause discussion, OR\n- Minor feature added, no tradeoffs discussed\n\n**LOW** → silence, tell user \"Routine session — nothing recorded.\"\n- No code changes, only planning\u002Fdiscussion, OR\n- Single trivial change with no context (\"change this text\", \"fix typo\", \"rename variable\")\n\nShow the user: `Signal: HIGH \u002F MEDIUM \u002F LOW — [one-line reason]`\n\n---\n\n## Layer 02 — WorkIntentClassifier\n\nRun all four frames simultaneously against conversation context + git diff.\nScore each frame 0.0–1.0 using the rubric below. Then apply pruning and classification rules.\n\n### Frame scoring rubric\n\n**Frame A — Technical** (code churn complexity)\n- `1.0` New module\u002Ffile created, complex logic added (state machine, Lua script, novel algorithm)\n- `0.5` Existing function logic modified, simple API endpoint added\n- `0.1` Typo fix, comment change, plain text edit\n\n**Frame B — Uncertainty** (developer doubt signals)\n- `1.0` Code written then fully rolled back, explicit doubt expressed (\"이게 맞나?\", \"동작 안 하네\"), `git revert`\n- `0.5` Advice sought from Claude mid-implementation, 2+ revision requests on same area\n- `0.0` Uninterrupted directive execution — developer knew exactly what to build\n\n**Frame C — Fork** (decision branch presence)\n- `1.0` Two or more alternatives explicitly compared in conversation (A vs B)\n- `0.5` No explicit comparison but tradeoff mentioned (performance vs readability)\n- `0.0` Single standard approach applied, no alternatives considered\n\n**Frame D — AI contribution** (Claude's actual impact)\n- `1.0` Claude identified a bug\u002Fedge case the developer hadn't noticed and proposed the fix\n- `0.6` Claude generated structural boilerplate\u002Fskeleton that significantly accelerated execution\n- `0.2` Claude reformatted or transcribed developer-directed code without independent contribution\n\n---\n\n### Pruning rule\n\nPrune any frame scoring \u003C 0.4.\n\n**Exception — High-Speed Execution Guard:**\nIf `Frame A >= 0.8` AND `Frame D >= 0.6`, do NOT prune and do NOT silence the session,\neven if Frame B = 0.0 and Frame C = 0.0.\nThis is a boilerplate-heavy FEATURE_BUILDING session. Classify immediately as `FEATURE_BUILDING` with `HIGH` signal.\nRationale: zero uncertainty in a fast-moving session is a feature, not a reason to discard it.\n\n---\n\n### Intent classification\n\n| Surviving frames | Dominant intent | Meaning |\n|---|---|---|\n| A high + D mid-high (B, C low) | `FEATURE_BUILDING` | High-velocity feature generation, Claude scaffolding |\n| B high + A\u002FD high | `BUG_FIXING` or `STUCK` | Active debugging or unresolved looping |\n| C high + A high | `REFACTORING` or `EXPLORING` | Architecture exploration, weighing alternatives |\n| All frames \u003C 0.4 | `FLOW_STATE` or LOW | Routine typing, silence unless Layer 01 was HIGH |\n\nIf multiple intents tie, pick the one with the highest combined frame score.\nRecord the runner-up — it belongs in the session narrative.\n\n---\n\n### Internal output format\n\nBefore proceeding to Layer 03, resolve to this structure (show it to the user):\n\n```json\n{\n  \"frames\": {\n    \"technical\": 0.0,\n    \"uncertainty\": 0.0,\n    \"fork\": 0.0,\n    \"ai_contribution\": 0.0\n  },\n  \"pruned\": [\"list of pruned frame names\"],\n  \"intent\": \"FEATURE_BUILDING\",\n  \"signal\": \"HIGH\",\n  \"calibration_note\": \"one sentence explaining any exception rule applied\"\n}\n```\n\n---\n\n## Layer 03 — Output\n\n### If HIGH signal\n\n**Append to `DECISIONS.md`** — one entry per real fork (Frame C must confirm alternatives existed):\n\n```markdown\n## [YYYY-MM-DD] \u003Ctitle>\n\n**Context**: [Frame A — what forced this choice]\n**Decision**: what was chosen\n**Alternatives considered**: [Frame C — road not taken]\n**Reasoning**: why — prefix \"inferred:\" if reconstructed from context\n**AI contribution**:\n  - Identified: [Frame D — something developer missed]\n  - Suggested: [Frame D — approach or alternative]\n  - Developer-driven: [what the developer decided independently]\n**Intent class**: [from Layer 02]\n**Signal score**: HIGH\n**Outcome**: implemented | pending | reversed\n```\n\nIf no real fork existed → write nothing. Never fabricate decisions.\n\n**BUG_FIXING intent: use this format instead:**\n\n```markdown\n## [YYYY-MM-DD] \u003Cbug title>\n\n**Root cause**: what actually caused the bug — the WHY, not just the what\n**Symptom**: what the developer observed\n**Fix**: what was changed\n**Why this fix**: rationale — inferred if not stated explicitly\n**Alternative fixes considered**: other approaches discussed (if any)\n**AI contribution**:\n  - Identified: [Frame D — did Claude spot the root cause?]\n  - Suggested: [Frame D — fix approach or diagnostic step]\n  - Developer-driven: [what the developer diagnosed\u002Fdecided independently]\n**Intent class**: BUG_FIXING\n**Signal score**: HIGH\n**Outcome**: fixed | workaround | deferred\n```\n\n**Create `session-history\u002FYYYY-MM-DD-HHMM.md`**:\n\n```markdown\n# Session [YYYY-MM-DD HH:MM]\n\n**Intent**: [class] (runner-up: [class if any])\n**Signal**: HIGH\n**Frames active**: A ([score]) \u002F B ([score]) \u002F C ([score]) \u002F D ([score])\n\n## What shipped\n[grounded in git log]\n\n## What was figured out\n[Frame B + C — the reasoning, tradeoffs, debugging — what developers forget]\n\n## Decisions made this session\n[refs to DECISIONS.md entries]\n\n## Where it got hard\n[Frame B findings — uncertainty, reverts, EXPLORING\u002FSTUCK signals]\n\n## AI contribution summary\n[Frame D synthesis — one honest paragraph, calibrated]\n\n## Next steps inferred\n[what's obviously incomplete]\n```\n\n**Append to `WORKLOG.md`**:\n```\nYYYY-MM-DD HH:MM | [intent] | HIGH | D:[score] | cache:[hit%]% | tok:[total] | \u003Cverb phrase> — \u003Cwhy it mattered>\n```\n\nFields:\n- `D:[score]` — Frame D AI contribution score (0.0–1.0)\n- `cache:[hit%]%` — cache hit rate from token analysis (or `cache:n\u002Fa` if no data)\n- `tok:[total]` — total tokens this session (input + cache_read + cache_create + output, in K e.g. `45K`)\n- verb phrase — what shipped, grounded in git log\n\n**Collect token usage** (bash — run this and capture output):\n```bash\npython3 -c \"\nimport json, sys\nfrom pathlib import Path\n\nprojects = Path.home() \u002F '.claude\u002Fprojects'\nfiles = sorted(projects.rglob('*.jsonl'), key=lambda f: f.stat().st_mtime, reverse=True)\nif not files:\n    print('no_data'); sys.exit()\n\nwith open(files[0]) as fp:\n    lines = [json.loads(l) for l in fp if l.strip()]\n\nti = to = cr = cc = 0\nturns = []\nfor i, line in enumerate(lines):\n    if line.get('type') == 'assistant':\n        u = line.get('message', {}).get('usage', {})\n        if not u: continue\n        inp = u.get('input_tokens', 0)\n        ti += inp; to += u.get('output_tokens', 0)\n        cr += u.get('cache_read_input_tokens', 0)\n        cc += u.get('cache_creation_input_tokens', 0)\n        prompt = ''\n        for j in range(i-1, -1, -1):\n            if lines[j].get('type') == 'user':\n                c = lines[j].get('message', {}).get('content', '')\n                prompt = (c if isinstance(c, str) else next((x.get('text','') for x in c if isinstance(x,dict) and x.get('type')=='text'), ''))[:80]\n                break\n        turns.append((inp, prompt))\n\ntotal = ti + cr + cc\nhit = cr \u002F total * 100 if total else 0\nprint(f'input={ti} output={to} cache_read={cr} cache_create={cc} hit={hit:.0f} turns={len(turns)}')\nturns.sort(reverse=True)\nfor idx, (tok, p) in enumerate(turns[:3]):\n    print(f'top{idx+1}={tok}|{p}')\n\"\n```\n\nParse the output and include token stats in the session narrative. Then:\n\n**Generate `session-history\u002FYYYY-MM-DD-HHMM-proof.html`** — write a self-contained HTML file. Structure and class names are fixed — do not rename or reorder sections.\n\n**Fixed CSS tokens (use exactly):**\n- Background: `#0d1117`, Card: `#161b22`, Border: `#30363d`\n- Font: `font-family: 'Courier New', monospace`\n- Frame score colors: `high` → `#3fb950`, `low` → `#f85149`, pruned → `#8b949e`\n- AI line colors: `ai-identified` → `#a371f7`, `ai-suggested` → `#d29922`, `ai-developer` → `#3fb950`\n\n**Fixed HTML structure (class names must match exactly):**\n```\n\u003Cdiv class=\"header\">\n  \u003Cdiv class=\"header-top\">\n    \u003Cdiv class=\"project-name\">\n    \u003Cspan class=\"badge\">                    \u003C!-- intent class -->\n  \u003Cdiv class=\"meta-row\">                    \u003C!-- date, branch, signal level text -->\n  \u003Cdiv class=\"signal-container\">\n    \u003Cdiv class=\"signal-label\">\n    \u003Cdiv class=\"signal-track\">\n      \u003Cdiv class=\"signal-fill\">             \u003C!-- width % driven by signal score -->\n\n\u003Cdiv class=\"section\">                       \u003C!-- frames -->\n  \u003Cdiv class=\"section-title\"> ... \u003Cspan class=\"count\">Layer 02 · ADHD tree-of-thought\u003C\u002Fspan>\n  \u003Cdiv class=\"frames-grid\">\n    \u003Cdiv class=\"frame-card\">               \u003C!-- pruned: class=\"frame-card pruned\" -->\n      \u003Cdiv class=\"frame-label\">            \u003C!-- Frame A \u002F B \u002F C \u002F D -->\n      \u003Cdiv class=\"frame-name\">\n      \u003Cdiv class=\"frame-score high|low\">   \u003C!-- score value -->\n\n\u003Cdiv class=\"section\">                       \u003C!-- decisions — skip section if none -->\n  \u003Cdiv class=\"section-title\"> ... \u003Cspan class=\"count\">N recorded\u003C\u002Fspan>\n  \u003Cdiv class=\"decision-card\">              \u003C!-- one per DECISIONS.md entry -->\n    \u003Cdiv class=\"decision-header\">\n      \u003Cdiv class=\"decision-title\">\n      \u003Cdiv class=\"decision-date\">\n    \u003Cdiv class=\"decision-fields\">\n      \u003Cdiv class=\"field-row\">\n        \u003Cdiv class=\"field-label\">          \u003C!-- Context \u002F Decision \u002F Alternatives \u002F Reasoning -->\n        \u003Cdiv class=\"field-value\">\n      \u003Cdiv class=\"field-row\">              \u003C!-- AI contribution row -->\n        \u003Cdiv class=\"field-label\">AI contribution\u003C\u002Fdiv>\n        \u003Cdiv class=\"field-value\">\n          \u003Cdiv class=\"ai-block\">\n            \u003Cdiv class=\"ai-line ai-identified|ai-suggested|ai-developer\">\n              \u003Cspan class=\"tag\">IDENTIFIED|SUGGESTED|DEV-DRIVEN\u003C\u002Fspan>\n      \u003Cdiv class=\"field-row\">              \u003C!-- Outcome row -->\n        \u003Cdiv class=\"field-label\">Outcome\u003C\u002Fdiv>\n        \u003Cdiv class=\"field-value\">\n          \u003Cspan class=\"outcome-badge outcome-implemented|outcome-pending|outcome-reversed\">\n\n\u003Cdiv class=\"section\">                       \u003C!-- session narrative -->\n  \u003Cdiv class=\"section-title\">Session narrative\u003C\u002Fdiv>\n  \u003Cdiv class=\"narrative-grid\">\n    \u003Cdiv class=\"narrative-card\">           \u003C!-- What shipped -->\n    \u003Cdiv class=\"narrative-card\">           \u003C!-- What was figured out -->\n    \u003Cdiv class=\"narrative-card\">           \u003C!-- Where it got hard -->\n    \u003Cdiv class=\"narrative-card\">           \u003C!-- Next steps inferred -->\n\n\u003Cdiv class=\"section\">                       \u003C!-- AI contribution summary -->\n  \u003Cdiv class=\"section-title\">AI contribution summary\u003C\u002Fdiv>\n  \u003Cdiv class=\"narrative-card\">             \u003C!-- Frame D synthesis paragraph -->\n\n\u003Cdiv class=\"section\">                       \u003C!-- token usage -->\n  \u003Cdiv class=\"section-title\">Token usage\u003C\u002Fdiv>\n  \u003Cdiv class=\"narrative-card\">             \u003C!-- cache hit rate bar + top turns + optimization note -->\n\n\u003Cdiv class=\"section\">                       \u003C!-- worklog tail -->\n  \u003Cdiv class=\"section-title\"> ... \u003Cspan class=\"count\">last N entries\u003C\u002Fspan>\n  \u003Cdiv class=\"worklog-entry\">              \u003C!-- one per recent WORKLOG line -->\n\n\u003Cdiv class=\"footer\">                        \u003C!-- last commit hash · \"Generated by collab-proof · timestamp\" -->\n```\n\nWrite the HTML using bash:\n```bash\ncat > session-history\u002FYYYY-MM-DD-HHMM-proof.html \u003C\u003C 'HTMLEOF'\n\u003C!DOCTYPE html>\n... (full HTML with inline CSS, no external resources)\nHTMLEOF\n```\n\nAfter writing, show: `open session-history\u002FYYYY-MM-DD-HHMM-proof.html`\n\n---\n\n### If MEDIUM signal\n\nAppend one line to `WORKLOG.md` only:\n```\nYYYY-MM-DD HH:MM | [intent] | MEDIUM | D:[score] | cache:[hit%]% | tok:[total] | \u003Cverb phrase>\n```\n\n---\n\n### If LOW signal\n\nTell user: \"Signal: LOW — Routine session, nothing recorded.\"\n\n---\n\n## Honesty rules\n\n- Never invent decisions not in the conversation or implied by the diff\n- \"inferred:\" prefix when reasoning is reconstructed\n- Frame D must be calibrated — neither overclaim nor dismiss\n- If all frames score \u003C 0.4 → write nothing\n\n---\n\n## PreCompact snapshot (context compaction defence)\n\nWhen context compaction is about to happen (triggered by the PreCompact hook),\nrun a lightweight mid-session checkpoint before context is lost:\n\n1. Compute current Layer 01 signal level from available context\n2. Score all four frames against what's visible now\n3. Write a snapshot to `session-history\u002F.tmp-TIMESTAMP.json`:\n\n```json\n{\n  \"timestamp\": \"YYYY-MM-DD HH:MM:SS\",\n  \"trigger\": \"pre-compact\",\n  \"signal\": \"HIGH \u002F MEDIUM \u002F LOW\",\n  \"frames\": { \"technical\": 0.0, \"uncertainty\": 0.0, \"fork\": 0.0, \"ai_contribution\": 0.0 },\n  \"intent\": \"FEATURE_BUILDING\",\n  \"key_moments\": [\n    \"one-line description of the most important decision or finding so far\"\n  ]\n}\n```\n\nWhen `\u002Fcollab-proof` runs at session end:\n- Read all `session-history\u002F.tmp-*.json` files\n- Merge frame scores (take max per frame across all snapshots)\n- Combine `key_moments` arrays — these preserve tradeoff discussions that were compacted away\n- Delete `.tmp-*.json` files after merging\n","# collab-proof\n\nSurfaces AI collaboration evidence the developer didn't consciously record.\nVela 3-layer pipeline × ADHD 4-frame reasoning — prompt-native, zero dependencies.\n\n---\n\n## Layer 01 — Signal detection\n\nRun `git log --oneline -10` and `git diff --stat HEAD~3..HEAD` first.\n\nClassify signal level using this rubric (pick the highest that matches):\n\n**HIGH** → full artifacts (DECISIONS.md + session-history + WORKLOG + HTML)\n- New file created, OR\n- 4+ files modified, OR\n- Explicit option comparison in conversation (\"vs\", \"instead of\", \"chose X over Y\"), OR\n- Design discussion lasted 15+ exchanges, OR\n- **Bug with root cause diagnosis** — conversation contains WHY the bug happened\n  (not just \"fixed X\" but \"the bug was caused by Y because Z\")\n\n**BUG_FIXING special rule** — override file count:\nEven if only 1 file changed, classify as HIGH if the conversation contains:\n- Root cause explanation (\"the bug was...\", \"this happened because...\", \"the issue is...\")\n- Diagnosis process (\"I checked...\", \"turned out...\", \"the problem was...\")\n- Fix rationale (\"chose this approach because...\", \"instead of X, used Y because...\")\nFile count doesn't matter for bugs — a well-diagnosed single-file fix is more valuable\nthan a 10-file feature with no discussion.\n\n**MEDIUM** → WORKLOG only\n- 1–3 files modified with no root cause discussion, OR\n- Minor feature added, no tradeoffs discussed\n\n**LOW** → silence, tell user \"Routine session — nothing recorded.\"\n- No code changes, only planning\u002Fdiscussion, OR\n- Single trivial change with no context (\"change this text\", \"fix typo\", \"rename variable\")\n\nShow the user: `Signal: HIGH \u002F MEDIUM \u002F LOW — [one-line reason]`\n\n---\n\n## Layer 02 — WorkIntentClassifier\n\nRun all four frames simultaneously against conversation context + git diff.\nScore each frame 0.0–1.0 using the rubric below. Then apply pruning and classification rules.\n\n### Frame scoring rubric\n\n**Frame A — Technical** (code churn complexity)\n- `1.0` New module\u002Ffile created, complex logic added (state machine, Lua script, novel algorithm)\n- `0.5` Existing function logic modified, simple API endpoint added\n- `0.1` Typo fix, comment change, plain text edit\n\n**Frame B — Uncertainty** (developer doubt signals)\n- `1.0` Code written then fully rolled back, explicit doubt expressed (\"이게 맞나?\", \"동작 안 하네\"), `git revert`\n- `0.5` Advice sought from Claude mid-implementation, 2+ revision requests on same area\n- `0.0` Uninterrupted directive execution — developer knew exactly what to build\n\n**Frame C — Fork** (decision branch presence)\n- `1.0` Two or more alternatives explicitly compared in conversation (A vs B)\n- `0.5` No explicit comparison but tradeoff mentioned (performance vs readability)\n- `0.0` Single standard approach applied, no alternatives considered\n\n**Frame D — AI contribution** (Claude's actual impact)\n- `1.0` Claude identified a bug\u002Fedge case the developer hadn't noticed and proposed the fix\n- `0.6` Claude generated structural boilerplate\u002Fskeleton that significantly accelerated execution\n- `0.2` Claude reformatted or transcribed developer-directed code without independent contribution\n\n---\n\n### Pruning rule\n\nPrune any frame scoring \u003C 0.4.\n\n**Exception — High-Speed Execution Guard:**\nIf `Frame A >= 0.8` AND `Frame D >= 0.6`, do NOT prune and do NOT silence the session,\neven if Frame B = 0.0 and Frame C = 0.0.\nThis is a boilerplate-heavy FEATURE_BUILDING session. Classify immediately as `FEATURE_BUILDING` with `HIGH` signal.\nRationale: zero uncertainty in a fast-moving session is a feature, not a reason to discard it.\n\n---\n\n### Intent classification\n\n| Surviving frames | Dominant intent | Meaning |\n|---|---|---|\n| A high + D mid-high (B, C low) | `FEATURE_BUILDING` | High-velocity feature generation, Claude scaffolding |\n| B high + A\u002FD high | `BUG_FIXING` or `STUCK` | Active debugging or unresolved looping |\n| C high + A high | `REFACTORING` or `EXPLORING` | Architecture exploration, weighing alternatives |\n| All frames \u003C 0.4 | `FLOW_STATE` or LOW | Routine typing, silence unless Layer 01 was HIGH |\n\nIf multiple intents tie, pick the one with the highest combined frame score.\nRecord the runner-up — it belongs in the session narrative.\n\n---\n\n### Internal output format\n\nBefore proceeding to Layer 03, resolve to this structure (show it to the user):\n\n```json\n{\n  \"frames\": {\n    \"technical\": 0.0,\n    \"uncertainty\": 0.0,\n    \"fork\": 0.0,\n    \"ai_contribution\": 0.0\n  },\n  \"pruned\": [\"list of pruned frame names\"],\n  \"intent\": \"FEATURE_BUILDING\",\n  \"signal\": \"HIGH\",\n  \"calibration_note\": \"one sentence explaining any exception rule applied\"\n}\n```\n\n---\n\n## Layer 03 — Output\n\n### If HIGH signal\n\n**Append to `DECISIONS.md`** — one entry per real fork (Frame C must confirm alternatives existed):\n\n```markdown\n## [YYYY-MM-DD] \u003Ctitle>\n\n**Context**: [Frame A — what forced this choice]\n**Decision**: what was chosen\n**Alternatives considered**: [Frame C — road not taken]\n**Reasoning**: why — prefix \"inferred:\" if reconstructed from context\n**AI contribution**:\n  - Identified: [Frame D — something developer missed]\n  - Suggested: [Frame D — approach or alternative]\n  - Developer-driven: [what the developer decided independently]\n**Intent class**: [from Layer 02]\n**Signal score**: HIGH\n**Outcome**: implemented | pending | reversed\n```\n\nIf no real fork existed → write nothing. Never fabricate decisions.\n\n**BUG_FIXING intent: use this format instead:**\n\n```markdown\n## [YYYY-MM-DD] \u003Cbug title>\n\n**Root cause**: what actually caused the bug — the WHY, not just the what\n**Symptom**: what the developer observed\n**Fix**: what was changed\n**Why this fix**: rationale — inferred if not stated explicitly\n**Alternative fixes considered**: other approaches discussed (if any)\n**AI contribution**:\n  - Identified: [Frame D — did Claude spot the root cause?]\n  - Suggested: [Frame D — fix approach or diagnostic step]\n  - Developer-driven: [what the developer diagnosed\u002Fdecided independently]\n**Intent class**: BUG_FIXING\n**Signal score**: HIGH\n**Outcome**: fixed | workaround | deferred\n```\n\n**Create `session-history\u002FYYYY-MM-DD-HHMM.md`**:\n\n```markdown\n# Session [YYYY-MM-DD HH:MM]\n\n**Intent**: [class] (runner-up: [class if any])\n**Signal**: HIGH\n**Frames active**: A ([score]) \u002F B ([score]) \u002F C ([score]) \u002F D ([score])\n\n## What shipped\n[grounded in git log]\n\n## What was figured out\n[Frame B + C — the reasoning, tradeoffs, debugging — what developers forget]\n\n## Decisions made this session\n[refs to DECISIONS.md entries]\n\n## Where it got hard\n[Frame B findings — uncertainty, reverts, EXPLORING\u002FSTUCK signals]\n\n## AI contribution summary\n[Frame D synthesis — one honest paragraph, calibrated]\n\n## Next steps inferred\n[what's obviously incomplete]\n```\n\n**Append to `WORKLOG.md`**:\n```\nYYYY-MM-DD HH:MM | [intent] | HIGH | D:[score] | cache:[hit%]% | tok:[total] | \u003Cverb phrase> — \u003Cwhy it mattered>\n```\n\nFields:\n- `D:[score]` — Frame D AI contribution score (0.0–1.0)\n- `cache:[hit%]%` — cache hit rate from token analysis (or `cache:n\u002Fa` if no data)\n- `tok:[total]` — total tokens this session (input + cache_read + cache_create + output, in K e.g. `45K`)\n- verb phrase — what shipped, grounded in git log\n\n**Collect token usage** (bash — run this and capture output):\n```bash\npython3 -c \"\nimport json, sys\nfrom pathlib import Path\n\nprojects = Path.home() \u002F '.claude\u002Fprojects'\nfiles = sorted(projects.rglob('*.jsonl'), key=lambda f: f.stat().st_mtime, reverse=True)\nif not files:\n    print('no_data'); sys.exit()\n\nwith open(files[0]) as fp:\n    lines = [json.loads(l) for l in fp if l.strip()]\n\nti = to = cr = cc = 0\nturns = []\nfor i, line in enumerate(lines):\n    if line.get('type') == 'assistant':\n        u = line.get('message', {}).get('usage', {})\n        if not u: continue\n        inp = u.get('input_tokens', 0)\n        ti += inp; to += u.get('output_tokens', 0)\n        cr += u.get('cache_read_input_tokens', 0)\n        cc += u.get('cache_creation_input_tokens', 0)\n        prompt = ''\n        for j in range(i-1, -1, -1):\n            if lines[j].get('type') == 'user':\n                c = lines[j].get('message', {}).get('content', '')\n                prompt = (c if isinstance(c, str) else next((x.get('text','') for x in c if isinstance(x,dict) and x.get('type')=='text'), ''))[:80]\n                break\n        turns.append((inp, prompt))\n\ntotal = ti + cr + cc\nhit = cr \u002F total * 100 if total else 0\nprint(f'input={ti} output={to} cache_read={cr} cache_create={cc} hit={hit:.0f} turns={len(turns)}')\nturns.sort(reverse=True)\nfor idx, (tok, p) in enumerate(turns[:3]):\n    print(f'top{idx+1}={tok}|{p}')\n\"\n```\n\nParse the output and include token stats in the session narrative. Then:\n\n**Generate `session-history\u002FYYYY-MM-DD-HHMM-proof.html`** — write a self-contained HTML file. Structure and class names are fixed — do not rename or reorder sections.\n\n**Fixed CSS tokens (use exactly):**\n- Background: `#0d1117`, Card: `#161b22`, Border: `#30363d`\n- Font: `font-family: 'Courier New', monospace`\n- Frame score colors: `high` → `#3fb950`, `low` → `#f85149`, pruned → `#8b949e`\n- AI line colors: `ai-identified` → `#a371f7`, `ai-suggested` → `#d29922`, `ai-developer` → `#3fb950`\n\n**Fixed HTML structure (class names must match exactly):**\n```\n\u003Cdiv class=\"header\">\n  \u003Cdiv class=\"header-top\">\n    \u003Cdiv class=\"project-name\">\n    \u003Cspan class=\"badge\">                    \u003C!-- intent class -->\n  \u003Cdiv class=\"meta-row\">                    \u003C!-- date, branch, signal level text -->\n  \u003Cdiv class=\"signal-container\">\n    \u003Cdiv class=\"signal-label\">\n    \u003Cdiv class=\"signal-track\">\n      \u003Cdiv class=\"signal-fill\">             \u003C!-- width % driven by signal score -->\n\n\u003Cdiv class=\"section\">                       \u003C!-- frames -->\n  \u003Cdiv class=\"section-title\"> ... \u003Cspan class=\"count\">Layer 02 · ADHD tree-of-thought\u003C\u002Fspan>\n  \u003Cdiv class=\"frames-grid\">\n    \u003Cdiv class=\"frame-card\">               \u003C!-- pruned: class=\"frame-card pruned\" -->\n      \u003Cdiv class=\"frame-label\">            \u003C!-- Frame A \u002F B \u002F C \u002F D -->\n      \u003Cdiv class=\"frame-name\">\n      \u003Cdiv class=\"frame-score high|low\">   \u003C!-- score value -->\n\n\u003Cdiv class=\"section\">                       \u003C!-- decisions — skip section if none -->\n  \u003Cdiv class=\"section-title\"> ... \u003Cspan class=\"count\">N recorded\u003C\u002Fspan>\n  \u003Cdiv class=\"decision-card\">              \u003C!-- one per DECISIONS.md entry -->\n    \u003Cdiv class=\"decision-header\">\n      \u003Cdiv class=\"decision-title\">\n      \u003Cdiv class=\"decision-date\">\n    \u003Cdiv class=\"decision-fields\">\n      \u003Cdiv class=\"field-row\">\n        \u003Cdiv class=\"field-label\">          \u003C!-- Context \u002F Decision \u002F Alternatives \u002F Reasoning -->\n        \u003Cdiv class=\"field-value\">\n      \u003Cdiv class=\"field-row\">              \u003C!-- AI contribution row -->\n        \u003Cdiv class=\"field-label\">AI contribution\u003C\u002Fdiv>\n        \u003Cdiv class=\"field-value\">\n          \u003Cdiv class=\"ai-block\">\n            \u003Cdiv class=\"ai-line ai-identified|ai-suggested|ai-developer\">\n              \u003Cspan class=\"tag\">IDENTIFIED|SUGGESTED|DEV-DRIVEN\u003C\u002Fspan>\n      \u003Cdiv class=\"field-row\">              \u003C!-- Outcome row -->\n        \u003Cdiv class=\"field-label\">Outcome\u003C\u002Fdiv>\n        \u003Cdiv class=\"field-value\">\n          \u003Cspan class=\"outcome-badge outcome-implemented|outcome-pending|outcome-reversed\">\n\n\u003Cdiv class=\"section\">                       \u003C!-- session narrative -->\n  \u003Cdiv class=\"section-title\">Session narrative\u003C\u002Fdiv>\n  \u003Cdiv class=\"narrative-grid\">\n    \u003Cdiv class=\"narrative-card\">           \u003C!-- What shipped -->\n    \u003Cdiv class=\"narrative-card\">           \u003C!-- What was figured out -->\n    \u003Cdiv class=\"narrative-card\">           \u003C!-- Where it got hard -->\n    \u003Cdiv class=\"narrative-card\">           \u003C!-- Next steps inferred -->\n\n\u003Cdiv class=\"section\">                       \u003C!-- AI contribution summary -->\n  \u003Cdiv class=\"section-title\">AI contribution summary\u003C\u002Fdiv>\n  \u003Cdiv class=\"narrative-card\">             \u003C!-- Frame D synthesis paragraph -->\n\n\u003Cdiv class=\"section\">                       \u003C!-- token usage -->\n  \u003Cdiv class=\"section-title\">Token usage\u003C\u002Fdiv>\n  \u003Cdiv class=\"narrative-card\">             \u003C!-- cache hit rate bar + top turns + optimization note -->\n\n\u003Cdiv class=\"section\">                       \u003C!-- worklog tail -->\n  \u003Cdiv class=\"section-title\"> ... \u003Cspan class=\"count\">last N entries\u003C\u002Fspan>\n  \u003Cdiv class=\"worklog-entry\">              \u003C!-- one per recent WORKLOG line -->\n\n\u003Cdiv class=\"footer\">                        \u003C!-- last commit hash · \"Generated by collab-proof · timestamp\" -->\n```\n\nWrite the HTML using bash:\n```bash\ncat > session-history\u002FYYYY-MM-DD-HHMM-proof.html \u003C\u003C 'HTMLEOF'\n\u003C!DOCTYPE html>\n... (full HTML with inline CSS, no external resources)\nHTMLEOF\n```\n\nAfter writing, show: `open session-history\u002FYYYY-MM-DD-HHMM-proof.html`\n\n---\n\n### If MEDIUM signal\n\nAppend one line to `WORKLOG.md` only:\n```\nYYYY-MM-DD HH:MM | [intent] | MEDIUM | D:[score] | cache:[hit%]% | tok:[total] | \u003Cverb phrase>\n```\n\n---\n\n### If LOW signal\n\nTell user: \"Signal: LOW — Routine session, nothing recorded.\"\n\n---\n\n## Honesty rules\n\n- Never invent decisions not in the conversation or implied by the diff\n- \"inferred:\" prefix when reasoning is reconstructed\n- Frame D must be calibrated — neither overclaim nor dismiss\n- If all frames score \u003C 0.4 → write nothing\n\n---\n\n## PreCompact snapshot (context compaction defence)\n\nWhen context compaction is about to happen (triggered by the PreCompact hook),\nrun a lightweight mid-session checkpoint before context is lost:\n\n1. Compute current Layer 01 signal level from available context\n2. Score all four frames against what's visible now\n3. Write a snapshot to `session-history\u002F.tmp-TIMESTAMP.json`:\n\n```json\n{\n  \"timestamp\": \"YYYY-MM-DD HH:MM:SS\",\n  \"trigger\": \"pre-compact\",\n  \"signal\": \"HIGH \u002F MEDIUM \u002F LOW\",\n  \"frames\": { \"technical\": 0.0, \"uncertainty\": 0.0, \"fork\": 0.0, \"ai_contribution\": 0.0 },\n  \"intent\": \"FEATURE_BUILDING\",\n  \"key_moments\": [\n    \"one-line description of the most important decision or finding so far\"\n  ]\n}\n```\n\nWhen `\u002Fcollab-proof` runs at session end:\n- Read all `session-history\u002F.tmp-*.json` files\n- Merge frame scores (take max per frame across all snapshots)\n- Combine `key_moments` arrays — these preserve tradeoff discussions that were compacted away\n- Delete `.tmp-*.json` files after merging\n",{"name":5,"license":15,"description":7},"main","decebbc662d2b278167b2a17d949479cf4cad66d","skills\u002Fimported\u002Fclaude-skills\u002Fengineering\u002Fcollab-proof\u002Fskills\u002Fcollab-proof","https:\u002F\u002Fgithub.com\u002FBhomik04\u002Fava-","https:\u002F\u002Fgithub.com\u002FBhomik04","2026-08-23 16:08:45",{"source":8,"skillName":5,"commands":31,"prompt":41,"zipAvailable":42},[32,35,38],{"tool":33,"command":34},"npx","npx skills add Bhomik04\u002Fava- --skill collab-proof",{"tool":36,"command":37},"bunx","bunx skills add Bhomik04\u002Fava- --skill collab-proof",{"tool":39,"command":40},"pnpm","pnpm dlx skills add Bhomik04\u002Fava- --skill collab-proof","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FBhomik04\u002Fava-\u002Fblob\u002Fmain\u002Fskills\u002Fimported\u002Fclaude-skills\u002Fengineering\u002Fcollab-proof\u002Fskills\u002Fcollab-proof\u002FSKILL.md",true,[44,50,54,58],{"path":45,"resourceType":46,"resourceTypeDesc":47,"sizeBytes":48,"sourceHtmlUrl":49},"references\u002Fai-collaboration-evidence.md","REFERENCE","参考文档",2990,"https:\u002F\u002Fgithub.com\u002FBhomik04\u002Fava-\u002Fblob\u002Fmain\u002Fskills\u002Fimported\u002Fclaude-skills\u002Fengineering\u002Fcollab-proof\u002Fskills\u002Fcollab-proof\u002Freferences\u002Fai-collaboration-evidence.md",{"path":51,"resourceType":46,"resourceTypeDesc":47,"sizeBytes":52,"sourceHtmlUrl":53},"references\u002Fdeveloper-portfolio-proof.md",3311,"https:\u002F\u002Fgithub.com\u002FBhomik04\u002Fava-\u002Fblob\u002Fmain\u002Fskills\u002Fimported\u002Fclaude-skills\u002Fengineering\u002Fcollab-proof\u002Fskills\u002Fcollab-proof\u002Freferences\u002Fdeveloper-portfolio-proof.md",{"path":55,"resourceType":46,"resourceTypeDesc":47,"sizeBytes":56,"sourceHtmlUrl":57},"references\u002Fsession-documentation-patterns.md",3732,"https:\u002F\u002Fgithub.com\u002FBhomik04\u002Fava-\u002Fblob\u002Fmain\u002Fskills\u002Fimported\u002Fclaude-skills\u002Fengineering\u002Fcollab-proof\u002Fskills\u002Fcollab-proof\u002Freferences\u002Fsession-documentation-patterns.md",{"path":59,"resourceType":46,"resourceTypeDesc":47,"sizeBytes":60,"sourceHtmlUrl":61},"references\u002Ftamper-evident-proof.md",3407,"https:\u002F\u002Fgithub.com\u002FBhomik04\u002Fava-\u002Fblob\u002Fmain\u002Fskills\u002Fimported\u002Fclaude-skills\u002Fengineering\u002Fcollab-proof\u002Fskills\u002Fcollab-proof\u002Freferences\u002Ftamper-evident-proof.md",[63,70,77,84,91,98],{"skillNo":64,"name":65,"nameZh":6,"description":66,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":67,"categories":68,"keywords":69,"publishedAt":19},"01M7B1YZ6EW9K9QQX1VYBXKKWH","spotify-dj","Intelligent music DJ that curates playlists, selects tracks based on mood, analyzes genres, and manages playback queues.","https:\u002F\u002Fgithub.com\u002FBhomik04\u002Fava-\u002Fblob\u002Fmain\u002Fskills\u002Fofficial\u002Fspotify-dj\u002FSKILL.md",[],[],{"skillNo":71,"name":72,"nameZh":6,"description":73,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":74,"categories":75,"keywords":76,"publishedAt":19},"01M7B1YWTNAF22PTEWNDGXQD9G","software-engineer","Autonomous software engineering, AST refactoring, Git worktree isolation, and self-healing test execution.","https:\u002F\u002Fgithub.com\u002FBhomik04\u002Fava-\u002Fblob\u002Fmain\u002Fskills\u002Fofficial\u002Fsoftware-engineer\u002FSKILL.md",[],[],{"skillNo":78,"name":79,"nameZh":6,"description":80,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":81,"categories":82,"keywords":83,"publishedAt":19},"01M7B1YS4HDDEFEJXBB8KW4T3K","obsidian-curator","Curates, organizes, links, and summarizes notes and research in the local Obsidian vault.","https:\u002F\u002Fgithub.com\u002FBhomik04\u002Fava-\u002Fblob\u002Fmain\u002Fskills\u002Fofficial\u002Fobsidian-curator\u002FSKILL.md",[],[],{"skillNo":85,"name":86,"nameZh":6,"description":87,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":88,"categories":89,"keywords":90,"publishedAt":19},"01M7B1YPJYQGB10P4EQ4SFEBFM","document-analysis","Parses, reads, extracts data, and summarizes multi-format documents (PDF, DOCX, Markdown, Text).","https:\u002F\u002Fgithub.com\u002FBhomik04\u002Fava-\u002Fblob\u002Fmain\u002Fskills\u002Fofficial\u002Fdocument-analysis\u002FSKILL.md",[],[],{"skillNo":92,"name":93,"nameZh":6,"description":94,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":95,"categories":96,"keywords":97,"publishedAt":19},"01M7B1YJPE6J8PEWQRSRSHJ03C","docker-ops","Inspects, monitors, starts, stops, and diagnoses Docker containers and swarms via Named Pipe.","https:\u002F\u002Fgithub.com\u002FBhomik04\u002Fava-\u002Fblob\u002Fmain\u002Fskills\u002Fofficial\u002Fdocker-ops\u002FSKILL.md",[],[],{"skillNo":99,"name":100,"nameZh":6,"description":101,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":102,"categories":103,"keywords":104,"publishedAt":19},"01M7B1YEG3JESA4JPJNMVM1556","deep-research","Conducts multi-step autonomous research, source cross-verification, and structured literature synthesis.","https:\u002F\u002Fgithub.com\u002FBhomik04\u002Fava-\u002Fblob\u002Fmain\u002Fskills\u002Fofficial\u002Fdeep-research\u002FSKILL.md",[],[]]