[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71S4X8RV3PMFC5D6A4BQ2MN":3,"skill-same:01M71S4X8RV3PMFC5D6A4BQ2MN":97},{"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":26,"publishedAt":47,"linkOnly":48,"markdownContent":49,"markdownBody":50,"frontMatter":51,"refName":63,"commitSha":64,"skillDirectory":65,"forksCount":66,"repositoryHtmlUrl":67,"repositoryHomepageUrl":6,"ownerHtmlUrl":68,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":69,"install":70,"resources":82},"01M71S4X8RV3PMFC5D6A4BQ2MN","author-entity-projection",null,"v4 sub-skill #2. Adds the `entities:` block to the brief and emits\na per-domain projection function at\n`api\u002Fserver\u002Fservices\u002Fentity_projections\u002F\u003Cworkflow_type_snake>.py`.\nValidates entity kinds + relations against the Phase 1\n`_NODE_TABLES` \u002F `_REL_TABLES` schema in\n`api\u002Fserver\u002Fservices\u002Fentity_graph.py`.","arturcrmbot\u002Fzava-control-plane","arturcrmbot","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F156445312?v=4","01M71R9QBEJ4ZSX5AXBGBYH82C","Artur Zielinski","01M71R9QCJSV19ESCAF5773TWH",1,"MIT","https:\u002F\u002Fgithub.com\u002Farturcrmbot\u002Fzava-control-plane\u002Fblob\u002Fmain\u002Fdocs\u002Fsuperpowers\u002Fskills\u002Fcompose-domain\u002Fsub-skills\u002Fauthor-entity-projection\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],"author","entity","author entity projection","payload","paths","node","at","ast","orchestrator","server","phase","api","workflow","workflows","only","design","skeleton","decision","time","brief","2026-11-10 13:02:02",false,"---\nname: author-entity-projection\ndescription: |\n  v4 sub-skill #2. Adds the `entities:` block to the brief and emits\n  a per-domain projection function at\n  `api\u002Fserver\u002Fservices\u002Fentity_projections\u002F\u003Cworkflow_type_snake>.py`.\n  Validates entity kinds + relations against the Phase 1\n  `_NODE_TABLES` \u002F `_REL_TABLES` schema in\n  `api\u002Fserver\u002Fservices\u002Fentity_graph.py`.\naudience: design-time-only\nforbidden-runtime: true\ninputs:\n  - brief.domain (from author-domain-skeleton)\n  - brief.phases\n  - the live orchestrator file at\n    `api\u002Ffunctions\u002Fworkflows\u002F\u003Cprefix>_\u003Cworkflow_type_snake>.py`\n    (so ref_field paths can be AST-walked against the emitted payload)\noutputs:\n  - brief.entities\n  - \u003Csandbox>\u002Fapi\u002Fserver\u002Fservices\u002Fentity_projections\u002F\u003Cwt_snake>.py\nhands_off_to: author-decision-mapping\n---\n\n# author-entity-projection\n\nThis sub-skill is responsible for one thing: declaring **which graph\nentities and relationships this workflow projects**, then emitting a\nsingle Python projection module that Phase 1's\n`api.server.services.entity_projections.PROJECTIONS` registry binds.\n\n## Procedure\n\n1. **Read the orchestrator** at\n   `api\u002Ffunctions\u002Fworkflows\u002F\u003Cprefix>_\u003Cworkflow_type_snake>.py`. Walk\n   its AST to enumerate every dotted path the orchestrator stamps on\n   the `payload` it emits. Use that as the universe of permissible\n   `ref_field` and `attribute` paths.\n\n2. **Propose the `entities:` block.** Each entity declares:\n   - `kind` — must be one of the seven Phase 1 node tables\n     (`Person`, `Organisation`, `Asset`, `Money`, `Decision`, `Place`,\n     `Period`). `Workflow` is reflector-managed; do not project it.\n   - `ref_field` — dotted path inside `payload` (e.g.\n     `payload.vendor.id`) holding the entity id.\n   - `source` (optional) — sub-kind label landing on the node's\n     `kind` attr (e.g. `vendor`, `agency`, `joiner`, `campaign`).\n   - `attributes` (optional) — map of Kuzu column → dotted payload\n     ref.\n   - `relations` (optional) — list of `{kind, target_ref}` entries\n     where `kind` is one of `_REL_TABLES` and `target_ref` is another\n     entity's `ref_field`.\n\n3. **Validate.** Run `validator.py:validate(brief, orchestrator_path)`.\n   On `SchemaError` (unknown kind \u002F unresolved ref \u002F bad rel), STOP\n   and print the structured failure.\n\n4. **Render the projection.** Call\n   `codegen.render_projection(brief)`. Write `(filename, body)` into\n   the sandbox at\n   `tools\u002Fscratch\u002Fcompose-domain\u002F\u003Crun-id>\u002Fapi\u002Fserver\u002Fservices\u002Fentity_projections\u002F\u003Cfilename>`.\n\n5. **Hand off** to `author-decision-mapping`.\n\n## Output shape (one Python module per domain)\n\nThe codegen emits a module that mirrors the twelve hand-written Phase 1\nprojection modules:\n\n```python\n\"\"\"Projection: \u003Cworkflow-type> (compose-domain v4 codegen).\"\"\"\nfrom __future__ import annotations\n\nimport json\n\nfrom api.server.services.entity_projections import (\n    DecisionWrite, EntityWrite, RelWrite, build_decision, slug,\n)\nfrom api.shared.types import Workflow\n\nWORKFLOW_TYPE = \"\u003Cworkflow-type>\"\n\n\ndef project(workflow: Workflow) -> list[EntityWrite | RelWrite | DecisionWrite]:\n    p = workflow.payload or {}\n    sw = (workflow.id,)\n    ops: list[EntityWrite | RelWrite | DecisionWrite] = []\n\n    # --- Entity 0 ---\n    \u003Ckind>_id = f\"\u003CPREFIX>-\u003Csource>-{slug(str(\u003Cref_field>))}\"\n    ops.append(EntityWrite(\n        kind=\"\u003CKind>\", id=\u003Ckind>_id,\n        attrs={\"kind\": \"\u003Csource>\", ...},\n        source_workflows=sw,\n    ))\n    # ...\n    return ops\n```\n\n`build_decision(...)` is appended downstream by\n`author-decision-mapping` — this codegen produces only `EntityWrite`\n+ `RelWrite`.\n\n## Constraints\n\n- The function MUST be named `project` (Phase 1 PAT-005). The module\n  MUST expose `WORKFLOW_TYPE = \"\u003Cworkflow-type>\"` so the registry can\n  bind it.\n- Imports MUST be limited to the allow-list above; the validator\n  enforces this on the rendered output.\n- ID prefix convention (matches Phase 1):\n  `Person → PERSON-`, `Organisation → ORG-`, `Asset → ASSET-`,\n  `Money → MONEY-`, `Decision → DEC-`, `Place → PLACE-`,\n  `Period → PERIOD-`.\n\n## Failure handling\n\nValidation failure aborts the pipeline. Re-author the brief.\n","# author-entity-projection\n\nThis sub-skill is responsible for one thing: declaring **which graph\nentities and relationships this workflow projects**, then emitting a\nsingle Python projection module that Phase 1's\n`api.server.services.entity_projections.PROJECTIONS` registry binds.\n\n## Procedure\n\n1. **Read the orchestrator** at\n   `api\u002Ffunctions\u002Fworkflows\u002F\u003Cprefix>_\u003Cworkflow_type_snake>.py`. Walk\n   its AST to enumerate every dotted path the orchestrator stamps on\n   the `payload` it emits. Use that as the universe of permissible\n   `ref_field` and `attribute` paths.\n\n2. **Propose the `entities:` block.** Each entity declares:\n   - `kind` — must be one of the seven Phase 1 node tables\n     (`Person`, `Organisation`, `Asset`, `Money`, `Decision`, `Place`,\n     `Period`). `Workflow` is reflector-managed; do not project it.\n   - `ref_field` — dotted path inside `payload` (e.g.\n     `payload.vendor.id`) holding the entity id.\n   - `source` (optional) — sub-kind label landing on the node's\n     `kind` attr (e.g. `vendor`, `agency`, `joiner`, `campaign`).\n   - `attributes` (optional) — map of Kuzu column → dotted payload\n     ref.\n   - `relations` (optional) — list of `{kind, target_ref}` entries\n     where `kind` is one of `_REL_TABLES` and `target_ref` is another\n     entity's `ref_field`.\n\n3. **Validate.** Run `validator.py:validate(brief, orchestrator_path)`.\n   On `SchemaError` (unknown kind \u002F unresolved ref \u002F bad rel), STOP\n   and print the structured failure.\n\n4. **Render the projection.** Call\n   `codegen.render_projection(brief)`. Write `(filename, body)` into\n   the sandbox at\n   `tools\u002Fscratch\u002Fcompose-domain\u002F\u003Crun-id>\u002Fapi\u002Fserver\u002Fservices\u002Fentity_projections\u002F\u003Cfilename>`.\n\n5. **Hand off** to `author-decision-mapping`.\n\n## Output shape (one Python module per domain)\n\nThe codegen emits a module that mirrors the twelve hand-written Phase 1\nprojection modules:\n\n```python\n\"\"\"Projection: \u003Cworkflow-type> (compose-domain v4 codegen).\"\"\"\nfrom __future__ import annotations\n\nimport json\n\nfrom api.server.services.entity_projections import (\n    DecisionWrite, EntityWrite, RelWrite, build_decision, slug,\n)\nfrom api.shared.types import Workflow\n\nWORKFLOW_TYPE = \"\u003Cworkflow-type>\"\n\n\ndef project(workflow: Workflow) -> list[EntityWrite | RelWrite | DecisionWrite]:\n    p = workflow.payload or {}\n    sw = (workflow.id,)\n    ops: list[EntityWrite | RelWrite | DecisionWrite] = []\n\n    # --- Entity 0 ---\n    \u003Ckind>_id = f\"\u003CPREFIX>-\u003Csource>-{slug(str(\u003Cref_field>))}\"\n    ops.append(EntityWrite(\n        kind=\"\u003CKind>\", id=\u003Ckind>_id,\n        attrs={\"kind\": \"\u003Csource>\", ...},\n        source_workflows=sw,\n    ))\n    # ...\n    return ops\n```\n\n`build_decision(...)` is appended downstream by\n`author-decision-mapping` — this codegen produces only `EntityWrite`\n+ `RelWrite`.\n\n## Constraints\n\n- The function MUST be named `project` (Phase 1 PAT-005). The module\n  MUST expose `WORKFLOW_TYPE = \"\u003Cworkflow-type>\"` so the registry can\n  bind it.\n- Imports MUST be limited to the allow-list above; the validator\n  enforces this on the rendered output.\n- ID prefix convention (matches Phase 1):\n  `Person → PERSON-`, `Organisation → ORG-`, `Asset → ASSET-`,\n  `Money → MONEY-`, `Decision → DEC-`, `Place → PLACE-`,\n  `Period → PERIOD-`.\n\n## Failure handling\n\nValidation failure aborts the pipeline. Re-author the brief.\n",{"name":5,"inputs":52,"outputs":56,"audience":59,"description":60,"hands_off_to":61,"forbidden-runtime":62},[53,54,55],"brief.domain (from author-domain-skeleton)","brief.phases","the live orchestrator file at `api\u002Ffunctions\u002Fworkflows\u002F\u003Cprefix>_\u003Cworkflow_type_snake>.py` (so ref_field paths can be AST-walked against the emitted payload)",[57,58],"brief.entities","\u003Csandbox>\u002Fapi\u002Fserver\u002Fservices\u002Fentity_projections\u002F\u003Cwt_snake>.py","design-time-only","v4 sub-skill #2. Adds the `entities:` block to the brief and emits\na per-domain projection function at\n`api\u002Fserver\u002Fservices\u002Fentity_projections\u002F\u003Cworkflow_type_snake>.py`.\nValidates entity kinds + relations against the Phase 1\n`_NODE_TABLES` \u002F `_REL_TABLES` schema in\n`api\u002Fserver\u002Fservices\u002Fentity_graph.py`.\n","author-decision-mapping",true,"main","db273d7d646605c0bf0175dc9c8057b9ad2628b5","docs\u002Fsuperpowers\u002Fskills\u002Fcompose-domain\u002Fsub-skills\u002Fauthor-entity-projection",2,"https:\u002F\u002Fgithub.com\u002Farturcrmbot\u002Fzava-control-plane","https:\u002F\u002Fgithub.com\u002Farturcrmbot","2026-09-28 17:47:06",{"source":8,"skillName":5,"commands":71,"prompt":81,"zipAvailable":62},[72,75,78],{"tool":73,"command":74},"npx","npx skills add arturcrmbot\u002Fzava-control-plane --skill author-entity-projection",{"tool":76,"command":77},"bunx","bunx skills add arturcrmbot\u002Fzava-control-plane --skill author-entity-projection",{"tool":79,"command":80},"pnpm","pnpm dlx skills add arturcrmbot\u002Fzava-control-plane --skill author-entity-projection","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Farturcrmbot\u002Fzava-control-plane\u002Fblob\u002Fmain\u002Fdocs\u002Fsuperpowers\u002Fskills\u002Fcompose-domain\u002Fsub-skills\u002Fauthor-entity-projection\u002FSKILL.md",[83,89,93],{"path":84,"resourceType":85,"resourceTypeDesc":86,"sizeBytes":87,"sourceHtmlUrl":88},"__init__.py","SCRIPT","脚本",0,"https:\u002F\u002Fgithub.com\u002Farturcrmbot\u002Fzava-control-plane\u002Fblob\u002Fmain\u002Fdocs\u002Fsuperpowers\u002Fskills\u002Fcompose-domain\u002Fsub-skills\u002Fauthor-entity-projection\u002F__init__.py",{"path":90,"resourceType":85,"resourceTypeDesc":86,"sizeBytes":91,"sourceHtmlUrl":92},"codegen.py",6408,"https:\u002F\u002Fgithub.com\u002Farturcrmbot\u002Fzava-control-plane\u002Fblob\u002Fmain\u002Fdocs\u002Fsuperpowers\u002Fskills\u002Fcompose-domain\u002Fsub-skills\u002Fauthor-entity-projection\u002Fcodegen.py",{"path":94,"resourceType":85,"resourceTypeDesc":86,"sizeBytes":95,"sourceHtmlUrl":96},"validator.py",7365,"https:\u002F\u002Fgithub.com\u002Farturcrmbot\u002Fzava-control-plane\u002Fblob\u002Fmain\u002Fdocs\u002Fsuperpowers\u002Fskills\u002Fcompose-domain\u002Fsub-skills\u002Fauthor-entity-projection\u002Fvalidator.py",[98,119,136,150,158,165],{"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":47},"01M71SJECD4KXSSJV1B0HSY4T4","proactive-customer-care","Proactively notifies and, where warranted, extends a small bounded goodwill gesture to a customer whose itinerary materially changed.","https:\u002F\u002Fgithub.com\u002Farturcrmbot\u002Fzava-control-plane\u002Fblob\u002Fmain\u002Fverticals\u002Ftravel\u002Fskills\u002Fproactive-customer-care\u002FSKILL.md",[],[105,106,107,108,109,110,111,112,113,114,115,116,117,118],"proactive","customer","proactive customer care","customer care","gesture","action","bounded","status","check","booking","operations","travel","issue","itinerary",{"skillNo":120,"name":121,"nameZh":6,"description":122,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":123,"categories":124,"keywords":125,"publishedAt":47},"01M71SJ9VHGNNTB6452H1KRZD6","payment-exception","Resolves a failed balance payment by retrying it to complete the booking, or releasing the booking's inventory when retry is not viable.","https:\u002F\u002Fgithub.com\u002Farturcrmbot\u002Fzava-control-plane\u002Fblob\u002Fmain\u002Fverticals\u002Ftravel\u002Fskills\u002Fpayment-exception\u002FSKILL.md",[],[126,127,128,129,130,114,131,132,133,112,134,135,113,115,116],"payment","payment exception","it","retry","balance","when","release","complete","capacity","inventory",{"skillNo":137,"name":138,"nameZh":6,"description":139,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":140,"categories":141,"keywords":142,"publishedAt":47},"01M71SJ6S6XREB0J6CCVCSFZ9E","hotel-supplier-recovery","Restores accommodation for a shortfall-hit hotel allotment by moving contracted rooms from a donor allotment with headroom, resolving the reported supplier shortfall.","https:\u002F\u002Fgithub.com\u002Farturcrmbot\u002Fzava-control-plane\u002Fblob\u002Fmain\u002Fverticals\u002Ftravel\u002Fskills\u002Fhotel-supplier-recovery\u002FSKILL.md",[],[143,144,145,146,113,115,116,147,148,149],"hotel supplier recovery","hotel","recovery","with","move","for","headroom",{"skillNo":151,"name":152,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":153,"categories":154,"keywords":155,"publishedAt":47},"01M71SJ4G5MPM50WZ6F66M3PNS","holiday-sales-booking","https:\u002F\u002Fgithub.com\u002Farturcrmbot\u002Fzava-control-plane\u002Fblob\u002Fmain\u002Fverticals\u002Ftravel\u002Fskills\u002Fholiday-sales-booking\u002FSKILL.md",[],[156,114,157],"holiday sales booking","sales",{"skillNo":159,"name":160,"nameZh":6,"description":6,"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":163,"publishedAt":47},"01M71SJ2AHHWN2C4YV2RKEE947","flight-disruption-recovery","https:\u002F\u002Fgithub.com\u002Farturcrmbot\u002Fzava-control-plane\u002Fblob\u002Fmain\u002Fverticals\u002Ftravel\u002Fskills\u002Fflight-disruption-recovery\u002FSKILL.md",[],[164,145],"flight disruption recovery",{"skillNo":166,"name":167,"nameZh":6,"description":168,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":169,"categories":170,"keywords":171,"publishedAt":47},"01M71SHYPK8HNQ80C9XAWSER53","destination-operations","Dispatches a replacement resort transfer when an arrival is at risk, rebinding any travellers on the at-risk transfer to the replacement.","https:\u002F\u002Fgithub.com\u002Farturcrmbot\u002Fzava-control-plane\u002Fblob\u002Fmain\u002Fverticals\u002Ftravel\u002Fskills\u002Fdestination-operations\u002FSKILL.md",[],[172,115,173,174,113,175,116,33,131,176],"destination operations","destination","risk","dispatch","transfer"]