[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6K7M4HNZR34GSB3V14KVCWA":3,"skill-same:01M6K7M4HNZR34GSB3V14KVCWA":50},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":18,"linkOnly":19,"markdownContent":20,"markdownBody":21,"frontMatter":22,"refName":23,"commitSha":24,"skillDirectory":25,"forksCount":13,"repositoryHtmlUrl":26,"repositoryHomepageUrl":6,"ownerHtmlUrl":27,"ownerBlogUrl":6,"ownerDescription":28,"updatedAt":29,"install":30,"resources":43},"01M6K7M4HNZR34GSB3V14KVCWA","retro",null,"joewalnes\u002Fskills","joewalnes","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F48950?v=4","01M6K7J46C00DDV34GMGT2NK72","Joe Walnes","01M6K7J4ANFVAP1P9ZJ3K4F3P2",3,"MIT","https:\u002F\u002Fgithub.com\u002Fjoewalnes\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fretro\u002FSKILL.md",[],[5],"2026-11-10 10:12:30",false,"---\nname: retro\ndescription: Evidence-first retrospective of a session or fleet from its transcripts and repo. Use when a process isn't working and you want to know why before changing anything.\nargument-hint: [project-dir] [--hours N]\n---\n\n# Retro: find out what actually happened before deciding what to change\n\nWhen a session or a fleet \"keeps stalling\" or \"never finishes,\" the temptation is to add a rule. Don't — not yet. The fleets that stalled had the rule (\"run it on a loop\") written down; what they lacked was the evidence that it wasn't happening (zero scheduled wakeups in 480 hours) and the mechanism that would have made it happen. A retro produces both: the number, and the thing that refuses.\n\nThis complements `\u002Fgo-team retro`, which reads `LESSONS.md` — the fleet's *self-report*. This reads what actually happened, which is a different source in the same way `\u002Fslop`'s history is different from `\u002Fscorecard`'s snapshot.\n\n## Run the script first\n\n```bash\npython3 ~\u002F.claude\u002Fskills\u002Fretro\u002Fscripts\u002Fretro.py \u003Cproject-dir> [--hours 48]\n```\n\nIt reads the project's session transcripts (`~\u002F.claude\u002Fprojects\u002F…\u002F*.jsonl`) and its repo, and reports numbers: session span and idle share; every idle gap with what preceded it and what resumed it; human turns and the human's own redirects (\"why do we keep stalling\", \"this has been going on a while\"); which channels were used — `AskUserQuestion` versus `DECISION NEEDED`, `Cron`\u002F`ScheduleWakeup`, `Agent`, `SendMessage`; every question asked; and the repo's fleet artefacts — commits, merges, `Thesis:` trailers, leases, landing sources, the compass line, the top open ask and whether anyone holds a lane lease for it, the last lesson written.\n\n## How to read it\n\n1. **Gaps before counts.** An idle share of 90% is not \"stalling\" — it's *not running*. For each long gap, what preceded it is the cause: a question the human wasn't there to answer, a permission prompt, a turn that ended with a completion report and nothing to resume it. What resumed it tells you who was doing the work of keeping things alive (if it's always `[HUMAN]`, there is no heartbeat).\n2. **Channels defined versus channels used.** A skill can define `DECISION NEEDED` and the model will still reach for `AskUserQuestion`, because that's the tool that exists. Zero uses of a designed channel means the design isn't binding.\n3. **The human's own words are evidence.** \"Why do we keep stalling waiting on me for tool approval?\" is a root-cause statement. Quote it.\n4. **Artefacts versus claims.** Landings all labelled `asks` while the top ask is untouched; a compass line reading `not-taken`; leases with no cron — each is a record that exists and a measurement that doesn't. That shape recurs everywhere; name it when you see it.\n5. **The one diagnostic question**, from go-team's failure catalogue: *what else would produce exactly this reading?* Two states, one observation — find the signal they don't share before concluding.\n\n## Write the findings as rule + mechanism\n\nEach finding, ranked by evidence weight:\n\n```\n**N. \u003Cwhat happened, with the number>.** \u003Cthe cost, and the evidence — quote the transcript or cite the artefact>\n*Mechanism:* \u003Cthe hook, script, agent definition, setting, or file the gate reads — the thing that refuses. A rule with no mechanism is a record of intent.>\n```\n\nBefore proposing a new rule, read the target skill's existing ones and sharpen one instead of adding a sibling. Prefer one capstone with instances over fifteen parallel rules. Then deliver the proposals to the skills repo with `\u002Frequest skills \"\u003Ctitle>\" --body-file \u003Cproposals.md>` — don't edit that repo from here.\n\n## What this skill does not do\n\nIt doesn't grade code (`\u002Fslop`, `\u002Fscorecard`), and it doesn't fix anything. It tells you what happened, in numbers, so that the fix is the right one.\n","# Retro: find out what actually happened before deciding what to change\n\nWhen a session or a fleet \"keeps stalling\" or \"never finishes,\" the temptation is to add a rule. Don't — not yet. The fleets that stalled had the rule (\"run it on a loop\") written down; what they lacked was the evidence that it wasn't happening (zero scheduled wakeups in 480 hours) and the mechanism that would have made it happen. A retro produces both: the number, and the thing that refuses.\n\nThis complements `\u002Fgo-team retro`, which reads `LESSONS.md` — the fleet's *self-report*. This reads what actually happened, which is a different source in the same way `\u002Fslop`'s history is different from `\u002Fscorecard`'s snapshot.\n\n## Run the script first\n\n```bash\npython3 ~\u002F.claude\u002Fskills\u002Fretro\u002Fscripts\u002Fretro.py \u003Cproject-dir> [--hours 48]\n```\n\nIt reads the project's session transcripts (`~\u002F.claude\u002Fprojects\u002F…\u002F*.jsonl`) and its repo, and reports numbers: session span and idle share; every idle gap with what preceded it and what resumed it; human turns and the human's own redirects (\"why do we keep stalling\", \"this has been going on a while\"); which channels were used — `AskUserQuestion` versus `DECISION NEEDED`, `Cron`\u002F`ScheduleWakeup`, `Agent`, `SendMessage`; every question asked; and the repo's fleet artefacts — commits, merges, `Thesis:` trailers, leases, landing sources, the compass line, the top open ask and whether anyone holds a lane lease for it, the last lesson written.\n\n## How to read it\n\n1. **Gaps before counts.** An idle share of 90% is not \"stalling\" — it's *not running*. For each long gap, what preceded it is the cause: a question the human wasn't there to answer, a permission prompt, a turn that ended with a completion report and nothing to resume it. What resumed it tells you who was doing the work of keeping things alive (if it's always `[HUMAN]`, there is no heartbeat).\n2. **Channels defined versus channels used.** A skill can define `DECISION NEEDED` and the model will still reach for `AskUserQuestion`, because that's the tool that exists. Zero uses of a designed channel means the design isn't binding.\n3. **The human's own words are evidence.** \"Why do we keep stalling waiting on me for tool approval?\" is a root-cause statement. Quote it.\n4. **Artefacts versus claims.** Landings all labelled `asks` while the top ask is untouched; a compass line reading `not-taken`; leases with no cron — each is a record that exists and a measurement that doesn't. That shape recurs everywhere; name it when you see it.\n5. **The one diagnostic question**, from go-team's failure catalogue: *what else would produce exactly this reading?* Two states, one observation — find the signal they don't share before concluding.\n\n## Write the findings as rule + mechanism\n\nEach finding, ranked by evidence weight:\n\n```\n**N. \u003Cwhat happened, with the number>.** \u003Cthe cost, and the evidence — quote the transcript or cite the artefact>\n*Mechanism:* \u003Cthe hook, script, agent definition, setting, or file the gate reads — the thing that refuses. A rule with no mechanism is a record of intent.>\n```\n\nBefore proposing a new rule, read the target skill's existing ones and sharpen one instead of adding a sibling. Prefer one capstone with instances over fifteen parallel rules. Then deliver the proposals to the skills repo with `\u002Frequest skills \"\u003Ctitle>\" --body-file \u003Cproposals.md>` — don't edit that repo from here.\n\n## What this skill does not do\n\nIt doesn't grade code (`\u002Fslop`, `\u002Fscorecard`), and it doesn't fix anything. It tells you what happened, in numbers, so that the fix is the right one.\n",{},"main","0d32bda2cb8e014372c2814f5aa47f48eee0f411","skills\u002Fretro","https:\u002F\u002Fgithub.com\u002Fjoewalnes\u002Fskills","https:\u002F\u002Fgithub.com\u002Fjoewalnes","Experimental Projects @ Stripe.\r\n\r\nPreviously: Apple, Google, ThoughtWorks, DRW, Startups.","2026-09-09 00:56:55",{"source":7,"skillName":5,"commands":31,"prompt":41,"zipAvailable":42},[32,35,38],{"tool":33,"command":34},"npx","npx skills add joewalnes\u002Fskills --skill retro",{"tool":36,"command":37},"bunx","bunx skills add joewalnes\u002Fskills --skill retro",{"tool":39,"command":40},"pnpm","pnpm dlx skills add joewalnes\u002Fskills --skill retro","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fjoewalnes\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fretro\u002FSKILL.md",true,[44],{"path":45,"resourceType":46,"resourceTypeDesc":47,"sizeBytes":48,"sourceHtmlUrl":49},"scripts\u002Fretro.py","SCRIPT","脚本",9344,"https:\u002F\u002Fgithub.com\u002Fjoewalnes\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fretro\u002Fscripts\u002Fretro.py",[51,67,79,98,114,120],{"skillNo":52,"name":53,"nameZh":6,"description":54,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":55,"categories":56,"keywords":57,"publishedAt":18},"01M6K7MSG99DXYKTVVFGZWND1S","tool-web","Build a lightweight single-file web application with no external dependencies","https:\u002F\u002Fgithub.com\u002Fjoewalnes\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Ftool-web\u002FSKILL.md",[],[58,59,60,61,62,63,64,65,66],"tool web","web","tool","with","application","dependencies","build","single-file","file",{"skillNo":68,"name":69,"nameZh":6,"description":70,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":71,"categories":72,"keywords":73,"publishedAt":18},"01M6K7MPN2FG6M6JQFWFR18CJ0","todo","Add a new bug or todo to the project's tracker","https:\u002F\u002Fgithub.com\u002Fjoewalnes\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Ftodo\u002FSKILL.md",[],[69,74,75,76,77,78],"bug","tracker","task","project","add",{"skillNo":80,"name":81,"nameZh":6,"description":82,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":83,"categories":84,"keywords":85,"publishedAt":18},"01M6K7MGQFFYCD8HFDP1B95KDN","slop","Find unchosen code — surface area growing without leverage. Use pre-merge on a branch, or to check if a repo is accreting.","https:\u002F\u002Fgithub.com\u002Fjoewalnes\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fslop\u002FSKILL.md",[],[81,86,87,88,89,90,91,92,93,94,95,96,97],"find","branch","merge","repo","check","use","leverage","quick","rev","pre-merge","explain","code",{"skillNo":99,"name":100,"nameZh":6,"description":101,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":102,"categories":103,"keywords":104,"publishedAt":18},"01M6K7MCVREA4NZ46Q9JWZJ7TG","sitrep","Where were we? Branch, in-progress work, blocked agents, inbox, next steps. Use when resuming a session.","https:\u002F\u002Fgithub.com\u002Fjoewalnes\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fsitrep\u002FSKILL.md",[],[100,105,106,107,108,87,109,110,91,111,112,113],"inbox","Bash","grep","work","read","session","next","progress","next steps",{"skillNo":115,"name":116,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":117,"categories":118,"keywords":119,"publishedAt":18},"01M6K7M99FYMH9SFSEKB718J2B","scorecard","https:\u002F\u002Fgithub.com\u002Fjoewalnes\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fscorecard\u002FSKILL.md",[],[116],{"skillNo":121,"name":122,"nameZh":6,"description":123,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":124,"categories":125,"keywords":126,"publishedAt":18},"01M6K7M0QT6PD1SPE282ZQ0SM4","request","Ask another project's agents for a change instead of editing their repo. Use when a fix belongs in another repository.","https:\u002F\u002Fgithub.com\u002Fjoewalnes\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Frequest\u002FSKILL.md",[],[122,105,127,128,89,129,130,91,131,132,77,133,134,135],"repository","editing","ask","fix","show","done","id","for","change"]