[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-rivet-riveter-create-run":3,"mdc-2okurd-key":35,"related-org-rivet-riveter-create-run":807,"related-repo-rivet-riveter-create-run":1015},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":24,"repoUrl":25,"updatedAt":26,"license":27,"forks":28,"topics":29,"repo":30,"sourceUrl":33,"mdContent":34},"riveter-create-run","create and run Riveter PRD specifications","Convert a spec into a Ralph the Riveter PRD and run folder for `riveter run`. Triggered by \"riveter create run\", \"create a prd for riveter\", \"spec out\", \"plan this feature for riveter\", or \"convert this spec for riveter\". Non-interactive — does not ask follow-up questions.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},"rivet","Rivet","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Frivet.png","rivet-dev",[13,15,18,21],{"name":9,"slug":8,"type":14},"tag",{"name":16,"slug":17,"type":14},"Specs","specs",{"name":19,"slug":20,"type":14},"Product Management","product-management",{"name":22,"slug":23,"type":14},"Engineering","engineering",6,"https:\u002F\u002Fgithub.com\u002Frivet-dev\u002Friveter","2026-05-26T13:25:29.801256",null,0,[],{"repoUrl":25,"stars":24,"forks":28,"topics":31,"description":32},[],"Ralph the Riveter — an autonomous coding loop using jj and pluggable agents.","https:\u002F\u002Fgithub.com\u002Frivet-dev\u002Friveter\u002Ftree\u002FHEAD\u002Fskills\u002Friveter-create-run","---\nname: riveter-create-run\ndescription: Convert a spec into a Ralph the Riveter PRD and run folder for `riveter run`. Triggered by \"riveter create run\", \"create a prd for riveter\", \"spec out\", \"plan this feature for riveter\", or \"convert this spec for riveter\". Non-interactive — does not ask follow-up questions.\n---\n\n# Skill: `riveter-create-run` — Spec → Riveter run folder\n\nYou convert a user-supplied spec (free-form description or full PRD markdown)\ninto a **Riveter run folder** that the `riveter` CLI can execute.\n\nYou are non-interactive. Do **not** ask the user clarifying questions. The user\ncan edit `prd.toml` after you finish if anything needs tweaking.\n\n## Inputs\n\n- A spec (the user's message, or a file\u002Fpath\u002FURL they reference). Preserve it\n  verbatim — never paraphrase the original input when saving it.\n\n## Output\n\nYou will create one folder under the Riveter state directory and print the\nrunId. The CLI takes it from there.\n\n## Steps\n\n### 1. Determine the state directory\n\nDefault: `~\u002F.riveter` on every platform. If `RIVETER_STATE_DIR` is set, use\nthat instead.\n\nThe runs live at `\u003Cstate-dir>\u002Fruns\u002F\u003CrunId>\u002F` and are never auto-deleted by\nRiveter — they persist until the user removes them by hand.\n\n### 2. Compute the runId\n\n`\u003Ckebab-of-feature-title>-\u003Crandom-8-alphanumeric>`\n\n- lowercase `[a-z0-9-]+`\n- total length ≤ 64\n- the random 8-char suffix uses `[a-z0-9]` to keep runs unique per invocation\n\nExample: `task-priority-a1b2c3d4`\n\n### 3. Create the folder and write files\n\nCreate `\u003Cstate-dir>\u002Fruns\u002F\u003CrunId>\u002F` (mkdir -p), then write:\n\n- `spec.md` — the **original** user input, verbatim. Do not edit it.\n- `prd.toml` — the structured PRD (schema below)\n\nIf the input already contains `## User Stories` (or equivalent structured\nsections), use those story titles + acceptance criteria directly. Otherwise,\nsynthesize stories from the description.\n\n#### `prd.toml` schema\n\n```toml\ndescription = \"\u003Cone-paragraph project context the agent sees every iteration>\"\ncreatedAt   = \"\u003CISO-8601 UTC, e.g. 2026-05-24T11:42:07Z>\"\n\n[[stories]]\nid    = 1                            # 1-indexed, sequential, no gaps\ntitle = \"\u003C≤ 80 chars; reads well as a commit subject>\"\npasses = false                       # always false in fresh PRDs\nnotes  = \"\"                          # optional; agent may write scratch notes here\nacceptanceCriteria = [\n  \"\u003Cconcrete, testable assertion>\",\n  \"\u003Canother>\",\n  \"\u003Ctypecheck\u002Ftest passes>\",\n]\n\n[[stories]]\nid    = 2\n# ...\n```\n\n`notes` is optional. Leave it as an empty string for fresh PRDs — the agent\nmay overwrite it with per-story scratch context (failing commands, design\nnotes, references) so a future iteration on the same story can pick up\nwhere the previous one left off.\n\nRules to follow:\n\n- **One story = one focused commit.** Aim for stories small enough that a fresh\n  agent with no prior context can complete them.\n- **Title ≤ 80 chars.** The CLI rejects longer titles. Trim adjectives, not\n  meaning.\n- **Acceptance criteria are testable.** Each entry should be checkable by the\n  agent (file edited, test passing, command exits zero).\n- **`passes = false` for all stories.** The CLI flips them as the agent\n  completes work.\n- **Sequential `id`s (1..N, no gaps).** The CLI validates this.\n\n### 4. Validate\n\nRun:\n\n```sh\nriveter validate -r \u003CrunId>\n```\n\nParse the output. Each `- ` line under a `✗` heading is a separate error.\n\nIf validation fails:\n\n1. Read the errors.\n2. Patch the offending file (almost always `prd.toml` — fix title length,\n   resequence ids, fill empty `acceptanceCriteria`, etc.).\n3. Re-run `riveter validate -r \u003CrunId>`.\n4. Repeat up to **3 attempts** total.\n\nIf validation still fails after 3 attempts, show the user the remaining errors\nand **do not** print the \"ready to run\" message.\n\n### 5. Print the handoff message\n\nOnly after `riveter validate` exits 0:\n\n> Created run `\u003CrunId>` at `\u003Cstate-dir>\u002Fruns\u002F\u003CrunId>`.\n> Review `prd.toml`, then run: `riveter run -r \u003CrunId>`\n\n## Notes for the agent executing this skill\n\n- You have shell + filesystem access. Use them.\n- Do not implement the spec — just convert it into the run folder. The\n  `riveter run` step (driven by Codex\u002FClaude\u002Fmock) does the actual coding work.\n- Do not initialize a jj repo or move files inside the user's project. The\n  CLI assumes the user is in their own jj repo when they later invoke\n  `riveter run`.\n",{"data":36,"body":37},{"name":4,"description":6},{"type":38,"children":39},"root",[40,57,79,99,106,116,122,127,133,140,161,174,180,189,221,232,238,250,281,294,306,470,481,486,553,559,564,614,635,640,694,706,712,725,763,769,801],{"type":41,"tag":42,"props":43,"children":45},"element","h1",{"id":44},"skill-riveter-create-run-spec-riveter-run-folder",[46,49,55],{"type":47,"value":48},"text","Skill: ",{"type":41,"tag":50,"props":51,"children":53},"code",{"className":52},[],[54],{"type":47,"value":4},{"type":47,"value":56}," — Spec → Riveter run folder",{"type":41,"tag":58,"props":59,"children":60},"p",{},[61,63,69,71,77],{"type":47,"value":62},"You convert a user-supplied spec (free-form description or full PRD markdown)\ninto a ",{"type":41,"tag":64,"props":65,"children":66},"strong",{},[67],{"type":47,"value":68},"Riveter run folder",{"type":47,"value":70}," that the ",{"type":41,"tag":50,"props":72,"children":74},{"className":73},[],[75],{"type":47,"value":76},"riveter",{"type":47,"value":78}," CLI can execute.",{"type":41,"tag":58,"props":80,"children":81},{},[82,84,89,91,97],{"type":47,"value":83},"You are non-interactive. Do ",{"type":41,"tag":64,"props":85,"children":86},{},[87],{"type":47,"value":88},"not",{"type":47,"value":90}," ask the user clarifying questions. The user\ncan edit ",{"type":41,"tag":50,"props":92,"children":94},{"className":93},[],[95],{"type":47,"value":96},"prd.toml",{"type":47,"value":98}," after you finish if anything needs tweaking.",{"type":41,"tag":100,"props":101,"children":103},"h2",{"id":102},"inputs",[104],{"type":47,"value":105},"Inputs",{"type":41,"tag":107,"props":108,"children":109},"ul",{},[110],{"type":41,"tag":111,"props":112,"children":113},"li",{},[114],{"type":47,"value":115},"A spec (the user's message, or a file\u002Fpath\u002FURL they reference). Preserve it\nverbatim — never paraphrase the original input when saving it.",{"type":41,"tag":100,"props":117,"children":119},{"id":118},"output",[120],{"type":47,"value":121},"Output",{"type":41,"tag":58,"props":123,"children":124},{},[125],{"type":47,"value":126},"You will create one folder under the Riveter state directory and print the\nrunId. The CLI takes it from there.",{"type":41,"tag":100,"props":128,"children":130},{"id":129},"steps",[131],{"type":47,"value":132},"Steps",{"type":41,"tag":134,"props":135,"children":137},"h3",{"id":136},"_1-determine-the-state-directory",[138],{"type":47,"value":139},"1. Determine the state directory",{"type":41,"tag":58,"props":141,"children":142},{},[143,145,151,153,159],{"type":47,"value":144},"Default: ",{"type":41,"tag":50,"props":146,"children":148},{"className":147},[],[149],{"type":47,"value":150},"~\u002F.riveter",{"type":47,"value":152}," on every platform. If ",{"type":41,"tag":50,"props":154,"children":156},{"className":155},[],[157],{"type":47,"value":158},"RIVETER_STATE_DIR",{"type":47,"value":160}," is set, use\nthat instead.",{"type":41,"tag":58,"props":162,"children":163},{},[164,166,172],{"type":47,"value":165},"The runs live at ",{"type":41,"tag":50,"props":167,"children":169},{"className":168},[],[170],{"type":47,"value":171},"\u003Cstate-dir>\u002Fruns\u002F\u003CrunId>\u002F",{"type":47,"value":173}," and are never auto-deleted by\nRiveter — they persist until the user removes them by hand.",{"type":41,"tag":134,"props":175,"children":177},{"id":176},"_2-compute-the-runid",[178],{"type":47,"value":179},"2. Compute the runId",{"type":41,"tag":58,"props":181,"children":182},{},[183],{"type":41,"tag":50,"props":184,"children":186},{"className":185},[],[187],{"type":47,"value":188},"\u003Ckebab-of-feature-title>-\u003Crandom-8-alphanumeric>",{"type":41,"tag":107,"props":190,"children":191},{},[192,203,208],{"type":41,"tag":111,"props":193,"children":194},{},[195,197],{"type":47,"value":196},"lowercase ",{"type":41,"tag":50,"props":198,"children":200},{"className":199},[],[201],{"type":47,"value":202},"[a-z0-9-]+",{"type":41,"tag":111,"props":204,"children":205},{},[206],{"type":47,"value":207},"total length ≤ 64",{"type":41,"tag":111,"props":209,"children":210},{},[211,213,219],{"type":47,"value":212},"the random 8-char suffix uses ",{"type":41,"tag":50,"props":214,"children":216},{"className":215},[],[217],{"type":47,"value":218},"[a-z0-9]",{"type":47,"value":220}," to keep runs unique per invocation",{"type":41,"tag":58,"props":222,"children":223},{},[224,226],{"type":47,"value":225},"Example: ",{"type":41,"tag":50,"props":227,"children":229},{"className":228},[],[230],{"type":47,"value":231},"task-priority-a1b2c3d4",{"type":41,"tag":134,"props":233,"children":235},{"id":234},"_3-create-the-folder-and-write-files",[236],{"type":47,"value":237},"3. Create the folder and write files",{"type":41,"tag":58,"props":239,"children":240},{},[241,243,248],{"type":47,"value":242},"Create ",{"type":41,"tag":50,"props":244,"children":246},{"className":245},[],[247],{"type":47,"value":171},{"type":47,"value":249}," (mkdir -p), then write:",{"type":41,"tag":107,"props":251,"children":252},{},[253,271],{"type":41,"tag":111,"props":254,"children":255},{},[256,262,264,269],{"type":41,"tag":50,"props":257,"children":259},{"className":258},[],[260],{"type":47,"value":261},"spec.md",{"type":47,"value":263}," — the ",{"type":41,"tag":64,"props":265,"children":266},{},[267],{"type":47,"value":268},"original",{"type":47,"value":270}," user input, verbatim. Do not edit it.",{"type":41,"tag":111,"props":272,"children":273},{},[274,279],{"type":41,"tag":50,"props":275,"children":277},{"className":276},[],[278],{"type":47,"value":96},{"type":47,"value":280}," — the structured PRD (schema below)",{"type":41,"tag":58,"props":282,"children":283},{},[284,286,292],{"type":47,"value":285},"If the input already contains ",{"type":41,"tag":50,"props":287,"children":289},{"className":288},[],[290],{"type":47,"value":291},"## User Stories",{"type":47,"value":293}," (or equivalent structured\nsections), use those story titles + acceptance criteria directly. Otherwise,\nsynthesize stories from the description.",{"type":41,"tag":295,"props":296,"children":298},"h4",{"id":297},"prdtoml-schema",[299,304],{"type":41,"tag":50,"props":300,"children":302},{"className":301},[],[303],{"type":47,"value":96},{"type":47,"value":305}," schema",{"type":41,"tag":307,"props":308,"children":313},"pre",{"className":309,"code":310,"language":311,"meta":312,"style":312},"language-toml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","description = \"\u003Cone-paragraph project context the agent sees every iteration>\"\ncreatedAt   = \"\u003CISO-8601 UTC, e.g. 2026-05-24T11:42:07Z>\"\n\n[[stories]]\nid    = 1                            # 1-indexed, sequential, no gaps\ntitle = \"\u003C≤ 80 chars; reads well as a commit subject>\"\npasses = false                       # always false in fresh PRDs\nnotes  = \"\"                          # optional; agent may write scratch notes here\nacceptanceCriteria = [\n  \"\u003Cconcrete, testable assertion>\",\n  \"\u003Canother>\",\n  \"\u003Ctypecheck\u002Ftest passes>\",\n]\n\n[[stories]]\nid    = 2\n# ...\n","toml","",[314],{"type":41,"tag":50,"props":315,"children":316},{"__ignoreMap":312},[317,328,337,347,356,365,373,382,391,400,409,418,427,436,444,452,461],{"type":41,"tag":318,"props":319,"children":322},"span",{"class":320,"line":321},"line",1,[323],{"type":41,"tag":318,"props":324,"children":325},{},[326],{"type":47,"value":327},"description = \"\u003Cone-paragraph project context the agent sees every iteration>\"\n",{"type":41,"tag":318,"props":329,"children":331},{"class":320,"line":330},2,[332],{"type":41,"tag":318,"props":333,"children":334},{},[335],{"type":47,"value":336},"createdAt   = \"\u003CISO-8601 UTC, e.g. 2026-05-24T11:42:07Z>\"\n",{"type":41,"tag":318,"props":338,"children":340},{"class":320,"line":339},3,[341],{"type":41,"tag":318,"props":342,"children":344},{"emptyLinePlaceholder":343},true,[345],{"type":47,"value":346},"\n",{"type":41,"tag":318,"props":348,"children":350},{"class":320,"line":349},4,[351],{"type":41,"tag":318,"props":352,"children":353},{},[354],{"type":47,"value":355},"[[stories]]\n",{"type":41,"tag":318,"props":357,"children":359},{"class":320,"line":358},5,[360],{"type":41,"tag":318,"props":361,"children":362},{},[363],{"type":47,"value":364},"id    = 1                            # 1-indexed, sequential, no gaps\n",{"type":41,"tag":318,"props":366,"children":367},{"class":320,"line":24},[368],{"type":41,"tag":318,"props":369,"children":370},{},[371],{"type":47,"value":372},"title = \"\u003C≤ 80 chars; reads well as a commit subject>\"\n",{"type":41,"tag":318,"props":374,"children":376},{"class":320,"line":375},7,[377],{"type":41,"tag":318,"props":378,"children":379},{},[380],{"type":47,"value":381},"passes = false                       # always false in fresh PRDs\n",{"type":41,"tag":318,"props":383,"children":385},{"class":320,"line":384},8,[386],{"type":41,"tag":318,"props":387,"children":388},{},[389],{"type":47,"value":390},"notes  = \"\"                          # optional; agent may write scratch notes here\n",{"type":41,"tag":318,"props":392,"children":394},{"class":320,"line":393},9,[395],{"type":41,"tag":318,"props":396,"children":397},{},[398],{"type":47,"value":399},"acceptanceCriteria = [\n",{"type":41,"tag":318,"props":401,"children":403},{"class":320,"line":402},10,[404],{"type":41,"tag":318,"props":405,"children":406},{},[407],{"type":47,"value":408},"  \"\u003Cconcrete, testable assertion>\",\n",{"type":41,"tag":318,"props":410,"children":412},{"class":320,"line":411},11,[413],{"type":41,"tag":318,"props":414,"children":415},{},[416],{"type":47,"value":417},"  \"\u003Canother>\",\n",{"type":41,"tag":318,"props":419,"children":421},{"class":320,"line":420},12,[422],{"type":41,"tag":318,"props":423,"children":424},{},[425],{"type":47,"value":426},"  \"\u003Ctypecheck\u002Ftest passes>\",\n",{"type":41,"tag":318,"props":428,"children":430},{"class":320,"line":429},13,[431],{"type":41,"tag":318,"props":432,"children":433},{},[434],{"type":47,"value":435},"]\n",{"type":41,"tag":318,"props":437,"children":439},{"class":320,"line":438},14,[440],{"type":41,"tag":318,"props":441,"children":442},{"emptyLinePlaceholder":343},[443],{"type":47,"value":346},{"type":41,"tag":318,"props":445,"children":447},{"class":320,"line":446},15,[448],{"type":41,"tag":318,"props":449,"children":450},{},[451],{"type":47,"value":355},{"type":41,"tag":318,"props":453,"children":455},{"class":320,"line":454},16,[456],{"type":41,"tag":318,"props":457,"children":458},{},[459],{"type":47,"value":460},"id    = 2\n",{"type":41,"tag":318,"props":462,"children":464},{"class":320,"line":463},17,[465],{"type":41,"tag":318,"props":466,"children":467},{},[468],{"type":47,"value":469},"# ...\n",{"type":41,"tag":58,"props":471,"children":472},{},[473,479],{"type":41,"tag":50,"props":474,"children":476},{"className":475},[],[477],{"type":47,"value":478},"notes",{"type":47,"value":480}," is optional. Leave it as an empty string for fresh PRDs — the agent\nmay overwrite it with per-story scratch context (failing commands, design\nnotes, references) so a future iteration on the same story can pick up\nwhere the previous one left off.",{"type":41,"tag":58,"props":482,"children":483},{},[484],{"type":47,"value":485},"Rules to follow:",{"type":41,"tag":107,"props":487,"children":488},{},[489,499,509,519,535],{"type":41,"tag":111,"props":490,"children":491},{},[492,497],{"type":41,"tag":64,"props":493,"children":494},{},[495],{"type":47,"value":496},"One story = one focused commit.",{"type":47,"value":498}," Aim for stories small enough that a fresh\nagent with no prior context can complete them.",{"type":41,"tag":111,"props":500,"children":501},{},[502,507],{"type":41,"tag":64,"props":503,"children":504},{},[505],{"type":47,"value":506},"Title ≤ 80 chars.",{"type":47,"value":508}," The CLI rejects longer titles. Trim adjectives, not\nmeaning.",{"type":41,"tag":111,"props":510,"children":511},{},[512,517],{"type":41,"tag":64,"props":513,"children":514},{},[515],{"type":47,"value":516},"Acceptance criteria are testable.",{"type":47,"value":518}," Each entry should be checkable by the\nagent (file edited, test passing, command exits zero).",{"type":41,"tag":111,"props":520,"children":521},{},[522,533],{"type":41,"tag":64,"props":523,"children":524},{},[525,531],{"type":41,"tag":50,"props":526,"children":528},{"className":527},[],[529],{"type":47,"value":530},"passes = false",{"type":47,"value":532}," for all stories.",{"type":47,"value":534}," The CLI flips them as the agent\ncompletes work.",{"type":41,"tag":111,"props":536,"children":537},{},[538,551],{"type":41,"tag":64,"props":539,"children":540},{},[541,543,549],{"type":47,"value":542},"Sequential ",{"type":41,"tag":50,"props":544,"children":546},{"className":545},[],[547],{"type":47,"value":548},"id",{"type":47,"value":550},"s (1..N, no gaps).",{"type":47,"value":552}," The CLI validates this.",{"type":41,"tag":134,"props":554,"children":556},{"id":555},"_4-validate",[557],{"type":47,"value":558},"4. Validate",{"type":41,"tag":58,"props":560,"children":561},{},[562],{"type":47,"value":563},"Run:",{"type":41,"tag":307,"props":565,"children":569},{"className":566,"code":567,"language":568,"meta":312,"style":312},"language-sh shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","riveter validate -r \u003CrunId>\n","sh",[570],{"type":41,"tag":50,"props":571,"children":572},{"__ignoreMap":312},[573],{"type":41,"tag":318,"props":574,"children":575},{"class":320,"line":321},[576,581,587,592,598,603,609],{"type":41,"tag":318,"props":577,"children":579},{"style":578},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[580],{"type":47,"value":76},{"type":41,"tag":318,"props":582,"children":584},{"style":583},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[585],{"type":47,"value":586}," validate",{"type":41,"tag":318,"props":588,"children":589},{"style":583},[590],{"type":47,"value":591}," -r",{"type":41,"tag":318,"props":593,"children":595},{"style":594},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[596],{"type":47,"value":597}," \u003C",{"type":41,"tag":318,"props":599,"children":600},{"style":583},[601],{"type":47,"value":602},"runI",{"type":41,"tag":318,"props":604,"children":606},{"style":605},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[607],{"type":47,"value":608},"d",{"type":41,"tag":318,"props":610,"children":611},{"style":594},[612],{"type":47,"value":613},">\n",{"type":41,"tag":58,"props":615,"children":616},{},[617,619,625,627,633],{"type":47,"value":618},"Parse the output. Each ",{"type":41,"tag":50,"props":620,"children":622},{"className":621},[],[623],{"type":47,"value":624},"- ",{"type":47,"value":626}," line under a ",{"type":41,"tag":50,"props":628,"children":630},{"className":629},[],[631],{"type":47,"value":632},"✗",{"type":47,"value":634}," heading is a separate error.",{"type":41,"tag":58,"props":636,"children":637},{},[638],{"type":47,"value":639},"If validation fails:",{"type":41,"tag":641,"props":642,"children":643},"ol",{},[644,649,669,682],{"type":41,"tag":111,"props":645,"children":646},{},[647],{"type":47,"value":648},"Read the errors.",{"type":41,"tag":111,"props":650,"children":651},{},[652,654,659,661,667],{"type":47,"value":653},"Patch the offending file (almost always ",{"type":41,"tag":50,"props":655,"children":657},{"className":656},[],[658],{"type":47,"value":96},{"type":47,"value":660}," — fix title length,\nresequence ids, fill empty ",{"type":41,"tag":50,"props":662,"children":664},{"className":663},[],[665],{"type":47,"value":666},"acceptanceCriteria",{"type":47,"value":668},", etc.).",{"type":41,"tag":111,"props":670,"children":671},{},[672,674,680],{"type":47,"value":673},"Re-run ",{"type":41,"tag":50,"props":675,"children":677},{"className":676},[],[678],{"type":47,"value":679},"riveter validate -r \u003CrunId>",{"type":47,"value":681},".",{"type":41,"tag":111,"props":683,"children":684},{},[685,687,692],{"type":47,"value":686},"Repeat up to ",{"type":41,"tag":64,"props":688,"children":689},{},[690],{"type":47,"value":691},"3 attempts",{"type":47,"value":693}," total.",{"type":41,"tag":58,"props":695,"children":696},{},[697,699,704],{"type":47,"value":698},"If validation still fails after 3 attempts, show the user the remaining errors\nand ",{"type":41,"tag":64,"props":700,"children":701},{},[702],{"type":47,"value":703},"do not",{"type":47,"value":705}," print the \"ready to run\" message.",{"type":41,"tag":134,"props":707,"children":709},{"id":708},"_5-print-the-handoff-message",[710],{"type":47,"value":711},"5. Print the handoff message",{"type":41,"tag":58,"props":713,"children":714},{},[715,717,723],{"type":47,"value":716},"Only after ",{"type":41,"tag":50,"props":718,"children":720},{"className":719},[],[721],{"type":47,"value":722},"riveter validate",{"type":47,"value":724}," exits 0:",{"type":41,"tag":726,"props":727,"children":728},"blockquote",{},[729],{"type":41,"tag":58,"props":730,"children":731},{},[732,734,740,742,748,750,755,757],{"type":47,"value":733},"Created run ",{"type":41,"tag":50,"props":735,"children":737},{"className":736},[],[738],{"type":47,"value":739},"\u003CrunId>",{"type":47,"value":741}," at ",{"type":41,"tag":50,"props":743,"children":745},{"className":744},[],[746],{"type":47,"value":747},"\u003Cstate-dir>\u002Fruns\u002F\u003CrunId>",{"type":47,"value":749},".\nReview ",{"type":41,"tag":50,"props":751,"children":753},{"className":752},[],[754],{"type":47,"value":96},{"type":47,"value":756},", then run: ",{"type":41,"tag":50,"props":758,"children":760},{"className":759},[],[761],{"type":47,"value":762},"riveter run -r \u003CrunId>",{"type":41,"tag":100,"props":764,"children":766},{"id":765},"notes-for-the-agent-executing-this-skill",[767],{"type":47,"value":768},"Notes for the agent executing this skill",{"type":41,"tag":107,"props":770,"children":771},{},[772,777,790],{"type":41,"tag":111,"props":773,"children":774},{},[775],{"type":47,"value":776},"You have shell + filesystem access. Use them.",{"type":41,"tag":111,"props":778,"children":779},{},[780,782,788],{"type":47,"value":781},"Do not implement the spec — just convert it into the run folder. The\n",{"type":41,"tag":50,"props":783,"children":785},{"className":784},[],[786],{"type":47,"value":787},"riveter run",{"type":47,"value":789}," step (driven by Codex\u002FClaude\u002Fmock) does the actual coding work.",{"type":41,"tag":111,"props":791,"children":792},{},[793,795,800],{"type":47,"value":794},"Do not initialize a jj repo or move files inside the user's project. The\nCLI assumes the user is in their own jj repo when they later invoke\n",{"type":41,"tag":50,"props":796,"children":798},{"className":797},[],[799],{"type":47,"value":787},{"type":47,"value":681},{"type":41,"tag":802,"props":803,"children":804},"style",{},[805],{"type":47,"value":806},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":808,"total":463},[809,833,851,870,886,902,919,935,953,969,985,1001],{"slug":810,"name":810,"fn":811,"description":812,"org":813,"tags":814,"stars":463,"repoUrl":831,"updatedAt":832},"ai-agent","build AI agent backends with Rivet","Build an AI agent backend with persistent memory: one Rivet Actor per conversation, queued message handling, and streaming LLM responses as realtime events.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[815,818,821,824,827,830],{"name":816,"slug":817,"type":14},"Agents","agents",{"name":819,"slug":820,"type":14},"Backend","backend",{"name":822,"slug":823,"type":14},"LLM","llm",{"name":825,"slug":826,"type":14},"Memory","memory",{"name":828,"slug":829,"type":14},"Real-time","real-time",{"name":9,"slug":8,"type":14},"https:\u002F\u002Fgithub.com\u002Frivet-dev\u002Fskills","2026-07-21T05:37:45.411803",{"slug":834,"name":834,"fn":835,"description":836,"org":837,"tags":838,"stars":463,"repoUrl":831,"updatedAt":850},"ai-agent-workspace","create persistent workspaces for AI agents","Give every AI agent its own computer: a persistent workspace with a filesystem, processes, shells, networking, and agent sessions on a lightweight in-process OS.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[839,840,843,846,847],{"name":816,"slug":817,"type":14},{"name":841,"slug":842,"type":14},"File Storage","file-storage",{"name":844,"slug":845,"type":14},"Infrastructure","infrastructure",{"name":9,"slug":8,"type":14},{"name":848,"slug":849,"type":14},"Sandboxing","sandboxing","2026-06-14T08:06:57.274844",{"slug":852,"name":852,"fn":853,"description":854,"org":855,"tags":856,"stars":463,"repoUrl":831,"updatedAt":869},"chat-room","build realtime chat rooms with Rivet","Build a realtime chat room backend with Rivet Actors: one actor per room, SQLite-backed message history, and WebSocket broadcast to every connected client.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[857,858,861,862,863,866],{"name":819,"slug":820,"type":14},{"name":859,"slug":860,"type":14},"Messaging","messaging",{"name":828,"slug":829,"type":14},{"name":9,"slug":8,"type":14},{"name":864,"slug":865,"type":14},"SQL","sql",{"name":867,"slug":868,"type":14},"WebSockets","websockets","2026-07-21T05:37:48.403494",{"slug":871,"name":871,"fn":872,"description":873,"org":874,"tags":875,"stars":463,"repoUrl":831,"updatedAt":885},"collaborative-text-editor","build collaborative text editors with Rivet","Build a collaborative text editor backend with Yjs CRDTs and Rivet Actors: per-document actors relay sync and awareness updates and persist snapshots.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[876,877,880,883,884],{"name":819,"slug":820,"type":14},{"name":878,"slug":879,"type":14},"Collaboration","collaboration",{"name":881,"slug":882,"type":14},"Documents","documents",{"name":828,"slug":829,"type":14},{"name":9,"slug":8,"type":14},"2026-07-21T05:37:49.412829",{"slug":887,"name":887,"fn":888,"description":889,"org":890,"tags":891,"stars":463,"repoUrl":831,"updatedAt":901},"cron-jobs","schedule durable cron jobs with Rivet","Patterns for durable one-shot, calendar, and fixed-interval work on Rivet Actors.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[892,895,896,897,898],{"name":893,"slug":894,"type":14},"Automation","automation",{"name":819,"slug":820,"type":14},{"name":844,"slug":845,"type":14},{"name":9,"slug":8,"type":14},{"name":899,"slug":900,"type":14},"Scheduling","scheduling","2026-07-21T05:37:43.395911",{"slug":903,"name":903,"fn":904,"description":905,"org":906,"tags":907,"stars":463,"repoUrl":831,"updatedAt":918},"live-cursors","implement live cursors and multiplayer presence","Live cursors and multiplayer presence with Rivet Actors: per-connection cursor state, realtime updates over events or raw WebSockets, and throttling.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[908,909,912,913,914,917],{"name":878,"slug":879,"type":14},{"name":910,"slug":911,"type":14},"Frontend","frontend",{"name":828,"slug":829,"type":14},{"name":9,"slug":8,"type":14},{"name":915,"slug":916,"type":14},"UX Design","ux-design",{"name":867,"slug":868,"type":14},"2026-07-21T05:37:47.391088",{"slug":920,"name":920,"fn":921,"description":922,"org":923,"tags":924,"stars":463,"repoUrl":831,"updatedAt":934},"multiplayer-game","build multiplayer games with Rivet","Pragmatic patterns for building multiplayer games: matchmaking, tick loops, realtime state, interest management, and validation.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[925,928,929,932,933],{"name":926,"slug":927,"type":14},"Architecture","architecture",{"name":22,"slug":23,"type":14},{"name":930,"slug":931,"type":14},"Game Development","game-development",{"name":828,"slug":829,"type":14},{"name":9,"slug":8,"type":14},"2026-07-21T05:37:44.627991",{"slug":936,"name":936,"fn":937,"description":938,"org":939,"tags":940,"stars":463,"repoUrl":831,"updatedAt":952},"per-tenant-database","implement multi-tenant data isolation with Rivet","Multi-tenant data isolation with one Rivet Actor per tenant: the actor key is the tenant id, so each tenant gets its own isolated dataset and migrations.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[941,942,945,948,951],{"name":926,"slug":927,"type":14},{"name":943,"slug":944,"type":14},"Database","database",{"name":946,"slug":947,"type":14},"Migration","migration",{"name":949,"slug":950,"type":14},"Multi-Tenant","multi-tenant",{"name":9,"slug":8,"type":14},"2026-07-21T05:37:46.414425",{"slug":954,"name":954,"fn":955,"description":956,"org":957,"tags":958,"stars":463,"repoUrl":831,"updatedAt":968},"rivetkit","build and debug Rivet Actors","RivetKit backend and Rivet Actor runtime guidance. Use for building, modifying, debugging, or testing Rivet Actors, registries, serverless\u002Frunner modes, deployment, or actor-based workflows.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[959,960,961,964,967],{"name":816,"slug":817,"type":14},{"name":819,"slug":820,"type":14},{"name":962,"slug":963,"type":14},"Debugging","debugging",{"name":965,"slug":966,"type":14},"Deployment","deployment",{"name":9,"slug":8,"type":14},"2026-07-24T05:38:58.10133",{"slug":970,"name":970,"fn":971,"description":972,"org":973,"tags":974,"stars":463,"repoUrl":831,"updatedAt":984},"rivetkit-client-javascript","use RivetKit JavaScript client","RivetKit JavaScript client guidance. Use for browser, Node.js, or Bun clients that connect to Rivet Actors with rivetkit\u002Fclient, create clients, call actions, or manage connections.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[975,976,977,980,981],{"name":819,"slug":820,"type":14},{"name":910,"slug":911,"type":14},{"name":978,"slug":979,"type":14},"JavaScript","javascript",{"name":9,"slug":8,"type":14},{"name":982,"slug":983,"type":14},"SDK","sdk","2026-07-30T05:31:37.725576",{"slug":986,"name":986,"fn":987,"description":988,"org":989,"tags":990,"stars":463,"repoUrl":831,"updatedAt":1000},"rivetkit-client-react","use RivetKit React client","RivetKit React client guidance. Use for React apps that connect to Rivet Actors with @rivetkit\u002Freact, create hooks with createRivetKit, or manage realtime state with useActor.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[991,992,995,996,997],{"name":910,"slug":911,"type":14},{"name":993,"slug":994,"type":14},"React","react",{"name":9,"slug":8,"type":14},{"name":982,"slug":983,"type":14},{"name":998,"slug":999,"type":14},"State Management","state-management","2026-07-30T05:31:36.618873",{"slug":1002,"name":1002,"fn":1003,"description":1004,"org":1005,"tags":1006,"stars":463,"repoUrl":831,"updatedAt":1014},"rivetkit-client-rust","build RivetKit Rust clients","RivetKit Rust client guidance. Use for Rust clients and backends that connect to Rivet Actors with rivetkit::client, create typed actor handles, call actions, or manage connections.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1007,1010,1011],{"name":1008,"slug":1009,"type":14},"API Development","api-development",{"name":819,"slug":820,"type":14},{"name":1012,"slug":1013,"type":14},"Rust","rust","2026-07-24T05:39:02.105888",{"items":1016,"total":321},[1017],{"slug":4,"name":4,"fn":5,"description":6,"org":1018,"tags":1019,"stars":24,"repoUrl":25,"updatedAt":26},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1020,1021,1022,1023],{"name":22,"slug":23,"type":14},{"name":19,"slug":20,"type":14},{"name":9,"slug":8,"type":14},{"name":16,"slug":17,"type":14}]