[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71P0GRT4SYZDTHEPKWPMN1H":3,"skill-same:01M71P0GRT4SYZDTHEPKWPMN1H":115},{"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":44,"commitSha":45,"skillDirectory":46,"forksCount":47,"repositoryHtmlUrl":48,"repositoryHomepageUrl":6,"ownerHtmlUrl":49,"ownerBlogUrl":50,"ownerDescription":51,"updatedAt":52,"install":53,"resources":66},"01M71P0GRT4SYZDTHEPKWPMN1H","verify-terminal-delivery",null,"Model-check with TLA+ that a background terminal's end and its emit-to-pi notifications reach the model of the Pi session that started it, under any order of process events, tool calls, and Pi run phases. Use after changing agent\u002Fextensions\u002Fbackground-terminals\u002F or upgrading Pi, before reporting the change as working, and when `vp run verify` fails on `verify:terminal-delivery-citations`.","drsh4dow\u002Fpi-setup","drsh4dow","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F45247070?v=4","01M71P068NASGHSWS11VWW416N","Daniel Moretti","01M71P0698BH81N65NP04X9NVN",10,"MIT","https:\u002F\u002Fgithub.com\u002Fdrsh4dow\u002Fpi-setup\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fverify-terminal-delivery\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"delivery","verify terminal delivery","terminal","verify","end","notifications","order","when","extensions","calls","with","TLA+","as","Citations","use","session","pi","check","model","tool","2026-11-10 10:56:23",false,"---\nname: verify-terminal-delivery\ndescription: Model-check with TLA+ that a background terminal's end and its emit-to-pi notifications reach the model of the Pi session that started it, under any order of process events, tool calls, and Pi run phases. Use after changing agent\u002Fextensions\u002Fbackground-terminals\u002F or upgrading Pi, before reporting the change as working, and when `vp run verify` fails on `verify:terminal-delivery-citations`.\n---\n\n# Verify background terminal delivery\n\n`bg_start` promises that a terminal's completion wakes the agent with its real exit, and that `emit-to-pi` sends the agent intermediate events. Three parties share that promise: the terminal manager (`manager.ts`, `session.ts`), the delivery queue (`delivery.ts`, `index.ts`), and Pi's run loop (`agent-session.js`, `agent-loop.js`). [`TerminalDelivery.tla`](TerminalDelivery.tla) models every order in which their callbacks run, and TLC checks all of them.\n\n- **Properties.** A terminal that settles on its own reaches the model with its final state (`CompletionWakesAgent`). A terminal that `bg_kill` ends reaches the model through the kill's result (`KillReachesAgent`). When the user can abort, every terminal's end still reaches Pi's queue or the transcript for the model's next request, including the end of a terminal whose `bg_kill` wait the user aborted (`EndReachesPi`). A notification reaches the model unless its terminal settles first (`NotificationReachesAgent`). No end and no notification reaches the model in two messages, and a `bg_kill` result that reports an end counts as one (`NoDoubleWake`). An unattended run shuts down with a terminal still running only after the model read three still-running notices without calling a tool (`UnattendedRunOutwaitsTerminals`).\n- **Harm.** The system prompt tells agents to end their turn and wait for the wake. A lost wake leaves a TUI session idle while the user waits for an answer, and makes a subagent report a pending status as its result. A double wake makes the agent act on one result twice.\n\n\"Reaches the model\" means a later model request contains it. \"Unattended\" means a print or JSON run, or a subagent's TUI session. Both end when the run settles, so the `agent_before_settle` handler waits for running terminals.\n\n## What the check covers\n\nRun the check after any change to these files, or to the Pi version in `bun.lock`. Each `\\* code:` citation in the spec names one of these functions, tools, or event handlers. Every model config runs the same spec, so they all cover the same code.\n\n| File under `agent\u002Fextensions\u002Fbackground-terminals\u002F` | Functions                                                                                                                      |\n| --------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------ |\n| `delivery.ts`                                       | `queue`, `flush`, `drain`, `enqueueNotification`, `takePending`, `waitForDelivery`                                             |\n| `index.ts`                                          | tools `bg_start`, `bg_status`, `bg_kill`; handlers `agent_before_settle`, `agent_settled`, `turn_end`; `MAX_IDLE_SETTLE_WAITS` |\n| `manager.ts`                                        | `settle`, `terminate`, `appendNotification`                                                                                    |\n| `session.ts`                                        | `join` (with its `kill`, `consume`, and `abandonKill`), `leave`                                                                |\n\nThe spec also cites Pi under `node_modules\u002F`, as installed from `bun.lock`. In `pi-coding-agent`'s `agent-session.js`, it cites `sendCustomMessage`, `_startRun`, `_handlePostAgentRun`, `_runBeforeSettleBoundary`, `_emitAgentSettled`, `isIdle`, `isCompacting`, `abort`, and `_clearManualCompactionState`. In `pi-agent-core`'s `agent-loop.js`, it cites `runLoop`. The sync commit below has both packages at 1.2.0.\n\nIn sync at `5e34079ec0fd2fa4976b249a81866e3533bf50d7`. Move this commit forward only after you confirm that the model describes the code above at the new commit.\n\nA change needs a model update when it adds, removes, or reorders a step that touches shared state. Shared state is `delivery.pending`, the settle waiter, a terminal's entry in the manager, Pi's steering queue and deferred actions, and whether Pi is running, settling, idle, or compacting. A change to rendering, output tails, or message text touches none of it.\n\n## Run the check\n\nFrom the checkout root:\n\n```bash\n.agents\u002Fskills\u002Fverify-terminal-delivery\u002Fscripts\u002Fcheck\n```\n\nIt needs Java 11 or newer on `PATH`, or in `JAVA`. The first run downloads TLC 1.7.4 to `${XDG_CACHE_HOME:-~\u002F.cache}\u002Fpi-setup\u002F` and checks its sha256. A run takes about 20 s.\n\nThe script does three things:\n\n1. It checks that every `\\* code:` citation in the spec still matches the code. If one does not, it stops before any model runs, because a model that no longer matches the code proves nothing. A citation names a file, a function, and a line copied from that function's body. For a tool, the function is its `name`. For an event handler, it is the event. `vp run verify` runs this step alone, as `scripts\u002Fcheck --citations`.\n2. It runs seven models that must hold. `Session.cfg` is a TUI session where the user can compact. `SessionNotifications.cfg` is a TUI session without compaction. `Aborts.cfg` adds user aborts. `UnattendedRun.cfg`, `UnattendedCompletion.cfg`, and `UnattendedRunHoldsNotification.cfg` are unattended runs. `AbortedKillIsSilent.cfg` is a TUI session with one terminal and user aborts, and checks `EndReachesPi`.\n3. It runs two models that reproduce known findings and must be violated. See [Known findings](#known-findings).\n\nExit 0 means every citation is current and each model matched the `\\* expect:` line at the top of its config. For a violated model, the script prints the broken property, such as `Invariant NoDoubleWake is violated` or `Temporal properties were violated`, then the counterexample as numbered steps. Each step names the action, the file and function it models, and the variables that changed. The full TLC output is in `${TMPDIR:-\u002Ftmp}\u002Fverify-terminal-delivery\u002F`.\n\n## Update the model for an intended change\n\n1. List the changed hunks with `git diff` from the sync commit on the files in [What the check covers](#what-the-check-covers).\n2. For each hunk, find the actions whose citation sits in it, or whose behavior it changes. Search the spec for the function name. Then read the changed function's callers, because the effect of a change often shows only at the call site. For example, whether `takePending` consumes its batches decides what the `agent_before_settle` handler delivers.\n3. Edit each action to do what the new code does. One action is one callback that runs to completion, or the part of an async function between two awaits that another callback can observe. Name a new action after the code. Prefix it with `T` for the terminal, `Tool` for a tool call, `BS` for the `agent_before_settle` handler, `P` for Pi, or `User`. Add it to `PiStep` or `Next`, and put a `\\* code:` citation above it. The last citation above an action labels it in traces. Add a newly cited function to the table in [What the check covers](#what-the-check-covers).\n4. Run the check.\n\nThe update is done when the check exits 0, or when it fails only on a finding you report. If a property fails after a faithful update, the change broke it. Report the counterexample. The properties and `Fairness` stay as they are.\n\n## Read a failure\n\n- **`stale citation`.** The cited line changed or was deleted. Open the action above the citation and compare it with the new code. If the behavior is the same, copy the new line into the citation. If the behavior changed, update the action first. Then cite the line of the same function that now does what the action models. If no line does, delete the citation, and keep at least one citation above the action so that traces still label it.\n- **`model error (TypeOK)`.** The spec gives a variable a value outside its type. Fix the spec.\n- **`TLC error`.** TLC could not parse or evaluate the spec. The script prints the error lines.\n- **`violated, expected holds`.** Walk the counterexample and open the cited code for each step. Then classify it:\n  - **Modeling error.** A step does something the code cannot do, such as steering a message while Pi is idle. Fix that action to match the code.\n  - **Timing artifact.** The model has no clock, so `BSWake` can time out at any moment. If the trace needs a 10-minute wait to end before a step that takes milliseconds, report the durations instead of calling it a bug.\n  - **Real bug.** Every step is possible in the code, in that order. Report it as steps in the code's terms, such as \"the terminal settles while `agent_settled` handlers run, so Pi defers its completion\".\n- **`holds, expected violated`.** The known finding no longer reproduces. Confirm which change fixed it, then update [Known findings](#known-findings) and the config's `\\* expect:` line.\n\nRead every result with the **statechart** skill, which says how to chart a broken PROPERTY, such as `CompletionWakesAgent`, as an invariant over settled states. In a scratch copy of the spec, `System` is the disjunction of the actions in `Fairness`. `CompactionHoldsNotification.cfg` breaks the invariant form of `NotificationReachesAgent`. `CompletionDeferredBehindRun.cfg` does not break the invariant form of `CompletionWakesAgent`, because its counterexample loops back to an earlier state, so give its TLC trace instead of a chart.\n\n## What the model assumes\n\n- **One event loop.** Each action runs without interruption. `Effect.runFork` runs `delivery.flush` before `queue` returns. Between the model's answer and the next request, Pi awaits other extensions' `agent_end` and `agent_settled` handlers, so terminal events can land there. Only this extension handles `agent_before_settle`.\n- **The model.** It calls at most one tool per answer, and now and then it answers without one. `NotificationReachesAgent` needs that, because a notification waits for the run to settle by design.\n- **Terminals.** A terminal may run forever and may send one notification. Exit, pipe close, and the process-group poll are one step, and so is the automatic termination after the pipe grace. A kill always ends the terminal, because `terminate` escalates to SIGKILL and then settles it.\n- **Pi.** `pi.sendMessage` steers while a run is active, defers while `agent_settled` handlers run, and starts a run while idle. Steering drains one message per poll. `ctx.signal` is undefined during `agent_before_settle`, so an abort does not end the settle wait.\n- **The user.** A TUI user may prompt, compact, or abort at any time, or never act again. Unattended runs have no user.\n- **Aborts.** After an abort, a completion that was steered into the aborted run waits in Pi's queue or the transcript for the user's next prompt. That is Pi's design for queued messages, so `Aborts.cfg` checks only `NoDoubleWake`, and `AbortedKillIsSilent.cfg` checks that each end reaches Pi rather than the model (`EndReachesPi`).\n- **Left out.** The 32-item queue eviction and `bg_list`'s `deliveryProblem`, the 256 KiB batch limit, the `agent_before_settle` error outcome, several clients that share one session, several `bg_kill` calls that wait on one terminal at once, session switches, and rendering.\n- **Bounds.** Two terminals, except one in `UnattendedCompletion.cfg`, where two terminals reproduce [Completion deferred behind a run](#completion-deferred-behind-a-run). With three terminals, every model that must hold still held, in 13 minutes. Raise `Terminals` in a config to rerun that bound.\n\n## Known findings\n\nEach finding is a config that must be violated. The script prints one trace for each.\n\n### Compaction holds notification\n\n`CompactionHoldsNotification.cfg`. In a TUI session, a notification that arrives during `\u002Fcompact`, or `\u002Ftree` with a summary, waits for the next completion, prompt, or settle. `queue` holds it because Pi is compacting, and compaction does not emit `agent_settled`.\n\n### Completion deferred behind a run\n\n`CompletionDeferredBehindRun.cfg`. A terminal settles while `agent_settled` handlers run, after this extension's handler flushed another message. Pi defers both messages. It runs the first as a new run and sends the second only after that run settles. In an unattended run, that run lasts as long as another terminal runs and the model keeps checking it. The window is the time other extensions' `agent_settled` handlers spend on I\u002FO.\n","# Verify background terminal delivery\n\n`bg_start` promises that a terminal's completion wakes the agent with its real exit, and that `emit-to-pi` sends the agent intermediate events. Three parties share that promise: the terminal manager (`manager.ts`, `session.ts`), the delivery queue (`delivery.ts`, `index.ts`), and Pi's run loop (`agent-session.js`, `agent-loop.js`). [`TerminalDelivery.tla`](TerminalDelivery.tla) models every order in which their callbacks run, and TLC checks all of them.\n\n- **Properties.** A terminal that settles on its own reaches the model with its final state (`CompletionWakesAgent`). A terminal that `bg_kill` ends reaches the model through the kill's result (`KillReachesAgent`). When the user can abort, every terminal's end still reaches Pi's queue or the transcript for the model's next request, including the end of a terminal whose `bg_kill` wait the user aborted (`EndReachesPi`). A notification reaches the model unless its terminal settles first (`NotificationReachesAgent`). No end and no notification reaches the model in two messages, and a `bg_kill` result that reports an end counts as one (`NoDoubleWake`). An unattended run shuts down with a terminal still running only after the model read three still-running notices without calling a tool (`UnattendedRunOutwaitsTerminals`).\n- **Harm.** The system prompt tells agents to end their turn and wait for the wake. A lost wake leaves a TUI session idle while the user waits for an answer, and makes a subagent report a pending status as its result. A double wake makes the agent act on one result twice.\n\n\"Reaches the model\" means a later model request contains it. \"Unattended\" means a print or JSON run, or a subagent's TUI session. Both end when the run settles, so the `agent_before_settle` handler waits for running terminals.\n\n## What the check covers\n\nRun the check after any change to these files, or to the Pi version in `bun.lock`. Each `\\* code:` citation in the spec names one of these functions, tools, or event handlers. Every model config runs the same spec, so they all cover the same code.\n\n| File under `agent\u002Fextensions\u002Fbackground-terminals\u002F` | Functions                                                                                                                      |\n| --------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------ |\n| `delivery.ts`                                       | `queue`, `flush`, `drain`, `enqueueNotification`, `takePending`, `waitForDelivery`                                             |\n| `index.ts`                                          | tools `bg_start`, `bg_status`, `bg_kill`; handlers `agent_before_settle`, `agent_settled`, `turn_end`; `MAX_IDLE_SETTLE_WAITS` |\n| `manager.ts`                                        | `settle`, `terminate`, `appendNotification`                                                                                    |\n| `session.ts`                                        | `join` (with its `kill`, `consume`, and `abandonKill`), `leave`                                                                |\n\nThe spec also cites Pi under `node_modules\u002F`, as installed from `bun.lock`. In `pi-coding-agent`'s `agent-session.js`, it cites `sendCustomMessage`, `_startRun`, `_handlePostAgentRun`, `_runBeforeSettleBoundary`, `_emitAgentSettled`, `isIdle`, `isCompacting`, `abort`, and `_clearManualCompactionState`. In `pi-agent-core`'s `agent-loop.js`, it cites `runLoop`. The sync commit below has both packages at 1.2.0.\n\nIn sync at `5e34079ec0fd2fa4976b249a81866e3533bf50d7`. Move this commit forward only after you confirm that the model describes the code above at the new commit.\n\nA change needs a model update when it adds, removes, or reorders a step that touches shared state. Shared state is `delivery.pending`, the settle waiter, a terminal's entry in the manager, Pi's steering queue and deferred actions, and whether Pi is running, settling, idle, or compacting. A change to rendering, output tails, or message text touches none of it.\n\n## Run the check\n\nFrom the checkout root:\n\n```bash\n.agents\u002Fskills\u002Fverify-terminal-delivery\u002Fscripts\u002Fcheck\n```\n\nIt needs Java 11 or newer on `PATH`, or in `JAVA`. The first run downloads TLC 1.7.4 to `${XDG_CACHE_HOME:-~\u002F.cache}\u002Fpi-setup\u002F` and checks its sha256. A run takes about 20 s.\n\nThe script does three things:\n\n1. It checks that every `\\* code:` citation in the spec still matches the code. If one does not, it stops before any model runs, because a model that no longer matches the code proves nothing. A citation names a file, a function, and a line copied from that function's body. For a tool, the function is its `name`. For an event handler, it is the event. `vp run verify` runs this step alone, as `scripts\u002Fcheck --citations`.\n2. It runs seven models that must hold. `Session.cfg` is a TUI session where the user can compact. `SessionNotifications.cfg` is a TUI session without compaction. `Aborts.cfg` adds user aborts. `UnattendedRun.cfg`, `UnattendedCompletion.cfg`, and `UnattendedRunHoldsNotification.cfg` are unattended runs. `AbortedKillIsSilent.cfg` is a TUI session with one terminal and user aborts, and checks `EndReachesPi`.\n3. It runs two models that reproduce known findings and must be violated. See [Known findings](#known-findings).\n\nExit 0 means every citation is current and each model matched the `\\* expect:` line at the top of its config. For a violated model, the script prints the broken property, such as `Invariant NoDoubleWake is violated` or `Temporal properties were violated`, then the counterexample as numbered steps. Each step names the action, the file and function it models, and the variables that changed. The full TLC output is in `${TMPDIR:-\u002Ftmp}\u002Fverify-terminal-delivery\u002F`.\n\n## Update the model for an intended change\n\n1. List the changed hunks with `git diff` from the sync commit on the files in [What the check covers](#what-the-check-covers).\n2. For each hunk, find the actions whose citation sits in it, or whose behavior it changes. Search the spec for the function name. Then read the changed function's callers, because the effect of a change often shows only at the call site. For example, whether `takePending` consumes its batches decides what the `agent_before_settle` handler delivers.\n3. Edit each action to do what the new code does. One action is one callback that runs to completion, or the part of an async function between two awaits that another callback can observe. Name a new action after the code. Prefix it with `T` for the terminal, `Tool` for a tool call, `BS` for the `agent_before_settle` handler, `P` for Pi, or `User`. Add it to `PiStep` or `Next`, and put a `\\* code:` citation above it. The last citation above an action labels it in traces. Add a newly cited function to the table in [What the check covers](#what-the-check-covers).\n4. Run the check.\n\nThe update is done when the check exits 0, or when it fails only on a finding you report. If a property fails after a faithful update, the change broke it. Report the counterexample. The properties and `Fairness` stay as they are.\n\n## Read a failure\n\n- **`stale citation`.** The cited line changed or was deleted. Open the action above the citation and compare it with the new code. If the behavior is the same, copy the new line into the citation. If the behavior changed, update the action first. Then cite the line of the same function that now does what the action models. If no line does, delete the citation, and keep at least one citation above the action so that traces still label it.\n- **`model error (TypeOK)`.** The spec gives a variable a value outside its type. Fix the spec.\n- **`TLC error`.** TLC could not parse or evaluate the spec. The script prints the error lines.\n- **`violated, expected holds`.** Walk the counterexample and open the cited code for each step. Then classify it:\n  - **Modeling error.** A step does something the code cannot do, such as steering a message while Pi is idle. Fix that action to match the code.\n  - **Timing artifact.** The model has no clock, so `BSWake` can time out at any moment. If the trace needs a 10-minute wait to end before a step that takes milliseconds, report the durations instead of calling it a bug.\n  - **Real bug.** Every step is possible in the code, in that order. Report it as steps in the code's terms, such as \"the terminal settles while `agent_settled` handlers run, so Pi defers its completion\".\n- **`holds, expected violated`.** The known finding no longer reproduces. Confirm which change fixed it, then update [Known findings](#known-findings) and the config's `\\* expect:` line.\n\nRead every result with the **statechart** skill, which says how to chart a broken PROPERTY, such as `CompletionWakesAgent`, as an invariant over settled states. In a scratch copy of the spec, `System` is the disjunction of the actions in `Fairness`. `CompactionHoldsNotification.cfg` breaks the invariant form of `NotificationReachesAgent`. `CompletionDeferredBehindRun.cfg` does not break the invariant form of `CompletionWakesAgent`, because its counterexample loops back to an earlier state, so give its TLC trace instead of a chart.\n\n## What the model assumes\n\n- **One event loop.** Each action runs without interruption. `Effect.runFork` runs `delivery.flush` before `queue` returns. Between the model's answer and the next request, Pi awaits other extensions' `agent_end` and `agent_settled` handlers, so terminal events can land there. Only this extension handles `agent_before_settle`.\n- **The model.** It calls at most one tool per answer, and now and then it answers without one. `NotificationReachesAgent` needs that, because a notification waits for the run to settle by design.\n- **Terminals.** A terminal may run forever and may send one notification. Exit, pipe close, and the process-group poll are one step, and so is the automatic termination after the pipe grace. A kill always ends the terminal, because `terminate` escalates to SIGKILL and then settles it.\n- **Pi.** `pi.sendMessage` steers while a run is active, defers while `agent_settled` handlers run, and starts a run while idle. Steering drains one message per poll. `ctx.signal` is undefined during `agent_before_settle`, so an abort does not end the settle wait.\n- **The user.** A TUI user may prompt, compact, or abort at any time, or never act again. Unattended runs have no user.\n- **Aborts.** After an abort, a completion that was steered into the aborted run waits in Pi's queue or the transcript for the user's next prompt. That is Pi's design for queued messages, so `Aborts.cfg` checks only `NoDoubleWake`, and `AbortedKillIsSilent.cfg` checks that each end reaches Pi rather than the model (`EndReachesPi`).\n- **Left out.** The 32-item queue eviction and `bg_list`'s `deliveryProblem`, the 256 KiB batch limit, the `agent_before_settle` error outcome, several clients that share one session, several `bg_kill` calls that wait on one terminal at once, session switches, and rendering.\n- **Bounds.** Two terminals, except one in `UnattendedCompletion.cfg`, where two terminals reproduce [Completion deferred behind a run](#completion-deferred-behind-a-run). With three terminals, every model that must hold still held, in 13 minutes. Raise `Terminals` in a config to rerun that bound.\n\n## Known findings\n\nEach finding is a config that must be violated. The script prints one trace for each.\n\n### Compaction holds notification\n\n`CompactionHoldsNotification.cfg`. In a TUI session, a notification that arrives during `\u002Fcompact`, or `\u002Ftree` with a summary, waits for the next completion, prompt, or settle. `queue` holds it because Pi is compacting, and compaction does not emit `agent_settled`.\n\n### Completion deferred behind a run\n\n`CompletionDeferredBehindRun.cfg`. A terminal settles while `agent_settled` handlers run, after this extension's handler flushed another message. Pi defers both messages. It runs the first as a new run and sends the second only after that run settles. In an unattended run, that run lasts as long as another terminal runs and the model keeps checking it. The window is the time other extensions' `agent_settled` handlers spend on I\u002FO.\n",{"name":5,"description":7},"main","f7936596c1ba2e1472dadccc3f111b9d517fa96c",".agents\u002Fskills\u002Fverify-terminal-delivery",2,"https:\u002F\u002Fgithub.com\u002Fdrsh4dow\u002Fpi-setup","https:\u002F\u002Fgithub.com\u002Fdrsh4dow","https:\u002F\u002Fdanielmoretti.com\u002F","Toss A Coin To Your Witcher :pirate_flag: ","2026-11-03 22:13:53",{"source":8,"skillName":5,"commands":54,"prompt":64,"zipAvailable":65},[55,58,61],{"tool":56,"command":57},"npx","npx skills add drsh4dow\u002Fpi-setup --skill verify-terminal-delivery",{"tool":59,"command":60},"bunx","bunx skills add drsh4dow\u002Fpi-setup --skill verify-terminal-delivery",{"tool":62,"command":63},"pnpm","pnpm dlx skills add drsh4dow\u002Fpi-setup --skill verify-terminal-delivery","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fdrsh4dow\u002Fpi-setup\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fverify-terminal-delivery\u002FSKILL.md",true,[67,73,77,81,85,91,95,99,103,107,111],{"path":68,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":71,"sourceHtmlUrl":72},"AbortedKillIsSilent.cfg","OTHER","其他",234,"https:\u002F\u002Fgithub.com\u002Fdrsh4dow\u002Fpi-setup\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fverify-terminal-delivery\u002FAbortedKillIsSilent.cfg",{"path":74,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":75,"sourceHtmlUrl":76},"Aborts.cfg",216,"https:\u002F\u002Fgithub.com\u002Fdrsh4dow\u002Fpi-setup\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fverify-terminal-delivery\u002FAborts.cfg",{"path":78,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":79,"sourceHtmlUrl":80},"CompactionHoldsNotification.cfg",235,"https:\u002F\u002Fgithub.com\u002Fdrsh4dow\u002Fpi-setup\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fverify-terminal-delivery\u002FCompactionHoldsNotification.cfg",{"path":82,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":83,"sourceHtmlUrl":84},"CompletionDeferredBehindRun.cfg",237,"https:\u002F\u002Fgithub.com\u002Fdrsh4dow\u002Fpi-setup\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fverify-terminal-delivery\u002FCompletionDeferredBehindRun.cfg",{"path":86,"resourceType":87,"resourceTypeDesc":88,"sizeBytes":89,"sourceHtmlUrl":90},"scripts\u002Fcheck","SCRIPT","脚本",6089,"https:\u002F\u002Fgithub.com\u002Fdrsh4dow\u002Fpi-setup\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fverify-terminal-delivery\u002Fscripts\u002Fcheck",{"path":92,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":93,"sourceHtmlUrl":94},"Session.cfg",264,"https:\u002F\u002Fgithub.com\u002Fdrsh4dow\u002Fpi-setup\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fverify-terminal-delivery\u002FSession.cfg",{"path":96,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":97,"sourceHtmlUrl":98},"SessionNotifications.cfg",252,"https:\u002F\u002Fgithub.com\u002Fdrsh4dow\u002Fpi-setup\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fverify-terminal-delivery\u002FSessionNotifications.cfg",{"path":100,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":101,"sourceHtmlUrl":102},"TerminalDelivery.tla",28345,"https:\u002F\u002Fgithub.com\u002Fdrsh4dow\u002Fpi-setup\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fverify-terminal-delivery\u002FTerminalDelivery.tla",{"path":104,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":105,"sourceHtmlUrl":106},"UnattendedCompletion.cfg",228,"https:\u002F\u002Fgithub.com\u002Fdrsh4dow\u002Fpi-setup\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fverify-terminal-delivery\u002FUnattendedCompletion.cfg",{"path":108,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":109,"sourceHtmlUrl":110},"UnattendedRun.cfg",274,"https:\u002F\u002Fgithub.com\u002Fdrsh4dow\u002Fpi-setup\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fverify-terminal-delivery\u002FUnattendedRun.cfg",{"path":112,"resourceType":69,"resourceTypeDesc":70,"sizeBytes":113,"sourceHtmlUrl":114},"UnattendedRunHoldsNotification.cfg",232,"https:\u002F\u002Fgithub.com\u002Fdrsh4dow\u002Fpi-setup\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fverify-terminal-delivery\u002FUnattendedRunHoldsNotification.cfg",[116,137,169,186,207,218],{"skillNo":117,"name":118,"nameZh":6,"description":119,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":120,"categories":121,"keywords":122,"publishedAt":39},"01M71P4GPJMBK21BTZBKY9T8EE","changelog","Write the changelog entry for a pull request. Use when a PR changes behavior that users, operators, or integrators can notice.","https:\u002F\u002Fgithub.com\u002Fdrsh4dow\u002Fpi-setup\u002Fblob\u002Fmain\u002Fevals\u002Fharness-lessons\u002Ffixtures\u002Fchangelog-skill\u002FSKILL.md",[],[118,123,124,125,126,127,128,129,130,131,132,133,134,33,26,135,136],"users","pull","notice","changes","operators","pr","pull request","for","request","behavior","entry","write","can","changelog entry",{"skillNo":138,"name":139,"nameZh":6,"description":140,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":141,"categories":142,"keywords":153,"publishedAt":39},"01M71P4E9AZM56JBY227P2G1SC","writing-good-tickets","Write, file, or update an issue or ticket that an agent or a developer can take to one PR. Use when filing a bug or feature, updating an issue, or breaking a plan into tickets.","https:\u002F\u002Fgithub.com\u002Fdrsh4dow\u002Fpi-setup\u002Fblob\u002Fmain\u002Fagent\u002Fskills\u002Fwriting-good-tickets\u002FSKILL.md",[143,148],{"categoryNo":144,"categoryName":145,"taxonomyType":146,"taxonomyTypeDesc":147},"01JBSEEDCAT000000000000018","写作与文案","SCENARIO","使用场景",{"categoryNo":149,"categoryName":150,"taxonomyType":151,"taxonomyTypeDesc":152},"01JBSEEDCAT000000000000036","内容创作者","PROFESSION","适用职业",[154,155,156,157,128,158,159,160,33,161,26,162,163,135,164,165,134,166,167,168],"good","writing","tickets","writing good tickets","feature","filing","ticket","false","file","one","plan","update","bug","take","issue",{"skillNo":170,"name":171,"nameZh":6,"description":172,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":173,"categories":174,"keywords":177,"publishedAt":39},"01M71P4C0B0DXTRRSG9RA6Y687","writing-good-prs","Write or update a pull request title and body that a reviewer can trust and own. Use when opening a PR or editing its description.","https:\u002F\u002Fgithub.com\u002Fdrsh4dow\u002Fpi-setup\u002Fblob\u002Fmain\u002Fagent\u002Fskills\u002Fwriting-good-prs\u002FSKILL.md",[175,176],{"categoryNo":144,"categoryName":145,"taxonomyType":146,"taxonomyTypeDesc":147},{"categoryNo":149,"categoryName":150,"taxonomyType":151,"taxonomyTypeDesc":152},[154,178,155,179,124,180,128,181,33,161,26,135,182,183,129,131,165,134,184,185],"prs","writing good prs","trust","editing","reviewer","title","opening a pr","body",{"skillNo":187,"name":188,"nameZh":6,"description":189,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":190,"categories":191,"keywords":194,"publishedAt":39},"01M71P49D1AG2MR6AYNPMMT34Z","writing-good-commits","Write or reword a git commit message and size the commit it describes. Use when committing, or when reshaping commits during a rebase.","https:\u002F\u002Fgithub.com\u002Fdrsh4dow\u002Fpi-setup\u002Fblob\u002Fmain\u002Fagent\u002Fskills\u002Fwriting-good-commits\u002FSKILL.md",[192,193],{"categoryNo":144,"categoryName":145,"taxonomyType":146,"taxonomyTypeDesc":147},{"categoryNo":149,"categoryName":150,"taxonomyType":151,"taxonomyTypeDesc":152},[195,154,155,196,197,198,134,199,200,201,33,161,202,203,26,204,205,206],"commits","writing good commits","message","size","git commit message","git","git commit","rebase","commit message","committing","commit","it",{"skillNo":208,"name":209,"nameZh":6,"description":210,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":211,"categories":212,"keywords":215,"publishedAt":39},"01M71P480BDE55JMPVVEBCFS7P","writing-for-agents","Writing documents for agents. Use when creating or editing skills, or modifying AGENTS.md or CLAUDE.md.","https:\u002F\u002Fgithub.com\u002Fdrsh4dow\u002Fpi-setup\u002Fblob\u002Fmain\u002Fagent\u002Fskills\u002Fwriting-for-agents\u002FSKILL.md",[213,214],{"categoryNo":144,"categoryName":145,"taxonomyType":146,"taxonomyTypeDesc":147},{"categoryNo":149,"categoryName":150,"taxonomyType":151,"taxonomyTypeDesc":152},[216,130,155,181,33,161,217,26],"writing for agents","documents",{"skillNo":219,"name":220,"nameZh":6,"description":221,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":222,"categories":223,"keywords":224,"publishedAt":39},"01M71P45SNCD7DDSA6FRVCPA17","wizard","Generate an interactive bash wizard that walks a human through steps only they can perform. Use when provisioning infrastructure, setting up credentials or CI secrets, walking an unfamiliar third-party dashboard, or running a one-off migration or cutover. Don't invoke this for steps the agent can perform itself.","https:\u002F\u002Fgithub.com\u002Fdrsh4dow\u002Fpi-setup\u002Fblob\u002Fmain\u002Fagent\u002Fskills\u002Fwizard\u002FSKILL.md",[],[220,225,226,130,227,228,229,230,33,231,161,26,232,163,233,135,234,235,236,237],"running","setting","up","ci","provisioning infrastructure","only","invoke","Bash","interactive","credentials","dashboard","generate","human"]