[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6H823DP56G96ZWYFNH9P0BP":3,"skill-same:01M6H823DP56G96ZWYFNH9P0BP":89},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":40,"linkOnly":41,"markdownContent":42,"markdownBody":43,"frontMatter":44,"refName":45,"commitSha":46,"skillDirectory":47,"forksCount":14,"repositoryHtmlUrl":48,"repositoryHomepageUrl":6,"ownerHtmlUrl":49,"ownerBlogUrl":50,"ownerDescription":51,"updatedAt":52,"install":53,"resources":66},"01M6H823DP56G96ZWYFNH9P0BP","postgres-best-practices",null,"Postgres schema and query rules, independent of the calling language. TRIGGER — load BEFORE writing or editing a .sql file, a migration, or any schema, index, constraint or query change against Postgres: new tables, foreign keys, status columns, claim or lease queries, backfills, ON CONFLICT upserts. SKIP for MySQL, SQLite and other engines, and for code that never touches SQL.","O-Marsters-1997\u002Fmy-claude-code","O-Marsters-1997","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F72571979?v=4","01M6H800V7V9BSXYZKDM0JXTJ2","Olly Marsters","01M6H800ZYDJR42TNRH0E6ZVZ7",0,"MIT","https:\u002F\u002Fgithub.com\u002FO-Marsters-1997\u002Fmy-claude-code\u002Fblob\u002Fmain\u002Fskills\u002Fcode\u002Fpostgres-best-practices\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39],"best practices","postgres best practices","postgres","never","new","for","load","trigger","conflict","claim","query","calling","queries","writing","schema","editing","Rules","sqlite","file","mysql","code","2026-11-10 10:12:30",false,"---\nname: postgres-best-practices\ndescription: >\n  Postgres schema and query rules, independent of the calling language. TRIGGER — load BEFORE\n  writing or editing a .sql file, a migration, or any schema, index, constraint or query change\n  against Postgres: new tables, foreign keys, status columns, claim or lease queries, backfills,\n  ON CONFLICT upserts. SKIP for MySQL, SQLite and other engines, and for code that never touches\n  SQL.\n---\n\n# Postgres\n\nRules for schema and queries on Postgres. They are language-agnostic; the Go half lives in the\n`go-idiomatic` skill (`references\u002Fdatabase.md`, `references\u002Fpatterns.md`).\n\n## Where to Look\n\n| If you're working on…                                   | Load this                                        |\n| ------------------------------------------------------- | ------------------------------------------------ |\n| Go code that runs these queries (`database\u002Fsql`, pgx)   | `go-idiomatic` `references\u002Fdatabase.md`          |\n| A closed value set mirrored as a Go type                | `go-idiomatic` `references\u002Fpatterns.md` § Typed Value Sets |\n| Writing or changing a migration, any tool               | `references\u002Fmigrations.md`                       |\n| Converting an existing Postgres `ENUM` to `text` + `CHECK` | `references\u002Fmigrations.md` § ENUM Conversion  |\n| Migrations in a repo that uses goose                    | `references\u002Fgoose.md` (only when the repo uses goose) |\n| Only if the repo has `sqlc.yaml`: queries, config, CI   | `references\u002Fsqlc.md`                             |\n\n## Schema\n\n- **Closed value sets are `text` + a named `CHECK`, never a Postgres `ENUM`.** Adding a value to\n  an `ENUM` is a type migration and removing one is not supported; a `CHECK` is one `ALTER`.\n  Never mix the two styles in one schema, and never leave a status column unchecked. An existing\n  `ENUM` is a conversion to schedule, not a style to extend.\n- **Every foreign key column has an index.** Postgres does not create one. Without it, deleting\n  a parent scans the child table, and `ON DELETE CASCADE` turns that into one scan per row.\n- **`timestamptz` for instants, `date` only for calendar dates.** Never store times as `text`.\n- **`jsonb` for JSON, never `text`.**\n- **Name every constraint and index, with one scheme** (`\u003Ctable>_\u003Ccols>_key`, `_fkey`, `_check`,\n  `\u003Ctable>_\u003Ccols>_idx`). Names are what errors and migrations refer to.\n- **One meaning for absence per column.** NULL or `''`, not both. Pick NULL unless the column is\n  `NOT NULL DEFAULT ''` by design.\n- **An append-only table gets a retention policy in the migration that creates it.** Outboxes,\n  run logs and audit trails only grow; decide how long rows live, index the column the cleanup\n  filters on, and delete expired rows in batches (`DELETE ... WHERE id IN (SELECT id ... LIMIT n)`)\n  from a scheduled job. Added later, the first cleanup is one huge delete on a huge table.\n\n## Queries\n\n- **One clock per comparison.** `DEFAULT now()` is fine for audit columns. Any time the\n  application compares against, or a test asserts on, is passed in as a parameter. Mixing SQL\n  `NOW()` with the app's `time.Now()` makes leases and expiries untestable and skewed.\n- **Explicit column lists.** No `SELECT *` and no `RETURNING *`; adding a column must not change\n  what callers receive.\n- **Every list query has a hard `LIMIT`.** A list without one returns the whole table once the\n  table grows. On growing tables page by keyset (`WHERE (created_at, id) \u003C ($1, $2) ORDER BY\n  created_at DESC, id DESC LIMIT $3`), not `OFFSET`, which reads and discards every skipped row.\n- **No N+1 loops.** Fetch with `= ANY($1::uuid[])`, insert with multi-row `VALUES` or `COPY`.\n- **Claiming work uses `FOR UPDATE SKIP LOCKED`** so concurrent workers take different rows\n  instead of queueing on one. Update the claimed row in the same statement or transaction.\n- **Read-then-write uses `SELECT ... FOR UPDATE`** in a transaction. A plain read races.\n- **Match unique violations (SQLSTATE `23505`) by constraint name**, not by message text or by\n  assuming which constraint fired. This is why constraints are named.\n- **`ON CONFLICT` names its target** (`ON CONFLICT (col)` or `ON CONSTRAINT name`). A bare\n  `ON CONFLICT DO NOTHING` silently swallows violations of constraints you did not mean.\n\n## Building SQL\n\n- **Never build SQL, or shell that carries SQL, with `fmt.Sprintf` or string concatenation.**\n  Pass values as bind parameters (`$1`) or, for a script, as environment variables the script\n  reads. Pass identifiers through `pgx.Identifier{\"schema\", \"table\"}.Sanitize()`. Interpolating\n  even an int starts the habit that becomes injection.\n\nA container entrypoint is a static script that reads its value from the environment\n(`IDLE_TIMEOUT` set via the container's `Env`):\n\n```go\n\u002F\u002Fgo:embed entrypoint.sh\nvar entrypoint string\n```\n\n```sh\npsql -v t=\"$IDLE_TIMEOUT\" -c \"ALTER SYSTEM SET idle_in_transaction_session_timeout = :'t'\"\n```\n\n## Altering tables\n\n- **Add columns nullable or with a constant default**, then backfill, then add `NOT NULL`.\n  Never rewrite a large table inside the migration that adds the column.\n- **Backfill in batches**, keyed on the primary key, committing between batches. One giant\n  `UPDATE` holds locks and bloats the table.\n- **Create indexes on live tables with `CREATE INDEX CONCURRENTLY`**, outside a transaction.\n- **Add constraints in two steps on big tables:** `ADD CONSTRAINT ... NOT VALID`, then\n  `VALIDATE CONSTRAINT`, which does not block writes.\n- **Migrations are forward-only once merged.** Fix mistakes with a new migration.\n","# Postgres\n\nRules for schema and queries on Postgres. They are language-agnostic; the Go half lives in the\n`go-idiomatic` skill (`references\u002Fdatabase.md`, `references\u002Fpatterns.md`).\n\n## Where to Look\n\n| If you're working on…                                   | Load this                                        |\n| ------------------------------------------------------- | ------------------------------------------------ |\n| Go code that runs these queries (`database\u002Fsql`, pgx)   | `go-idiomatic` `references\u002Fdatabase.md`          |\n| A closed value set mirrored as a Go type                | `go-idiomatic` `references\u002Fpatterns.md` § Typed Value Sets |\n| Writing or changing a migration, any tool               | `references\u002Fmigrations.md`                       |\n| Converting an existing Postgres `ENUM` to `text` + `CHECK` | `references\u002Fmigrations.md` § ENUM Conversion  |\n| Migrations in a repo that uses goose                    | `references\u002Fgoose.md` (only when the repo uses goose) |\n| Only if the repo has `sqlc.yaml`: queries, config, CI   | `references\u002Fsqlc.md`                             |\n\n## Schema\n\n- **Closed value sets are `text` + a named `CHECK`, never a Postgres `ENUM`.** Adding a value to\n  an `ENUM` is a type migration and removing one is not supported; a `CHECK` is one `ALTER`.\n  Never mix the two styles in one schema, and never leave a status column unchecked. An existing\n  `ENUM` is a conversion to schedule, not a style to extend.\n- **Every foreign key column has an index.** Postgres does not create one. Without it, deleting\n  a parent scans the child table, and `ON DELETE CASCADE` turns that into one scan per row.\n- **`timestamptz` for instants, `date` only for calendar dates.** Never store times as `text`.\n- **`jsonb` for JSON, never `text`.**\n- **Name every constraint and index, with one scheme** (`\u003Ctable>_\u003Ccols>_key`, `_fkey`, `_check`,\n  `\u003Ctable>_\u003Ccols>_idx`). Names are what errors and migrations refer to.\n- **One meaning for absence per column.** NULL or `''`, not both. Pick NULL unless the column is\n  `NOT NULL DEFAULT ''` by design.\n- **An append-only table gets a retention policy in the migration that creates it.** Outboxes,\n  run logs and audit trails only grow; decide how long rows live, index the column the cleanup\n  filters on, and delete expired rows in batches (`DELETE ... WHERE id IN (SELECT id ... LIMIT n)`)\n  from a scheduled job. Added later, the first cleanup is one huge delete on a huge table.\n\n## Queries\n\n- **One clock per comparison.** `DEFAULT now()` is fine for audit columns. Any time the\n  application compares against, or a test asserts on, is passed in as a parameter. Mixing SQL\n  `NOW()` with the app's `time.Now()` makes leases and expiries untestable and skewed.\n- **Explicit column lists.** No `SELECT *` and no `RETURNING *`; adding a column must not change\n  what callers receive.\n- **Every list query has a hard `LIMIT`.** A list without one returns the whole table once the\n  table grows. On growing tables page by keyset (`WHERE (created_at, id) \u003C ($1, $2) ORDER BY\n  created_at DESC, id DESC LIMIT $3`), not `OFFSET`, which reads and discards every skipped row.\n- **No N+1 loops.** Fetch with `= ANY($1::uuid[])`, insert with multi-row `VALUES` or `COPY`.\n- **Claiming work uses `FOR UPDATE SKIP LOCKED`** so concurrent workers take different rows\n  instead of queueing on one. Update the claimed row in the same statement or transaction.\n- **Read-then-write uses `SELECT ... FOR UPDATE`** in a transaction. A plain read races.\n- **Match unique violations (SQLSTATE `23505`) by constraint name**, not by message text or by\n  assuming which constraint fired. This is why constraints are named.\n- **`ON CONFLICT` names its target** (`ON CONFLICT (col)` or `ON CONSTRAINT name`). A bare\n  `ON CONFLICT DO NOTHING` silently swallows violations of constraints you did not mean.\n\n## Building SQL\n\n- **Never build SQL, or shell that carries SQL, with `fmt.Sprintf` or string concatenation.**\n  Pass values as bind parameters (`$1`) or, for a script, as environment variables the script\n  reads. Pass identifiers through `pgx.Identifier{\"schema\", \"table\"}.Sanitize()`. Interpolating\n  even an int starts the habit that becomes injection.\n\nA container entrypoint is a static script that reads its value from the environment\n(`IDLE_TIMEOUT` set via the container's `Env`):\n\n```go\n\u002F\u002Fgo:embed entrypoint.sh\nvar entrypoint string\n```\n\n```sh\npsql -v t=\"$IDLE_TIMEOUT\" -c \"ALTER SYSTEM SET idle_in_transaction_session_timeout = :'t'\"\n```\n\n## Altering tables\n\n- **Add columns nullable or with a constant default**, then backfill, then add `NOT NULL`.\n  Never rewrite a large table inside the migration that adds the column.\n- **Backfill in batches**, keyed on the primary key, committing between batches. One giant\n  `UPDATE` holds locks and bloats the table.\n- **Create indexes on live tables with `CREATE INDEX CONCURRENTLY`**, outside a transaction.\n- **Add constraints in two steps on big tables:** `ADD CONSTRAINT ... NOT VALID`, then\n  `VALIDATE CONSTRAINT`, which does not block writes.\n- **Migrations are forward-only once merged.** Fix mistakes with a new migration.\n",{"name":5,"description":7},"main","aede9f7bc29a2d9127fa7ce29682c242596c7759","skills\u002Fcode\u002Fpostgres-best-practices","https:\u002F\u002Fgithub.com\u002FO-Marsters-1997\u002Fmy-claude-code","https:\u002F\u002Fgithub.com\u002FO-Marsters-1997","https:\u002F\u002Fpersonal-portfolio-v2-phi.vercel.app","Go & TypeScript developer building tooling for AI-assisted development: git worktree workflows, Claude Code skills and agent orchestration.","2026-11-11 22:26:34",{"source":8,"skillName":5,"commands":54,"prompt":64,"zipAvailable":65},[55,58,61],{"tool":56,"command":57},"npx","npx skills add O-Marsters-1997\u002Fmy-claude-code --skill postgres-best-practices",{"tool":59,"command":60},"bunx","bunx skills add O-Marsters-1997\u002Fmy-claude-code --skill postgres-best-practices",{"tool":62,"command":63},"pnpm","pnpm dlx skills add O-Marsters-1997\u002Fmy-claude-code --skill postgres-best-practices","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FO-Marsters-1997\u002Fmy-claude-code\u002Fblob\u002Fmain\u002Fskills\u002Fcode\u002Fpostgres-best-practices\u002FSKILL.md",true,[67,73,77,81,85],{"path":68,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":71,"sourceHtmlUrl":72},"evals\u002Fevals.json","REFERENCE","参考文档",4054,"https:\u002F\u002Fgithub.com\u002FO-Marsters-1997\u002Fmy-claude-code\u002Fblob\u002Fmain\u002Fskills\u002Fcode\u002Fpostgres-best-practices\u002Fevals\u002Fevals.json",{"path":74,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":75,"sourceHtmlUrl":76},"references\u002Fgoose.md",3812,"https:\u002F\u002Fgithub.com\u002FO-Marsters-1997\u002Fmy-claude-code\u002Fblob\u002Fmain\u002Fskills\u002Fcode\u002Fpostgres-best-practices\u002Freferences\u002Fgoose.md",{"path":78,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":79,"sourceHtmlUrl":80},"references\u002Fmigrations.md",4378,"https:\u002F\u002Fgithub.com\u002FO-Marsters-1997\u002Fmy-claude-code\u002Fblob\u002Fmain\u002Fskills\u002Fcode\u002Fpostgres-best-practices\u002Freferences\u002Fmigrations.md",{"path":82,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":83,"sourceHtmlUrl":84},"references\u002Fsqlc-patterns.md",3346,"https:\u002F\u002Fgithub.com\u002FO-Marsters-1997\u002Fmy-claude-code\u002Fblob\u002Fmain\u002Fskills\u002Fcode\u002Fpostgres-best-practices\u002Freferences\u002Fsqlc-patterns.md",{"path":86,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":87,"sourceHtmlUrl":88},"references\u002Fsqlc.md",4678,"https:\u002F\u002Fgithub.com\u002FO-Marsters-1997\u002Fmy-claude-code\u002Fblob\u002Fmain\u002Fskills\u002Fcode\u002Fpostgres-best-practices\u002Freferences\u002Fsqlc.md",[90,98,105,130,157,183],{"skillNo":91,"name":92,"nameZh":6,"description":93,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":94,"categories":95,"keywords":96,"publishedAt":97},"01M745F5J4Z2W32G4QXESCN5PM","vault-recall","Answer the user's conceptual or technical question using their Obsidian vault as well as general knowledge. Use when the user asks a question (not a task) whose topic appears in the vault MOC digest from session start. Not for task instructions, not mid-task, and not for writing to the vault (that is to-vault).","https:\u002F\u002Fgithub.com\u002FO-Marsters-1997\u002Fmy-claude-code\u002Fblob\u002Fmain\u002Fskills\u002Fproductivity\u002Fvault-recall\u002FSKILL.md",[],[],"2026-11-11 15:11:14",{"skillNo":99,"name":100,"nameZh":6,"description":101,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":102,"categories":103,"keywords":104,"publishedAt":97},"01M745EW5W0A7K9016Z54A4KG2","ingest","Ingest one external source (an article, course lesson, doc, PDF or URL) into the user's Obsidian vault: save the original to raw\u002F, then build wiki\u002F pages per the vault's § Ingest. Use when the user types \u002Fingest, or says \"ingest this\", \"add this source to my wiki\", \"put this article\u002Flesson in the vault as a wiki page\". Works from any repo. Routing rule: someone else's words go to wiki\u002F (this skill); the user's own learnings and decisions go to notes\u002F (\u002Fto-vault).","https:\u002F\u002Fgithub.com\u002FO-Marsters-1997\u002Fmy-claude-code\u002Fblob\u002Fmain\u002Fskills\u002Fproductivity\u002Fingest\u002FSKILL.md",[],[],{"skillNo":106,"name":107,"nameZh":6,"description":108,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":109,"categories":110,"keywords":111,"publishedAt":40},"01M6H88J6TYRV9T8RKWW569YM8","to-tickets","Breaks a source into independently-grabbable GitHub tickets. For a code feature the source is the plan (`docs\u002Fplans\u002F\u003Cfeature>.md`, from \u002Fto-plan) and every new or changed symbol lands in exactly one ticket, its signatures copied into the ticket body; a non-code feature is cut from the PRD's slices. Cuts tickets for one feature per run. If a code feature has no approved plan, offers \u002Fto-plan instead of cutting from prose. In a repo that runs command-centre, also emits `[[task]]` blocks into its config; in a plain treepad repo, emits a Batch Manifest instead so the tickets materialise as stacked worktrees.","https:\u002F\u002Fgithub.com\u002FO-Marsters-1997\u002Fmy-claude-code\u002Fblob\u002Fmain\u002Fskills\u002Fworkflow\u002Fto-tickets\u002FSKILL.md",[],[112,113,23,114,115,116,117,118,39,119,120,121,122,123,124,24,125,126,127,128,129],"tickets","to tickets","signatures","github","plan","batch","task","manifest","plans","true","ticket","command","repo","feature","run","worktrees","as","cut",{"skillNo":131,"name":132,"nameZh":6,"description":133,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":134,"categories":135,"keywords":141,"publishedAt":40},"01M6H88E98X9KGGYBGSVDS1E8H","to-seams","Records an agreed-but-unlanded cross-repo interface as a seam: the file a consumer's agent gets pasted into its prompt as ground truth, plus the `[[seam]]` block command-centre reads for the retirement pointer. Use when two repos need to build against an interface neither has landed yet — \"record a seam for X\", \"we agreed on this schema, seam it\", \"add a seam so Y can build against Z's new field\". Halts for approval before writing either file.","https:\u002F\u002Fgithub.com\u002FO-Marsters-1997\u002Fmy-claude-code\u002Fblob\u002Fmain\u002Fskills\u002Fworkflow\u002Fto-seams\u002FSKILL.md",[136],{"categoryNo":137,"categoryName":138,"taxonomyType":139,"taxonomyTypeDesc":140},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[142,33,23,143,144,145,37,146,147,148,32,149,150,121,151,152,153,124,24,154,155,156,128,123],"to seams","neither","it","but","prompt","either","use","when","interface","repos","block","records","build","can","record",{"skillNo":158,"name":159,"nameZh":6,"description":160,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":161,"categories":162,"keywords":168,"publishedAt":40},"01M6H889PSQM2E1ATS2JC10QRV","to-roadmap","Prioritises settled features into a Now \u002F Next \u002F Later kanban board, rendered as a self-contained .\u002Fideas\u002Froadmap.html. Each card is a feature, not a ticket — one card later becomes several tickets via \u002Fto-prd -> \u002Fto-plan -> \u002Fto-tickets. Boards the features in .\u002Fdocs\u002Fapproach.md, or the \"## Accepted ideas\" in .\u002Fideas\u002FCONTEXT.md when there is no approach doc. The approach doc is settled truth: this assigns tiers and reasons about ordering, it never re-litigates what was decided.","https:\u002F\u002Fgithub.com\u002FO-Marsters-1997\u002Fmy-claude-code\u002Fblob\u002Fmain\u002Fskills\u002Fworkflow\u002Fto-roadmap\u002FSKILL.md",[163],{"categoryNo":164,"categoryName":165,"taxonomyType":166,"taxonomyTypeDesc":167},"01JBSEEDCAT000000000000031","产品经理","PROFESSION","适用职业",[169,170,22,128,125,171,172,149,173,174,175,112,176,177,116,178,179,121,122,180,181,182],"to roadmap","roadmap","via","features","doc","board","about","next","later","self","now","card","re","ideas",{"skillNo":184,"name":185,"nameZh":6,"description":186,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":187,"categories":188,"keywords":190,"publishedAt":40},"01M6H885QAK839Q771ZBKBK1KA","to-prd","Turns one feature idea into a PRD built on journeys: a one-line problem, journeys (each ending in an observable state) and delivery slices that say what is usable after each. Interviews, explores the codebase, and saves to docs\u002Fprds\u002F\u003Cfeature>.md. Covers exactly one feature: given a multi-feature source, ask which one. Reads any approach doc or ideate report as priors so it doesn't re-ask what's settled, but needs none. Starts the per-feature spine (\u002Fto-prd -> \u002Fto-plan -> \u002Fto-tickets).","https:\u002F\u002Fgithub.com\u002FO-Marsters-1997\u002Fmy-claude-code\u002Fblob\u002Fmain\u002Fskills\u002Fworkflow\u002Fto-prd\u002FSKILL.md",[189],{"categoryNo":164,"categoryName":165,"taxonomyType":166,"taxonomyTypeDesc":167},[191,192,193,194,195,196,197,198,112,199,116,200,201,202,121,181,125,203,204,128],"prd","to prd","say","interviews","codebase","report","line","delivery","spine","state","multi","ask","problem","which"]