[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71FYEYAX06MK66W9YYB9FCE":3,"skill-same:01M71FYEYAX06MK66W9YYB9FCE":67},{"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":39,"linkOnly":40,"markdownContent":41,"markdownBody":42,"frontMatter":43,"refName":45,"commitSha":46,"skillDirectory":47,"forksCount":14,"repositoryHtmlUrl":48,"repositoryHomepageUrl":6,"ownerHtmlUrl":49,"ownerBlogUrl":50,"ownerDescription":51,"updatedAt":52,"install":53,"resources":66},"01M71FYEYAX06MK66W9YYB9FCE","open-pr",null,"PR opening protocol for VERIFICATION_READINESS, branch push, ready PR creation, and the first management pass. Invoked by exact name as a composed lifecycle protocol.","outcomeeng\u002Fplugins","outcomeeng","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F257335685?v=4","01M71FRVRF36XYR3HRSCGFHK2R","Outcome Engineering","01M71FRVS4BZG17DWANFJ7EPNY",1,"MIT","https:\u002F\u002Fgithub.com\u002Foutcomeeng\u002Fplugins\u002Fblob\u002Fmain\u002Fsrc\u002Fplugins\u002Fproduct-tree\u002Fskills\u002Fopen-pr\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"pr","open pr","open","verification","create","log","mktemp","Bash","URL","false","remote","gh pr","auth","parse","creation","get","show","branch","fetch","ready","2026-11-10 10:12:30",false,"---\nname: open-pr\nuser-invocable: false\ndescription: >-\n  PR opening protocol for VERIFICATION_READINESS, branch push, ready PR creation, and the first management pass. Invoked by exact name as a composed lifecycle protocol.\nallowed-tools: Read, Write, Glob, Grep,{!% if target == 'claude' %!} Agent,{!% else %!} {{! tool('spawn_agent') !}}, {{! tool('wait_agent') !}},{!% endif %!} Bash(spx worktree status:*), Bash(spx diagnose:*), Bash(gh auth status:*), Bash(git status:*), Bash(gh repo view:*), Bash(git remote get-url origin), Bash(git fetch:*), Bash(git merge-base:*), Bash(git diff:*), Bash(git rev-parse:*), Bash(gh pr view:*), Bash(git branch --show-current), Bash(git push -u origin HEAD:refs\u002Fheads\u002F*), Bash(git log:*), Bash(gh pr create:*), Bash(gh pr checks:*), Bash(mktemp -d), Bash(printf:*), {{! tool('use_skill') !}}\n---\n\n\u003Cobjective>\nA pull request opened ready for review.\n\u003C\u002Fobjective>\n\n\u003Cproject_specialization>\nAfter loading this skill, check whether `spx\u002Flocal\u002Fopen-pr.md` exists at the repository root. Read it if present and apply it as a product-specific addition to this flow (extra pre-flight checks, additional required body sections, project-specific push commands).\n\nThe overlay MUST NOT: skip or weaken the local deterministic-verification, evidence-auditor, or local-review predicates of `VERIFICATION_READINESS`, open the PR before `VERIFICATION_READINESS` holds, open the PR as a draft gating step, or weaken the upstream-safety check.\n\nProduction-relevance recognition, merge command, and local deterministic verification scope live in `spx\u002Flocal\u002Fmerging.md`, shared with \u002Fmanage-pr. The local deterministic-verification commands come from the project's own `{{! file('root_guide') !}}` convention, with the overlay allowed to centralize scope and escalation cases.\n\u003C\u002Fproject_specialization>\n\n\u003Cthe_opening_flow>\n\nWalk these steps in order. Every step is a routine workflow operation — verify, review, push, open — and runs directly. The opening flow contains no operator-confirmation pauses.\n\n**Step 0 — Load references.** {!% require_skill 'product-tree:merging-standards' %!} It supplies the shared vocabulary. {!% require_skill 'product-tree:commit-changes' %!} It supplies the commit type and scope classification. Follow \u002Fmerging-standards `\u003Creference_index>` and directly read its `merge-policy.md` reference before Step 1; invoking the compact loader alone does not load the tagged policy sections used below.\n\n**Step 1 — GATE: Pre-flight.** Run `spx worktree status` from the assigned root and require a fresh passing \u002Fmerging-standards `\u003Coccupancy_preflight>` before any checkout-sensitive mutation. Run `\u003Crepository_target_gate>`, every overlay-declared preflight check per `\u003Coverlay_safety_checks>`, then `\u003Cbranch_hygiene>` checks. Every condition must hold or the flow stops at the first failed condition. Run this step before the push; it guards the checkout state at publication time.\n\n\u003Crepository_target_gate>\n\n`gh pr create` names no repository, so it opens the PR against whatever `gh` resolves as the base — and for a fork `gh` resolves that to the **parent**, not to the repository the branch was pushed to. A flow that never resolves the target can therefore publish a branch to one repository and open a PR against a different organization's. Resolve both repositories and the operator's access class before the push, never after:\n\n```bash\npr_target=$(gh repo view --json isFork,parent,nameWithOwner --jq 'if .isFork then .parent.nameWithOwner else .nameWithOwner end')\npush_target=$(gh repo view \"$(git remote get-url origin)\" --json nameWithOwner --jq '.nameWithOwner')\naccess=$(gh repo view \"$pr_target\" --json viewerPermission --jq '.viewerPermission')\nprintf 'pr_target=%s push_target=%s access=%s\\n' \"$pr_target\" \"$push_target\" \"$access\"\n```\n\nEvery condition below must hold, each reported with the exact resolved values:\n\n- `access` is `ADMIN`, `MAINTAIN`, or `WRITE`. `READ`, `NONE`, or an empty result STOPS the flow — a pull request is never opened against a repository the operator does not control.\n- `pr_target` equals `push_target`. A difference means the checkout is a fork and `gh` has resolved the base to the upstream. STOP, name both repositories, and return the decision to the operator; never open the PR against an upstream on the strength of a resolved default.\n\n`pr_target` selects the parent when `isFork` is true, so it is the repository `gh pr create` opens against. `push_target` resolves the same repository through the `origin` URL, so comparing it with a bare `nameWithOwner` returns equal for every checkout, fork included, and the gate would pass without examining the case it exists to catch.\n\nAccess class comes from `viewerPermission` alone. A remote URL, the authenticated account name, or a successful push proves nothing about it: the operator owns repositories across several organizations, and neither `git remote` nor the account identity reports the permission that governs this one.\n\n\u003C\u002Frepository_target_gate>\n\n**Step 2 — GATE: Classify topology.** Run \u002Fmerging-standards `\u003Cbranch_topology>` peer or stacked gate. Repair or reclassify before pushing if the gate fails.\n\n\u003Cstep name=\"verification_readiness_decision\">\n\n**Step 3 — GATE: Evaluate `VERIFICATION_READINESS`.** Per \u002Fmerging-standards `\u003Cauthority_gates>`, the PR opens ready only when `VERIFICATION_READINESS` holds — all predicates below.\n\n*(a) Deterministic verification.* Run the project's local deterministic verification per \u002Fmerging-standards `\u003Clocal_deterministic_scope>` — validation and testing for the touched scope, escalating only when the overlay or risk evidence requires a wider local run. Capture verbose stdout\u002Fstderr in a log file inside a `mktemp -d` directory, inspect only the exit status, summary, and failing sections, and leave the directory in place. It must report success; fix failures and re-run until green.\n\nUse skill `product-tree:commit-changes` after deterministic verification passes and before any evidence Auditor or Reviewer agent session is dispatched. Confirm the worktree is clean and record the full checkpoint `HEAD`. After any further change, commit the new version before another evidence Auditor or Reviewer agent session reads it.\n\n*(b) Evidence-auditor predicates.* For each evidence Auditor the merge composition in \u002Fmerging-standards `\u003Cauthority_gates>` selects, apply \u002Fmerging-standards `\u003Cverification_dispatch_readiness>`, then dispatch it for the exact committed changeset as the `\u003Cauthority_gates>` evidence-audit predicate directs: `{{! subagent_name('product-tree', 'test-evidence-auditor') !}}` and `{{! subagent_name('product-tree', 'eval-evidence-auditor') !}}`, each for the owning node that predicate names. Handle rejected, failing, or unknown verdicts per \u002Fmerging-standards `\u003Cauditor_verdicts>`: repair the defect class, re-run deterministic verification, create a new checkpoint, and re-run that Auditor within the gate cap \u002Fmerging-standards `\u003Cauthority_gates>` states. A second counted rejection on an Auditor's gate stops the flow before the push, reporting the gate, both results with the run token of each Verifier that records a run, and the outstanding defect class; NEVER launch that Auditor a third time.\n\n*(c) Local review within the gate cap.* When the merge composition in \u002Fmerging-standards `\u003Cauthority_gates>` selects the local review, apply \u002Fmerging-standards `\u003Cverification_dispatch_readiness>`, then run the `{{! subagent_name('product-tree', 'changes-reviewer') !}}` agent on the exact committed changeset — it runs in an isolated agent session, so the verdict is not biased by work performed in the Author's agent session. Invoke it per \u002Fmerging-standards `\u003Clocal_review_invocation>` with only the raw committed scope and no interpretive scope, severity pre-filter, or instruction on what to emphasize; the Reviewer reads the repository's own instructions and the shared taxonomy itself. The Reviewer emits findings only (no decision\u002Fverdict); process its findings by **validity and phase** per \u002Fmerging-standards `\u003Creview_classification>` — this is the before-open phase:\n\n- **Validate each finding** against its cited rule, the product-local \u002F language \u002F product-tree governance, and the PDR\u002FADR decisions. Drop any finding the citation does not support.\n- **Apply every valid `BLOCKING` finding that belongs; route every `DEBT` finding on touched or invalidated text to its ruling.** Treat each valid finding as defect-class evidence: sweep the touched node(s) for parallel instances under the clause the finding cites, as the cited standard defines it, and the same source contract, evidence pattern, lifecycle step, or generated-source relationship. Fix the cited site and every instance that clause covers, change nothing the clause does not require, record each repair's clause and the check that shows its class closed for the next `VERIFICATION_DISPATCH_READY` record, commit via \u002Fcommit-changes, and re-invoke the Reviewer within the gate cap \u002Fmerging-standards `\u003Cauthority_gates>` states. A second counted rejection of the local review stops the flow before the push, reporting both results with the run token of each Verifier that records a run and the outstanding defect class; NEVER invoke the Reviewer a third time. When a valid `BLOCKING` finding's fix is too large to belong in this changeset, **split it out** — the work leaves the diff, recorded in the owning node's `ISSUES.md` with a reason naming why it is large — instead of applying it here. A `DEBT` finding on text the changeset touches or invalidates waits for a ruling per \u002Fmerging-standards `\u003Cauthority_gates>`; apply it only as the ruling directs, record the ruling before the PR exists in the commit-message form the recording-a-ruling bullet of the debt rulings paragraph of \u002Fmerging-standards `\u003Cauthority_gates>` states, record a finding a ruling accepts once in the governing node's `ISSUES.md` under a heading that ends with its entry key as three code spans per the accepted-finding paragraph of \u002Fmerging-standards `\u003Cauthority_gates>`, and it counts toward no gate's rejection cap.\n- **Passed** when the committed changeset carries no unapplied valid `BLOCKING` finding that belongs and no `DEBT` finding on touched or invalidated text without a ruling or `TRACKED` label. Severity never decides a `BLOCKING` finding; validity and the before-open phase do, and a ruling decides a `DEBT` finding.\n\nThe iteration accumulates commits on the branch — the eventual push at Step 4 sends them all. After every iteration that commits, re-run \u002Fmerging-standards `\u003Cbranch_hygiene>`, re-run local deterministic verification, and re-run the evidence-auditor predicates for touched evidence surfaces and the local review where the merge composition selects them — all `VERIFICATION_READINESS` predicates must hold together on the exact tree the push publishes (the joint gating of \u002Fmanage-pr Step 6: a verification-driven fix is a diff the review has not seen, an evidence-audit fix changes the evidence surface, and a review-driven fix is a tree verification has not covered). Every agentic re-run counts toward its own gate's cap; deterministic verification re-runs outside the cap. When a gate reaches its second counted rejection before one tree passes every predicate, the flow stops with no push and no PR, reporting that gate, both results with the run token of each Verifier that records a run, and the outstanding defect class. `VERIFICATION_READINESS` holds only when (a), (b), and (c) hold; only then proceed. The before-open pass is the strictest point in the lifecycle: every valid `BLOCKING` finding that belongs is applied here, every `DEBT` finding on touched or invalidated text is ruled, and only split-out work survives to the CI review, which on the open PR must show no unresolved finding on touched or invalidated text (a `BLOCKING` finding fixed, dropped as unbacked, or deferred by a recorded `ISSUES.md` entry naming why its fix is a separate larger concern; a `DEBT` finding ruled or labeled `TRACKED`).\n\n\u003C\u002Fstep>\n\n**Step 4 — GATE: Push.** Use the explicit destination ref form from \u002Fmerging-standards `\u003Cpush_semantics>`:\n\n```bash\nbranch=$(git branch --show-current)\ngit push -u origin HEAD:refs\u002Fheads\u002F\"${branch}\"\n```\n\nIf the product defines a custom branch-push command, follow {{! file('root_guide') !}} instead — the explicit destination ref must remain part of any custom command.\n\n**Step 5 — GATE: Open the PR ready.** The PR body is a payload: it spans lines and carries code spans, quotes, or shell metacharacters. It reaches `gh` through a file, never through a heredoc, a pipe, or an inline `--body` argument.\n\n- ALWAYS: write the body with the file-write tool to a file in the scratch directory the harness names for this session, under a file name unique to this agent and branch, such as `pr-body-\u003Cbranch-slug>-\u003Cagent-session-id>.md`. Where the harness names no scratch directory, use the one the hosting environment designates, such as `$RUNNER_TEMP` on a hosted runner.\n- ALWAYS: pass the file with `--body-file \u003Cbody-file>`, with the path written out literally.\n- NEVER: remove the body file; the harness clears its scratch directory.\n- NEVER: place the body file in the repository, in a fixed path, or in a directory shared by other sessions.\n\nThe PR opens `ready_for_review` because `VERIFICATION_READINESS` holds (Step 3); `gh pr create` defaults to ready, so no draft flag is passed. Write the body from `\u003Cbody_template>` to the file, then run:\n\n```bash\nGIT_TERMINAL_PROMPT=0 gh pr create --title \"\u003Ccommit-subject under 70 chars per \u002Fcommit-changes>\" --body-file \u003Cbody-file> --head \u003Cbranch>\n```\n\nResolve `\u003Cbranch>` with `git branch --show-current` first and write it literally.\n\nFlag rationale:\n\n- No `--draft` — the PR opens ready per \u002Fmerging-standards `\u003Cauthority_gates>`; `VERIFICATION_READINESS` (Step 3) is the gate that earns the open, and opening ready fires every CI review (Codex and the CI review) at once. A stacked PR is the one exception — pass `--draft` only when `\u003Cbranch_topology>` holds it draft until its base merges.\n- `--head` — the feature branch, stated explicitly so the head ref never depends on gh's inference. It suppresses gh's fork\u002Fpush-target prompt, which is safe only because `\u003Crepository_target_gate>` has already resolved and checked both repositories; without that gate the suppressed prompt would hide a cross-repository target rather than settle it.\n- `--base` — omit only for peer branches targeting the repo default; specify the previous stack branch for stacked PRs.\n- `GIT_TERMINAL_PROMPT=0` — disables git credential prompts. (gh detects non-TTY stdin\u002Fstdout and skips its own prompts automatically; no `GH_*` env var is needed.)\n\nDo not use `--fill`.\n\n**Step 6 — Start the first management pass.** {!% require_skill 'product-tree:manage-pr' %!} Resolve the PR number, then invoke `\u002Fmanage-pr` on that PR. `\u002Fmanage-pr` owns pending checks, CI review waits, reinspection, merge gates, and post-merge closeout evidence.\n\n**Exit.** Surface the PR URL. The managing flow takes over.\n\n\u003C\u002Fthe_opening_flow>\n\n\u003Ctitle_format>\n\nThe PR title is one commit-subject line under 70 characters per \u002Fcommit-changes:\n\n- Single commit on the branch -> use that commit's subject as-is.\n- Multiple commits -> synthesize one subject capturing the dominant type and scope. Read `git log --format=%s \u003Cbase>..HEAD`, pick the dominant type from \u002Fcommit-changes `\u003Ccommit_types>`, write a description that summarizes the change across the commits (not a commit list).\n\nExamples:\n\n```text\nfeat(auth): add OAuth2 token refresh\nfeat(auth): add SMS and authenticator-app two-factor support\nrefactor: extract validation into dedicated module\nfix(parser): handle nested expressions and empty operands\n```\n\n\u003C\u002Ftitle_format>\n\n\u003Cbody_template>\n\nThe PR body is markdown prose written to the scratch body file `\u003Cbody-file>` of Step 5. Default template:\n\n```text\n## Summary\n\n- \u003Cone or two short bullets describing the change at a glance>\n\n## Background\n\n\u003Ccontext: what motivated this change, what problem it solves, what user-visible behavior it affects>\n\n## Changes\n\n- \u003Cbulleted list of what was modified, grouped by area>\n\n## Test plan\n\n- [ ] \u003Cverification step the Reviewer can run>\n- [ ] \u003Cadditional check>\n\n## Refs\n\n- \u003Cfull spec node path>\n- \u003Cissue refs, e.g. Closes #123>\n```\n\nAdapt by change type:\n\n| Change type | Adaptation                                                                                |\n| ----------- | ----------------------------------------------------------------------------------------- |\n| Bug fix     | Add a **Root cause** subsection in Background. Test plan includes the failing repro.      |\n| Feature     | Expand Summary into a short user-facing description. Test plan lists acceptance criteria. |\n| Refactor    | State the no-behavior-change invariant. Test plan: \"existing tests still pass\".           |\n| Spec        | Link the spec nodes affected; describe what is now declared.                              |\n| Docs        | Drop Test plan; describe what readers gain.                                               |\n\nBody explains WHY for the Reviewer; the diff already shows WHAT. Reference spec nodes by full path from `spx\u002F`. No `\u003Cself_reference>` violations per \u002Fmerging-standards.\n\n\u003C\u002Fbody_template>\n\n\u003Cshell_scope>\n\nThe narrow Bash grants in frontmatter authorize approval-free execution. Run required consumer-declared commands from the product's root guide or active PR-opening specialization through normal harness per-call approval when they fall outside those grants, then continue the governed step without a separate lifecycle confirmation. When the harness exposes no approval path, stop with `MERGE_BLOCKED:project-command-approval-unavailable`, naming the command and declaring surface; never skip the command, widen `allowed-tools` during execution, or add repository-specific grants to this portable skill.\n\n\u003C\u002Fshell_scope>\n\n\u003Cfailure_modes>\n\n**Opened a PR gated on an earlier tree.** Claude established `VERIFICATION_READINESS`, then committed fixes during the repair iterations, and opened the PR without re-running deterministic verification and the evidence-auditor predicates and local review the merge composition selects on the final accumulated tree — so the opened diff was gated at an earlier state than the one CI receives. After every iteration that commits, re-run \u002Fmerging-standards `\u003Cbranch_hygiene>`, local deterministic verification, and the evidence-auditor predicates and local review the merge composition selects, treating `VERIFICATION_READINESS` as holding only when all predicates pass together on the exact tree the push publishes — never with the later-fixed predicate established before the last commit (Step 3).\n\n**Push rejection after local readiness.** Claude reached `VERIFICATION_READINESS`, then the explicit destination push was rejected because the remote branch advanced or credentials failed. For a remote advancement: {!% require_skill 'product-tree:sync-base' %!} Re-run it, re-establish `VERIFICATION_READINESS` on the resulting tree, and push again; for credentials or permission failure, stop with the exact command output and no PR mutation.\n\n**Duplicate PR already exists.** Claude attempted `gh pr create` on a branch that already had an open PR, because no pre-flight step looks up an existing PR. Detect an existing PR before creation or classify the `gh pr create` failure; switch to \u002Fmanage-pr for that PR instead of opening a second PR or changing the branch name.\n\n**Stacked topology opened ready too early.** Claude treated a stacked branch like a peer branch and opened it ready against the default base. When `\u003Cbranch_topology>` classifies a stack, set the previous stack branch as `--base` and keep the PR draft until its base merges; do not satisfy `VERIFICATION_READINESS` against the wrong base.\n\n**Repair stall.** Claude repeated deterministic, evidence-audit, and review fixes without reaching one tree where all predicates held, because each fix changed a tree that another predicate had not yet covered, so repairing one gate reopened another and nothing bounded the loop short of the cap. Stop when a gate reaches its second counted rejection or when the next fix would expand the changeset beyond the requested scope, record the split-out `BLOCKING` finding's concern in the owning node's `ISSUES.md`, and run one final deterministic verification and the evidence-auditor predicates and review the merge composition selects on the narrowed branch before opening.\n\n\u003C\u002Ffailure_modes>\n\n\u003Csuccess_criteria>\n\nThe opening flow has succeeded when:\n\n- \u002Fmerging-standards and \u002Fcommit-changes are loaded before the flow begins, `merge-policy.md` is read directly from \u002Fmerging-standards `\u003Creference_index>` before any tagged policy section is used, and a fresh `spx worktree status` reading passes `\u003Coccupancy_preflight>` before checkout-sensitive mutation.\n- `\u003Crepository_target_gate>` passed before push: `pr_target` and `push_target` were resolved and equal, and `viewerPermission` on `pr_target` returned `ADMIN`, `MAINTAIN`, or `WRITE`. All three values appear verbatim in the report.\n- \u002Fmerging-standards `\u003Cbranch_hygiene>` and `\u003Cbranch_topology>` gates pass before push.\n- `VERIFICATION_READINESS` held before the PR opened: local deterministic verification passed on the diff that will be pushed, every evidence-auditor predicate the merge composition selects passed, and the local review passed within the gate cap where the composition selects it — every valid `BLOCKING` finding that belongs was applied, any valid `BLOCKING` finding too large to belong was split out (recorded in the owning node's `ISSUES.md`), every `DEBT` finding on touched or invalidated text has a ruling that was acted on, and unbacked findings were dropped. Severity did not gate a `BLOCKING` finding; validity and the before-open phase did, and rulings decided `DEBT` findings.\n- Push uses the explicit destination ref form from \u002Fmerging-standards `\u003Cpush_semantics>`.\n- Title is one commit-subject line under 70 chars per \u002Fcommit-changes.\n- Body is written to a scratch file and delivered to gh via `--body-file \u003Cbody-file>` (real newlines), with no heredoc, pipe, or inline form.\n- The PR is opened `ready_for_review` (`gh pr create` with no `--draft`) once `VERIFICATION_READINESS` holds — except a stacked PR held draft per `\u003Cbranch_topology>`.\n- The first management pass starts after the PR opens; `\u002Fmanage-pr` owns any pending checks, CI review waits, reinspection, merge gates, and post-merge closeout evidence, including \u002Fmerging-standards `\u003Cpr_check_wait>`.\n- PR URL is surfaced to the user.\n- No `\u003Cself_reference>` violation per \u002Fmerging-standards.\n\n\u003C\u002Fsuccess_criteria>\n","\u003Cobjective>\nA pull request opened ready for review.\n\u003C\u002Fobjective>\n\n\u003Cproject_specialization>\nAfter loading this skill, check whether `spx\u002Flocal\u002Fopen-pr.md` exists at the repository root. Read it if present and apply it as a product-specific addition to this flow (extra pre-flight checks, additional required body sections, project-specific push commands).\n\nThe overlay MUST NOT: skip or weaken the local deterministic-verification, evidence-auditor, or local-review predicates of `VERIFICATION_READINESS`, open the PR before `VERIFICATION_READINESS` holds, open the PR as a draft gating step, or weaken the upstream-safety check.\n\nProduction-relevance recognition, merge command, and local deterministic verification scope live in `spx\u002Flocal\u002Fmerging.md`, shared with \u002Fmanage-pr. The local deterministic-verification commands come from the project's own `{{! file('root_guide') !}}` convention, with the overlay allowed to centralize scope and escalation cases.\n\u003C\u002Fproject_specialization>\n\n\u003Cthe_opening_flow>\n\nWalk these steps in order. Every step is a routine workflow operation — verify, review, push, open — and runs directly. The opening flow contains no operator-confirmation pauses.\n\n**Step 0 — Load references.** {!% require_skill 'product-tree:merging-standards' %!} It supplies the shared vocabulary. {!% require_skill 'product-tree:commit-changes' %!} It supplies the commit type and scope classification. Follow \u002Fmerging-standards `\u003Creference_index>` and directly read its `merge-policy.md` reference before Step 1; invoking the compact loader alone does not load the tagged policy sections used below.\n\n**Step 1 — GATE: Pre-flight.** Run `spx worktree status` from the assigned root and require a fresh passing \u002Fmerging-standards `\u003Coccupancy_preflight>` before any checkout-sensitive mutation. Run `\u003Crepository_target_gate>`, every overlay-declared preflight check per `\u003Coverlay_safety_checks>`, then `\u003Cbranch_hygiene>` checks. Every condition must hold or the flow stops at the first failed condition. Run this step before the push; it guards the checkout state at publication time.\n\n\u003Crepository_target_gate>\n\n`gh pr create` names no repository, so it opens the PR against whatever `gh` resolves as the base — and for a fork `gh` resolves that to the **parent**, not to the repository the branch was pushed to. A flow that never resolves the target can therefore publish a branch to one repository and open a PR against a different organization's. Resolve both repositories and the operator's access class before the push, never after:\n\n```bash\npr_target=$(gh repo view --json isFork,parent,nameWithOwner --jq 'if .isFork then .parent.nameWithOwner else .nameWithOwner end')\npush_target=$(gh repo view \"$(git remote get-url origin)\" --json nameWithOwner --jq '.nameWithOwner')\naccess=$(gh repo view \"$pr_target\" --json viewerPermission --jq '.viewerPermission')\nprintf 'pr_target=%s push_target=%s access=%s\\n' \"$pr_target\" \"$push_target\" \"$access\"\n```\n\nEvery condition below must hold, each reported with the exact resolved values:\n\n- `access` is `ADMIN`, `MAINTAIN`, or `WRITE`. `READ`, `NONE`, or an empty result STOPS the flow — a pull request is never opened against a repository the operator does not control.\n- `pr_target` equals `push_target`. A difference means the checkout is a fork and `gh` has resolved the base to the upstream. STOP, name both repositories, and return the decision to the operator; never open the PR against an upstream on the strength of a resolved default.\n\n`pr_target` selects the parent when `isFork` is true, so it is the repository `gh pr create` opens against. `push_target` resolves the same repository through the `origin` URL, so comparing it with a bare `nameWithOwner` returns equal for every checkout, fork included, and the gate would pass without examining the case it exists to catch.\n\nAccess class comes from `viewerPermission` alone. A remote URL, the authenticated account name, or a successful push proves nothing about it: the operator owns repositories across several organizations, and neither `git remote` nor the account identity reports the permission that governs this one.\n\n\u003C\u002Frepository_target_gate>\n\n**Step 2 — GATE: Classify topology.** Run \u002Fmerging-standards `\u003Cbranch_topology>` peer or stacked gate. Repair or reclassify before pushing if the gate fails.\n\n\u003Cstep name=\"verification_readiness_decision\">\n\n**Step 3 — GATE: Evaluate `VERIFICATION_READINESS`.** Per \u002Fmerging-standards `\u003Cauthority_gates>`, the PR opens ready only when `VERIFICATION_READINESS` holds — all predicates below.\n\n*(a) Deterministic verification.* Run the project's local deterministic verification per \u002Fmerging-standards `\u003Clocal_deterministic_scope>` — validation and testing for the touched scope, escalating only when the overlay or risk evidence requires a wider local run. Capture verbose stdout\u002Fstderr in a log file inside a `mktemp -d` directory, inspect only the exit status, summary, and failing sections, and leave the directory in place. It must report success; fix failures and re-run until green.\n\nUse skill `product-tree:commit-changes` after deterministic verification passes and before any evidence Auditor or Reviewer agent session is dispatched. Confirm the worktree is clean and record the full checkpoint `HEAD`. After any further change, commit the new version before another evidence Auditor or Reviewer agent session reads it.\n\n*(b) Evidence-auditor predicates.* For each evidence Auditor the merge composition in \u002Fmerging-standards `\u003Cauthority_gates>` selects, apply \u002Fmerging-standards `\u003Cverification_dispatch_readiness>`, then dispatch it for the exact committed changeset as the `\u003Cauthority_gates>` evidence-audit predicate directs: `{{! subagent_name('product-tree', 'test-evidence-auditor') !}}` and `{{! subagent_name('product-tree', 'eval-evidence-auditor') !}}`, each for the owning node that predicate names. Handle rejected, failing, or unknown verdicts per \u002Fmerging-standards `\u003Cauditor_verdicts>`: repair the defect class, re-run deterministic verification, create a new checkpoint, and re-run that Auditor within the gate cap \u002Fmerging-standards `\u003Cauthority_gates>` states. A second counted rejection on an Auditor's gate stops the flow before the push, reporting the gate, both results with the run token of each Verifier that records a run, and the outstanding defect class; NEVER launch that Auditor a third time.\n\n*(c) Local review within the gate cap.* When the merge composition in \u002Fmerging-standards `\u003Cauthority_gates>` selects the local review, apply \u002Fmerging-standards `\u003Cverification_dispatch_readiness>`, then run the `{{! subagent_name('product-tree', 'changes-reviewer') !}}` agent on the exact committed changeset — it runs in an isolated agent session, so the verdict is not biased by work performed in the Author's agent session. Invoke it per \u002Fmerging-standards `\u003Clocal_review_invocation>` with only the raw committed scope and no interpretive scope, severity pre-filter, or instruction on what to emphasize; the Reviewer reads the repository's own instructions and the shared taxonomy itself. The Reviewer emits findings only (no decision\u002Fverdict); process its findings by **validity and phase** per \u002Fmerging-standards `\u003Creview_classification>` — this is the before-open phase:\n\n- **Validate each finding** against its cited rule, the product-local \u002F language \u002F product-tree governance, and the PDR\u002FADR decisions. Drop any finding the citation does not support.\n- **Apply every valid `BLOCKING` finding that belongs; route every `DEBT` finding on touched or invalidated text to its ruling.** Treat each valid finding as defect-class evidence: sweep the touched node(s) for parallel instances under the clause the finding cites, as the cited standard defines it, and the same source contract, evidence pattern, lifecycle step, or generated-source relationship. Fix the cited site and every instance that clause covers, change nothing the clause does not require, record each repair's clause and the check that shows its class closed for the next `VERIFICATION_DISPATCH_READY` record, commit via \u002Fcommit-changes, and re-invoke the Reviewer within the gate cap \u002Fmerging-standards `\u003Cauthority_gates>` states. A second counted rejection of the local review stops the flow before the push, reporting both results with the run token of each Verifier that records a run and the outstanding defect class; NEVER invoke the Reviewer a third time. When a valid `BLOCKING` finding's fix is too large to belong in this changeset, **split it out** — the work leaves the diff, recorded in the owning node's `ISSUES.md` with a reason naming why it is large — instead of applying it here. A `DEBT` finding on text the changeset touches or invalidates waits for a ruling per \u002Fmerging-standards `\u003Cauthority_gates>`; apply it only as the ruling directs, record the ruling before the PR exists in the commit-message form the recording-a-ruling bullet of the debt rulings paragraph of \u002Fmerging-standards `\u003Cauthority_gates>` states, record a finding a ruling accepts once in the governing node's `ISSUES.md` under a heading that ends with its entry key as three code spans per the accepted-finding paragraph of \u002Fmerging-standards `\u003Cauthority_gates>`, and it counts toward no gate's rejection cap.\n- **Passed** when the committed changeset carries no unapplied valid `BLOCKING` finding that belongs and no `DEBT` finding on touched or invalidated text without a ruling or `TRACKED` label. Severity never decides a `BLOCKING` finding; validity and the before-open phase do, and a ruling decides a `DEBT` finding.\n\nThe iteration accumulates commits on the branch — the eventual push at Step 4 sends them all. After every iteration that commits, re-run \u002Fmerging-standards `\u003Cbranch_hygiene>`, re-run local deterministic verification, and re-run the evidence-auditor predicates for touched evidence surfaces and the local review where the merge composition selects them — all `VERIFICATION_READINESS` predicates must hold together on the exact tree the push publishes (the joint gating of \u002Fmanage-pr Step 6: a verification-driven fix is a diff the review has not seen, an evidence-audit fix changes the evidence surface, and a review-driven fix is a tree verification has not covered). Every agentic re-run counts toward its own gate's cap; deterministic verification re-runs outside the cap. When a gate reaches its second counted rejection before one tree passes every predicate, the flow stops with no push and no PR, reporting that gate, both results with the run token of each Verifier that records a run, and the outstanding defect class. `VERIFICATION_READINESS` holds only when (a), (b), and (c) hold; only then proceed. The before-open pass is the strictest point in the lifecycle: every valid `BLOCKING` finding that belongs is applied here, every `DEBT` finding on touched or invalidated text is ruled, and only split-out work survives to the CI review, which on the open PR must show no unresolved finding on touched or invalidated text (a `BLOCKING` finding fixed, dropped as unbacked, or deferred by a recorded `ISSUES.md` entry naming why its fix is a separate larger concern; a `DEBT` finding ruled or labeled `TRACKED`).\n\n\u003C\u002Fstep>\n\n**Step 4 — GATE: Push.** Use the explicit destination ref form from \u002Fmerging-standards `\u003Cpush_semantics>`:\n\n```bash\nbranch=$(git branch --show-current)\ngit push -u origin HEAD:refs\u002Fheads\u002F\"${branch}\"\n```\n\nIf the product defines a custom branch-push command, follow {{! file('root_guide') !}} instead — the explicit destination ref must remain part of any custom command.\n\n**Step 5 — GATE: Open the PR ready.** The PR body is a payload: it spans lines and carries code spans, quotes, or shell metacharacters. It reaches `gh` through a file, never through a heredoc, a pipe, or an inline `--body` argument.\n\n- ALWAYS: write the body with the file-write tool to a file in the scratch directory the harness names for this session, under a file name unique to this agent and branch, such as `pr-body-\u003Cbranch-slug>-\u003Cagent-session-id>.md`. Where the harness names no scratch directory, use the one the hosting environment designates, such as `$RUNNER_TEMP` on a hosted runner.\n- ALWAYS: pass the file with `--body-file \u003Cbody-file>`, with the path written out literally.\n- NEVER: remove the body file; the harness clears its scratch directory.\n- NEVER: place the body file in the repository, in a fixed path, or in a directory shared by other sessions.\n\nThe PR opens `ready_for_review` because `VERIFICATION_READINESS` holds (Step 3); `gh pr create` defaults to ready, so no draft flag is passed. Write the body from `\u003Cbody_template>` to the file, then run:\n\n```bash\nGIT_TERMINAL_PROMPT=0 gh pr create --title \"\u003Ccommit-subject under 70 chars per \u002Fcommit-changes>\" --body-file \u003Cbody-file> --head \u003Cbranch>\n```\n\nResolve `\u003Cbranch>` with `git branch --show-current` first and write it literally.\n\nFlag rationale:\n\n- No `--draft` — the PR opens ready per \u002Fmerging-standards `\u003Cauthority_gates>`; `VERIFICATION_READINESS` (Step 3) is the gate that earns the open, and opening ready fires every CI review (Codex and the CI review) at once. A stacked PR is the one exception — pass `--draft` only when `\u003Cbranch_topology>` holds it draft until its base merges.\n- `--head` — the feature branch, stated explicitly so the head ref never depends on gh's inference. It suppresses gh's fork\u002Fpush-target prompt, which is safe only because `\u003Crepository_target_gate>` has already resolved and checked both repositories; without that gate the suppressed prompt would hide a cross-repository target rather than settle it.\n- `--base` — omit only for peer branches targeting the repo default; specify the previous stack branch for stacked PRs.\n- `GIT_TERMINAL_PROMPT=0` — disables git credential prompts. (gh detects non-TTY stdin\u002Fstdout and skips its own prompts automatically; no `GH_*` env var is needed.)\n\nDo not use `--fill`.\n\n**Step 6 — Start the first management pass.** {!% require_skill 'product-tree:manage-pr' %!} Resolve the PR number, then invoke `\u002Fmanage-pr` on that PR. `\u002Fmanage-pr` owns pending checks, CI review waits, reinspection, merge gates, and post-merge closeout evidence.\n\n**Exit.** Surface the PR URL. The managing flow takes over.\n\n\u003C\u002Fthe_opening_flow>\n\n\u003Ctitle_format>\n\nThe PR title is one commit-subject line under 70 characters per \u002Fcommit-changes:\n\n- Single commit on the branch -> use that commit's subject as-is.\n- Multiple commits -> synthesize one subject capturing the dominant type and scope. Read `git log --format=%s \u003Cbase>..HEAD`, pick the dominant type from \u002Fcommit-changes `\u003Ccommit_types>`, write a description that summarizes the change across the commits (not a commit list).\n\nExamples:\n\n```text\nfeat(auth): add OAuth2 token refresh\nfeat(auth): add SMS and authenticator-app two-factor support\nrefactor: extract validation into dedicated module\nfix(parser): handle nested expressions and empty operands\n```\n\n\u003C\u002Ftitle_format>\n\n\u003Cbody_template>\n\nThe PR body is markdown prose written to the scratch body file `\u003Cbody-file>` of Step 5. Default template:\n\n```text\n## Summary\n\n- \u003Cone or two short bullets describing the change at a glance>\n\n## Background\n\n\u003Ccontext: what motivated this change, what problem it solves, what user-visible behavior it affects>\n\n## Changes\n\n- \u003Cbulleted list of what was modified, grouped by area>\n\n## Test plan\n\n- [ ] \u003Cverification step the Reviewer can run>\n- [ ] \u003Cadditional check>\n\n## Refs\n\n- \u003Cfull spec node path>\n- \u003Cissue refs, e.g. Closes #123>\n```\n\nAdapt by change type:\n\n| Change type | Adaptation                                                                                |\n| ----------- | ----------------------------------------------------------------------------------------- |\n| Bug fix     | Add a **Root cause** subsection in Background. Test plan includes the failing repro.      |\n| Feature     | Expand Summary into a short user-facing description. Test plan lists acceptance criteria. |\n| Refactor    | State the no-behavior-change invariant. Test plan: \"existing tests still pass\".           |\n| Spec        | Link the spec nodes affected; describe what is now declared.                              |\n| Docs        | Drop Test plan; describe what readers gain.                                               |\n\nBody explains WHY for the Reviewer; the diff already shows WHAT. Reference spec nodes by full path from `spx\u002F`. No `\u003Cself_reference>` violations per \u002Fmerging-standards.\n\n\u003C\u002Fbody_template>\n\n\u003Cshell_scope>\n\nThe narrow Bash grants in frontmatter authorize approval-free execution. Run required consumer-declared commands from the product's root guide or active PR-opening specialization through normal harness per-call approval when they fall outside those grants, then continue the governed step without a separate lifecycle confirmation. When the harness exposes no approval path, stop with `MERGE_BLOCKED:project-command-approval-unavailable`, naming the command and declaring surface; never skip the command, widen `allowed-tools` during execution, or add repository-specific grants to this portable skill.\n\n\u003C\u002Fshell_scope>\n\n\u003Cfailure_modes>\n\n**Opened a PR gated on an earlier tree.** Claude established `VERIFICATION_READINESS`, then committed fixes during the repair iterations, and opened the PR without re-running deterministic verification and the evidence-auditor predicates and local review the merge composition selects on the final accumulated tree — so the opened diff was gated at an earlier state than the one CI receives. After every iteration that commits, re-run \u002Fmerging-standards `\u003Cbranch_hygiene>`, local deterministic verification, and the evidence-auditor predicates and local review the merge composition selects, treating `VERIFICATION_READINESS` as holding only when all predicates pass together on the exact tree the push publishes — never with the later-fixed predicate established before the last commit (Step 3).\n\n**Push rejection after local readiness.** Claude reached `VERIFICATION_READINESS`, then the explicit destination push was rejected because the remote branch advanced or credentials failed. For a remote advancement: {!% require_skill 'product-tree:sync-base' %!} Re-run it, re-establish `VERIFICATION_READINESS` on the resulting tree, and push again; for credentials or permission failure, stop with the exact command output and no PR mutation.\n\n**Duplicate PR already exists.** Claude attempted `gh pr create` on a branch that already had an open PR, because no pre-flight step looks up an existing PR. Detect an existing PR before creation or classify the `gh pr create` failure; switch to \u002Fmanage-pr for that PR instead of opening a second PR or changing the branch name.\n\n**Stacked topology opened ready too early.** Claude treated a stacked branch like a peer branch and opened it ready against the default base. When `\u003Cbranch_topology>` classifies a stack, set the previous stack branch as `--base` and keep the PR draft until its base merges; do not satisfy `VERIFICATION_READINESS` against the wrong base.\n\n**Repair stall.** Claude repeated deterministic, evidence-audit, and review fixes without reaching one tree where all predicates held, because each fix changed a tree that another predicate had not yet covered, so repairing one gate reopened another and nothing bounded the loop short of the cap. Stop when a gate reaches its second counted rejection or when the next fix would expand the changeset beyond the requested scope, record the split-out `BLOCKING` finding's concern in the owning node's `ISSUES.md`, and run one final deterministic verification and the evidence-auditor predicates and review the merge composition selects on the narrowed branch before opening.\n\n\u003C\u002Ffailure_modes>\n\n\u003Csuccess_criteria>\n\nThe opening flow has succeeded when:\n\n- \u002Fmerging-standards and \u002Fcommit-changes are loaded before the flow begins, `merge-policy.md` is read directly from \u002Fmerging-standards `\u003Creference_index>` before any tagged policy section is used, and a fresh `spx worktree status` reading passes `\u003Coccupancy_preflight>` before checkout-sensitive mutation.\n- `\u003Crepository_target_gate>` passed before push: `pr_target` and `push_target` were resolved and equal, and `viewerPermission` on `pr_target` returned `ADMIN`, `MAINTAIN`, or `WRITE`. All three values appear verbatim in the report.\n- \u002Fmerging-standards `\u003Cbranch_hygiene>` and `\u003Cbranch_topology>` gates pass before push.\n- `VERIFICATION_READINESS` held before the PR opened: local deterministic verification passed on the diff that will be pushed, every evidence-auditor predicate the merge composition selects passed, and the local review passed within the gate cap where the composition selects it — every valid `BLOCKING` finding that belongs was applied, any valid `BLOCKING` finding too large to belong was split out (recorded in the owning node's `ISSUES.md`), every `DEBT` finding on touched or invalidated text has a ruling that was acted on, and unbacked findings were dropped. Severity did not gate a `BLOCKING` finding; validity and the before-open phase did, and rulings decided `DEBT` findings.\n- Push uses the explicit destination ref form from \u002Fmerging-standards `\u003Cpush_semantics>`.\n- Title is one commit-subject line under 70 chars per \u002Fcommit-changes.\n- Body is written to a scratch file and delivered to gh via `--body-file \u003Cbody-file>` (real newlines), with no heredoc, pipe, or inline form.\n- The PR is opened `ready_for_review` (`gh pr create` with no `--draft`) once `VERIFICATION_READINESS` holds — except a stacked PR held draft per `\u003Cbranch_topology>`.\n- The first management pass starts after the PR opens; `\u002Fmanage-pr` owns any pending checks, CI review waits, reinspection, merge gates, and post-merge closeout evidence, including \u002Fmerging-standards `\u003Cpr_check_wait>`.\n- PR URL is surfaced to the user.\n- No `\u003Cself_reference>` violation per \u002Fmerging-standards.\n\n\u003C\u002Fsuccess_criteria>\n",{"name":5,"description":7,"allowed-tools":44,"user-invocable":40},"Read, Write, Glob, Grep,{!% if target == 'claude' %!} Agent,{!% else %!} {{! tool('spawn_agent') !}}, {{! tool('wait_agent') !}},{!% endif %!} Bash(spx worktree status:*), Bash(spx diagnose:*), Bash(gh auth status:*), Bash(git status:*), Bash(gh repo view:*), Bash(git remote get-url origin), Bash(git fetch:*), Bash(git merge-base:*), Bash(git diff:*), Bash(git rev-parse:*), Bash(gh pr view:*), Bash(git branch --show-current), Bash(git push -u origin HEAD:refs\u002Fheads\u002F*), Bash(git log:*), Bash(gh pr create:*), Bash(gh pr checks:*), Bash(mktemp -d), Bash(printf:*), {{! tool('use_skill') !}}","main","978d51c51d68c99cffb2ba48f7cad9d2f07e5738","src\u002Fplugins\u002Fproduct-tree\u002Fskills\u002Fopen-pr","https:\u002F\u002Fgithub.com\u002Foutcomeeng\u002Fplugins","https:\u002F\u002Fgithub.com\u002Foutcomeeng","https:\u002F\u002Foutcome.engineering","Spec-driven development for AI-assisted engineering","2026-11-11 22:17:26",{"source":8,"skillName":5,"commands":54,"prompt":64,"zipAvailable":65},[55,58,61],{"tool":56,"command":57},"npx","npx skills add outcomeeng\u002Fplugins --skill open-pr",{"tool":59,"command":60},"bunx","bunx skills add outcomeeng\u002Fplugins --skill open-pr",{"tool":62,"command":63},"pnpm","pnpm dlx skills add outcomeeng\u002Fplugins --skill open-pr","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Foutcomeeng\u002Fplugins\u002Fblob\u002Fmain\u002Fsrc\u002Fplugins\u002Fproduct-tree\u002Fskills\u002Fopen-pr\u002FSKILL.md",true,[],[68,74,111,127,143,156],{"skillNo":69,"name":70,"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":71,"categories":72,"keywords":73,"publishedAt":39},"01M71G25RZTPQG9KJ00JCHC1F7","plugin","https:\u002F\u002Fgithub.com\u002Foutcomeeng\u002Fplugins\u002Fblob\u002Fmain\u002Fsrc\u002Ftemplates\u002Fplugin\u002FSKILL.md",[],[70],{"skillNo":75,"name":76,"nameZh":6,"description":77,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":78,"categories":79,"keywords":90,"publishedAt":39},"01M71G23DCX3SV60H63HBBKQ6J","sanitize-powerpoint","ALWAYS invoke this skill when sanitizing, cleaning up, auditing, or aligning a PowerPoint (.pptx) deck — slide-master and layout structure, layout type attributes, stray fonts, non-theme colors, or layout naming. NEVER hand-edit pptx XML without this skill.","https:\u002F\u002Fgithub.com\u002Foutcomeeng\u002Fplugins\u002Fblob\u002Fmain\u002Fsrc\u002Fplugins\u002Fwork\u002Fskills\u002Fsanitize-powerpoint\u002FSKILL.md",[80,85],{"categoryNo":81,"categoryName":82,"taxonomyType":83,"taxonomyTypeDesc":84},"01JBSEEDCAT000000000000003","演示文稿","SCENARIO","使用场景",{"categoryNo":86,"categoryName":87,"taxonomyType":88,"taxonomyTypeDesc":89},"01JBSEEDCAT000000000000034","行政与办公人员","PROFESSION","适用职业",[91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110],"sanitize powerpoint","powerpoint","sanitize","fonts","type","cleaning","structure","never","attributes","theme","pptx","naming","layout","deck","up","edit","xml","master","invoke","when",{"skillNo":112,"name":113,"nameZh":6,"description":114,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":115,"categories":116,"keywords":117,"publishedAt":39},"01M71G21PQKBCDECHGVYSKPJW5","draw-excalidraw","ALWAYS invoke this skill when creating Excalidraw diagrams, visualizing workflows, architectures, or concepts. NEVER generate Excalidraw JSON without this skill.","https:\u002F\u002Fgithub.com\u002Foutcomeeng\u002Fplugins\u002Fblob\u002Fmain\u002Fsrc\u002Fplugins\u002Fwork\u002Fskills\u002Fdraw-excalidraw\u002FSKILL.md",[],[118,119,120,121,122,98,109,123,124,110,125,126],"draw excalidraw","excalidraw","draw","diagrams","architectures","generate","workflows","concepts","json",{"skillNo":128,"name":129,"nameZh":6,"description":130,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":131,"categories":132,"keywords":136,"publishedAt":39},"01M71G1ZMNGFD37RZYM620XM2C","typescript-test-standards","TypeScript test standards enforced across all skills. Loaded by other skills, not invoked directly.","https:\u002F\u002Fgithub.com\u002Foutcomeeng\u002Fplugins\u002Fblob\u002Fmain\u002Fsrc\u002Fplugins\u002Ftypescript\u002Fskills\u002Ftypescript-test-standards\u002FSKILL.md",[133],{"categoryNo":134,"categoryName":135,"taxonomyType":83,"taxonomyTypeDesc":84},"01JBSEEDCAT000000000000008","测试与质量",[137,138,139,140,28,141,142],"typescript","typescript test standards","test","standards","read","across",{"skillNo":144,"name":145,"nameZh":6,"description":146,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":147,"categories":148,"keywords":152,"publishedAt":39},"01M71G1XBH0X1VCTR7269MDGSY","typescript-code-standards","TypeScript code standards enforced across all skills. Loaded by other skills, not invoked directly.","https:\u002F\u002Fgithub.com\u002Foutcomeeng\u002Fplugins\u002Fblob\u002Fmain\u002Fsrc\u002Fplugins\u002Ftypescript\u002Fskills\u002Ftypescript-code-standards\u002FSKILL.md",[149],{"categoryNo":150,"categoryName":151,"taxonomyType":88,"taxonomyTypeDesc":89},"01JBSEEDCAT000000000000030","开发工程师",[137,153,154,155,140,28,141,142],"code","typescript code standards","code standards",{"skillNo":157,"name":158,"nameZh":6,"description":159,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":160,"categories":161,"keywords":162,"publishedAt":39},"01M71G1TQ3VN45SJ75DFMJDB9W","typescript-architecture-standards","TypeScript ADR conventions enforced across architect and auditor skills. Loaded by other skills, not invoked directly.","https:\u002F\u002Fgithub.com\u002Foutcomeeng\u002Fplugins\u002Fblob\u002Fmain\u002Fsrc\u002Fplugins\u002Ftypescript\u002Fskills\u002Ftypescript-architecture-standards\u002FSKILL.md",[],[163,140,164,165,137,166,167,142,141,168,28,169],"architecture standards","typescript architecture standards","architecture","adr","architect","auditor","conventions"]