[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6N9AJS49AW39A1R3CXMM1RR":3,"skill-same:01M6N9AJS49AW39A1R3CXMM1RR":69},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":22,"publishedAt":43,"linkOnly":44,"markdownContent":45,"markdownBody":46,"frontMatter":47,"refName":48,"commitSha":49,"skillDirectory":50,"forksCount":51,"repositoryHtmlUrl":52,"repositoryHomepageUrl":6,"ownerHtmlUrl":53,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":54,"install":55,"resources":68},"01M6N9AJS49AW39A1R3CXMM1RR","bubbles-result-envelope",null,"Compose a valid Bubbles result envelope at the end of every agent invocation. Use when finishing any Bubbles agent task and about to return control to the orchestrator, when routing work to another specialist via a packet, or when emitting a continuation envelope from a read-only\u002Fadvisory surface. Covers outcome vocabulary, finding accounting, addressedFindings\u002FunresolvedFindings, and next-owner routing.","pkirsanov\u002Fsmackerel","pkirsanov","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F138962?v=4","01M6N8NAPD2KXMVC17X6GJ0WZ5","01M6N8NATQ9SAZ00H9D61R0TPV",1,"MIT","https:\u002F\u002Fgithub.com\u002Fpkirsanov\u002Fsmackerel\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fbubbles-result-envelope\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000040","财务","PROFESSION","适用职业",[23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42],"bubbles result envelope","result","next","continuation","read-only","about","via","end","control","advisory","valid","task","accounting","compose","only","use","outcome","orchestrator","work","routing","2026-11-10 10:12:30",false,"---\nname: bubbles-result-envelope\ndescription: Compose a valid Bubbles result envelope at the end of every agent invocation. Use when finishing any Bubbles agent task and about to return control to the orchestrator, when routing work to another specialist via a packet, or when emitting a continuation envelope from a read-only\u002Fadvisory surface. Covers outcome vocabulary, finding accounting, addressedFindings\u002FunresolvedFindings, and next-owner routing.\n---\n\n# Bubbles Result Envelope\n\n## Goal\nReturn work to `bubbles.workflow` (or another orchestrator) with a machine-readable envelope that carries enough provenance for the next routing decision, without hiding deferred findings or claiming work that did not happen.\n\n## When to use\n- End of every `bubbles.*` agent invocation\n- Returning from a subagent dispatch\n- Emitting a continuation envelope from `bubbles.recap`, `bubbles.status`, `bubbles.handoff`, `bubbles.super`\n- Routing a foreign-artifact finding to its owner\n\n## Repository Binding (repository-sensitive invocations)\n\nBefore consuming or emitting a repository-sensitive result, validate the inherited actionable packet with `bubbles\u002Fscripts\u002Frepository-binding.sh validate-packet`. The RESULT-ENVELOPE echoes this exact closed field set unchanged:\n\n- `repositoryRoot`\n- `repositoryAlias`\n- `repositoryResolution.sessionId`\n- `repositoryResolution.decisionId`\n- `repositoryResolution.controlRevision`\n- `repositoryResolution.controlPathDigest`\n- `repositoryResolution.authority`\n- `repositoryResolution.transition`\n- `repositoryResolution.scopeKind`\n- `repositoryResolution.scopeId`\n- `repositoryResolution.targetKind`\n- `repositoryResolution.pathVisibility`\n- `repositoryResolution.actionable`\n\nStale revisions, root substitution, cross-scope substitution, malformed packets, and public\u002Fredacted projections are refusals. Public projections use `\u003Credacted-local-root>` with `repositoryResolution.pathVisibility: redacted` and `repositoryResolution.actionable: false`; they are non-actionable and cannot resume or dispatch work.\n\n## Envelope shape (terminal — completion or block)\n```\n## RESULT-ENVELOPE\nagent: bubbles.\u003Cname>\nmode: \u003Cworkflow-mode>\nspec: specs\u002F\u003CNNN-feature>\nscope: SCOPE-\u003Cid>          # if applicable\noutcome: completed_owned | completed_diagnostic | route_required | blocked\naddressedFindings:\n  - \u003Cfinding-id>: \u003Cone-line resolution + evidence ref>\nunresolvedFindings:\n  - \u003Cfinding-id>: \u003Cone-line reason + suggested owner>\nnextRequiredOwner: bubbles.\u003Cname>   # only when outcome=route_required or blocked\nreason: \u003Cone-line explanation>\nevidenceRefs:\n  - specs\u002F\u003CNNN>\u002Freport.md#\u003Csection>\n  - specs\u002F\u003CNNN>\u002Fscopes.md#scope-\u003Cid>\n```\n\n## Envelope shape (continuation — advisory surfaces)\nFor recap\u002Fstatus\u002Fhandoff\u002Fsuper and read-only outputs that suggest how to continue:\n```\n## CONTINUATION-ENVELOPE\ntarget: specs\u002F\u003CNNN-feature>\nintent: \u003Cone-line natural-language goal>\npreferredWorkflowMode: \u003Cmode-from-workflows.yaml>\ntags: [\u003Crouting-tag>, ...]\nreason: \u003Cwhy this is the next step>\nprovenance:                          # binding provenance (IMP-025 MR3)\n  repositoryRoot: \u003Cgit-toplevel-of-edited-repo>\n  agentSourceRoot: \u003Crepo-slug the active agent was installed for>\n  frameworkVersion: \u003Cinstalled Bubbles version>\nworkBoundary:                        # immutable task scope (IMP-100 R6, optional)\n  repositoryRoots: [\u003Crepo-slug>, ...]      # the ONLY repos this task may modify\n  specTargets: [specs\u002F\u003CNNN-feature>, ...]  # optional: the in-scope specs\n  allowedPaths: [\u003Cglob>, ...]              # optional: in-scope paths (dir\u002F**, dir\u002F, exact)\n  crossRepoPolicy: forbidden               # forbidden (default) | authorized\n```\n\nThe orchestrator routes continuation envelopes through `bubbles.workflow`, not directly to a specialist.\n\nAfter terminal completion, a read-only surface emits the schema-valid redacted repository projection: `repositoryRoot: \u003Credacted-local-root>`, `repositoryResolution.pathVisibility: redacted`, `repositoryResolution.actionable: false`, `target: none`, and `preferredWorkflowMode: none`. Repository alias and remaining decision provenance stay unchanged. Any possible next priority is listed outside the envelope as `not started`; a new explicit request must establish fresh authority before work begins.\n\n**Binding provenance (multi-root, IMP-025 MR3).** The `provenance` block lets a resumed\nsession verify it is still bound to the intended repository + agent source. On resume, the\norchestrator MUST validate that the envelope's `agentSourceRoot` still matches the\n`repositoryRoot` being edited (reuse `bubbles\u002Fscripts\u002Frepo-binding-preflight.sh\n--repo-root \u003CrepositoryRoot> --agent-source \u003CagentSourceRoot>`); a mismatch is a REFUSE\n(the resumed run is bound to a different workspace root than the handoff assumed). Canonical\nframework-source work sets `agentSourceRoot` to the framework slug and passes via\n`--canonical-source`. Omitting the block is permitted only for single-root sessions where\nthe marker is absent (the preflight is advisory there); populate it whenever the\n`.install-source.json` `targetRepoSlug` marker exists. See\n[docs\u002Fguides\u002FAI_ENVIRONMENT.md](..\u002F..\u002Fdocs\u002Fguides\u002FAI_ENVIRONMENT.md) (Multi-Root Workspaces).\n\n**Work boundary (anti-wandering, IMP-100 R6).** The optional `workBoundary` block declares\nthe immutable scope of the requested task so a session cannot drift into unrelated work (the\n\"works on repo A, starts fixing repo B\" failure mode). Before touching any candidate change,\nthe orchestrator consults `bubbles\u002Fscripts\u002Fwork-boundary-resolve.sh --feature-dir \u003Cspec>\n--candidate-repo \u003Cslug> [--candidate-spec \u003Cid>] [--candidate-path \u003Cpath>]`, which classifies\nthe candidate as `in-boundary` (proceed inline), `route-same-repo` (unrelated same-repo →\nfile\u002Froute a finding, never inline-fix), `route-cross-repo` (a different repo, allowed ONLY\nwhen `crossRepoPolicy: authorized`), or `refuse-cross-repo` (a different repo under the\ndefault `forbidden` policy → REFUSE). The block is opt-in + backward-compatible: absent it,\nevery candidate resolves `in-boundary`. A present-but-malformed boundary is fail-closed\n(exit 2). It composes with `repo-binding-preflight.sh` (which guards the agent-source install\nbinding); the boundary guards the per-task ALLOWED SCOPE. Unrelated same-repo findings are\nfiled\u002Frouted; different-repo findings are route-only unless the user authorized a cross-repo\nscenario.\n\n## Outcome vocabulary (canonical)\nState-modifying and diagnostic agents MUST end with EXACTLY ONE of these four outcomes (per `agents\u002Fbubbles_shared\u002Fvalidation-core.md` and `evidence-rules.md`; enforced by `bubbles\u002Fscripts\u002Faudit-result-contract-lint.sh`):\n| Outcome | When to use |\n|---------|-------------|\n| `completed_owned` | A state-modifying agent finished its owned work: all owned DoD items `[x]` with evidence, no unresolved findings, all gates pass |\n| `completed_diagnostic` | A read-only\u002Fanalysis agent (audit, review, regression, security, …) finished its diagnostic pass: findings packaged for owners, no owned DoD to check |\n| `route_required` | Found work that belongs to another specialist; package it as a finding with `nextRequiredOwner`. This is an **upward return to the active top-level runner**, which performs the next dispatch. You MUST NOT dispatch that owner yourself: a subagent on this runtime has no dispatch tool at all, so the call would not fail loudly, it would silently do nothing and tempt you to do the work inline and record it as a delegation. |\n| `blocked` | Cannot proceed; external dependency, missing input, or mechanical gate refuses |\n\n`done_with_concerns` is **legacy read-only compatibility only** (pre-G092 specs carrying `legacyStatusCompatibility:true`); it is **not** a valid new RESULT-ENVELOPE outcome. To ship non-blocking notes, validate certifies `done` with an `observations[]` array (severity `low`\u002F`medium`), or a diagnostic agent surfaces observation-shaped findings (`followUpOwner`\u002F`followUpAction`) for the orchestrator to attach — see [completion-governance.md](..\u002F..\u002Fagents\u002Fbubbles_shared\u002Fcompletion-governance.md#legacy-status-done_with_concerns). Anything warranting `high` severity is `blocked`, not a concern.\n\n## Finding accounting (NON-NEGOTIABLE)\nEvery finding raised in this invocation MUST appear in EXACTLY ONE of:\n- `addressedFindings` (fixed in this scope, evidence linked)\n- `unresolvedFindings` (routed to owner)\n- `observations[]` (non-blocking `low`\u002F`medium` notes attached to `completed_owned` or a validate-certified `done`, per completion-governance.md — never used to launder a gate failure)\n\nA finding that disappears between rounds is the cherry-pick anti-pattern and is blocked by the workflow agent's post-fix-cycle verification.\n\n## Learning disposition (mutable runs)\n\nClosing an envelope after a run that CHANGED something is the moment to answer\none question: did this run teach anything worth keeping? Record the answer in the\noptional `learning` object. There are exactly three legal answers.\n\n| `disposition` | Means | Also required |\n|---|---|---|\n| `captured` | A lesson was written | `lessonId` naming it |\n| `not-applicable` | The run produced nothing generalizable | nothing |\n| `deferred` | A lesson is owed but was not written now | `reason`, 20+ characters |\n\n```json\n\"learning\": { \"disposition\": \"captured\", \"lessonId\": \"lesson-9f2c1a\" }\n```\n\nWrite the lesson with `bubbles.sh lessons add --problem … --root-cause … --fix …\n--applies-when …`, which returns the id and compacts the file.\n\n**This is not a quota.** `execution-ops.md` argues that forcing one lesson per run\nmanufactures filler and degrades clustering, and that argument is preserved\nintact. `not-applicable` is a legitimate, common, and unquestioned answer. What\nis recorded is that the decision was MADE — an agent that decided correctly used\nto leave no trace of having decided at all.\n\n`result-envelope-validate.sh` refuses only what it can falsify: `captured` with\nno resolvable `lessonId`, and `deferred` with a reason shorter than twenty\ncharacters. Omitting the whole object stays valid.\n\n## Common mistakes\n- **Claiming `completed_owned` while leaving unchecked DoD items** — guard rejects this.\n- **A diagnostic agent emitting `completed_owned`** — read-only\u002Fanalysis agents own no DoD; they emit `completed_diagnostic`.\n- **Emitting `done_with_concerns` as a current outcome** — it is legacy-read-only; use `completed_owned`\u002F`completed_diagnostic` with `observations[]` for non-blocking notes, or `blocked` for anything a gate would refuse. Never use an observation to dodge a fixable bug.\n- **Setting `nextRequiredOwner` to `bubbles.workflow`** — workflow is the dispatcher, not the next owner. Name the actual specialist.\n- **Using `@bubbles.X` in envelope or output** — the slash convention applies everywhere: `\u002Fbubbles.X` only.\n- **Claiming `learning.disposition: captured` without writing the lesson** — the validator refuses it in every mode, including `--advisory`.\n\n## Workflow-only continuation (NON-NEGOTIABLE)\nRead-only\u002Fadvisory surfaces (recap, status, handoff, super, retro, recommend-first) MUST suggest `\u002Fbubbles.workflow \u003Cmode>` for continuation, not `\u002Fbubbles.implement`, `\u002Fbubbles.test`, `\u002Fbubbles.validate`, or `\u002Fbubbles.audit` directly. Direct specialist commands are valid only when the user explicitly requests a surgical invocation.\n\n## Authoritative modules\n- `agents\u002Fbubbles_shared\u002Fworkflow-orchestration-core.md` — envelope schema + dispatcher contract\n- `agents\u002Fbubbles_shared\u002Fworkflow-delegation-core.md` — natural-language intent routing\n- `agents\u002Fbubbles_shared\u002Fworkflow-execution-loops.md` — per-round synchronous completion\n- `agents\u002Fbubbles_shared\u002Fworkflow-fix-cycle-protocol.md` — finding-set closure during remediation\n- `agents\u002Fbubbles_shared\u002Fagent-common.md` — Workflow-Only Continuation section\n","# Bubbles Result Envelope\n\n## Goal\nReturn work to `bubbles.workflow` (or another orchestrator) with a machine-readable envelope that carries enough provenance for the next routing decision, without hiding deferred findings or claiming work that did not happen.\n\n## When to use\n- End of every `bubbles.*` agent invocation\n- Returning from a subagent dispatch\n- Emitting a continuation envelope from `bubbles.recap`, `bubbles.status`, `bubbles.handoff`, `bubbles.super`\n- Routing a foreign-artifact finding to its owner\n\n## Repository Binding (repository-sensitive invocations)\n\nBefore consuming or emitting a repository-sensitive result, validate the inherited actionable packet with `bubbles\u002Fscripts\u002Frepository-binding.sh validate-packet`. The RESULT-ENVELOPE echoes this exact closed field set unchanged:\n\n- `repositoryRoot`\n- `repositoryAlias`\n- `repositoryResolution.sessionId`\n- `repositoryResolution.decisionId`\n- `repositoryResolution.controlRevision`\n- `repositoryResolution.controlPathDigest`\n- `repositoryResolution.authority`\n- `repositoryResolution.transition`\n- `repositoryResolution.scopeKind`\n- `repositoryResolution.scopeId`\n- `repositoryResolution.targetKind`\n- `repositoryResolution.pathVisibility`\n- `repositoryResolution.actionable`\n\nStale revisions, root substitution, cross-scope substitution, malformed packets, and public\u002Fredacted projections are refusals. Public projections use `\u003Credacted-local-root>` with `repositoryResolution.pathVisibility: redacted` and `repositoryResolution.actionable: false`; they are non-actionable and cannot resume or dispatch work.\n\n## Envelope shape (terminal — completion or block)\n```\n## RESULT-ENVELOPE\nagent: bubbles.\u003Cname>\nmode: \u003Cworkflow-mode>\nspec: specs\u002F\u003CNNN-feature>\nscope: SCOPE-\u003Cid>          # if applicable\noutcome: completed_owned | completed_diagnostic | route_required | blocked\naddressedFindings:\n  - \u003Cfinding-id>: \u003Cone-line resolution + evidence ref>\nunresolvedFindings:\n  - \u003Cfinding-id>: \u003Cone-line reason + suggested owner>\nnextRequiredOwner: bubbles.\u003Cname>   # only when outcome=route_required or blocked\nreason: \u003Cone-line explanation>\nevidenceRefs:\n  - specs\u002F\u003CNNN>\u002Freport.md#\u003Csection>\n  - specs\u002F\u003CNNN>\u002Fscopes.md#scope-\u003Cid>\n```\n\n## Envelope shape (continuation — advisory surfaces)\nFor recap\u002Fstatus\u002Fhandoff\u002Fsuper and read-only outputs that suggest how to continue:\n```\n## CONTINUATION-ENVELOPE\ntarget: specs\u002F\u003CNNN-feature>\nintent: \u003Cone-line natural-language goal>\npreferredWorkflowMode: \u003Cmode-from-workflows.yaml>\ntags: [\u003Crouting-tag>, ...]\nreason: \u003Cwhy this is the next step>\nprovenance:                          # binding provenance (IMP-025 MR3)\n  repositoryRoot: \u003Cgit-toplevel-of-edited-repo>\n  agentSourceRoot: \u003Crepo-slug the active agent was installed for>\n  frameworkVersion: \u003Cinstalled Bubbles version>\nworkBoundary:                        # immutable task scope (IMP-100 R6, optional)\n  repositoryRoots: [\u003Crepo-slug>, ...]      # the ONLY repos this task may modify\n  specTargets: [specs\u002F\u003CNNN-feature>, ...]  # optional: the in-scope specs\n  allowedPaths: [\u003Cglob>, ...]              # optional: in-scope paths (dir\u002F**, dir\u002F, exact)\n  crossRepoPolicy: forbidden               # forbidden (default) | authorized\n```\n\nThe orchestrator routes continuation envelopes through `bubbles.workflow`, not directly to a specialist.\n\nAfter terminal completion, a read-only surface emits the schema-valid redacted repository projection: `repositoryRoot: \u003Credacted-local-root>`, `repositoryResolution.pathVisibility: redacted`, `repositoryResolution.actionable: false`, `target: none`, and `preferredWorkflowMode: none`. Repository alias and remaining decision provenance stay unchanged. Any possible next priority is listed outside the envelope as `not started`; a new explicit request must establish fresh authority before work begins.\n\n**Binding provenance (multi-root, IMP-025 MR3).** The `provenance` block lets a resumed\nsession verify it is still bound to the intended repository + agent source. On resume, the\norchestrator MUST validate that the envelope's `agentSourceRoot` still matches the\n`repositoryRoot` being edited (reuse `bubbles\u002Fscripts\u002Frepo-binding-preflight.sh\n--repo-root \u003CrepositoryRoot> --agent-source \u003CagentSourceRoot>`); a mismatch is a REFUSE\n(the resumed run is bound to a different workspace root than the handoff assumed). Canonical\nframework-source work sets `agentSourceRoot` to the framework slug and passes via\n`--canonical-source`. Omitting the block is permitted only for single-root sessions where\nthe marker is absent (the preflight is advisory there); populate it whenever the\n`.install-source.json` `targetRepoSlug` marker exists. See\n[docs\u002Fguides\u002FAI_ENVIRONMENT.md](..\u002F..\u002Fdocs\u002Fguides\u002FAI_ENVIRONMENT.md) (Multi-Root Workspaces).\n\n**Work boundary (anti-wandering, IMP-100 R6).** The optional `workBoundary` block declares\nthe immutable scope of the requested task so a session cannot drift into unrelated work (the\n\"works on repo A, starts fixing repo B\" failure mode). Before touching any candidate change,\nthe orchestrator consults `bubbles\u002Fscripts\u002Fwork-boundary-resolve.sh --feature-dir \u003Cspec>\n--candidate-repo \u003Cslug> [--candidate-spec \u003Cid>] [--candidate-path \u003Cpath>]`, which classifies\nthe candidate as `in-boundary` (proceed inline), `route-same-repo` (unrelated same-repo →\nfile\u002Froute a finding, never inline-fix), `route-cross-repo` (a different repo, allowed ONLY\nwhen `crossRepoPolicy: authorized`), or `refuse-cross-repo` (a different repo under the\ndefault `forbidden` policy → REFUSE). The block is opt-in + backward-compatible: absent it,\nevery candidate resolves `in-boundary`. A present-but-malformed boundary is fail-closed\n(exit 2). It composes with `repo-binding-preflight.sh` (which guards the agent-source install\nbinding); the boundary guards the per-task ALLOWED SCOPE. Unrelated same-repo findings are\nfiled\u002Frouted; different-repo findings are route-only unless the user authorized a cross-repo\nscenario.\n\n## Outcome vocabulary (canonical)\nState-modifying and diagnostic agents MUST end with EXACTLY ONE of these four outcomes (per `agents\u002Fbubbles_shared\u002Fvalidation-core.md` and `evidence-rules.md`; enforced by `bubbles\u002Fscripts\u002Faudit-result-contract-lint.sh`):\n| Outcome | When to use |\n|---------|-------------|\n| `completed_owned` | A state-modifying agent finished its owned work: all owned DoD items `[x]` with evidence, no unresolved findings, all gates pass |\n| `completed_diagnostic` | A read-only\u002Fanalysis agent (audit, review, regression, security, …) finished its diagnostic pass: findings packaged for owners, no owned DoD to check |\n| `route_required` | Found work that belongs to another specialist; package it as a finding with `nextRequiredOwner`. This is an **upward return to the active top-level runner**, which performs the next dispatch. You MUST NOT dispatch that owner yourself: a subagent on this runtime has no dispatch tool at all, so the call would not fail loudly, it would silently do nothing and tempt you to do the work inline and record it as a delegation. |\n| `blocked` | Cannot proceed; external dependency, missing input, or mechanical gate refuses |\n\n`done_with_concerns` is **legacy read-only compatibility only** (pre-G092 specs carrying `legacyStatusCompatibility:true`); it is **not** a valid new RESULT-ENVELOPE outcome. To ship non-blocking notes, validate certifies `done` with an `observations[]` array (severity `low`\u002F`medium`), or a diagnostic agent surfaces observation-shaped findings (`followUpOwner`\u002F`followUpAction`) for the orchestrator to attach — see [completion-governance.md](..\u002F..\u002Fagents\u002Fbubbles_shared\u002Fcompletion-governance.md#legacy-status-done_with_concerns). Anything warranting `high` severity is `blocked`, not a concern.\n\n## Finding accounting (NON-NEGOTIABLE)\nEvery finding raised in this invocation MUST appear in EXACTLY ONE of:\n- `addressedFindings` (fixed in this scope, evidence linked)\n- `unresolvedFindings` (routed to owner)\n- `observations[]` (non-blocking `low`\u002F`medium` notes attached to `completed_owned` or a validate-certified `done`, per completion-governance.md — never used to launder a gate failure)\n\nA finding that disappears between rounds is the cherry-pick anti-pattern and is blocked by the workflow agent's post-fix-cycle verification.\n\n## Learning disposition (mutable runs)\n\nClosing an envelope after a run that CHANGED something is the moment to answer\none question: did this run teach anything worth keeping? Record the answer in the\noptional `learning` object. There are exactly three legal answers.\n\n| `disposition` | Means | Also required |\n|---|---|---|\n| `captured` | A lesson was written | `lessonId` naming it |\n| `not-applicable` | The run produced nothing generalizable | nothing |\n| `deferred` | A lesson is owed but was not written now | `reason`, 20+ characters |\n\n```json\n\"learning\": { \"disposition\": \"captured\", \"lessonId\": \"lesson-9f2c1a\" }\n```\n\nWrite the lesson with `bubbles.sh lessons add --problem … --root-cause … --fix …\n--applies-when …`, which returns the id and compacts the file.\n\n**This is not a quota.** `execution-ops.md` argues that forcing one lesson per run\nmanufactures filler and degrades clustering, and that argument is preserved\nintact. `not-applicable` is a legitimate, common, and unquestioned answer. What\nis recorded is that the decision was MADE — an agent that decided correctly used\nto leave no trace of having decided at all.\n\n`result-envelope-validate.sh` refuses only what it can falsify: `captured` with\nno resolvable `lessonId`, and `deferred` with a reason shorter than twenty\ncharacters. Omitting the whole object stays valid.\n\n## Common mistakes\n- **Claiming `completed_owned` while leaving unchecked DoD items** — guard rejects this.\n- **A diagnostic agent emitting `completed_owned`** — read-only\u002Fanalysis agents own no DoD; they emit `completed_diagnostic`.\n- **Emitting `done_with_concerns` as a current outcome** — it is legacy-read-only; use `completed_owned`\u002F`completed_diagnostic` with `observations[]` for non-blocking notes, or `blocked` for anything a gate would refuse. Never use an observation to dodge a fixable bug.\n- **Setting `nextRequiredOwner` to `bubbles.workflow`** — workflow is the dispatcher, not the next owner. Name the actual specialist.\n- **Using `@bubbles.X` in envelope or output** — the slash convention applies everywhere: `\u002Fbubbles.X` only.\n- **Claiming `learning.disposition: captured` without writing the lesson** — the validator refuses it in every mode, including `--advisory`.\n\n## Workflow-only continuation (NON-NEGOTIABLE)\nRead-only\u002Fadvisory surfaces (recap, status, handoff, super, retro, recommend-first) MUST suggest `\u002Fbubbles.workflow \u003Cmode>` for continuation, not `\u002Fbubbles.implement`, `\u002Fbubbles.test`, `\u002Fbubbles.validate`, or `\u002Fbubbles.audit` directly. Direct specialist commands are valid only when the user explicitly requests a surgical invocation.\n\n## Authoritative modules\n- `agents\u002Fbubbles_shared\u002Fworkflow-orchestration-core.md` — envelope schema + dispatcher contract\n- `agents\u002Fbubbles_shared\u002Fworkflow-delegation-core.md` — natural-language intent routing\n- `agents\u002Fbubbles_shared\u002Fworkflow-execution-loops.md` — per-round synchronous completion\n- `agents\u002Fbubbles_shared\u002Fworkflow-fix-cycle-protocol.md` — finding-set closure during remediation\n- `agents\u002Fbubbles_shared\u002Fagent-common.md` — Workflow-Only Continuation section\n",{"name":5,"description":7},"main","ed893cc338281a0bb9bb9ecf3415716cb242bb3f",".claude\u002Fskills\u002Fbubbles-result-envelope",0,"https:\u002F\u002Fgithub.com\u002Fpkirsanov\u002Fsmackerel","https:\u002F\u002Fgithub.com\u002Fpkirsanov","2026-11-07 02:54:37",{"source":8,"skillName":5,"commands":56,"prompt":66,"zipAvailable":67},[57,60,63],{"tool":58,"command":59},"npx","npx skills add pkirsanov\u002Fsmackerel --skill bubbles-result-envelope",{"tool":61,"command":62},"bunx","bunx skills add pkirsanov\u002Fsmackerel --skill bubbles-result-envelope",{"tool":64,"command":65},"pnpm","pnpm dlx skills add pkirsanov\u002Fsmackerel --skill bubbles-result-envelope","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fpkirsanov\u002Fsmackerel\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fbubbles-result-envelope\u002FSKILL.md",true,[],[70,100,127,154,175,202],{"skillNo":71,"name":72,"nameZh":6,"description":73,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":74,"categories":75,"keywords":81,"publishedAt":43},"01M6N9V5TBHQT20V5SCCJ1VRBC","smackerel-trace-capture","Wire Smackerel's concrete validate-plane stack into the framework trace-driven defect-discovery method. Use when running live-category tests (integration\u002Fe2e\u002Fe2e-ui\u002Fstress) against the ephemeral test stack; capturing SLO or trace evidence; hunting latency\u002Ferror\u002Fperf bugs from spans; querying the test-stack Jaeger or Prometheus; or touching `.specify\u002Fruntime\u002Fobservability`. Concrete smackerel endpoints + the exact `capture-slo.sh` command; do NOT duplicate `bubbles-observability-adapter` — this only adds the wiring.","https:\u002F\u002Fgithub.com\u002Fpkirsanov\u002Fsmackerel\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fsmackerel-trace-capture\u002FSKILL.md",[76],{"categoryNo":77,"categoryName":78,"taxonomyType":79,"taxonomyTypeDesc":80},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",[82,83,84,85,86,87,88,89,90,38,91,37,92,93,94,95,96,97,98,99],"trace","capture","smackerel trace capture","perf","observability","prometheus","specify","e2e","discovery","slo","evidence","do","latency","runtime","tests","adapter","error","bugs",{"skillNo":101,"name":102,"nameZh":6,"description":103,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":104,"categories":105,"keywords":109,"publishedAt":43},"01M6N9TZDEV26RZ7W34HEFPQE9","smackerel-no-defaults","Enforce Smackerel's NO-DEFAULTS \u002F fail-loud SST policy. Use when editing config, Docker Compose, deploy adapters, docs, instructions, skills, env handling, host bind addresses, or any runtime value that could be hidden by fallback syntax.","https:\u002F\u002Fgithub.com\u002Fpkirsanov\u002Fsmackerel\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fsmackerel-no-defaults\u002FSKILL.md",[106],{"categoryNo":107,"categoryName":108,"taxonomyType":79,"taxonomyTypeDesc":80},"01JBSEEDCAT000000000000011","运维与部署",[110,111,112,113,114,115,116,117,118,38,36,119,95,120,121,122,123,124,125,126],"smackerel no defaults","docker","policy","config","deploy","docker compose","syntax","editing","instructions","enforce","bind","env","host","Adapters","sst","addresses","value",{"skillNo":128,"name":129,"nameZh":6,"description":130,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":131,"categories":132,"keywords":136,"publishedAt":43},"01M6N9TJRS5PF83JH2W4614D4W","bubbles-workflow-mode-resolution","Resolve a Bubbles workflow mode against `bubbles\u002Fworkflows.yaml`, including template inheritance, status ceilings, gate wiring, and decision policy. Use when picking a mode for a request, when a guard reports a mode-related failure, or when extending workflows.yaml with a new mode or template. Covers natural-language intent routing and the workflow registry consistency rules.","https:\u002F\u002Fgithub.com\u002Fpkirsanov\u002Fsmackerel\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fbubbles-workflow-mode-resolution\u002FSKILL.md",[133],{"categoryNo":134,"categoryName":135,"taxonomyType":79,"taxonomyTypeDesc":80},"01JBSEEDCAT000000000000023","Skill与智能体开发",[137,138,139,140,112,141,42,142,143,144,145,38,146,147,148,149,150,151,152,153],"workflow","resolution","mode","bubbles workflow mode resolution","workflows","guard","template","decision","Rules","reports","intent","inheritance","with","consistency","natural-language","for","wiring",{"skillNo":155,"name":156,"nameZh":6,"description":157,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":158,"categories":159,"keywords":161,"publishedAt":43},"01M6N9TC98D6DJR0D64SSN0SN3","bubbles-workflow-execution-loops","Run per-round synchronous workflow execution loops correctly. Use when orchestrating a multi-round workflow, dispatching specialist subagents, handling round-based remediation, or interpreting a workflow mode's execution policy. Covers authorized direct execution, dispatch-and-wait, batch-then-summarize prohibition, and mapped-mode execution.","https:\u002F\u002Fgithub.com\u002Fpkirsanov\u002Fsmackerel\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fbubbles-workflow-execution-loops\u002FSKILL.md",[160],{"categoryNo":134,"categoryName":135,"taxonomyType":79,"taxonomyTypeDesc":80},[137,162,163,164,165,112,166,167,168,169,170,38,171,172,173,174,139],"execution","loops","bubbles workflow execution loops","summarize","run","batch","remediation","direct","subagents","dispatch","wait","multi","multi-round",{"skillNo":176,"name":177,"nameZh":6,"description":178,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":179,"categories":180,"keywords":185,"publishedAt":43},"01M6N9SYXQNJDQ1T1YT81JH2BG","bubbles-vscode-agent-constraints","Design agents that fit the VS Code Copilot Chat runtime instead of fighting it. Use when authoring or editing any `*.agent.md`; when adding `tools:`, `agents:`, `handoffs:`, `model:`, `user-invocable:`, or `disable-model-invocation:` frontmatter; when designing an orchestrator that dispatches specialists; when a design implies agent-calls-agent-calls-agent chaining; when a subagent dispatch silently no-ops or an agent cannot be selected in the dropdown; or when writing a governance rule about delegation that the runtime cannot actually enforce. Prevents multi-level-subagent designs, prose-only dispatch laws, and frontmatter\u002Fbody contradictions.","https:\u002F\u002Fgithub.com\u002Fpkirsanov\u002Fsmackerel\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fbubbles-vscode-agent-constraints\u002FSKILL.md",[181,184],{"categoryNo":182,"categoryName":183,"taxonomyType":79,"taxonomyTypeDesc":80},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":134,"categoryName":135,"taxonomyType":79,"taxonomyTypeDesc":80},[186,187,188,189,190,191,192,193,194,195,196,197,117,40,37,95,198,199,200,201],"vscode","constraints","bubbles vscode agent constraints","design","writing","copilot","code","delegation","Tools","subagent","model","chaining","authoring","fit","subagent dispatch","frontmatter",{"skillNo":203,"name":204,"nameZh":6,"description":205,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":206,"categories":207,"keywords":208,"publishedAt":43},"01M6N9SD78SK12PRT9KBRZ6TB3","bubbles-upkeep-cadence","How to schedule, dispatch, and record recurring operational upkeep tasks (backup, restore-drill, BCDR-drill, patch-cycle, secret-rotation, flag-cleanup, compliance-sweep). Use when authoring or modifying `config\u002Fupkeep-calendar.yaml`, when investigating a missed task, when reading the upkeep ledger, or when adding a new task type.","https:\u002F\u002Fgithub.com\u002Fpkirsanov\u002Fsmackerel\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fbubbles-upkeep-cadence\u002FSKILL.md",[],[209,210,211,212,213,214,215,216,38,217,218,34,219,220,221,222,223,224,225,226],"cadence","bubbles upkeep cadence","tasks","cleanup","backup","sweep","schedule","recurring","patch","restore","cycle","record","missed","type","drill","how to","new task","rotation"]