[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M699EKWZ1994ZX44CWBSFCSF":3,"skill-same:01M699EKWZ1994ZX44CWBSFCSF":99},{"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":28,"publishedAt":52,"linkOnly":53,"markdownContent":54,"markdownBody":55,"frontMatter":56,"refName":57,"commitSha":58,"skillDirectory":59,"forksCount":60,"repositoryHtmlUrl":61,"repositoryHomepageUrl":62,"ownerHtmlUrl":63,"ownerBlogUrl":64,"ownerDescription":65,"updatedAt":66,"install":67,"resources":80},"01M699EKWZ1994ZX44CWBSFCSF","apm-spec-guardian",null,"Use this skill to run a four-panel adversarial advisory review on any pull request that touches the OpenAPM specification artifact (docs\u002Fsrc\u002Fcontent\u002Fdocs\u002Fspecs\u002Fopenapm-*.md), its inline \u002F sidecar JSON Schemas (docs\u002Fsrc\u002Fcontent\u002Fdocs\u002Fspecs\u002Fschemas\u002F*.schema.json), or the conformance fixture seed (tests\u002Ffixtures\u002Fspec-conformance\u002F**). The panel fans out to four spec-ecosystem reviewers (swagger-openapi-editor, oci-distribution-editor, pkgmgr-registry-contract-editor, w3c-tag-architect), each running in its own agent thread, and a spec-editor synthesizer that produces a fold-now \u002F defer-v0.1.1 \u002F defer-v0.2 \u002F reject list plus a ship decision keyed off a 1..10 shocked_meter scale. The orchestrator is the sole writer to the PR: ONE consolidated comment, no verdict labels, no merge gating. The panel is advisory -- it surfaces findings, prioritizes folds, and renders a ship recommendation that the maintainer weighs.","microsoft\u002Fapm","microsoft","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F6154722?v=4","01M698VYDXZ6JW5WH3CRV650R8","Microsoft","01M699CC41JR5QW38C9PDX6101",4361,"MIT","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fapm\u002Fblob\u002Fmain\u002F.apm\u002Fskills\u002Fapm-spec-guardian\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000037","律师与法务","PROFESSION","适用职业",[29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],"spec","apm spec guardian","apm","guardian","gating","review","request","labels","inline","ecosystem","now","distribution","fixture","artifact","writer","specification","orchestrator","decision","run","merge","editor","oci","docs","2026-11-10 10:12:30",false,"---\nname: apm-spec-guardian\ndescription: >-\n  Use this skill to run a four-panel adversarial advisory review on any\n  pull request that touches the OpenAPM specification artifact\n  (docs\u002Fsrc\u002Fcontent\u002Fdocs\u002Fspecs\u002Fopenapm-*.md), its inline \u002F sidecar JSON\n  Schemas (docs\u002Fsrc\u002Fcontent\u002Fdocs\u002Fspecs\u002Fschemas\u002F*.schema.json), or the\n  conformance fixture seed (tests\u002Ffixtures\u002Fspec-conformance\u002F**). The\n  panel fans out to four spec-ecosystem reviewers\n  (swagger-openapi-editor, oci-distribution-editor,\n  pkgmgr-registry-contract-editor, w3c-tag-architect), each running in\n  its own agent thread, and a spec-editor synthesizer that produces a\n  fold-now \u002F defer-v0.1.1 \u002F defer-v0.2 \u002F reject list plus a ship\n  decision keyed off a 1..10 shocked_meter scale. The orchestrator is\n  the sole writer to the PR: ONE consolidated comment, no verdict\n  labels, no merge gating. The panel is advisory -- it surfaces\n  findings, prioritizes folds, and renders a ship recommendation that\n  the maintainer weighs.\n---\n\n# APM Spec Guardian -- Four-Panel Advisory Review for OpenAPM\n\nThis skill institutionalizes the two-round adversarial spec review\nthat produced OpenAPM v0.1 by hand. The panel is FAN-OUT +\nSYNTHESIZER. Each panelist runs in its own agent thread (via the\n`task` tool) and returns JSON matching\n`assets\u002Fpanelist-return-schema.json`. The orchestrator schema-validates\neach return, hands all returns to the `spec-editor-synthesizer`\n(also a task thread, returns JSON matching\n`assets\u002Fsynthesizer-return-schema.json`), runs the linter checklist\nin `assets\u002Flinter-checklist.md`, then renders ONE comment from\n`assets\u002Fcomment-template.md`.\n\nThis skill is ADVISORY by design. It does not compute a binary\nverdict, it does not apply verdict labels, and it does not gate\nmerge. The panel surfaces findings; the maintainer ships.\n\n## Activation scope\n\nThis skill activates ONLY when the PR diff touches at least one of:\n\n- `docs\u002Fsrc\u002Fcontent\u002Fdocs\u002Fspecs\u002Fopenapm-*.md` (the normative spec\n  artifact, current and future versions)\n- `docs\u002Fsrc\u002Fcontent\u002Fdocs\u002Fspecs\u002Fschemas\u002F*.schema.json` (sidecar JSON\n  Schemas, if\u002Fwhen the inline Appendix-A schemas are extracted to\n  files)\n- `tests\u002Ffixtures\u002Fspec-conformance\u002F**` (the conformance fixture seed)\n\nEdits to any OTHER documentation page MUST NOT trigger this skill.\nThe maintainer's general `docs-sync` skill covers those.\n\n## Architecture invariants\n\n- **Advisory regime, not gate regime.** There is no `APPROVE` \u002F\n  `REJECT`, no `spec-approved` \u002F `spec-rejected` label, no\n  deterministic verdict computation. The synthesizer returns a\n  `ship_decision` (`fold_and_ship` \u002F `needs_revision` \u002F\n  `next_brief`); this is prose for the human reviewer, never\n  auto-applied as a label or status check.\n- **Ship-meter floor.** `ship_decision: fold_and_ship` REQUIRES\n  `shocked_meter_avg >= 7.0`. Below 7.0 the synthesizer MUST emit\n  `needs_revision` (single drafter pass on the existing artifact)\n  or `next_brief` (another round of panel review with a new brief).\n  The floor is advisory wording in the comment, not a status check.\n- **Blocker veto.** If ANY panelist returns\n  `new_blocking_findings[].length > 0`, the synthesizer MUST emit\n  `ship_decision: next_brief` regardless of the shocked_meter_avg.\n  A blocking finding from one panel is not outweighed by three\n  panels rating the artifact 9\u002F10.\n- **Single-writer interlock.** Only the orchestrator writes to the\n  PR: exactly one `add-comment` call and one `remove-labels` call.\n  The `remove-labels` call sweeps `spec-review` (trigger\n  idempotency). NO `add-labels` call -- there are no verdict labels.\n  Panelist subagents and the synthesizer subagent return JSON only\n  and MUST NOT call any `gh` write command, post comments, apply\n  labels, or touch PR state.\n- **Single-emission discipline.** Exactly one comment per panel run,\n  rendered from `assets\u002Fcomment-template.md` after all subagents\n  return and the linter checklist runs.\n- **ASCII-only artifact.** Every byte the skill writes (the comment,\n  the synthesizer prose, any rendered fold instruction) MUST be\n  within printable ASCII (U+0020 - U+007E). The skill inherits the\n  repo encoding rule from `.github\u002Finstructions\u002Fencoding.instructions.md`\n  (if present) and additionally enforces it on the spec artifact via\n  linter check 1.\n- **No-vendor-foundation language ban.** The spec artifact MUST NOT\n  contain \"CNCF\", \"Linux Foundation\", \"Sandbox\", \"Incubation\",\n  \"W3C Process\", or \"IETF RFC stream\". The persona prompts MAY\n  reference these as pedigree (a panelist's credibility comes from\n  having edited OpenAPI; that does not put OpenAPI's foundation\n  affiliation in the spec text). Linter check 2 greps the artifact\n  for the forbidden token list AFTER any fold.\n\n## Agent roster\n\n| Agent | Role | Always active? |\n|-------|------|----------------|\n| [Swagger \u002F OpenAPI Editor](..\u002F..\u002Fagents\u002Fspec-swagger-editor.agent.md) | Interface-contract discipline (schemas, $ref hygiene, oneOf discriminators, conformance enumeration) | Yes |\n| [OCI Distribution Editor](..\u002F..\u002Fagents\u002Fspec-oci-editor.agent.md) | Registry-HTTP rigor (hash envelopes, mirror tolerance, fail-closed extraction, supply-chain threat model) | Yes |\n| [Package-Manager Registry-Contract Editor](..\u002F..\u002Fagents\u002Fspec-pkgmgr-editor.agent.md) | Dependency-resolution rigor (semver dialect pinning, lockfile determinism, transitive conflict policy, reserved-slot defensive MUSTs) | Yes |\n| [W3C TAG Architect](..\u002F..\u002Fagents\u002Fspec-tag-architect.agent.md) | Web-platform integration \u002F architecture (extensibility, layering, fingerprinting, machine-readable contract surface) | Yes |\n| [Spec Editor Synthesizer](..\u002F..\u002Fagents\u002Fspec-editor-synthesizer.agent.md) | Same hand that drafted; aggregates panel returns, computes shocked_meter_avg, clusters convergent themes, produces fold-now \u002F defer \u002F reject lists and ship_decision | Yes |\n\nThe roster is invariant for the v0.1 lineage. Changing it requires\nbumping the skill version.\n\n## Topology\n\n```\n   apm-spec-guardian SKILL (orchestrator thread)\n                      |\n   +------ Wave 0: scope decision (orchestrator-internal) ------+\n   |  classify diff:                                            |\n   |   - editorial-only (tiny patch, single section, no schema  |\n   |     change, no fixture add)  -> skip Wave 3, run Wave 5    |\n   |     linter only, render lightweight comment                |\n   |   - editorial-patch (default for PR-trigger)               |\n   |     -> skip Wave 1+2, start at Wave 3                      |\n   |   - new-version (operator opt-in via PR body marker        |\n   |     `apm-spec-guardian: new-version`)                      |\n   |     -> run Wave 1 + 2 + 3 + 4 + 5                          |\n   +------------------------------------------------------------+\n                      |\n        IF new-version mode: run Wave 1 + Wave 2 first\n                      |\n   Wave 1 (optional, new-version only): task -> spec-editor-synthesizer\n          acting as ASSESSOR -- reads issue context + corpus +\n          produces SPEC_BRIEF_v0 (session-state artifact)\n   Wave 2 (optional, new-version only): task -> spec-editor-synthesizer\n          acting as DRAFTER -- produces SPEC_DRAFT_v0 from SPEC_BRIEF_v0\n                      |\n   Wave 3: FAN-OUT via task tool (4 panelists in parallel)\n   +------+------+--------+------+\n   v      v      v        v\n   swagger oci  pkgmgr   tag\n   (each returns JSON per assets\u002Fpanelist-return-schema.json)\n                      |\n                      v   \u003C-- S4 schema-validate per return\n                      v   \u003C-- on malformed: re-spawn that panelist\n                      v       (max 2 attempts; then placeholder)\n                      v\n   Wave 4: task -> spec-editor-synthesizer\n   - aggregates findings across 4 panels\n   - computes shocked_meter_avg\n   - resolves dissent\n   - clusters into convergent themes\n   - emits fold_now[] + defer_v0_1_1[] + defer_v0_2[] + reject[]\n   - emits ship_decision honoring ship-meter floor + blocker veto\n   - returns assets\u002Fsynthesizer-return-schema.json\n                      |\n                      v   \u003C-- S4 schema-validate\n                      v\n   Wave 5: LINTER (mechanical, from assets\u002Flinter-checklist.md)\n          - 11 checks; each MUST pass\n          - failures append to ship_prose as advisory notes\n          - linter does NOT change ship_decision; it informs the\n            human reviewer\n                      |\n   Wave 6: orchestrator (sole writer)\n            |               |\n            v               v\n        add-comment    remove-labels\n        (max:1)        [spec-review]\n                       (trigger idempotency reset)\n```\n\n## Wave 0 -- scope decision\n\nThe orchestrator classifies the diff before spawning any panelist.\nDecision rules, in order:\n\n1. **New-version mode.** If the PR body contains the literal marker\n   line `apm-spec-guardian: new-version`, OR the diff creates a new\n   `docs\u002Fsrc\u002Fcontent\u002Fdocs\u002Fspecs\u002Fopenapm-*.md` file (not an edit to\n   an existing one), classify as `new-version`. Run Waves 1 -> 2 ->\n   3 -> 4 -> 5 -> 6.\n2. **Editorial-only mode.** If ALL of the following hold:\n   - the diff added \u003C 50 lines AND removed \u003C 50 lines total across\n     all in-scope paths,\n   - no JSON Schema file was added, removed, or had its top-level\n     `properties` keys changed,\n   - no fixture file was added or removed (existing fixture\n     content edits are OK),\n   - no anchor of the form `\u003Ca id=\"req-` was added or removed,\n   classify as `editorial-only`. SKIP Wave 3 + Wave 4. Run Wave 5\n   linter on the modified artifact. Render the lightweight\n   editorial-only branch of `assets\u002Fcomment-template.md` (just the\n   linter result + a one-line \"no substantive spec change\n   detected\").\n3. **Editorial-patch mode (default).** Everything else. Run Wave 3\n   -> 4 -> 5 -> 6. Wave 1 + Wave 2 are SKIPPED; the panel reviews\n   the existing artifact as modified by the PR diff.\n\nDocument the decision in the comment header (one line: \"Scope: \u003Cmode>;\ndiff = +X\u002F-Y lines across N files\").\n\n## Wave 3 -- panel fan-out\n\nSpawn the following four tasks in PARALLEL via the `task` tool, one\ntask per persona:\n\n- `spec-swagger-editor`\n- `spec-oci-editor`\n- `spec-pkgmgr-editor`\n- `spec-tag-architect`\n\nEach task prompt MUST:\n\n- Reference its persona file by relative path\n  (`..\u002F..\u002Fagents\u002Fspec-\u003Cslug>.agent.md`) so the subagent loads its\n  own scope, lens, and pedigree.\n- Include the PR number, title, body, and full diff (passed inline),\n  PLUS the current contents of the in-scope spec artifact AS\n  MODIFIED by the diff (the panel reviews the post-merge state of\n  the file, not just the diff).\n- Cite `assets\u002Fpanelist-return-schema.json` and require the\n  subagent to emit JSON matching that schema as its FINAL message.\n- State the calibrated severity contract: \"Use\n  `new_blocking_findings` ONLY for issues that would break a\n  conformant implementation, leak a security guarantee, or invalidate\n  a published normative claim. Use `new_recommended_findings` for\n  substantive improvements. Use `new_nit_findings` for one-line\n  editorial polish. The panel is advisory; nothing you return blocks\n  merge; pick the severity that honestly matches your signal\n  strength.\"\n- State the no-vendor-foundation rule: \"Your pedigree as a [persona]\n  is part of your prompt. Do NOT propose adding the names of any\n  standards body, foundation, or governance program (CNCF, Linux\n  Foundation, Sandbox, Incubation, W3C Process, IETF RFC stream) to\n  the spec artifact text. Findings that recommend such additions\n  will be auto-rejected by the synthesizer.\"\n- State the ASCII rule: \"Every byte in your return JSON and every\n  byte of any proposed fix or replacement text MUST be within U+0020\n  - U+007E. No emojis, no Unicode dashes, no curly quotes.\"\n- Pass `round` (1 on first pass, 2+ on subsequent rounds in\n  new-version mode).\n- Restate the output contract: NO `gh` write commands, NO posting\n  comments, NO label changes, NO touching PR state. JSON return only.\n\n## Wave 4 -- synthesizer\n\nPass all four validated panelist JSON returns to a `task` invocation\nthat loads `..\u002F..\u002Fagents\u002Fspec-editor-synthesizer.agent.md`. The prompt\nMUST:\n\n- Provide all panelist returns as structured input.\n- Ask for: `convergence_table`, `convergent_themes` (themes flagged\n  by 2+ panels), `fold_now[]` (surgical single-section fixes only),\n  `defer_v0_1_1[]` (small patches deferrable to next patch\n  release), `defer_v0_2[]` (architectural work requiring a reserved\n  slot in a future major), `reject[]` (findings the synthesizer\n  declines, with rationale), `ship_decision`, `ship_prose`,\n  `linter_handoff_notes`.\n- State the ship-decision rules verbatim:\n  - If `sum(panelist.new_blocking_findings)` > 0 across all panels,\n    `ship_decision` MUST be `next_brief`.\n  - Else if `shocked_meter_avg \u003C 7.0`, `ship_decision` MUST be\n    `needs_revision`.\n  - Else `ship_decision` MAY be `fold_and_ship`.\n- State the no-vendor-foundation rule: auto-reject any\n  panelist-proposed fix that would add a banned token to the\n  artifact; surface in `reject[]` with rationale.\n- Cite `assets\u002Fsynthesizer-return-schema.json` and require JSON\n  return.\n- Restate the contract: the panel is advisory. The synthesizer does\n  NOT pick a verdict label. The `ship_decision` is prose for the\n  human reviewer, not a gate. NO `gh` write commands.\n\nValidate the synthesizer return against\n`assets\u002Fsynthesizer-return-schema.json`. On failure, re-spawn once\nwith the violation cited.\n\n## Wave 5 -- linter\n\nRun `assets\u002Flinter-checklist.md` against the in-scope artifact set\n(spec markdown + schemas + fixtures). The checklist has 11 mechanical\nchecks; each is a one-liner producing exit code 0 (or empty grep\noutput where noted). Record pass \u002F fail per check.\n\nLinter outcomes are ADVISORY: a failed check does NOT change the\nsynthesizer's `ship_decision`. It DOES surface in the comment as a\n\"Linter notes\" section so the maintainer can decide whether to fold\nthe fix into the same PR. If `ship_decision == fold_and_ship` AND\nany linter check failed, the comment surfaces the conflict\nprominently (\"Synthesizer recommends ship; linter found N issues\nworth folding first\").\n\n## Wave 6 -- render the comment\n\nLoad `assets\u002Fcomment-template.md`, fill the placeholders from the\nsynthesizer + panelist JSON + linter results, and emit it as exactly\nONE comment.\n\nFilling rules:\n\n- The convergence table renders ONE row per panelist with verdict,\n  shocked_meter, new_blockers, new_recommended, new_nits counts.\n- The fold-now list renders the synthesizer's `fold_now[]`\n  verbatim, ordered as returned.\n- The defer-v0.1.1 and defer-v0.2 lists render below the fold list,\n  collapsed in `\u003Cdetails>` blocks if either has more than 3 items.\n- The reject list renders only if non-empty.\n- The \"Linter notes\" section renders only if any check failed; each\n  failed check renders the check id + the one-line failure summary.\n- Full per-panel findings collapse into a `\u003Cdetails>` at the bottom.\n- NEVER render the words \"Verdict\", \"APPROVE\", \"REJECT\", \"blocked\",\n  \"merge gate\", or any equivalent. The panel is advisory.\n\nThen sweep the `spec-review` label via `safe-outputs.remove-labels`\n(idempotent on missing labels). NO `add-labels` call.\n\n## Output contract (non-negotiable)\n\n- Exactly ONE comment per panel run, rendered from\n  `assets\u002Fcomment-template.md`.\n- Exactly ONE `remove-labels` call sweeping `[spec-review]`.\n- NO `add-labels` call.\n- Subagents (panelists + synthesizer) NEVER write to PR state,\n  NEVER call `gh pr comment`, NEVER call `gh pr edit --add-label`.\n  They return JSON. The orchestrator is the sole writer.\n- ASCII-only across every byte the orchestrator writes.\n- Never invent new top-level template sections or drop existing\n  ones.\n\n## Loop budget\n\n- **Editorial-patch mode:** at most 2 panel rounds. If round 2 still\n  carries new_blocking_findings, the synthesizer emits\n  `ship_decision: next_brief` with a `ship_prose` note that the\n  loop budget is exhausted and the maintainer should ESCALATE\n  (manually decide between drafting a fix or closing the PR).\n- **New-version mode:** at most 3 panel rounds. Same exhaustion\n  semantics on round 3.\n- **Editorial-only mode:** zero panel rounds (linter only).\n\nThe orchestrator increments and tracks the round counter; subagents\nreceive it as input but MUST NOT trust panel-side memory.\n\n## Gotchas\n\n- **Roster invariant.** The frontmatter description, the activation\n  scope list, the roster table, the topology diagram, and the\n  schema enum MUST agree on the 4 panelists + 1 synthesizer. If you\n  change one, change all in the same edit.\n- **Blocker veto trumps ship-meter.** A panelist who returns one\n  `new_blocking_finding` and a shocked_meter of 9 means \"the spec is\n  mostly excellent but this one thing would break a conformant\n  implementation\". That blocker still vetoes `fold_and_ship`. Do not\n  let the synthesizer average it away.\n- **Calibrated severity discipline.** The advisory regime relies on\n  panelists distinguishing blocking from recommended honestly. If a\n  panelist marks every editorial nit as blocking, the synthesizer's\n  blocker veto becomes a denial-of-ship. The panelist prompts state\n  the contract explicitly; the synthesizer arbitration prose is the\n  safety valve.\n- **Wave 0 editorial-only is a noise filter, not a quality\n  shortcut.** It exists so a one-line typo fix to a fixture comment\n  does not summon four expert agents. It MUST NOT fire on schema\n  changes, anchor additions, or fixture-tree topology changes; the\n  rules above are intentionally conservative.\n- **No-vendor-foundation tokens may appear in panelist returns** (a\n  panelist can name \"the W3C TAG\" as their pedigree in their\n  `summary` field) but MUST NOT appear in the synthesizer's\n  `fold_now[].patch_instruction` or in the rendered comment body\n  outside `\u003Cdetails>` collapsed sections. The synthesizer auto-rejects\n  panelist proposals that would add banned tokens to the artifact.\n- **ASCII enforcement is per-byte, not per-codepoint.** A character\n  with codepoint > 0x7E is non-ASCII even if it would round-trip\n  through a different encoding. The linter checks raw byte values,\n  not the rendered visual.\n- **Subagent write enforcement is contract-based, not sandbox-based.**\n  Tool permissions are workflow-scoped, not subagent-scoped, so\n  every spawned task technically inherits the same `gh` toolset.\n  The \"subagents must not write\" rule is enforced by the prompt\n  contract in each `.agent.md` plus the `safe-outputs.add-comment.max:\n  1` fail-soft.\n- **Spec drift across count sites.** Linter check 6 catches when sec.\n  1.3 sentence, Appendix C trailer, and Appendix D revision-history\n  disagree on the normative-statement total. This is the most common\n  failure mode of a fold pass and is the reason the linter is\n  mandatory before render.\n\n## Relationship to autopilot-pr-review-worker\n\n`autopilot-pr-review-worker` is the general OSS multi-persona review for any\nnon-trivial PR in the repo. `apm-spec-guardian` is its narrow,\nspec-only sibling: a different persona roster, a different ship\ndecision schema (shocked_meter instead of stance enum), and a\nmandatory linter step. The architectural shape (FAN-OUT +\nSYNTHESIZER + single-writer interlock + advisory regime) is\ndeliberately the same so a contributor reading one can read the\nother. Do not merge them; the persona pedigrees and the artifact\ntype (spec vs code) are different enough that one-size-fits-all\nprompts would dilute both.\n","# APM Spec Guardian -- Four-Panel Advisory Review for OpenAPM\n\nThis skill institutionalizes the two-round adversarial spec review\nthat produced OpenAPM v0.1 by hand. The panel is FAN-OUT +\nSYNTHESIZER. Each panelist runs in its own agent thread (via the\n`task` tool) and returns JSON matching\n`assets\u002Fpanelist-return-schema.json`. The orchestrator schema-validates\neach return, hands all returns to the `spec-editor-synthesizer`\n(also a task thread, returns JSON matching\n`assets\u002Fsynthesizer-return-schema.json`), runs the linter checklist\nin `assets\u002Flinter-checklist.md`, then renders ONE comment from\n`assets\u002Fcomment-template.md`.\n\nThis skill is ADVISORY by design. It does not compute a binary\nverdict, it does not apply verdict labels, and it does not gate\nmerge. The panel surfaces findings; the maintainer ships.\n\n## Activation scope\n\nThis skill activates ONLY when the PR diff touches at least one of:\n\n- `docs\u002Fsrc\u002Fcontent\u002Fdocs\u002Fspecs\u002Fopenapm-*.md` (the normative spec\n  artifact, current and future versions)\n- `docs\u002Fsrc\u002Fcontent\u002Fdocs\u002Fspecs\u002Fschemas\u002F*.schema.json` (sidecar JSON\n  Schemas, if\u002Fwhen the inline Appendix-A schemas are extracted to\n  files)\n- `tests\u002Ffixtures\u002Fspec-conformance\u002F**` (the conformance fixture seed)\n\nEdits to any OTHER documentation page MUST NOT trigger this skill.\nThe maintainer's general `docs-sync` skill covers those.\n\n## Architecture invariants\n\n- **Advisory regime, not gate regime.** There is no `APPROVE` \u002F\n  `REJECT`, no `spec-approved` \u002F `spec-rejected` label, no\n  deterministic verdict computation. The synthesizer returns a\n  `ship_decision` (`fold_and_ship` \u002F `needs_revision` \u002F\n  `next_brief`); this is prose for the human reviewer, never\n  auto-applied as a label or status check.\n- **Ship-meter floor.** `ship_decision: fold_and_ship` REQUIRES\n  `shocked_meter_avg >= 7.0`. Below 7.0 the synthesizer MUST emit\n  `needs_revision` (single drafter pass on the existing artifact)\n  or `next_brief` (another round of panel review with a new brief).\n  The floor is advisory wording in the comment, not a status check.\n- **Blocker veto.** If ANY panelist returns\n  `new_blocking_findings[].length > 0`, the synthesizer MUST emit\n  `ship_decision: next_brief` regardless of the shocked_meter_avg.\n  A blocking finding from one panel is not outweighed by three\n  panels rating the artifact 9\u002F10.\n- **Single-writer interlock.** Only the orchestrator writes to the\n  PR: exactly one `add-comment` call and one `remove-labels` call.\n  The `remove-labels` call sweeps `spec-review` (trigger\n  idempotency). NO `add-labels` call -- there are no verdict labels.\n  Panelist subagents and the synthesizer subagent return JSON only\n  and MUST NOT call any `gh` write command, post comments, apply\n  labels, or touch PR state.\n- **Single-emission discipline.** Exactly one comment per panel run,\n  rendered from `assets\u002Fcomment-template.md` after all subagents\n  return and the linter checklist runs.\n- **ASCII-only artifact.** Every byte the skill writes (the comment,\n  the synthesizer prose, any rendered fold instruction) MUST be\n  within printable ASCII (U+0020 - U+007E). The skill inherits the\n  repo encoding rule from `.github\u002Finstructions\u002Fencoding.instructions.md`\n  (if present) and additionally enforces it on the spec artifact via\n  linter check 1.\n- **No-vendor-foundation language ban.** The spec artifact MUST NOT\n  contain \"CNCF\", \"Linux Foundation\", \"Sandbox\", \"Incubation\",\n  \"W3C Process\", or \"IETF RFC stream\". The persona prompts MAY\n  reference these as pedigree (a panelist's credibility comes from\n  having edited OpenAPI; that does not put OpenAPI's foundation\n  affiliation in the spec text). Linter check 2 greps the artifact\n  for the forbidden token list AFTER any fold.\n\n## Agent roster\n\n| Agent | Role | Always active? |\n|-------|------|----------------|\n| [Swagger \u002F OpenAPI Editor](..\u002F..\u002Fagents\u002Fspec-swagger-editor.agent.md) | Interface-contract discipline (schemas, $ref hygiene, oneOf discriminators, conformance enumeration) | Yes |\n| [OCI Distribution Editor](..\u002F..\u002Fagents\u002Fspec-oci-editor.agent.md) | Registry-HTTP rigor (hash envelopes, mirror tolerance, fail-closed extraction, supply-chain threat model) | Yes |\n| [Package-Manager Registry-Contract Editor](..\u002F..\u002Fagents\u002Fspec-pkgmgr-editor.agent.md) | Dependency-resolution rigor (semver dialect pinning, lockfile determinism, transitive conflict policy, reserved-slot defensive MUSTs) | Yes |\n| [W3C TAG Architect](..\u002F..\u002Fagents\u002Fspec-tag-architect.agent.md) | Web-platform integration \u002F architecture (extensibility, layering, fingerprinting, machine-readable contract surface) | Yes |\n| [Spec Editor Synthesizer](..\u002F..\u002Fagents\u002Fspec-editor-synthesizer.agent.md) | Same hand that drafted; aggregates panel returns, computes shocked_meter_avg, clusters convergent themes, produces fold-now \u002F defer \u002F reject lists and ship_decision | Yes |\n\nThe roster is invariant for the v0.1 lineage. Changing it requires\nbumping the skill version.\n\n## Topology\n\n```\n   apm-spec-guardian SKILL (orchestrator thread)\n                      |\n   +------ Wave 0: scope decision (orchestrator-internal) ------+\n   |  classify diff:                                            |\n   |   - editorial-only (tiny patch, single section, no schema  |\n   |     change, no fixture add)  -> skip Wave 3, run Wave 5    |\n   |     linter only, render lightweight comment                |\n   |   - editorial-patch (default for PR-trigger)               |\n   |     -> skip Wave 1+2, start at Wave 3                      |\n   |   - new-version (operator opt-in via PR body marker        |\n   |     `apm-spec-guardian: new-version`)                      |\n   |     -> run Wave 1 + 2 + 3 + 4 + 5                          |\n   +------------------------------------------------------------+\n                      |\n        IF new-version mode: run Wave 1 + Wave 2 first\n                      |\n   Wave 1 (optional, new-version only): task -> spec-editor-synthesizer\n          acting as ASSESSOR -- reads issue context + corpus +\n          produces SPEC_BRIEF_v0 (session-state artifact)\n   Wave 2 (optional, new-version only): task -> spec-editor-synthesizer\n          acting as DRAFTER -- produces SPEC_DRAFT_v0 from SPEC_BRIEF_v0\n                      |\n   Wave 3: FAN-OUT via task tool (4 panelists in parallel)\n   +------+------+--------+------+\n   v      v      v        v\n   swagger oci  pkgmgr   tag\n   (each returns JSON per assets\u002Fpanelist-return-schema.json)\n                      |\n                      v   \u003C-- S4 schema-validate per return\n                      v   \u003C-- on malformed: re-spawn that panelist\n                      v       (max 2 attempts; then placeholder)\n                      v\n   Wave 4: task -> spec-editor-synthesizer\n   - aggregates findings across 4 panels\n   - computes shocked_meter_avg\n   - resolves dissent\n   - clusters into convergent themes\n   - emits fold_now[] + defer_v0_1_1[] + defer_v0_2[] + reject[]\n   - emits ship_decision honoring ship-meter floor + blocker veto\n   - returns assets\u002Fsynthesizer-return-schema.json\n                      |\n                      v   \u003C-- S4 schema-validate\n                      v\n   Wave 5: LINTER (mechanical, from assets\u002Flinter-checklist.md)\n          - 11 checks; each MUST pass\n          - failures append to ship_prose as advisory notes\n          - linter does NOT change ship_decision; it informs the\n            human reviewer\n                      |\n   Wave 6: orchestrator (sole writer)\n            |               |\n            v               v\n        add-comment    remove-labels\n        (max:1)        [spec-review]\n                       (trigger idempotency reset)\n```\n\n## Wave 0 -- scope decision\n\nThe orchestrator classifies the diff before spawning any panelist.\nDecision rules, in order:\n\n1. **New-version mode.** If the PR body contains the literal marker\n   line `apm-spec-guardian: new-version`, OR the diff creates a new\n   `docs\u002Fsrc\u002Fcontent\u002Fdocs\u002Fspecs\u002Fopenapm-*.md` file (not an edit to\n   an existing one), classify as `new-version`. Run Waves 1 -> 2 ->\n   3 -> 4 -> 5 -> 6.\n2. **Editorial-only mode.** If ALL of the following hold:\n   - the diff added \u003C 50 lines AND removed \u003C 50 lines total across\n     all in-scope paths,\n   - no JSON Schema file was added, removed, or had its top-level\n     `properties` keys changed,\n   - no fixture file was added or removed (existing fixture\n     content edits are OK),\n   - no anchor of the form `\u003Ca id=\"req-` was added or removed,\n   classify as `editorial-only`. SKIP Wave 3 + Wave 4. Run Wave 5\n   linter on the modified artifact. Render the lightweight\n   editorial-only branch of `assets\u002Fcomment-template.md` (just the\n   linter result + a one-line \"no substantive spec change\n   detected\").\n3. **Editorial-patch mode (default).** Everything else. Run Wave 3\n   -> 4 -> 5 -> 6. Wave 1 + Wave 2 are SKIPPED; the panel reviews\n   the existing artifact as modified by the PR diff.\n\nDocument the decision in the comment header (one line: \"Scope: \u003Cmode>;\ndiff = +X\u002F-Y lines across N files\").\n\n## Wave 3 -- panel fan-out\n\nSpawn the following four tasks in PARALLEL via the `task` tool, one\ntask per persona:\n\n- `spec-swagger-editor`\n- `spec-oci-editor`\n- `spec-pkgmgr-editor`\n- `spec-tag-architect`\n\nEach task prompt MUST:\n\n- Reference its persona file by relative path\n  (`..\u002F..\u002Fagents\u002Fspec-\u003Cslug>.agent.md`) so the subagent loads its\n  own scope, lens, and pedigree.\n- Include the PR number, title, body, and full diff (passed inline),\n  PLUS the current contents of the in-scope spec artifact AS\n  MODIFIED by the diff (the panel reviews the post-merge state of\n  the file, not just the diff).\n- Cite `assets\u002Fpanelist-return-schema.json` and require the\n  subagent to emit JSON matching that schema as its FINAL message.\n- State the calibrated severity contract: \"Use\n  `new_blocking_findings` ONLY for issues that would break a\n  conformant implementation, leak a security guarantee, or invalidate\n  a published normative claim. Use `new_recommended_findings` for\n  substantive improvements. Use `new_nit_findings` for one-line\n  editorial polish. The panel is advisory; nothing you return blocks\n  merge; pick the severity that honestly matches your signal\n  strength.\"\n- State the no-vendor-foundation rule: \"Your pedigree as a [persona]\n  is part of your prompt. Do NOT propose adding the names of any\n  standards body, foundation, or governance program (CNCF, Linux\n  Foundation, Sandbox, Incubation, W3C Process, IETF RFC stream) to\n  the spec artifact text. Findings that recommend such additions\n  will be auto-rejected by the synthesizer.\"\n- State the ASCII rule: \"Every byte in your return JSON and every\n  byte of any proposed fix or replacement text MUST be within U+0020\n  - U+007E. No emojis, no Unicode dashes, no curly quotes.\"\n- Pass `round` (1 on first pass, 2+ on subsequent rounds in\n  new-version mode).\n- Restate the output contract: NO `gh` write commands, NO posting\n  comments, NO label changes, NO touching PR state. JSON return only.\n\n## Wave 4 -- synthesizer\n\nPass all four validated panelist JSON returns to a `task` invocation\nthat loads `..\u002F..\u002Fagents\u002Fspec-editor-synthesizer.agent.md`. The prompt\nMUST:\n\n- Provide all panelist returns as structured input.\n- Ask for: `convergence_table`, `convergent_themes` (themes flagged\n  by 2+ panels), `fold_now[]` (surgical single-section fixes only),\n  `defer_v0_1_1[]` (small patches deferrable to next patch\n  release), `defer_v0_2[]` (architectural work requiring a reserved\n  slot in a future major), `reject[]` (findings the synthesizer\n  declines, with rationale), `ship_decision`, `ship_prose`,\n  `linter_handoff_notes`.\n- State the ship-decision rules verbatim:\n  - If `sum(panelist.new_blocking_findings)` > 0 across all panels,\n    `ship_decision` MUST be `next_brief`.\n  - Else if `shocked_meter_avg \u003C 7.0`, `ship_decision` MUST be\n    `needs_revision`.\n  - Else `ship_decision` MAY be `fold_and_ship`.\n- State the no-vendor-foundation rule: auto-reject any\n  panelist-proposed fix that would add a banned token to the\n  artifact; surface in `reject[]` with rationale.\n- Cite `assets\u002Fsynthesizer-return-schema.json` and require JSON\n  return.\n- Restate the contract: the panel is advisory. The synthesizer does\n  NOT pick a verdict label. The `ship_decision` is prose for the\n  human reviewer, not a gate. NO `gh` write commands.\n\nValidate the synthesizer return against\n`assets\u002Fsynthesizer-return-schema.json`. On failure, re-spawn once\nwith the violation cited.\n\n## Wave 5 -- linter\n\nRun `assets\u002Flinter-checklist.md` against the in-scope artifact set\n(spec markdown + schemas + fixtures). The checklist has 11 mechanical\nchecks; each is a one-liner producing exit code 0 (or empty grep\noutput where noted). Record pass \u002F fail per check.\n\nLinter outcomes are ADVISORY: a failed check does NOT change the\nsynthesizer's `ship_decision`. It DOES surface in the comment as a\n\"Linter notes\" section so the maintainer can decide whether to fold\nthe fix into the same PR. If `ship_decision == fold_and_ship` AND\nany linter check failed, the comment surfaces the conflict\nprominently (\"Synthesizer recommends ship; linter found N issues\nworth folding first\").\n\n## Wave 6 -- render the comment\n\nLoad `assets\u002Fcomment-template.md`, fill the placeholders from the\nsynthesizer + panelist JSON + linter results, and emit it as exactly\nONE comment.\n\nFilling rules:\n\n- The convergence table renders ONE row per panelist with verdict,\n  shocked_meter, new_blockers, new_recommended, new_nits counts.\n- The fold-now list renders the synthesizer's `fold_now[]`\n  verbatim, ordered as returned.\n- The defer-v0.1.1 and defer-v0.2 lists render below the fold list,\n  collapsed in `\u003Cdetails>` blocks if either has more than 3 items.\n- The reject list renders only if non-empty.\n- The \"Linter notes\" section renders only if any check failed; each\n  failed check renders the check id + the one-line failure summary.\n- Full per-panel findings collapse into a `\u003Cdetails>` at the bottom.\n- NEVER render the words \"Verdict\", \"APPROVE\", \"REJECT\", \"blocked\",\n  \"merge gate\", or any equivalent. The panel is advisory.\n\nThen sweep the `spec-review` label via `safe-outputs.remove-labels`\n(idempotent on missing labels). NO `add-labels` call.\n\n## Output contract (non-negotiable)\n\n- Exactly ONE comment per panel run, rendered from\n  `assets\u002Fcomment-template.md`.\n- Exactly ONE `remove-labels` call sweeping `[spec-review]`.\n- NO `add-labels` call.\n- Subagents (panelists + synthesizer) NEVER write to PR state,\n  NEVER call `gh pr comment`, NEVER call `gh pr edit --add-label`.\n  They return JSON. The orchestrator is the sole writer.\n- ASCII-only across every byte the orchestrator writes.\n- Never invent new top-level template sections or drop existing\n  ones.\n\n## Loop budget\n\n- **Editorial-patch mode:** at most 2 panel rounds. If round 2 still\n  carries new_blocking_findings, the synthesizer emits\n  `ship_decision: next_brief` with a `ship_prose` note that the\n  loop budget is exhausted and the maintainer should ESCALATE\n  (manually decide between drafting a fix or closing the PR).\n- **New-version mode:** at most 3 panel rounds. Same exhaustion\n  semantics on round 3.\n- **Editorial-only mode:** zero panel rounds (linter only).\n\nThe orchestrator increments and tracks the round counter; subagents\nreceive it as input but MUST NOT trust panel-side memory.\n\n## Gotchas\n\n- **Roster invariant.** The frontmatter description, the activation\n  scope list, the roster table, the topology diagram, and the\n  schema enum MUST agree on the 4 panelists + 1 synthesizer. If you\n  change one, change all in the same edit.\n- **Blocker veto trumps ship-meter.** A panelist who returns one\n  `new_blocking_finding` and a shocked_meter of 9 means \"the spec is\n  mostly excellent but this one thing would break a conformant\n  implementation\". That blocker still vetoes `fold_and_ship`. Do not\n  let the synthesizer average it away.\n- **Calibrated severity discipline.** The advisory regime relies on\n  panelists distinguishing blocking from recommended honestly. If a\n  panelist marks every editorial nit as blocking, the synthesizer's\n  blocker veto becomes a denial-of-ship. The panelist prompts state\n  the contract explicitly; the synthesizer arbitration prose is the\n  safety valve.\n- **Wave 0 editorial-only is a noise filter, not a quality\n  shortcut.** It exists so a one-line typo fix to a fixture comment\n  does not summon four expert agents. It MUST NOT fire on schema\n  changes, anchor additions, or fixture-tree topology changes; the\n  rules above are intentionally conservative.\n- **No-vendor-foundation tokens may appear in panelist returns** (a\n  panelist can name \"the W3C TAG\" as their pedigree in their\n  `summary` field) but MUST NOT appear in the synthesizer's\n  `fold_now[].patch_instruction` or in the rendered comment body\n  outside `\u003Cdetails>` collapsed sections. The synthesizer auto-rejects\n  panelist proposals that would add banned tokens to the artifact.\n- **ASCII enforcement is per-byte, not per-codepoint.** A character\n  with codepoint > 0x7E is non-ASCII even if it would round-trip\n  through a different encoding. The linter checks raw byte values,\n  not the rendered visual.\n- **Subagent write enforcement is contract-based, not sandbox-based.**\n  Tool permissions are workflow-scoped, not subagent-scoped, so\n  every spawned task technically inherits the same `gh` toolset.\n  The \"subagents must not write\" rule is enforced by the prompt\n  contract in each `.agent.md` plus the `safe-outputs.add-comment.max:\n  1` fail-soft.\n- **Spec drift across count sites.** Linter check 6 catches when sec.\n  1.3 sentence, Appendix C trailer, and Appendix D revision-history\n  disagree on the normative-statement total. This is the most common\n  failure mode of a fold pass and is the reason the linter is\n  mandatory before render.\n\n## Relationship to autopilot-pr-review-worker\n\n`autopilot-pr-review-worker` is the general OSS multi-persona review for any\nnon-trivial PR in the repo. `apm-spec-guardian` is its narrow,\nspec-only sibling: a different persona roster, a different ship\ndecision schema (shocked_meter instead of stance enum), and a\nmandatory linter step. The architectural shape (FAN-OUT +\nSYNTHESIZER + single-writer interlock + advisory regime) is\ndeliberately the same so a contributor reading one can read the\nother. Do not merge them; the persona pedigrees and the artifact\ntype (spec vs code) are different enough that one-size-fits-all\nprompts would dilute both.\n",{"name":5,"description":7},"main","2920043258932f0f67e6f01df7b9047eb42f358c",".apm\u002Fskills\u002Fapm-spec-guardian",425,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fapm","https:\u002F\u002Fmicrosoft.github.io\u002Fapm\u002F","https:\u002F\u002Fgithub.com\u002Fmicrosoft","https:\u002F\u002Fopensource.microsoft.com","Open source projects and samples from Microsoft","2026-11-13 18:27:31",{"source":8,"skillName":5,"commands":68,"prompt":78,"zipAvailable":79},[69,72,75],{"tool":70,"command":71},"npx","npx skills add microsoft\u002Fapm --skill apm-spec-guardian",{"tool":73,"command":74},"bunx","bunx skills add microsoft\u002Fapm --skill apm-spec-guardian",{"tool":76,"command":77},"pnpm","pnpm dlx skills add microsoft\u002Fapm --skill apm-spec-guardian","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fapm\u002Fblob\u002Fmain\u002F.apm\u002Fskills\u002Fapm-spec-guardian\u002FSKILL.md",true,[81,87,91,95],{"path":82,"resourceType":83,"resourceTypeDesc":84,"sizeBytes":85,"sourceHtmlUrl":86},"assets\u002Fcomment-template.md","ASSET","资产文件",6357,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fapm\u002Fblob\u002Fmain\u002F.apm\u002Fskills\u002Fapm-spec-guardian\u002Fassets\u002Fcomment-template.md",{"path":88,"resourceType":83,"resourceTypeDesc":84,"sizeBytes":89,"sourceHtmlUrl":90},"assets\u002Flinter-checklist.md",5827,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fapm\u002Fblob\u002Fmain\u002F.apm\u002Fskills\u002Fapm-spec-guardian\u002Fassets\u002Flinter-checklist.md",{"path":92,"resourceType":83,"resourceTypeDesc":84,"sizeBytes":93,"sourceHtmlUrl":94},"assets\u002Fpanelist-return-schema.json",6855,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fapm\u002Fblob\u002Fmain\u002F.apm\u002Fskills\u002Fapm-spec-guardian\u002Fassets\u002Fpanelist-return-schema.json",{"path":96,"resourceType":83,"resourceTypeDesc":84,"sizeBytes":97,"sourceHtmlUrl":98},"assets\u002Fsynthesizer-return-schema.json",8086,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fapm\u002Fblob\u002Fmain\u002F.apm\u002Fskills\u002Fapm-spec-guardian\u002Fassets\u002Fsynthesizer-return-schema.json",[100,106,112,117,122,127],{"skillNo":101,"name":102,"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":103,"categories":104,"keywords":105,"publishedAt":52},"01M699JMZBYWPBT7JYWBSB95Z6","hello","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fapm\u002Fblob\u002Fmain\u002Ftests\u002Fintegration\u002Ffixtures\u002Ftarget_resolution\u002Fshared\u002Fminimal_skill\u002F.apm\u002Fskills\u002Fhello\u002FSKILL.md",[],[102],{"skillNo":107,"name":108,"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":109,"categories":110,"keywords":111,"publishedAt":52},"01M699JKAMZ4DH1PYJMXHE4FG4","placeholder","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fapm\u002Fblob\u002Fmain\u002Ftests\u002Fintegration\u002Ffixtures\u002Ftarget_resolution\u002Fs25_copilot_alias\u002F.apm\u002Fskills\u002Fplaceholder\u002FSKILL.md",[],[108],{"skillNo":113,"name":108,"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":114,"categories":115,"keywords":116,"publishedAt":52},"01M699JHR9DKJ7BZHAPF6DZX2Z","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fapm\u002Fblob\u002Fmain\u002Ftests\u002Fintegration\u002Ffixtures\u002Ftarget_resolution\u002Fs24_priority_override\u002F.apm\u002Fskills\u002Fplaceholder\u002FSKILL.md",[],[108],{"skillNo":118,"name":108,"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":119,"categories":120,"keywords":121,"publishedAt":52},"01M699JG5BJBZSWM25F1VMJ2H6","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fapm\u002Fblob\u002Fmain\u002Ftests\u002Fintegration\u002Ffixtures\u002Ftarget_resolution\u002Fs23_error_renderer\u002F.apm\u002Fskills\u002Fplaceholder\u002FSKILL.md",[],[108],{"skillNo":123,"name":108,"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":124,"categories":125,"keywords":126,"publishedAt":52},"01M699JEFSMBP3HNS061R15CE9","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fapm\u002Fblob\u002Fmain\u002Ftests\u002Fintegration\u002Ffixtures\u002Ftarget_resolution\u002Fs22_gemini_md_only\u002F.apm\u002Fskills\u002Fplaceholder\u002FSKILL.md",[],[108],{"skillNo":128,"name":108,"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":129,"categories":130,"keywords":131,"publishedAt":52},"01M699JCRCJCVZ3Z3RD8F9MXF5","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fapm\u002Fblob\u002Fmain\u002Ftests\u002Fintegration\u002Ffixtures\u002Ftarget_resolution\u002Fs21_codex_dir\u002F.apm\u002Fskills\u002Fplaceholder\u002FSKILL.md",[],[108]]