[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-vercel-adr-skill":3,"mdc--xfc3ro-key":50,"related-org-vercel-adr-skill":2263,"related-repo-vercel-adr-skill":2429},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":25,"repoUrl":26,"updatedAt":27,"license":28,"forks":29,"topics":30,"repo":45,"sourceUrl":48,"mdContent":49},"adr-skill","create and maintain architecture decision records","Create and maintain Architecture Decision Records (ADRs) optimized for agentic coding workflows. Use when you need to propose, write, update, accept\u002Freject, deprecate, or supersede an ADR; bootstrap an adr folder and index; consult existing ADRs before implementing changes; or enforce ADR conventions. This skill uses Socratic questioning to capture intent before drafting, and validates output against an agent-readiness checklist.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"vercel","Vercel","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fvercel.png",[12,16,19,22],{"name":13,"slug":14,"type":15},"Architecture","architecture","tag",{"name":17,"slug":18,"type":15},"Documentation","documentation",{"name":20,"slug":21,"type":15},"ADR","adr",{"name":23,"slug":24,"type":15},"Engineering","engineering",25670,"https:\u002F\u002Fgithub.com\u002Fvercel\u002Fai","2026-04-06T18:55:50.043694",null,4816,[31,32,33,34,35,36,37,38,39,40,41,42,43,8,44],"anthropic","artificial-intelligence","gemini","generative-ai","generative-ui","javascript","language-model","llm","nextjs","openai","react","svelte","typescript","vue",{"repoUrl":26,"stars":25,"forks":29,"topics":46,"description":47},[31,32,33,34,35,36,37,38,39,40,41,42,43,8,44],"The AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and agents ","https:\u002F\u002Fgithub.com\u002Fvercel\u002Fai\u002Ftree\u002FHEAD\u002Fskills\u002Fadr-skill","---\nname: adr-skill\ndescription: Create and maintain Architecture Decision Records (ADRs) optimized for agentic coding workflows. Use when you need to propose, write, update, accept\u002Freject, deprecate, or supersede an ADR; bootstrap an adr folder and index; consult existing ADRs before implementing changes; or enforce ADR conventions. This skill uses Socratic questioning to capture intent before drafting, and validates output against an agent-readiness checklist.\nmetadata:\n  internal: true\n---\n\n# ADR Skill\n\n## Philosophy\n\nADRs created with this skill are **executable specifications for coding agents**. A human approves the decision; an agent implements it. The ADR must contain everything the agent needs to write correct code without asking follow-up questions.\n\nThis means:\n\n- Constraints must be explicit and measurable, not vibes\n- Decisions must be specific enough to act on (\"use PostgreSQL 16 with pgvector\" not \"use a database\")\n- Consequences must map to concrete follow-up tasks\n- Non-goals must be stated to prevent scope creep\n- The ADR must be self-contained — no tribal knowledge assumptions\n- **The ADR must include an implementation plan** — which files to touch, which patterns to follow, which tests to write, and how to verify the decision was implemented correctly\n\n## When to Write an ADR\n\nWrite an ADR when a decision:\n\n- **Changes how the system is built or operated** (new dependency, architecture pattern, infrastructure choice, API design)\n- **Is hard to reverse** once code is written against it\n- **Affects other people or agents** who will work in this codebase later\n- **Has real alternatives** that were considered and rejected\n\nDo NOT write an ADR for:\n\n- Routine implementation choices within an established pattern\n- Bug fixes or typo corrections\n- Decisions already captured in an existing ADR (update it instead)\n- Style preferences already covered by linters or formatters\n\nWhen in doubt: if a future agent working in this codebase would benefit from knowing _why_ this choice was made, write the ADR.\n\n### Proactive ADR Triggers (For Agents)\n\nIf you are an agent coding in a repo and you encounter any of these situations, **stop and propose an ADR** before continuing:\n\n- You are about to introduce a new dependency that doesn't already exist in the project\n- You are about to create a new architectural pattern (new way of handling errors, new data access layer, new API convention) that other code will need to follow\n- You are about to make a choice between two or more real alternatives and the tradeoffs are non-obvious\n- You are about to change something that contradicts an existing accepted ADR\n- You realize you're writing a long code comment explaining \"why\" — that reasoning belongs in an ADR\n\n**How to propose**: Tell the human what decision you've hit, why it matters, and ask if they want to capture it as an ADR. If yes, run the full four-phase workflow. If no, note the decision in a code comment and move on.\n\n## Creating an ADR: Four-Phase Workflow\n\nEvery ADR goes through four phases. Do not skip phases.\n\n### Phase 0: Scan the Codebase\n\nBefore asking any questions, gather context from the repo:\n\n1. **Find existing ADRs.** Check `contributing\u002Fdecisions\u002F`, `docs\u002Fdecisions\u002F`, `adr\u002F`, `docs\u002Fadr\u002F`, `decisions\u002F` for existing records. Read them. Note:\n   - Existing conventions (directory, naming, template style)\n   - Decisions that relate to or constrain the current one\n   - Any ADRs this new decision might supersede\n\n2. **Check the tech stack.** Read `package.json`, `go.mod`, `requirements.txt`, `Cargo.toml`, or equivalent. Note relevant dependencies and versions.\n\n3. **Find related code patterns.** If the decision involves a specific area (e.g., \"how we handle auth\"), scan for existing implementations. Identify the specific files, directories, and patterns that will be affected by the decision.\n\n4. **Check for ADR references in code.** Look for ADR references in comments and docs (see \"Code ↔ ADR Linking\" below). This reveals which existing decisions govern which parts of the codebase.\n\n5. **Note what you found.** Carry this context into Phase 1 — it will sharpen your questions and prevent the ADR from contradicting existing decisions.\n\n### Phase 1: Capture Intent (Socratic)\n\nInterview the human to understand the decision space. Ask questions **one at a time**, building on previous answers. Do not dump a list of questions.\n\n**Core questions** (ask in roughly this order, skip what's already clear from context or Phase 0):\n\n1. **What are you deciding?** — Get a short, specific title. Push for a verb phrase (\"Choose X\", \"Adopt Y\", \"Replace Z with W\").\n2. **Why now?** — What broke, what's changing, or what will break if you do nothing? This is the trigger.\n3. **What constraints exist?** — Tech stack, timeline, budget, team size, existing code, compliance. Be concrete. Reference what you found in Phase 0 (\"I see you're already using X — does that constrain this?\").\n4. **What does success look like?** — Measurable outcomes. Push past \"it works\" to specifics (latency, throughput, DX, maintenance burden).\n5. **What options have you considered?** — At least two. For each: what's the core tradeoff? If they only have one option, help them articulate why alternatives were rejected.\n6. **What's your current lean?** — Capture gut intuition early. Often reveals unstated priorities.\n7. **Who needs to know or approve?** — Decision-makers, consulted experts, informed stakeholders.\n8. **What would an agent need to implement this?** — Which files\u002Fdirectories are affected? What existing patterns should it follow? What should it avoid? What tests would prove it's working? This directly feeds the Implementation Plan.\n\n**Adaptive follow-ups**: Based on answers, probe deeper where the decision is fuzzy. Common follow-ups:\n\n- \"What's the worst-case outcome if this decision is wrong?\"\n- \"What would make you revisit this in 6 months?\"\n- \"Is there anything you're explicitly choosing NOT to do?\"\n- \"What prior art or existing patterns in the codebase does this relate to?\"\n- \"I found [existing ADR\u002Fpattern] — does this new decision interact with it?\"\n\n**When to stop**: You have enough when you can fill every section of the ADR — including the Implementation Plan — without making things up. If you're guessing at any section, ask another question.\n\n**Intent Summary Gate**: Before moving to Phase 2, present a structured summary of what you captured and ask the human to confirm or correct it:\n\n> **Here's what I'm capturing for the ADR:**\n>\n> - **Title**: {title}\n> - **Trigger**: {why now}\n> - **Constraints**: {list}\n> - **Options**: {option 1} vs {option 2} [vs ...]\n> - **Lean**: {which option and why}\n> - **Non-goals**: {what's explicitly out of scope}\n> - **Related ADRs\u002Fcode**: {what exists that this interacts with}\n> - **Affected files\u002Fareas**: {where in the codebase this lands}\n> - **Verification**: {how we'll know it's implemented correctly}\n>\n> **Does this capture your intent? Anything to add or correct?**\n\nDo NOT proceed to Phase 2 until the human confirms the summary.\n\n### Phase 2: Draft the ADR\n\n1. **Choose the ADR directory.**\n   - If one exists (found in Phase 0), use it.\n   - If none exists, create `contributing\u002Fdecisions\u002F` (if `contributing\u002F` exists), `docs\u002Fdecisions\u002F` (MADR default), or `adr\u002F` (simpler repos).\n\n2. **Choose a filename strategy.**\n   - If existing ADRs use date prefixes (`YYYY-MM-DD-...`), continue that.\n   - Otherwise use slug-only filenames (`choose-database.md`).\n\n3. **Choose a template.**\n   - Use `assets\u002Ftemplates\u002Fadr-simple.md` for straightforward decisions (one clear winner, minimal tradeoffs).\n   - Use `assets\u002Ftemplates\u002Fadr-madr.md` when you need to document multiple options with structured pros\u002Fcons\u002Fdrivers.\n   - See `references\u002Ftemplate-variants.md` for guidance.\n\n4. **Fill every section from the confirmed intent summary.** Do not leave placeholder text. Every section should contain real content or be removed (optional sections only).\n\n5. **Write the Implementation Plan.** This is the most important section for agent-first ADRs. It tells the next agent exactly what to do. See the template for structure.\n\n6. **Write Verification criteria as checkboxes.** These must be specific enough that an agent can programmatically or manually check each one.\n\n7. **Generate the file.**\n   - Preferred: run `scripts\u002Fnew_adr.js` (handles directory, naming, and optional index updates).\n   - If you can't run scripts, copy a template from `assets\u002Ftemplates\u002F` and fill it manually.\n\n### Phase 3: Review Against Checklist\n\nAfter drafting, review the ADR against the agent-readiness checklist in `references\u002Freview-checklist.md`.\n\n**Present the review as a summary**, not a raw checklist dump. Format:\n\n> **ADR Review**\n>\n> ✅ **Passes**: {list what's solid — e.g., \"context is self-contained, implementation plan covers affected files, verification criteria are checkable\"}\n>\n> ⚠️ **Gaps found**:\n>\n> - {specific gap 1 — e.g., \"Implementation Plan doesn't mention test files — which test suite should cover this?\"}\n> - {specific gap 2}\n>\n> **Recommendation**: {Ship it \u002F Fix the gaps first \u002F Needs more Phase 1 work}\n\nOnly surface failures and notable strengths — do not recite every passing checkbox.\n\nIf there are gaps, propose specific fixes. Do not just flag problems — offer solutions and ask the human to approve.\n\nDo not finalize until the ADR passes the checklist or the human explicitly accepts the gaps.\n\n## Consulting ADRs (Read Workflow)\n\nAgents should read existing ADRs **before implementing changes** in a codebase that has them. This is not part of the create-an-ADR workflow — it's a standalone operation any agent should do.\n\n### When to Consult ADRs\n\n- Before starting work on a feature that touches architecture (auth, data layer, API design, infrastructure)\n- When you encounter a pattern in the code and wonder \"why is it done this way?\"\n- Before proposing a change that might contradict an existing decision\n- When a human says \"check the ADRs\" or \"there's a decision about this\"\n- When you find an ADR reference in a code comment\n\n### How to Consult ADRs\n\n1. **Find the ADR directory.** Check `contributing\u002Fdecisions\u002F`, `docs\u002Fdecisions\u002F`, `adr\u002F`, `docs\u002Fadr\u002F`, `decisions\u002F`. Also check for an index file (`README.md` or `index.md`).\n\n2. **Scan titles and statuses.** Read the index or list filenames. Focus on `accepted` ADRs — these are active decisions.\n\n3. **Read relevant ADRs fully.** Don't just read the title — read context, decision, consequences, non-goals, AND the Implementation Plan. The Implementation Plan tells you what patterns to follow and what files are governed by this decision.\n\n4. **Respect the decisions.** If an accepted ADR says \"use PostgreSQL,\" don't propose switching to MongoDB without creating a new ADR that supersedes it. If you find a conflict between what the code does and what the ADR says, flag it to the human.\n\n5. **Follow the Implementation Plan.** When implementing code in an area governed by an ADR, follow the patterns specified in its Implementation Plan. If the plan says \"all new queries go through the data-access layer in `src\u002Fdb\u002F`,\" do that.\n\n6. **Reference ADRs in your work.** Add ADR references in code comments and PR descriptions (see \"Code ↔ ADR Linking\" below).\n\n## Code ↔ ADR Linking\n\nADRs should be bidirectionally linked to the code they govern.\n\n### ADR → Code (in the Implementation Plan)\n\nThe Implementation Plan section names specific files, directories, and patterns:\n\n```markdown\n## Implementation Plan\n\n- **Affected paths**: `src\u002Fdb\u002F`, `src\u002Fconfig\u002Fdatabase.ts`, `tests\u002Fintegration\u002F`\n- **Pattern**: all database queries go through `src\u002Fdb\u002Fclient.ts`\n```\n\n### Code → ADR (in comments)\n\nWhen implementing code guided by an ADR, add a comment referencing it:\n\n```typescript\n\u002F\u002F ADR: Using better-sqlite3 for test database\n\u002F\u002F See: docs\u002Fdecisions\u002F2025-06-15-use-sqlite-for-test-database.md\nimport Database from 'better-sqlite3';\n```\n\nKeep these lightweight — one comment at the entry point, not on every line. The goal is discoverability: when a future agent reads this code, they can find the reasoning.\n\n### Why This Matters\n\n- An agent working in `src\u002Fdb\u002F` can find which ADRs govern that area\n- An agent reading an ADR can find the code that implements it\n- When an ADR is superseded, the code references make it easy to find all code that needs updating\n\n## Other Operations\n\n### Update an Existing ADR\n\n1. Identify the intent:\n   - **Accept \u002F reject**: change status, add any final context.\n   - **Deprecate**: status → `deprecated`, explain replacement path.\n   - **Supersede**: create a new ADR, link both ways (old → new, new → old).\n   - **Add learnings**: append to `## More Information` with a date stamp. Do not rewrite history.\n\n2. Use `scripts\u002Fset_adr_status.js` for status changes (supports YAML front matter, bullet status, and section status).\n\n### Post-Acceptance Lifecycle\n\nAfter an ADR is accepted:\n\n1. **Create implementation tasks.** Each item in the Implementation Plan and each follow-up in Consequences should become a trackable task (issue, ticket, or TODO).\n2. **Reference the ADR in PRs.** Link to the ADR in PR descriptions, e.g. \"Implements `contributing\u002Fdecisions\u002F2025-06-15-use-sqlite-for-test-database.md`.\"\n3. **Add code references.** Add ADR path comments at key implementation points.\n4. **Check verification criteria.** Once implementation is complete, walk through the Verification checkboxes. Update the ADR with results in `## More Information`.\n5. **Revisit when triggers fire.** If the ADR specified revisit conditions (\"if X happens, reconsider\"), monitor for those conditions.\n\n### Index\n\nIf the repo has an ADR index\u002Flog file (often `README.md` or `index.md` in the ADR dir), keep it updated.\n\nPreferred: let `scripts\u002Fnew_adr.js --update-index` do it. Otherwise:\n\n- Add a bullet entry for the new ADR.\n- Keep ordering consistent (numeric if numbered; date or alpha if slugs).\n\n### Bootstrap\n\nWhen introducing ADRs to a repo that has none:\n\n```bash\nnode \u002Fpath\u002Fto\u002Fadr-skill\u002Fscripts\u002Fbootstrap_adr.js\n```\n\nThis creates the directory, an index file, and a filled-out first ADR (\"Adopt architecture decision records\") with real content explaining why the team is using ADRs. Use `--json` for machine-readable output. Use `--dir` to override the directory name.\n\n### Categories (Large Projects)\n\nFor repos with many ADRs, organize by subdirectory:\n\n```\ndocs\u002Fdecisions\u002F\n  backend\u002F\n    2025-06-15-use-postgres.md\n  frontend\u002F\n    2025-06-20-use-react.md\n  infrastructure\u002F\n    2025-07-01-use-terraform.md\n```\n\nDate prefixes are local to each category. Choose a categorization scheme early (by layer, by domain, by team) and document it in the index.\n\n## Resources\n\n### scripts\u002F\n\n- `scripts\u002Fnew_adr.js` — create a new ADR file from a template, using repo conventions.\n- `scripts\u002Fset_adr_status.js` — update an ADR status in-place (YAML front matter or inline). Use `--json` for machine output.\n- `scripts\u002Fbootstrap_adr.js` — create ADR dir, `README.md`, and initial \"Adopt ADRs\" decision.\n\n### references\u002F\n\n- `references\u002Freview-checklist.md` — agent-readiness checklist for Phase 3 review.\n- `references\u002Fadr-conventions.md` — directory, filename, status, and lifecycle conventions.\n- `references\u002Ftemplate-variants.md` — when to use simple vs MADR-style templates.\n- `references\u002Fexamples.md` — filled-out short and long ADR examples with implementation plans.\n\n### assets\u002F\n\n- `assets\u002Ftemplates\u002Fadr-simple.md` — lean template for straightforward decisions.\n- `assets\u002Ftemplates\u002Fadr-madr.md` — MADR 4.0 template for decisions with multiple options and structured tradeoffs.\n- `assets\u002Ftemplates\u002Fadr-readme.md` — default ADR index scaffold used by `scripts\u002Fbootstrap_adr.js`.\n\n### Script Usage\n\nFrom the target repo root:\n\n```bash\n# Simple ADR\nnode \u002Fpath\u002Fto\u002Fadr-skill\u002Fscripts\u002Fnew_adr.js --title \"Choose database\" --status proposed\n\n# MADR-style with options\nnode \u002Fpath\u002Fto\u002Fadr-skill\u002Fscripts\u002Fnew_adr.js --title \"Choose database\" --template madr --status proposed\n\n# With index update\nnode \u002Fpath\u002Fto\u002Fadr-skill\u002Fscripts\u002Fnew_adr.js --title \"Choose database\" --status proposed --update-index\n\n# Bootstrap a new repo\nnode \u002Fpath\u002Fto\u002Fadr-skill\u002Fscripts\u002Fbootstrap_adr.js --dir docs\u002Fdecisions\n```\n\nNotes:\n\n- Scripts auto-detect ADR directory and filename strategy.\n- Use `--dir` and `--strategy` to override.\n- Use `--json` to emit machine-readable output.\n",{"data":51,"body":54},{"name":4,"description":6,"metadata":52},{"internal":53},true,{"type":55,"children":56},"root",[57,65,72,86,91,131,137,142,185,190,213,226,233,245,273,283,289,294,300,305,444,450,462,472,555,565,601,611,621,739,744,750,956,962,975,985,1043,1048,1053,1058,1064,1076,1082,1110,1116,1240,1246,1251,1257,1262,1419,1425,1430,1494,1499,1505,1530,1536,1542,1621,1627,1632,1699,1705,1723,1736,1749,1755,1760,1782,1803,1809,1814,1824,1829,1835,1841,1889,1895,1940,1946,1986,1992,1997,2214,2219,2257],{"type":58,"tag":59,"props":60,"children":61},"element","h1",{"id":4},[62],{"type":63,"value":64},"text","ADR Skill",{"type":58,"tag":66,"props":67,"children":69},"h2",{"id":68},"philosophy",[70],{"type":63,"value":71},"Philosophy",{"type":58,"tag":73,"props":74,"children":75},"p",{},[76,78,84],{"type":63,"value":77},"ADRs created with this skill are ",{"type":58,"tag":79,"props":80,"children":81},"strong",{},[82],{"type":63,"value":83},"executable specifications for coding agents",{"type":63,"value":85},". A human approves the decision; an agent implements it. The ADR must contain everything the agent needs to write correct code without asking follow-up questions.",{"type":58,"tag":73,"props":87,"children":88},{},[89],{"type":63,"value":90},"This means:",{"type":58,"tag":92,"props":93,"children":94},"ul",{},[95,101,106,111,116,121],{"type":58,"tag":96,"props":97,"children":98},"li",{},[99],{"type":63,"value":100},"Constraints must be explicit and measurable, not vibes",{"type":58,"tag":96,"props":102,"children":103},{},[104],{"type":63,"value":105},"Decisions must be specific enough to act on (\"use PostgreSQL 16 with pgvector\" not \"use a database\")",{"type":58,"tag":96,"props":107,"children":108},{},[109],{"type":63,"value":110},"Consequences must map to concrete follow-up tasks",{"type":58,"tag":96,"props":112,"children":113},{},[114],{"type":63,"value":115},"Non-goals must be stated to prevent scope creep",{"type":58,"tag":96,"props":117,"children":118},{},[119],{"type":63,"value":120},"The ADR must be self-contained — no tribal knowledge assumptions",{"type":58,"tag":96,"props":122,"children":123},{},[124,129],{"type":58,"tag":79,"props":125,"children":126},{},[127],{"type":63,"value":128},"The ADR must include an implementation plan",{"type":63,"value":130}," — which files to touch, which patterns to follow, which tests to write, and how to verify the decision was implemented correctly",{"type":58,"tag":66,"props":132,"children":134},{"id":133},"when-to-write-an-adr",[135],{"type":63,"value":136},"When to Write an ADR",{"type":58,"tag":73,"props":138,"children":139},{},[140],{"type":63,"value":141},"Write an ADR when a decision:",{"type":58,"tag":92,"props":143,"children":144},{},[145,155,165,175],{"type":58,"tag":96,"props":146,"children":147},{},[148,153],{"type":58,"tag":79,"props":149,"children":150},{},[151],{"type":63,"value":152},"Changes how the system is built or operated",{"type":63,"value":154}," (new dependency, architecture pattern, infrastructure choice, API design)",{"type":58,"tag":96,"props":156,"children":157},{},[158,163],{"type":58,"tag":79,"props":159,"children":160},{},[161],{"type":63,"value":162},"Is hard to reverse",{"type":63,"value":164}," once code is written against it",{"type":58,"tag":96,"props":166,"children":167},{},[168,173],{"type":58,"tag":79,"props":169,"children":170},{},[171],{"type":63,"value":172},"Affects other people or agents",{"type":63,"value":174}," who will work in this codebase later",{"type":58,"tag":96,"props":176,"children":177},{},[178,183],{"type":58,"tag":79,"props":179,"children":180},{},[181],{"type":63,"value":182},"Has real alternatives",{"type":63,"value":184}," that were considered and rejected",{"type":58,"tag":73,"props":186,"children":187},{},[188],{"type":63,"value":189},"Do NOT write an ADR for:",{"type":58,"tag":92,"props":191,"children":192},{},[193,198,203,208],{"type":58,"tag":96,"props":194,"children":195},{},[196],{"type":63,"value":197},"Routine implementation choices within an established pattern",{"type":58,"tag":96,"props":199,"children":200},{},[201],{"type":63,"value":202},"Bug fixes or typo corrections",{"type":58,"tag":96,"props":204,"children":205},{},[206],{"type":63,"value":207},"Decisions already captured in an existing ADR (update it instead)",{"type":58,"tag":96,"props":209,"children":210},{},[211],{"type":63,"value":212},"Style preferences already covered by linters or formatters",{"type":58,"tag":73,"props":214,"children":215},{},[216,218,224],{"type":63,"value":217},"When in doubt: if a future agent working in this codebase would benefit from knowing ",{"type":58,"tag":219,"props":220,"children":221},"em",{},[222],{"type":63,"value":223},"why",{"type":63,"value":225}," this choice was made, write the ADR.",{"type":58,"tag":227,"props":228,"children":230},"h3",{"id":229},"proactive-adr-triggers-for-agents",[231],{"type":63,"value":232},"Proactive ADR Triggers (For Agents)",{"type":58,"tag":73,"props":234,"children":235},{},[236,238,243],{"type":63,"value":237},"If you are an agent coding in a repo and you encounter any of these situations, ",{"type":58,"tag":79,"props":239,"children":240},{},[241],{"type":63,"value":242},"stop and propose an ADR",{"type":63,"value":244}," before continuing:",{"type":58,"tag":92,"props":246,"children":247},{},[248,253,258,263,268],{"type":58,"tag":96,"props":249,"children":250},{},[251],{"type":63,"value":252},"You are about to introduce a new dependency that doesn't already exist in the project",{"type":58,"tag":96,"props":254,"children":255},{},[256],{"type":63,"value":257},"You are about to create a new architectural pattern (new way of handling errors, new data access layer, new API convention) that other code will need to follow",{"type":58,"tag":96,"props":259,"children":260},{},[261],{"type":63,"value":262},"You are about to make a choice between two or more real alternatives and the tradeoffs are non-obvious",{"type":58,"tag":96,"props":264,"children":265},{},[266],{"type":63,"value":267},"You are about to change something that contradicts an existing accepted ADR",{"type":58,"tag":96,"props":269,"children":270},{},[271],{"type":63,"value":272},"You realize you're writing a long code comment explaining \"why\" — that reasoning belongs in an ADR",{"type":58,"tag":73,"props":274,"children":275},{},[276,281],{"type":58,"tag":79,"props":277,"children":278},{},[279],{"type":63,"value":280},"How to propose",{"type":63,"value":282},": Tell the human what decision you've hit, why it matters, and ask if they want to capture it as an ADR. If yes, run the full four-phase workflow. If no, note the decision in a code comment and move on.",{"type":58,"tag":66,"props":284,"children":286},{"id":285},"creating-an-adr-four-phase-workflow",[287],{"type":63,"value":288},"Creating an ADR: Four-Phase Workflow",{"type":58,"tag":73,"props":290,"children":291},{},[292],{"type":63,"value":293},"Every ADR goes through four phases. Do not skip phases.",{"type":58,"tag":227,"props":295,"children":297},{"id":296},"phase-0-scan-the-codebase",[298],{"type":63,"value":299},"Phase 0: Scan the Codebase",{"type":58,"tag":73,"props":301,"children":302},{},[303],{"type":63,"value":304},"Before asking any questions, gather context from the repo:",{"type":58,"tag":306,"props":307,"children":308},"ol",{},[309,375,414,424,434],{"type":58,"tag":96,"props":310,"children":311},{},[312,317,319,326,328,334,335,341,342,348,349,355,357],{"type":58,"tag":79,"props":313,"children":314},{},[315],{"type":63,"value":316},"Find existing ADRs.",{"type":63,"value":318}," Check ",{"type":58,"tag":320,"props":321,"children":323},"code",{"className":322},[],[324],{"type":63,"value":325},"contributing\u002Fdecisions\u002F",{"type":63,"value":327},", ",{"type":58,"tag":320,"props":329,"children":331},{"className":330},[],[332],{"type":63,"value":333},"docs\u002Fdecisions\u002F",{"type":63,"value":327},{"type":58,"tag":320,"props":336,"children":338},{"className":337},[],[339],{"type":63,"value":340},"adr\u002F",{"type":63,"value":327},{"type":58,"tag":320,"props":343,"children":345},{"className":344},[],[346],{"type":63,"value":347},"docs\u002Fadr\u002F",{"type":63,"value":327},{"type":58,"tag":320,"props":350,"children":352},{"className":351},[],[353],{"type":63,"value":354},"decisions\u002F",{"type":63,"value":356}," for existing records. Read them. Note:",{"type":58,"tag":92,"props":358,"children":359},{},[360,365,370],{"type":58,"tag":96,"props":361,"children":362},{},[363],{"type":63,"value":364},"Existing conventions (directory, naming, template style)",{"type":58,"tag":96,"props":366,"children":367},{},[368],{"type":63,"value":369},"Decisions that relate to or constrain the current one",{"type":58,"tag":96,"props":371,"children":372},{},[373],{"type":63,"value":374},"Any ADRs this new decision might supersede",{"type":58,"tag":96,"props":376,"children":377},{},[378,383,385,391,392,398,399,405,406,412],{"type":58,"tag":79,"props":379,"children":380},{},[381],{"type":63,"value":382},"Check the tech stack.",{"type":63,"value":384}," Read ",{"type":58,"tag":320,"props":386,"children":388},{"className":387},[],[389],{"type":63,"value":390},"package.json",{"type":63,"value":327},{"type":58,"tag":320,"props":393,"children":395},{"className":394},[],[396],{"type":63,"value":397},"go.mod",{"type":63,"value":327},{"type":58,"tag":320,"props":400,"children":402},{"className":401},[],[403],{"type":63,"value":404},"requirements.txt",{"type":63,"value":327},{"type":58,"tag":320,"props":407,"children":409},{"className":408},[],[410],{"type":63,"value":411},"Cargo.toml",{"type":63,"value":413},", or equivalent. Note relevant dependencies and versions.",{"type":58,"tag":96,"props":415,"children":416},{},[417,422],{"type":58,"tag":79,"props":418,"children":419},{},[420],{"type":63,"value":421},"Find related code patterns.",{"type":63,"value":423}," If the decision involves a specific area (e.g., \"how we handle auth\"), scan for existing implementations. Identify the specific files, directories, and patterns that will be affected by the decision.",{"type":58,"tag":96,"props":425,"children":426},{},[427,432],{"type":58,"tag":79,"props":428,"children":429},{},[430],{"type":63,"value":431},"Check for ADR references in code.",{"type":63,"value":433}," Look for ADR references in comments and docs (see \"Code ↔ ADR Linking\" below). This reveals which existing decisions govern which parts of the codebase.",{"type":58,"tag":96,"props":435,"children":436},{},[437,442],{"type":58,"tag":79,"props":438,"children":439},{},[440],{"type":63,"value":441},"Note what you found.",{"type":63,"value":443}," Carry this context into Phase 1 — it will sharpen your questions and prevent the ADR from contradicting existing decisions.",{"type":58,"tag":227,"props":445,"children":447},{"id":446},"phase-1-capture-intent-socratic",[448],{"type":63,"value":449},"Phase 1: Capture Intent (Socratic)",{"type":58,"tag":73,"props":451,"children":452},{},[453,455,460],{"type":63,"value":454},"Interview the human to understand the decision space. Ask questions ",{"type":58,"tag":79,"props":456,"children":457},{},[458],{"type":63,"value":459},"one at a time",{"type":63,"value":461},", building on previous answers. Do not dump a list of questions.",{"type":58,"tag":73,"props":463,"children":464},{},[465,470],{"type":58,"tag":79,"props":466,"children":467},{},[468],{"type":63,"value":469},"Core questions",{"type":63,"value":471}," (ask in roughly this order, skip what's already clear from context or Phase 0):",{"type":58,"tag":306,"props":473,"children":474},{},[475,485,495,505,515,525,535,545],{"type":58,"tag":96,"props":476,"children":477},{},[478,483],{"type":58,"tag":79,"props":479,"children":480},{},[481],{"type":63,"value":482},"What are you deciding?",{"type":63,"value":484}," — Get a short, specific title. Push for a verb phrase (\"Choose X\", \"Adopt Y\", \"Replace Z with W\").",{"type":58,"tag":96,"props":486,"children":487},{},[488,493],{"type":58,"tag":79,"props":489,"children":490},{},[491],{"type":63,"value":492},"Why now?",{"type":63,"value":494}," — What broke, what's changing, or what will break if you do nothing? This is the trigger.",{"type":58,"tag":96,"props":496,"children":497},{},[498,503],{"type":58,"tag":79,"props":499,"children":500},{},[501],{"type":63,"value":502},"What constraints exist?",{"type":63,"value":504}," — Tech stack, timeline, budget, team size, existing code, compliance. Be concrete. Reference what you found in Phase 0 (\"I see you're already using X — does that constrain this?\").",{"type":58,"tag":96,"props":506,"children":507},{},[508,513],{"type":58,"tag":79,"props":509,"children":510},{},[511],{"type":63,"value":512},"What does success look like?",{"type":63,"value":514}," — Measurable outcomes. Push past \"it works\" to specifics (latency, throughput, DX, maintenance burden).",{"type":58,"tag":96,"props":516,"children":517},{},[518,523],{"type":58,"tag":79,"props":519,"children":520},{},[521],{"type":63,"value":522},"What options have you considered?",{"type":63,"value":524}," — At least two. For each: what's the core tradeoff? If they only have one option, help them articulate why alternatives were rejected.",{"type":58,"tag":96,"props":526,"children":527},{},[528,533],{"type":58,"tag":79,"props":529,"children":530},{},[531],{"type":63,"value":532},"What's your current lean?",{"type":63,"value":534}," — Capture gut intuition early. Often reveals unstated priorities.",{"type":58,"tag":96,"props":536,"children":537},{},[538,543],{"type":58,"tag":79,"props":539,"children":540},{},[541],{"type":63,"value":542},"Who needs to know or approve?",{"type":63,"value":544}," — Decision-makers, consulted experts, informed stakeholders.",{"type":58,"tag":96,"props":546,"children":547},{},[548,553],{"type":58,"tag":79,"props":549,"children":550},{},[551],{"type":63,"value":552},"What would an agent need to implement this?",{"type":63,"value":554}," — Which files\u002Fdirectories are affected? What existing patterns should it follow? What should it avoid? What tests would prove it's working? This directly feeds the Implementation Plan.",{"type":58,"tag":73,"props":556,"children":557},{},[558,563],{"type":58,"tag":79,"props":559,"children":560},{},[561],{"type":63,"value":562},"Adaptive follow-ups",{"type":63,"value":564},": Based on answers, probe deeper where the decision is fuzzy. Common follow-ups:",{"type":58,"tag":92,"props":566,"children":567},{},[568,573,578,583,588],{"type":58,"tag":96,"props":569,"children":570},{},[571],{"type":63,"value":572},"\"What's the worst-case outcome if this decision is wrong?\"",{"type":58,"tag":96,"props":574,"children":575},{},[576],{"type":63,"value":577},"\"What would make you revisit this in 6 months?\"",{"type":58,"tag":96,"props":579,"children":580},{},[581],{"type":63,"value":582},"\"Is there anything you're explicitly choosing NOT to do?\"",{"type":58,"tag":96,"props":584,"children":585},{},[586],{"type":63,"value":587},"\"What prior art or existing patterns in the codebase does this relate to?\"",{"type":58,"tag":96,"props":589,"children":590},{},[591,593,599],{"type":63,"value":592},"\"I found ",{"type":58,"tag":594,"props":595,"children":596},"span",{},[597],{"type":63,"value":598},"existing ADR\u002Fpattern",{"type":63,"value":600}," — does this new decision interact with it?\"",{"type":58,"tag":73,"props":602,"children":603},{},[604,609],{"type":58,"tag":79,"props":605,"children":606},{},[607],{"type":63,"value":608},"When to stop",{"type":63,"value":610},": You have enough when you can fill every section of the ADR — including the Implementation Plan — without making things up. If you're guessing at any section, ask another question.",{"type":58,"tag":73,"props":612,"children":613},{},[614,619],{"type":58,"tag":79,"props":615,"children":616},{},[617],{"type":63,"value":618},"Intent Summary Gate",{"type":63,"value":620},": Before moving to Phase 2, present a structured summary of what you captured and ask the human to confirm or correct it:",{"type":58,"tag":622,"props":623,"children":624},"blockquote",{},[625,633,731],{"type":58,"tag":73,"props":626,"children":627},{},[628],{"type":58,"tag":79,"props":629,"children":630},{},[631],{"type":63,"value":632},"Here's what I'm capturing for the ADR:",{"type":58,"tag":92,"props":634,"children":635},{},[636,646,656,666,681,691,701,711,721],{"type":58,"tag":96,"props":637,"children":638},{},[639,644],{"type":58,"tag":79,"props":640,"children":641},{},[642],{"type":63,"value":643},"Title",{"type":63,"value":645},": {title}",{"type":58,"tag":96,"props":647,"children":648},{},[649,654],{"type":58,"tag":79,"props":650,"children":651},{},[652],{"type":63,"value":653},"Trigger",{"type":63,"value":655},": {why now}",{"type":58,"tag":96,"props":657,"children":658},{},[659,664],{"type":58,"tag":79,"props":660,"children":661},{},[662],{"type":63,"value":663},"Constraints",{"type":63,"value":665},": {list}",{"type":58,"tag":96,"props":667,"children":668},{},[669,674,676],{"type":58,"tag":79,"props":670,"children":671},{},[672],{"type":63,"value":673},"Options",{"type":63,"value":675},": {option 1} vs {option 2} ",{"type":58,"tag":594,"props":677,"children":678},{},[679],{"type":63,"value":680},"vs ...",{"type":58,"tag":96,"props":682,"children":683},{},[684,689],{"type":58,"tag":79,"props":685,"children":686},{},[687],{"type":63,"value":688},"Lean",{"type":63,"value":690},": {which option and why}",{"type":58,"tag":96,"props":692,"children":693},{},[694,699],{"type":58,"tag":79,"props":695,"children":696},{},[697],{"type":63,"value":698},"Non-goals",{"type":63,"value":700},": {what's explicitly out of scope}",{"type":58,"tag":96,"props":702,"children":703},{},[704,709],{"type":58,"tag":79,"props":705,"children":706},{},[707],{"type":63,"value":708},"Related ADRs\u002Fcode",{"type":63,"value":710},": {what exists that this interacts with}",{"type":58,"tag":96,"props":712,"children":713},{},[714,719],{"type":58,"tag":79,"props":715,"children":716},{},[717],{"type":63,"value":718},"Affected files\u002Fareas",{"type":63,"value":720},": {where in the codebase this lands}",{"type":58,"tag":96,"props":722,"children":723},{},[724,729],{"type":58,"tag":79,"props":725,"children":726},{},[727],{"type":63,"value":728},"Verification",{"type":63,"value":730},": {how we'll know it's implemented correctly}",{"type":58,"tag":73,"props":732,"children":733},{},[734],{"type":58,"tag":79,"props":735,"children":736},{},[737],{"type":63,"value":738},"Does this capture your intent? Anything to add or correct?",{"type":58,"tag":73,"props":740,"children":741},{},[742],{"type":63,"value":743},"Do NOT proceed to Phase 2 until the human confirms the summary.",{"type":58,"tag":227,"props":745,"children":747},{"id":746},"phase-2-draft-the-adr",[748],{"type":63,"value":749},"Phase 2: Draft the ADR",{"type":58,"tag":306,"props":751,"children":752},{},[753,803,840,889,899,909,919],{"type":58,"tag":96,"props":754,"children":755},{},[756,761],{"type":58,"tag":79,"props":757,"children":758},{},[759],{"type":63,"value":760},"Choose the ADR directory.",{"type":58,"tag":92,"props":762,"children":763},{},[764,769],{"type":58,"tag":96,"props":765,"children":766},{},[767],{"type":63,"value":768},"If one exists (found in Phase 0), use it.",{"type":58,"tag":96,"props":770,"children":771},{},[772,774,779,781,787,789,794,796,801],{"type":63,"value":773},"If none exists, create ",{"type":58,"tag":320,"props":775,"children":777},{"className":776},[],[778],{"type":63,"value":325},{"type":63,"value":780}," (if ",{"type":58,"tag":320,"props":782,"children":784},{"className":783},[],[785],{"type":63,"value":786},"contributing\u002F",{"type":63,"value":788}," exists), ",{"type":58,"tag":320,"props":790,"children":792},{"className":791},[],[793],{"type":63,"value":333},{"type":63,"value":795}," (MADR default), or ",{"type":58,"tag":320,"props":797,"children":799},{"className":798},[],[800],{"type":63,"value":340},{"type":63,"value":802}," (simpler repos).",{"type":58,"tag":96,"props":804,"children":805},{},[806,811],{"type":58,"tag":79,"props":807,"children":808},{},[809],{"type":63,"value":810},"Choose a filename strategy.",{"type":58,"tag":92,"props":812,"children":813},{},[814,827],{"type":58,"tag":96,"props":815,"children":816},{},[817,819,825],{"type":63,"value":818},"If existing ADRs use date prefixes (",{"type":58,"tag":320,"props":820,"children":822},{"className":821},[],[823],{"type":63,"value":824},"YYYY-MM-DD-...",{"type":63,"value":826},"), continue that.",{"type":58,"tag":96,"props":828,"children":829},{},[830,832,838],{"type":63,"value":831},"Otherwise use slug-only filenames (",{"type":58,"tag":320,"props":833,"children":835},{"className":834},[],[836],{"type":63,"value":837},"choose-database.md",{"type":63,"value":839},").",{"type":58,"tag":96,"props":841,"children":842},{},[843,848],{"type":58,"tag":79,"props":844,"children":845},{},[846],{"type":63,"value":847},"Choose a template.",{"type":58,"tag":92,"props":849,"children":850},{},[851,864,876],{"type":58,"tag":96,"props":852,"children":853},{},[854,856,862],{"type":63,"value":855},"Use ",{"type":58,"tag":320,"props":857,"children":859},{"className":858},[],[860],{"type":63,"value":861},"assets\u002Ftemplates\u002Fadr-simple.md",{"type":63,"value":863}," for straightforward decisions (one clear winner, minimal tradeoffs).",{"type":58,"tag":96,"props":865,"children":866},{},[867,868,874],{"type":63,"value":855},{"type":58,"tag":320,"props":869,"children":871},{"className":870},[],[872],{"type":63,"value":873},"assets\u002Ftemplates\u002Fadr-madr.md",{"type":63,"value":875}," when you need to document multiple options with structured pros\u002Fcons\u002Fdrivers.",{"type":58,"tag":96,"props":877,"children":878},{},[879,881,887],{"type":63,"value":880},"See ",{"type":58,"tag":320,"props":882,"children":884},{"className":883},[],[885],{"type":63,"value":886},"references\u002Ftemplate-variants.md",{"type":63,"value":888}," for guidance.",{"type":58,"tag":96,"props":890,"children":891},{},[892,897],{"type":58,"tag":79,"props":893,"children":894},{},[895],{"type":63,"value":896},"Fill every section from the confirmed intent summary.",{"type":63,"value":898}," Do not leave placeholder text. Every section should contain real content or be removed (optional sections only).",{"type":58,"tag":96,"props":900,"children":901},{},[902,907],{"type":58,"tag":79,"props":903,"children":904},{},[905],{"type":63,"value":906},"Write the Implementation Plan.",{"type":63,"value":908}," This is the most important section for agent-first ADRs. It tells the next agent exactly what to do. See the template for structure.",{"type":58,"tag":96,"props":910,"children":911},{},[912,917],{"type":58,"tag":79,"props":913,"children":914},{},[915],{"type":63,"value":916},"Write Verification criteria as checkboxes.",{"type":63,"value":918}," These must be specific enough that an agent can programmatically or manually check each one.",{"type":58,"tag":96,"props":920,"children":921},{},[922,927],{"type":58,"tag":79,"props":923,"children":924},{},[925],{"type":63,"value":926},"Generate the file.",{"type":58,"tag":92,"props":928,"children":929},{},[930,943],{"type":58,"tag":96,"props":931,"children":932},{},[933,935,941],{"type":63,"value":934},"Preferred: run ",{"type":58,"tag":320,"props":936,"children":938},{"className":937},[],[939],{"type":63,"value":940},"scripts\u002Fnew_adr.js",{"type":63,"value":942}," (handles directory, naming, and optional index updates).",{"type":58,"tag":96,"props":944,"children":945},{},[946,948,954],{"type":63,"value":947},"If you can't run scripts, copy a template from ",{"type":58,"tag":320,"props":949,"children":951},{"className":950},[],[952],{"type":63,"value":953},"assets\u002Ftemplates\u002F",{"type":63,"value":955}," and fill it manually.",{"type":58,"tag":227,"props":957,"children":959},{"id":958},"phase-3-review-against-checklist",[960],{"type":63,"value":961},"Phase 3: Review Against Checklist",{"type":58,"tag":73,"props":963,"children":964},{},[965,967,973],{"type":63,"value":966},"After drafting, review the ADR against the agent-readiness checklist in ",{"type":58,"tag":320,"props":968,"children":970},{"className":969},[],[971],{"type":63,"value":972},"references\u002Freview-checklist.md",{"type":63,"value":974},".",{"type":58,"tag":73,"props":976,"children":977},{},[978,983],{"type":58,"tag":79,"props":979,"children":980},{},[981],{"type":63,"value":982},"Present the review as a summary",{"type":63,"value":984},", not a raw checklist dump. Format:",{"type":58,"tag":622,"props":986,"children":987},{},[988,996,1008,1020,1033],{"type":58,"tag":73,"props":989,"children":990},{},[991],{"type":58,"tag":79,"props":992,"children":993},{},[994],{"type":63,"value":995},"ADR Review",{"type":58,"tag":73,"props":997,"children":998},{},[999,1001,1006],{"type":63,"value":1000},"✅ ",{"type":58,"tag":79,"props":1002,"children":1003},{},[1004],{"type":63,"value":1005},"Passes",{"type":63,"value":1007},": {list what's solid — e.g., \"context is self-contained, implementation plan covers affected files, verification criteria are checkable\"}",{"type":58,"tag":73,"props":1009,"children":1010},{},[1011,1013,1018],{"type":63,"value":1012},"⚠️ ",{"type":58,"tag":79,"props":1014,"children":1015},{},[1016],{"type":63,"value":1017},"Gaps found",{"type":63,"value":1019},":",{"type":58,"tag":92,"props":1021,"children":1022},{},[1023,1028],{"type":58,"tag":96,"props":1024,"children":1025},{},[1026],{"type":63,"value":1027},"{specific gap 1 — e.g., \"Implementation Plan doesn't mention test files — which test suite should cover this?\"}",{"type":58,"tag":96,"props":1029,"children":1030},{},[1031],{"type":63,"value":1032},"{specific gap 2}",{"type":58,"tag":73,"props":1034,"children":1035},{},[1036,1041],{"type":58,"tag":79,"props":1037,"children":1038},{},[1039],{"type":63,"value":1040},"Recommendation",{"type":63,"value":1042},": {Ship it \u002F Fix the gaps first \u002F Needs more Phase 1 work}",{"type":58,"tag":73,"props":1044,"children":1045},{},[1046],{"type":63,"value":1047},"Only surface failures and notable strengths — do not recite every passing checkbox.",{"type":58,"tag":73,"props":1049,"children":1050},{},[1051],{"type":63,"value":1052},"If there are gaps, propose specific fixes. Do not just flag problems — offer solutions and ask the human to approve.",{"type":58,"tag":73,"props":1054,"children":1055},{},[1056],{"type":63,"value":1057},"Do not finalize until the ADR passes the checklist or the human explicitly accepts the gaps.",{"type":58,"tag":66,"props":1059,"children":1061},{"id":1060},"consulting-adrs-read-workflow",[1062],{"type":63,"value":1063},"Consulting ADRs (Read Workflow)",{"type":58,"tag":73,"props":1065,"children":1066},{},[1067,1069,1074],{"type":63,"value":1068},"Agents should read existing ADRs ",{"type":58,"tag":79,"props":1070,"children":1071},{},[1072],{"type":63,"value":1073},"before implementing changes",{"type":63,"value":1075}," in a codebase that has them. This is not part of the create-an-ADR workflow — it's a standalone operation any agent should do.",{"type":58,"tag":227,"props":1077,"children":1079},{"id":1078},"when-to-consult-adrs",[1080],{"type":63,"value":1081},"When to Consult ADRs",{"type":58,"tag":92,"props":1083,"children":1084},{},[1085,1090,1095,1100,1105],{"type":58,"tag":96,"props":1086,"children":1087},{},[1088],{"type":63,"value":1089},"Before starting work on a feature that touches architecture (auth, data layer, API design, infrastructure)",{"type":58,"tag":96,"props":1091,"children":1092},{},[1093],{"type":63,"value":1094},"When you encounter a pattern in the code and wonder \"why is it done this way?\"",{"type":58,"tag":96,"props":1096,"children":1097},{},[1098],{"type":63,"value":1099},"Before proposing a change that might contradict an existing decision",{"type":58,"tag":96,"props":1101,"children":1102},{},[1103],{"type":63,"value":1104},"When a human says \"check the ADRs\" or \"there's a decision about this\"",{"type":58,"tag":96,"props":1106,"children":1107},{},[1108],{"type":63,"value":1109},"When you find an ADR reference in a code comment",{"type":58,"tag":227,"props":1111,"children":1113},{"id":1112},"how-to-consult-adrs",[1114],{"type":63,"value":1115},"How to Consult ADRs",{"type":58,"tag":306,"props":1117,"children":1118},{},[1119,1174,1192,1202,1212,1230],{"type":58,"tag":96,"props":1120,"children":1121},{},[1122,1127,1128,1133,1134,1139,1140,1145,1146,1151,1152,1157,1159,1165,1167,1173],{"type":58,"tag":79,"props":1123,"children":1124},{},[1125],{"type":63,"value":1126},"Find the ADR directory.",{"type":63,"value":318},{"type":58,"tag":320,"props":1129,"children":1131},{"className":1130},[],[1132],{"type":63,"value":325},{"type":63,"value":327},{"type":58,"tag":320,"props":1135,"children":1137},{"className":1136},[],[1138],{"type":63,"value":333},{"type":63,"value":327},{"type":58,"tag":320,"props":1141,"children":1143},{"className":1142},[],[1144],{"type":63,"value":340},{"type":63,"value":327},{"type":58,"tag":320,"props":1147,"children":1149},{"className":1148},[],[1150],{"type":63,"value":347},{"type":63,"value":327},{"type":58,"tag":320,"props":1153,"children":1155},{"className":1154},[],[1156],{"type":63,"value":354},{"type":63,"value":1158},". Also check for an index file (",{"type":58,"tag":320,"props":1160,"children":1162},{"className":1161},[],[1163],{"type":63,"value":1164},"README.md",{"type":63,"value":1166}," or ",{"type":58,"tag":320,"props":1168,"children":1170},{"className":1169},[],[1171],{"type":63,"value":1172},"index.md",{"type":63,"value":839},{"type":58,"tag":96,"props":1175,"children":1176},{},[1177,1182,1184,1190],{"type":58,"tag":79,"props":1178,"children":1179},{},[1180],{"type":63,"value":1181},"Scan titles and statuses.",{"type":63,"value":1183}," Read the index or list filenames. Focus on ",{"type":58,"tag":320,"props":1185,"children":1187},{"className":1186},[],[1188],{"type":63,"value":1189},"accepted",{"type":63,"value":1191}," ADRs — these are active decisions.",{"type":58,"tag":96,"props":1193,"children":1194},{},[1195,1200],{"type":58,"tag":79,"props":1196,"children":1197},{},[1198],{"type":63,"value":1199},"Read relevant ADRs fully.",{"type":63,"value":1201}," Don't just read the title — read context, decision, consequences, non-goals, AND the Implementation Plan. The Implementation Plan tells you what patterns to follow and what files are governed by this decision.",{"type":58,"tag":96,"props":1203,"children":1204},{},[1205,1210],{"type":58,"tag":79,"props":1206,"children":1207},{},[1208],{"type":63,"value":1209},"Respect the decisions.",{"type":63,"value":1211}," If an accepted ADR says \"use PostgreSQL,\" don't propose switching to MongoDB without creating a new ADR that supersedes it. If you find a conflict between what the code does and what the ADR says, flag it to the human.",{"type":58,"tag":96,"props":1213,"children":1214},{},[1215,1220,1222,1228],{"type":58,"tag":79,"props":1216,"children":1217},{},[1218],{"type":63,"value":1219},"Follow the Implementation Plan.",{"type":63,"value":1221}," When implementing code in an area governed by an ADR, follow the patterns specified in its Implementation Plan. If the plan says \"all new queries go through the data-access layer in ",{"type":58,"tag":320,"props":1223,"children":1225},{"className":1224},[],[1226],{"type":63,"value":1227},"src\u002Fdb\u002F",{"type":63,"value":1229},",\" do that.",{"type":58,"tag":96,"props":1231,"children":1232},{},[1233,1238],{"type":58,"tag":79,"props":1234,"children":1235},{},[1236],{"type":63,"value":1237},"Reference ADRs in your work.",{"type":63,"value":1239}," Add ADR references in code comments and PR descriptions (see \"Code ↔ ADR Linking\" below).",{"type":58,"tag":66,"props":1241,"children":1243},{"id":1242},"code-adr-linking",[1244],{"type":63,"value":1245},"Code ↔ ADR Linking",{"type":58,"tag":73,"props":1247,"children":1248},{},[1249],{"type":63,"value":1250},"ADRs should be bidirectionally linked to the code they govern.",{"type":58,"tag":227,"props":1252,"children":1254},{"id":1253},"adr-code-in-the-implementation-plan",[1255],{"type":63,"value":1256},"ADR → Code (in the Implementation Plan)",{"type":58,"tag":73,"props":1258,"children":1259},{},[1260],{"type":63,"value":1261},"The Implementation Plan section names specific files, directories, and patterns:",{"type":58,"tag":1263,"props":1264,"children":1269},"pre",{"className":1265,"code":1266,"language":1267,"meta":1268,"style":1268},"language-markdown shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","## Implementation Plan\n\n- **Affected paths**: `src\u002Fdb\u002F`, `src\u002Fconfig\u002Fdatabase.ts`, `tests\u002Fintegration\u002F`\n- **Pattern**: all database queries go through `src\u002Fdb\u002Fclient.ts`\n","markdown","",[1270],{"type":58,"tag":320,"props":1271,"children":1272},{"__ignoreMap":1268},[1273,1290,1299,1380],{"type":58,"tag":594,"props":1274,"children":1277},{"class":1275,"line":1276},"line",1,[1278,1284],{"type":58,"tag":594,"props":1279,"children":1281},{"style":1280},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[1282],{"type":63,"value":1283},"## ",{"type":58,"tag":594,"props":1285,"children":1287},{"style":1286},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[1288],{"type":63,"value":1289},"Implementation Plan\n",{"type":58,"tag":594,"props":1291,"children":1293},{"class":1275,"line":1292},2,[1294],{"type":58,"tag":594,"props":1295,"children":1296},{"emptyLinePlaceholder":53},[1297],{"type":63,"value":1298},"\n",{"type":58,"tag":594,"props":1300,"children":1302},{"class":1275,"line":1301},3,[1303,1308,1314,1320,1325,1331,1336,1341,1345,1349,1353,1358,1362,1366,1370,1375],{"type":58,"tag":594,"props":1304,"children":1305},{"style":1280},[1306],{"type":63,"value":1307},"-",{"type":58,"tag":594,"props":1309,"children":1311},{"style":1310},"--shiki-light:#39ADB5;--shiki-light-font-weight:bold;--shiki-default:#89DDFF;--shiki-default-font-weight:bold;--shiki-dark:#89DDFF;--shiki-dark-font-weight:bold",[1312],{"type":63,"value":1313}," **",{"type":58,"tag":594,"props":1315,"children":1317},{"style":1316},"--shiki-light:#E53935;--shiki-light-font-weight:bold;--shiki-default:#F07178;--shiki-default-font-weight:bold;--shiki-dark:#F07178;--shiki-dark-font-weight:bold",[1318],{"type":63,"value":1319},"Affected paths",{"type":58,"tag":594,"props":1321,"children":1322},{"style":1310},[1323],{"type":63,"value":1324},"**",{"type":58,"tag":594,"props":1326,"children":1328},{"style":1327},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[1329],{"type":63,"value":1330},": ",{"type":58,"tag":594,"props":1332,"children":1333},{"style":1280},[1334],{"type":63,"value":1335},"`",{"type":58,"tag":594,"props":1337,"children":1339},{"style":1338},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[1340],{"type":63,"value":1227},{"type":58,"tag":594,"props":1342,"children":1343},{"style":1280},[1344],{"type":63,"value":1335},{"type":58,"tag":594,"props":1346,"children":1347},{"style":1327},[1348],{"type":63,"value":327},{"type":58,"tag":594,"props":1350,"children":1351},{"style":1280},[1352],{"type":63,"value":1335},{"type":58,"tag":594,"props":1354,"children":1355},{"style":1338},[1356],{"type":63,"value":1357},"src\u002Fconfig\u002Fdatabase.ts",{"type":58,"tag":594,"props":1359,"children":1360},{"style":1280},[1361],{"type":63,"value":1335},{"type":58,"tag":594,"props":1363,"children":1364},{"style":1327},[1365],{"type":63,"value":327},{"type":58,"tag":594,"props":1367,"children":1368},{"style":1280},[1369],{"type":63,"value":1335},{"type":58,"tag":594,"props":1371,"children":1372},{"style":1338},[1373],{"type":63,"value":1374},"tests\u002Fintegration\u002F",{"type":58,"tag":594,"props":1376,"children":1377},{"style":1280},[1378],{"type":63,"value":1379},"`\n",{"type":58,"tag":594,"props":1381,"children":1383},{"class":1275,"line":1382},4,[1384,1388,1392,1397,1401,1406,1410,1415],{"type":58,"tag":594,"props":1385,"children":1386},{"style":1280},[1387],{"type":63,"value":1307},{"type":58,"tag":594,"props":1389,"children":1390},{"style":1310},[1391],{"type":63,"value":1313},{"type":58,"tag":594,"props":1393,"children":1394},{"style":1316},[1395],{"type":63,"value":1396},"Pattern",{"type":58,"tag":594,"props":1398,"children":1399},{"style":1310},[1400],{"type":63,"value":1324},{"type":58,"tag":594,"props":1402,"children":1403},{"style":1327},[1404],{"type":63,"value":1405},": all database queries go through ",{"type":58,"tag":594,"props":1407,"children":1408},{"style":1280},[1409],{"type":63,"value":1335},{"type":58,"tag":594,"props":1411,"children":1412},{"style":1338},[1413],{"type":63,"value":1414},"src\u002Fdb\u002Fclient.ts",{"type":58,"tag":594,"props":1416,"children":1417},{"style":1280},[1418],{"type":63,"value":1379},{"type":58,"tag":227,"props":1420,"children":1422},{"id":1421},"code-adr-in-comments",[1423],{"type":63,"value":1424},"Code → ADR (in comments)",{"type":58,"tag":73,"props":1426,"children":1427},{},[1428],{"type":63,"value":1429},"When implementing code guided by an ADR, add a comment referencing it:",{"type":58,"tag":1263,"props":1431,"children":1434},{"className":1432,"code":1433,"language":43,"meta":1268,"style":1268},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F ADR: Using better-sqlite3 for test database\n\u002F\u002F See: docs\u002Fdecisions\u002F2025-06-15-use-sqlite-for-test-database.md\nimport Database from 'better-sqlite3';\n",[1435],{"type":58,"tag":320,"props":1436,"children":1437},{"__ignoreMap":1268},[1438,1447,1455],{"type":58,"tag":594,"props":1439,"children":1440},{"class":1275,"line":1276},[1441],{"type":58,"tag":594,"props":1442,"children":1444},{"style":1443},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[1445],{"type":63,"value":1446},"\u002F\u002F ADR: Using better-sqlite3 for test database\n",{"type":58,"tag":594,"props":1448,"children":1449},{"class":1275,"line":1292},[1450],{"type":58,"tag":594,"props":1451,"children":1452},{"style":1443},[1453],{"type":63,"value":1454},"\u002F\u002F See: docs\u002Fdecisions\u002F2025-06-15-use-sqlite-for-test-database.md\n",{"type":58,"tag":594,"props":1456,"children":1457},{"class":1275,"line":1301},[1458,1464,1469,1474,1479,1484,1489],{"type":58,"tag":594,"props":1459,"children":1461},{"style":1460},"--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic",[1462],{"type":63,"value":1463},"import",{"type":58,"tag":594,"props":1465,"children":1466},{"style":1327},[1467],{"type":63,"value":1468}," Database ",{"type":58,"tag":594,"props":1470,"children":1471},{"style":1460},[1472],{"type":63,"value":1473},"from",{"type":58,"tag":594,"props":1475,"children":1476},{"style":1280},[1477],{"type":63,"value":1478}," '",{"type":58,"tag":594,"props":1480,"children":1481},{"style":1338},[1482],{"type":63,"value":1483},"better-sqlite3",{"type":58,"tag":594,"props":1485,"children":1486},{"style":1280},[1487],{"type":63,"value":1488},"'",{"type":58,"tag":594,"props":1490,"children":1491},{"style":1280},[1492],{"type":63,"value":1493},";\n",{"type":58,"tag":73,"props":1495,"children":1496},{},[1497],{"type":63,"value":1498},"Keep these lightweight — one comment at the entry point, not on every line. The goal is discoverability: when a future agent reads this code, they can find the reasoning.",{"type":58,"tag":227,"props":1500,"children":1502},{"id":1501},"why-this-matters",[1503],{"type":63,"value":1504},"Why This Matters",{"type":58,"tag":92,"props":1506,"children":1507},{},[1508,1520,1525],{"type":58,"tag":96,"props":1509,"children":1510},{},[1511,1513,1518],{"type":63,"value":1512},"An agent working in ",{"type":58,"tag":320,"props":1514,"children":1516},{"className":1515},[],[1517],{"type":63,"value":1227},{"type":63,"value":1519}," can find which ADRs govern that area",{"type":58,"tag":96,"props":1521,"children":1522},{},[1523],{"type":63,"value":1524},"An agent reading an ADR can find the code that implements it",{"type":58,"tag":96,"props":1526,"children":1527},{},[1528],{"type":63,"value":1529},"When an ADR is superseded, the code references make it easy to find all code that needs updating",{"type":58,"tag":66,"props":1531,"children":1533},{"id":1532},"other-operations",[1534],{"type":63,"value":1535},"Other Operations",{"type":58,"tag":227,"props":1537,"children":1539},{"id":1538},"update-an-existing-adr",[1540],{"type":63,"value":1541},"Update an Existing ADR",{"type":58,"tag":306,"props":1543,"children":1544},{},[1545,1609],{"type":58,"tag":96,"props":1546,"children":1547},{},[1548,1550],{"type":63,"value":1549},"Identify the intent:",{"type":58,"tag":92,"props":1551,"children":1552},{},[1553,1563,1581,1591],{"type":58,"tag":96,"props":1554,"children":1555},{},[1556,1561],{"type":58,"tag":79,"props":1557,"children":1558},{},[1559],{"type":63,"value":1560},"Accept \u002F reject",{"type":63,"value":1562},": change status, add any final context.",{"type":58,"tag":96,"props":1564,"children":1565},{},[1566,1571,1573,1579],{"type":58,"tag":79,"props":1567,"children":1568},{},[1569],{"type":63,"value":1570},"Deprecate",{"type":63,"value":1572},": status → ",{"type":58,"tag":320,"props":1574,"children":1576},{"className":1575},[],[1577],{"type":63,"value":1578},"deprecated",{"type":63,"value":1580},", explain replacement path.",{"type":58,"tag":96,"props":1582,"children":1583},{},[1584,1589],{"type":58,"tag":79,"props":1585,"children":1586},{},[1587],{"type":63,"value":1588},"Supersede",{"type":63,"value":1590},": create a new ADR, link both ways (old → new, new → old).",{"type":58,"tag":96,"props":1592,"children":1593},{},[1594,1599,1601,1607],{"type":58,"tag":79,"props":1595,"children":1596},{},[1597],{"type":63,"value":1598},"Add learnings",{"type":63,"value":1600},": append to ",{"type":58,"tag":320,"props":1602,"children":1604},{"className":1603},[],[1605],{"type":63,"value":1606},"## More Information",{"type":63,"value":1608}," with a date stamp. Do not rewrite history.",{"type":58,"tag":96,"props":1610,"children":1611},{},[1612,1613,1619],{"type":63,"value":855},{"type":58,"tag":320,"props":1614,"children":1616},{"className":1615},[],[1617],{"type":63,"value":1618},"scripts\u002Fset_adr_status.js",{"type":63,"value":1620}," for status changes (supports YAML front matter, bullet status, and section status).",{"type":58,"tag":227,"props":1622,"children":1624},{"id":1623},"post-acceptance-lifecycle",[1625],{"type":63,"value":1626},"Post-Acceptance Lifecycle",{"type":58,"tag":73,"props":1628,"children":1629},{},[1630],{"type":63,"value":1631},"After an ADR is accepted:",{"type":58,"tag":306,"props":1633,"children":1634},{},[1635,1645,1663,1673,1689],{"type":58,"tag":96,"props":1636,"children":1637},{},[1638,1643],{"type":58,"tag":79,"props":1639,"children":1640},{},[1641],{"type":63,"value":1642},"Create implementation tasks.",{"type":63,"value":1644}," Each item in the Implementation Plan and each follow-up in Consequences should become a trackable task (issue, ticket, or TODO).",{"type":58,"tag":96,"props":1646,"children":1647},{},[1648,1653,1655,1661],{"type":58,"tag":79,"props":1649,"children":1650},{},[1651],{"type":63,"value":1652},"Reference the ADR in PRs.",{"type":63,"value":1654}," Link to the ADR in PR descriptions, e.g. \"Implements ",{"type":58,"tag":320,"props":1656,"children":1658},{"className":1657},[],[1659],{"type":63,"value":1660},"contributing\u002Fdecisions\u002F2025-06-15-use-sqlite-for-test-database.md",{"type":63,"value":1662},".\"",{"type":58,"tag":96,"props":1664,"children":1665},{},[1666,1671],{"type":58,"tag":79,"props":1667,"children":1668},{},[1669],{"type":63,"value":1670},"Add code references.",{"type":63,"value":1672}," Add ADR path comments at key implementation points.",{"type":58,"tag":96,"props":1674,"children":1675},{},[1676,1681,1683,1688],{"type":58,"tag":79,"props":1677,"children":1678},{},[1679],{"type":63,"value":1680},"Check verification criteria.",{"type":63,"value":1682}," Once implementation is complete, walk through the Verification checkboxes. Update the ADR with results in ",{"type":58,"tag":320,"props":1684,"children":1686},{"className":1685},[],[1687],{"type":63,"value":1606},{"type":63,"value":974},{"type":58,"tag":96,"props":1690,"children":1691},{},[1692,1697],{"type":58,"tag":79,"props":1693,"children":1694},{},[1695],{"type":63,"value":1696},"Revisit when triggers fire.",{"type":63,"value":1698}," If the ADR specified revisit conditions (\"if X happens, reconsider\"), monitor for those conditions.",{"type":58,"tag":227,"props":1700,"children":1702},{"id":1701},"index",[1703],{"type":63,"value":1704},"Index",{"type":58,"tag":73,"props":1706,"children":1707},{},[1708,1710,1715,1716,1721],{"type":63,"value":1709},"If the repo has an ADR index\u002Flog file (often ",{"type":58,"tag":320,"props":1711,"children":1713},{"className":1712},[],[1714],{"type":63,"value":1164},{"type":63,"value":1166},{"type":58,"tag":320,"props":1717,"children":1719},{"className":1718},[],[1720],{"type":63,"value":1172},{"type":63,"value":1722}," in the ADR dir), keep it updated.",{"type":58,"tag":73,"props":1724,"children":1725},{},[1726,1728,1734],{"type":63,"value":1727},"Preferred: let ",{"type":58,"tag":320,"props":1729,"children":1731},{"className":1730},[],[1732],{"type":63,"value":1733},"scripts\u002Fnew_adr.js --update-index",{"type":63,"value":1735}," do it. Otherwise:",{"type":58,"tag":92,"props":1737,"children":1738},{},[1739,1744],{"type":58,"tag":96,"props":1740,"children":1741},{},[1742],{"type":63,"value":1743},"Add a bullet entry for the new ADR.",{"type":58,"tag":96,"props":1745,"children":1746},{},[1747],{"type":63,"value":1748},"Keep ordering consistent (numeric if numbered; date or alpha if slugs).",{"type":58,"tag":227,"props":1750,"children":1752},{"id":1751},"bootstrap",[1753],{"type":63,"value":1754},"Bootstrap",{"type":58,"tag":73,"props":1756,"children":1757},{},[1758],{"type":63,"value":1759},"When introducing ADRs to a repo that has none:",{"type":58,"tag":1263,"props":1761,"children":1765},{"className":1762,"code":1763,"language":1764,"meta":1268,"style":1268},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","node \u002Fpath\u002Fto\u002Fadr-skill\u002Fscripts\u002Fbootstrap_adr.js\n","bash",[1766],{"type":58,"tag":320,"props":1767,"children":1768},{"__ignoreMap":1268},[1769],{"type":58,"tag":594,"props":1770,"children":1771},{"class":1275,"line":1276},[1772,1777],{"type":58,"tag":594,"props":1773,"children":1774},{"style":1286},[1775],{"type":63,"value":1776},"node",{"type":58,"tag":594,"props":1778,"children":1779},{"style":1338},[1780],{"type":63,"value":1781}," \u002Fpath\u002Fto\u002Fadr-skill\u002Fscripts\u002Fbootstrap_adr.js\n",{"type":58,"tag":73,"props":1783,"children":1784},{},[1785,1787,1793,1795,1801],{"type":63,"value":1786},"This creates the directory, an index file, and a filled-out first ADR (\"Adopt architecture decision records\") with real content explaining why the team is using ADRs. Use ",{"type":58,"tag":320,"props":1788,"children":1790},{"className":1789},[],[1791],{"type":63,"value":1792},"--json",{"type":63,"value":1794}," for machine-readable output. Use ",{"type":58,"tag":320,"props":1796,"children":1798},{"className":1797},[],[1799],{"type":63,"value":1800},"--dir",{"type":63,"value":1802}," to override the directory name.",{"type":58,"tag":227,"props":1804,"children":1806},{"id":1805},"categories-large-projects",[1807],{"type":63,"value":1808},"Categories (Large Projects)",{"type":58,"tag":73,"props":1810,"children":1811},{},[1812],{"type":63,"value":1813},"For repos with many ADRs, organize by subdirectory:",{"type":58,"tag":1263,"props":1815,"children":1819},{"className":1816,"code":1818,"language":63},[1817],"language-text","docs\u002Fdecisions\u002F\n  backend\u002F\n    2025-06-15-use-postgres.md\n  frontend\u002F\n    2025-06-20-use-react.md\n  infrastructure\u002F\n    2025-07-01-use-terraform.md\n",[1820],{"type":58,"tag":320,"props":1821,"children":1822},{"__ignoreMap":1268},[1823],{"type":63,"value":1818},{"type":58,"tag":73,"props":1825,"children":1826},{},[1827],{"type":63,"value":1828},"Date prefixes are local to each category. Choose a categorization scheme early (by layer, by domain, by team) and document it in the index.",{"type":58,"tag":66,"props":1830,"children":1832},{"id":1831},"resources",[1833],{"type":63,"value":1834},"Resources",{"type":58,"tag":227,"props":1836,"children":1838},{"id":1837},"scripts",[1839],{"type":63,"value":1840},"scripts\u002F",{"type":58,"tag":92,"props":1842,"children":1843},{},[1844,1854,1871],{"type":58,"tag":96,"props":1845,"children":1846},{},[1847,1852],{"type":58,"tag":320,"props":1848,"children":1850},{"className":1849},[],[1851],{"type":63,"value":940},{"type":63,"value":1853}," — create a new ADR file from a template, using repo conventions.",{"type":58,"tag":96,"props":1855,"children":1856},{},[1857,1862,1864,1869],{"type":58,"tag":320,"props":1858,"children":1860},{"className":1859},[],[1861],{"type":63,"value":1618},{"type":63,"value":1863}," — update an ADR status in-place (YAML front matter or inline). Use ",{"type":58,"tag":320,"props":1865,"children":1867},{"className":1866},[],[1868],{"type":63,"value":1792},{"type":63,"value":1870}," for machine output.",{"type":58,"tag":96,"props":1872,"children":1873},{},[1874,1880,1882,1887],{"type":58,"tag":320,"props":1875,"children":1877},{"className":1876},[],[1878],{"type":63,"value":1879},"scripts\u002Fbootstrap_adr.js",{"type":63,"value":1881}," — create ADR dir, ",{"type":58,"tag":320,"props":1883,"children":1885},{"className":1884},[],[1886],{"type":63,"value":1164},{"type":63,"value":1888},", and initial \"Adopt ADRs\" decision.",{"type":58,"tag":227,"props":1890,"children":1892},{"id":1891},"references",[1893],{"type":63,"value":1894},"references\u002F",{"type":58,"tag":92,"props":1896,"children":1897},{},[1898,1908,1919,1929],{"type":58,"tag":96,"props":1899,"children":1900},{},[1901,1906],{"type":58,"tag":320,"props":1902,"children":1904},{"className":1903},[],[1905],{"type":63,"value":972},{"type":63,"value":1907}," — agent-readiness checklist for Phase 3 review.",{"type":58,"tag":96,"props":1909,"children":1910},{},[1911,1917],{"type":58,"tag":320,"props":1912,"children":1914},{"className":1913},[],[1915],{"type":63,"value":1916},"references\u002Fadr-conventions.md",{"type":63,"value":1918}," — directory, filename, status, and lifecycle conventions.",{"type":58,"tag":96,"props":1920,"children":1921},{},[1922,1927],{"type":58,"tag":320,"props":1923,"children":1925},{"className":1924},[],[1926],{"type":63,"value":886},{"type":63,"value":1928}," — when to use simple vs MADR-style templates.",{"type":58,"tag":96,"props":1930,"children":1931},{},[1932,1938],{"type":58,"tag":320,"props":1933,"children":1935},{"className":1934},[],[1936],{"type":63,"value":1937},"references\u002Fexamples.md",{"type":63,"value":1939}," — filled-out short and long ADR examples with implementation plans.",{"type":58,"tag":227,"props":1941,"children":1943},{"id":1942},"assets",[1944],{"type":63,"value":1945},"assets\u002F",{"type":58,"tag":92,"props":1947,"children":1948},{},[1949,1959,1969],{"type":58,"tag":96,"props":1950,"children":1951},{},[1952,1957],{"type":58,"tag":320,"props":1953,"children":1955},{"className":1954},[],[1956],{"type":63,"value":861},{"type":63,"value":1958}," — lean template for straightforward decisions.",{"type":58,"tag":96,"props":1960,"children":1961},{},[1962,1967],{"type":58,"tag":320,"props":1963,"children":1965},{"className":1964},[],[1966],{"type":63,"value":873},{"type":63,"value":1968}," — MADR 4.0 template for decisions with multiple options and structured tradeoffs.",{"type":58,"tag":96,"props":1970,"children":1971},{},[1972,1978,1980,1985],{"type":58,"tag":320,"props":1973,"children":1975},{"className":1974},[],[1976],{"type":63,"value":1977},"assets\u002Ftemplates\u002Fadr-readme.md",{"type":63,"value":1979}," — default ADR index scaffold used by ",{"type":58,"tag":320,"props":1981,"children":1983},{"className":1982},[],[1984],{"type":63,"value":1879},{"type":63,"value":974},{"type":58,"tag":227,"props":1987,"children":1989},{"id":1988},"script-usage",[1990],{"type":63,"value":1991},"Script Usage",{"type":58,"tag":73,"props":1993,"children":1994},{},[1995],{"type":63,"value":1996},"From the target repo root:",{"type":58,"tag":1263,"props":1998,"children":2000},{"className":1762,"code":1999,"language":1764,"meta":1268,"style":1268},"# Simple ADR\nnode \u002Fpath\u002Fto\u002Fadr-skill\u002Fscripts\u002Fnew_adr.js --title \"Choose database\" --status proposed\n\n# MADR-style with options\nnode \u002Fpath\u002Fto\u002Fadr-skill\u002Fscripts\u002Fnew_adr.js --title \"Choose database\" --template madr --status proposed\n\n# With index update\nnode \u002Fpath\u002Fto\u002Fadr-skill\u002Fscripts\u002Fnew_adr.js --title \"Choose database\" --status proposed --update-index\n\n# Bootstrap a new repo\nnode \u002Fpath\u002Fto\u002Fadr-skill\u002Fscripts\u002Fbootstrap_adr.js --dir docs\u002Fdecisions\n",[2001],{"type":58,"tag":320,"props":2002,"children":2003},{"__ignoreMap":1268},[2004,2012,2054,2061,2069,2115,2123,2132,2174,2182,2191],{"type":58,"tag":594,"props":2005,"children":2006},{"class":1275,"line":1276},[2007],{"type":58,"tag":594,"props":2008,"children":2009},{"style":1443},[2010],{"type":63,"value":2011},"# Simple ADR\n",{"type":58,"tag":594,"props":2013,"children":2014},{"class":1275,"line":1292},[2015,2019,2024,2029,2034,2039,2044,2049],{"type":58,"tag":594,"props":2016,"children":2017},{"style":1286},[2018],{"type":63,"value":1776},{"type":58,"tag":594,"props":2020,"children":2021},{"style":1338},[2022],{"type":63,"value":2023}," \u002Fpath\u002Fto\u002Fadr-skill\u002Fscripts\u002Fnew_adr.js",{"type":58,"tag":594,"props":2025,"children":2026},{"style":1338},[2027],{"type":63,"value":2028}," --title",{"type":58,"tag":594,"props":2030,"children":2031},{"style":1280},[2032],{"type":63,"value":2033}," \"",{"type":58,"tag":594,"props":2035,"children":2036},{"style":1338},[2037],{"type":63,"value":2038},"Choose database",{"type":58,"tag":594,"props":2040,"children":2041},{"style":1280},[2042],{"type":63,"value":2043},"\"",{"type":58,"tag":594,"props":2045,"children":2046},{"style":1338},[2047],{"type":63,"value":2048}," --status",{"type":58,"tag":594,"props":2050,"children":2051},{"style":1338},[2052],{"type":63,"value":2053}," proposed\n",{"type":58,"tag":594,"props":2055,"children":2056},{"class":1275,"line":1301},[2057],{"type":58,"tag":594,"props":2058,"children":2059},{"emptyLinePlaceholder":53},[2060],{"type":63,"value":1298},{"type":58,"tag":594,"props":2062,"children":2063},{"class":1275,"line":1382},[2064],{"type":58,"tag":594,"props":2065,"children":2066},{"style":1443},[2067],{"type":63,"value":2068},"# MADR-style with options\n",{"type":58,"tag":594,"props":2070,"children":2072},{"class":1275,"line":2071},5,[2073,2077,2081,2085,2089,2093,2097,2102,2107,2111],{"type":58,"tag":594,"props":2074,"children":2075},{"style":1286},[2076],{"type":63,"value":1776},{"type":58,"tag":594,"props":2078,"children":2079},{"style":1338},[2080],{"type":63,"value":2023},{"type":58,"tag":594,"props":2082,"children":2083},{"style":1338},[2084],{"type":63,"value":2028},{"type":58,"tag":594,"props":2086,"children":2087},{"style":1280},[2088],{"type":63,"value":2033},{"type":58,"tag":594,"props":2090,"children":2091},{"style":1338},[2092],{"type":63,"value":2038},{"type":58,"tag":594,"props":2094,"children":2095},{"style":1280},[2096],{"type":63,"value":2043},{"type":58,"tag":594,"props":2098,"children":2099},{"style":1338},[2100],{"type":63,"value":2101}," --template",{"type":58,"tag":594,"props":2103,"children":2104},{"style":1338},[2105],{"type":63,"value":2106}," madr",{"type":58,"tag":594,"props":2108,"children":2109},{"style":1338},[2110],{"type":63,"value":2048},{"type":58,"tag":594,"props":2112,"children":2113},{"style":1338},[2114],{"type":63,"value":2053},{"type":58,"tag":594,"props":2116,"children":2118},{"class":1275,"line":2117},6,[2119],{"type":58,"tag":594,"props":2120,"children":2121},{"emptyLinePlaceholder":53},[2122],{"type":63,"value":1298},{"type":58,"tag":594,"props":2124,"children":2126},{"class":1275,"line":2125},7,[2127],{"type":58,"tag":594,"props":2128,"children":2129},{"style":1443},[2130],{"type":63,"value":2131},"# With index update\n",{"type":58,"tag":594,"props":2133,"children":2135},{"class":1275,"line":2134},8,[2136,2140,2144,2148,2152,2156,2160,2164,2169],{"type":58,"tag":594,"props":2137,"children":2138},{"style":1286},[2139],{"type":63,"value":1776},{"type":58,"tag":594,"props":2141,"children":2142},{"style":1338},[2143],{"type":63,"value":2023},{"type":58,"tag":594,"props":2145,"children":2146},{"style":1338},[2147],{"type":63,"value":2028},{"type":58,"tag":594,"props":2149,"children":2150},{"style":1280},[2151],{"type":63,"value":2033},{"type":58,"tag":594,"props":2153,"children":2154},{"style":1338},[2155],{"type":63,"value":2038},{"type":58,"tag":594,"props":2157,"children":2158},{"style":1280},[2159],{"type":63,"value":2043},{"type":58,"tag":594,"props":2161,"children":2162},{"style":1338},[2163],{"type":63,"value":2048},{"type":58,"tag":594,"props":2165,"children":2166},{"style":1338},[2167],{"type":63,"value":2168}," proposed",{"type":58,"tag":594,"props":2170,"children":2171},{"style":1338},[2172],{"type":63,"value":2173}," --update-index\n",{"type":58,"tag":594,"props":2175,"children":2177},{"class":1275,"line":2176},9,[2178],{"type":58,"tag":594,"props":2179,"children":2180},{"emptyLinePlaceholder":53},[2181],{"type":63,"value":1298},{"type":58,"tag":594,"props":2183,"children":2185},{"class":1275,"line":2184},10,[2186],{"type":58,"tag":594,"props":2187,"children":2188},{"style":1443},[2189],{"type":63,"value":2190},"# Bootstrap a new repo\n",{"type":58,"tag":594,"props":2192,"children":2194},{"class":1275,"line":2193},11,[2195,2199,2204,2209],{"type":58,"tag":594,"props":2196,"children":2197},{"style":1286},[2198],{"type":63,"value":1776},{"type":58,"tag":594,"props":2200,"children":2201},{"style":1338},[2202],{"type":63,"value":2203}," \u002Fpath\u002Fto\u002Fadr-skill\u002Fscripts\u002Fbootstrap_adr.js",{"type":58,"tag":594,"props":2205,"children":2206},{"style":1338},[2207],{"type":63,"value":2208}," --dir",{"type":58,"tag":594,"props":2210,"children":2211},{"style":1338},[2212],{"type":63,"value":2213}," docs\u002Fdecisions\n",{"type":58,"tag":73,"props":2215,"children":2216},{},[2217],{"type":63,"value":2218},"Notes:",{"type":58,"tag":92,"props":2220,"children":2221},{},[2222,2227,2246],{"type":58,"tag":96,"props":2223,"children":2224},{},[2225],{"type":63,"value":2226},"Scripts auto-detect ADR directory and filename strategy.",{"type":58,"tag":96,"props":2228,"children":2229},{},[2230,2231,2236,2238,2244],{"type":63,"value":855},{"type":58,"tag":320,"props":2232,"children":2234},{"className":2233},[],[2235],{"type":63,"value":1800},{"type":63,"value":2237}," and ",{"type":58,"tag":320,"props":2239,"children":2241},{"className":2240},[],[2242],{"type":63,"value":2243},"--strategy",{"type":63,"value":2245}," to override.",{"type":58,"tag":96,"props":2247,"children":2248},{},[2249,2250,2255],{"type":63,"value":855},{"type":58,"tag":320,"props":2251,"children":2253},{"className":2252},[],[2254],{"type":63,"value":1792},{"type":63,"value":2256}," to emit machine-readable output.",{"type":58,"tag":2258,"props":2259,"children":2260},"style",{},[2261],{"type":63,"value":2262},"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":2264,"total":2428},[2265,2287,2301,2320,2331,2346,2360,2378,2390,2397,2408,2418],{"slug":2266,"name":2266,"fn":2267,"description":2268,"org":2269,"tags":2270,"stars":2284,"repoUrl":2285,"updatedAt":2286},"next-cache-components-adoption","enable and migrate to Next.js Cache Components","Turn on Cache Components in a Next.js app and resolve the blocking routes it surfaces. Use when the user wants to enable, adopt, or migrate to Cache Components, flip the `cacheComponents` flag, work through a flood of blocking-prerender \u002F instant validation errors, run the `cache-components-instant-false` codemod, or decide between opting routes out with `export const instant = false` and fixing them in place.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2271,2274,2277,2280,2283],{"name":2272,"slug":2273,"type":15},"Caching","caching",{"name":2275,"slug":2276,"type":15},"Frontend","frontend",{"name":2278,"slug":2279,"type":15},"Migration","migration",{"name":2281,"slug":2282,"type":15},"Next.js","next-js",{"name":9,"slug":8,"type":15},141208,"https:\u002F\u002Fgithub.com\u002Fvercel\u002Fnext.js","2026-07-24T05:38:30.118542",{"slug":2288,"name":2288,"fn":2289,"description":2290,"org":2291,"tags":2292,"stars":2284,"repoUrl":2285,"updatedAt":2300},"next-cache-components-optimizer","optimize Next.js cache components","Drive a Next.js route to instant navigation by setting up an agentic loop, under Cache Components \u002F PPR, on initial load (hard navigation) and client-side navigation (soft navigation). Encode the goal as a failing @next\u002Fplaywright instant() e2e and work it to green, one verified route at a time; the shipped test then guards against regression. Use when asked to make a route's navigation instant (its static shell commits immediately), fix a route whose static shell isn't prerendered\u002Fserved\u002Fprefetched, grow a route's static shell or fix its slow first paint, diagnose which Suspense boundary keeps a route out of its static shell, or write the instant() e2e guard for one. Requires Next.js 16.3+ with cacheComponents; directs an upgrade if older.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2293,2294,2295,2296,2299],{"name":2272,"slug":2273,"type":15},{"name":2275,"slug":2276,"type":15},{"name":2281,"slug":2282,"type":15},{"name":2297,"slug":2298,"type":15},"Performance","performance",{"name":9,"slug":8,"type":15},"2026-07-30T05:31:10.674078",{"slug":2302,"name":2302,"fn":2303,"description":2304,"org":2305,"tags":2306,"stars":2284,"repoUrl":2285,"updatedAt":2319},"next-dev-loop","verify Next.js runtime behavior","Verify Next.js runtime behavior after editing app code. Use this skill to confirm a change actually works in a running app — not just that it compiles or type-checks. Combines \u002F_next\u002Fmcp (Next.js's view) with agent-browser (the browser's view). Requires a running `next dev`.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2307,2310,2311,2314,2315,2316],{"name":2308,"slug":2309,"type":15},"Debugging","debugging",{"name":2275,"slug":2276,"type":15},{"name":2312,"slug":2313,"type":15},"Local Development","local-development",{"name":2281,"slug":2282,"type":15},{"name":9,"slug":8,"type":15},{"name":2317,"slug":2318,"type":15},"Web Development","web-development","2026-05-22T06:45:28.627735",{"slug":2321,"name":2321,"fn":2322,"description":2323,"org":2324,"tags":2325,"stars":2284,"repoUrl":2285,"updatedAt":2330},"next-partial-prefetching-adoption","adopt Partial Prefetching in Next.js apps","Turn on Partial Prefetching in a Next.js app and work through the insights it surfaces. Use when the user wants to enable or adopt Partial Prefetching, flip the `partialPrefetching` flag, opt routes in with `export const prefetch = 'partial'`, audit `\u003CLink prefetch={true}>` calls, or resolve the link-prefetch-partial and instant-shell-url-data insights.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2326,2327,2328,2329],{"name":2275,"slug":2276,"type":15},{"name":2281,"slug":2282,"type":15},{"name":2297,"slug":2298,"type":15},{"name":9,"slug":8,"type":15},"2026-07-30T05:31:11.591864",{"slug":2332,"name":2332,"fn":2333,"description":2334,"org":2335,"tags":2336,"stars":2343,"repoUrl":2344,"updatedAt":2345},"turborepo","manage monorepos with Turborepo","Turborepo monorepo build system guidance. Triggers on: turbo.json, task pipelines,\ndependsOn, caching, remote cache, the \"turbo\" CLI, --filter, --affected, CI optimization, environment\nvariables, internal packages, monorepo structure\u002Fbest practices, and boundaries.\n\nUse when user: configures tasks\u002Fworkflows\u002Fpipelines, creates packages, sets up\nmonorepo, shares code between apps, runs changed\u002Faffected packages, debugs cache,\nor has apps\u002Fpackages directories.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2337,2340,2341],{"name":2338,"slug":2339,"type":15},"CI\u002FCD","ci-cd",{"name":2297,"slug":2298,"type":15},{"name":2342,"slug":2332,"type":15},"Turborepo",30809,"https:\u002F\u002Fgithub.com\u002Fvercel\u002Fturborepo","2026-07-30T05:32:14.920116",{"slug":2347,"name":2347,"fn":2348,"description":2349,"org":2350,"tags":2351,"stars":25,"repoUrl":26,"updatedAt":2359},"add-function-examples","add AI function examples for testing","Guide for adding new AI function examples, for testing specific features against the actual provider APIs.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2352,2355,2358],{"name":2353,"slug":2354,"type":15},"AI SDK","ai-sdk",{"name":2356,"slug":2357,"type":15},"Testing","testing",{"name":9,"slug":8,"type":15},"2026-04-06T18:55:51.318866",{"slug":2361,"name":2361,"fn":2362,"description":2363,"org":2364,"tags":2365,"stars":25,"repoUrl":26,"updatedAt":2377},"add-harness-package","add AI SDK harness packages","Guide for adding new AI SDK harness packages. Use when creating a new @ai-sdk\u002Fharness-\u003Cname> package that adapts a coding-agent runtime to HarnessV1.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2366,2369,2370,2373,2376],{"name":2367,"slug":2368,"type":15},"Agents","agents",{"name":2353,"slug":2354,"type":15},{"name":2371,"slug":2372,"type":15},"Harness","harness",{"name":2374,"slug":2375,"type":15},"SDK","sdk",{"name":9,"slug":8,"type":15},"2026-06-18T08:29:19.858737",{"slug":2379,"name":2379,"fn":2380,"description":2381,"org":2382,"tags":2383,"stars":25,"repoUrl":26,"updatedAt":2389},"add-provider-package","add new provider packages to AI SDK","Guide for adding new AI provider packages to the AI SDK. Use when creating a new @ai-sdk\u002F\u003Cprovider> package to integrate an AI service into the SDK.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2384,2385,2388],{"name":2353,"slug":2354,"type":15},{"name":2386,"slug":2387,"type":15},"API Development","api-development",{"name":9,"slug":8,"type":15},"2026-04-06T18:55:47.45549",{"slug":4,"name":4,"fn":5,"description":6,"org":2391,"tags":2392,"stars":25,"repoUrl":26,"updatedAt":27},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2393,2394,2395,2396],{"name":20,"slug":21,"type":15},{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"name":23,"slug":24,"type":15},{"slug":2354,"name":2354,"fn":2398,"description":2399,"org":2400,"tags":2401,"stars":25,"repoUrl":26,"updatedAt":2407},"build AI features with Vercel AI SDK","Answer questions about the AI SDK and help build AI-powered features. Use when developers: (1) Ask about AI SDK functions like generateText, streamText, ToolLoopAgent, embed, or tools, (2) Want to build AI agents, chatbots, RAG systems, or text generation features, (3) Have questions about AI providers (OpenAI, Anthropic, Google, etc.), streaming, tool calling, structured output, or embeddings, (4) Use React hooks like useChat or useCompletion. Triggers on: \"AI SDK\", \"Vercel AI SDK\", \"generateText\", \"streamText\", \"add AI to my app\", \"build an agent\", \"tool calling\", \"structured output\", \"useChat\".",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2402,2403,2404,2406],{"name":2367,"slug":2368,"type":15},{"name":2353,"slug":2354,"type":15},{"name":2405,"slug":38,"type":15},"LLM",{"name":9,"slug":8,"type":15},"2026-04-06T18:55:48.739463",{"slug":2409,"name":2409,"fn":2410,"description":2411,"org":2412,"tags":2413,"stars":25,"repoUrl":26,"updatedAt":2417},"capture-api-response-test-fixture","capture API response test fixtures","Capture API response test fixture.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2414,2415,2416],{"name":2386,"slug":2387,"type":15},{"name":2356,"slug":2357,"type":15},{"name":9,"slug":8,"type":15},"2026-04-06T18:55:56.374433",{"slug":2419,"name":2419,"fn":2420,"description":2421,"org":2422,"tags":2423,"stars":25,"repoUrl":26,"updatedAt":2427},"develop-ai-functions-example","develop AI SDK function examples","Develop examples for AI SDK functions. Use when creating, running, or modifying examples under examples\u002Fai-functions\u002Fsrc to validate provider support, demonstrate features, or create test fixtures.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2424,2425,2426],{"name":2353,"slug":2354,"type":15},{"name":2356,"slug":2357,"type":15},{"name":9,"slug":8,"type":15},"2026-04-06T18:55:55.088956",68,{"items":2430,"total":2477},[2431,2437,2445,2451,2458,2465,2471],{"slug":2347,"name":2347,"fn":2348,"description":2349,"org":2432,"tags":2433,"stars":25,"repoUrl":26,"updatedAt":2359},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2434,2435,2436],{"name":2353,"slug":2354,"type":15},{"name":2356,"slug":2357,"type":15},{"name":9,"slug":8,"type":15},{"slug":2361,"name":2361,"fn":2362,"description":2363,"org":2438,"tags":2439,"stars":25,"repoUrl":26,"updatedAt":2377},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2440,2441,2442,2443,2444],{"name":2367,"slug":2368,"type":15},{"name":2353,"slug":2354,"type":15},{"name":2371,"slug":2372,"type":15},{"name":2374,"slug":2375,"type":15},{"name":9,"slug":8,"type":15},{"slug":2379,"name":2379,"fn":2380,"description":2381,"org":2446,"tags":2447,"stars":25,"repoUrl":26,"updatedAt":2389},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2448,2449,2450],{"name":2353,"slug":2354,"type":15},{"name":2386,"slug":2387,"type":15},{"name":9,"slug":8,"type":15},{"slug":4,"name":4,"fn":5,"description":6,"org":2452,"tags":2453,"stars":25,"repoUrl":26,"updatedAt":27},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2454,2455,2456,2457],{"name":20,"slug":21,"type":15},{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"name":23,"slug":24,"type":15},{"slug":2354,"name":2354,"fn":2398,"description":2399,"org":2459,"tags":2460,"stars":25,"repoUrl":26,"updatedAt":2407},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2461,2462,2463,2464],{"name":2367,"slug":2368,"type":15},{"name":2353,"slug":2354,"type":15},{"name":2405,"slug":38,"type":15},{"name":9,"slug":8,"type":15},{"slug":2409,"name":2409,"fn":2410,"description":2411,"org":2466,"tags":2467,"stars":25,"repoUrl":26,"updatedAt":2417},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2468,2469,2470],{"name":2386,"slug":2387,"type":15},{"name":2356,"slug":2357,"type":15},{"name":9,"slug":8,"type":15},{"slug":2419,"name":2419,"fn":2420,"description":2421,"org":2472,"tags":2473,"stars":25,"repoUrl":26,"updatedAt":2427},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2474,2475,2476],{"name":2353,"slug":2354,"type":15},{"name":2356,"slug":2357,"type":15},{"name":9,"slug":8,"type":15},12]