[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6X809BJDEFQS7DXB8FKQ8BA":3,"skill-same:01M6X809BJDEFQS7DXB8FKQ8BA":95},{"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":23,"publishedAt":45,"linkOnly":46,"markdownContent":47,"markdownBody":48,"frontMatter":49,"refName":66,"commitSha":67,"skillDirectory":68,"forksCount":69,"repositoryHtmlUrl":70,"repositoryHomepageUrl":71,"ownerHtmlUrl":72,"ownerBlogUrl":71,"ownerDescription":73,"updatedAt":74,"install":75,"resources":88},"01M6X809BJDEFQS7DXB8FKQ8BA","upstream-contribute",null,"Use when a learning, new skill, rule improvement, or bug fix from a consumer project should be contributed back to the shared agent-config package.","event4u-app\u002Fagent-config","event4u-app","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F199339632?v=4","01M6X5TWBNCQCE1VDKT4E9KF7N","event4u.app","01M6X5TWF4HRM266RG2Q5VVH1X",19,"MIT","https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Fsrc\u002Fskills\u002Fupstream-contribute\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44],"upstream contribute","contribute","upstream","back","new","when","subprocess","proposal","scope","project","shared","self","config","new skill","bug","never","fix","command","Bash","Meta","release","2026-11-10 10:12:30",false,"---\nmodel_tier: inherit\nname: upstream-contribute\ndescription: \"Use when a learning, new skill, rule improvement, or bug fix from a consumer project should be contributed back to the shared agent-config package.\"\ndomain: process\nscope:\n  write: []\n  verification_reason: \"execution.handler is internal, so this skill spawns no subprocess — writes happen through the agent's declared allowed_tools. No command can prove a scope the skill never executes.\"\nexecution:\n  type: assisted\n  handler: internal\n  allowed_tools: [\"Bash(.\u002Fagent-config proposal:check:*)\", \"Bash(.\u002Fagent-config self-repair:release:*)\", \"Bash(.\u002Fagent-config doctor:*)\"]\nworkspaces:\n  - agent-config-maintainer\npacks:\n  - meta\n---\n\n# upstream-contribute\n\n## When to use\n\n- A new skill was created in a project that should be shared across all projects\n- A rule or skill improvement was discovered that benefits all consumers\n- A bug was found in a shared skill, rule, or command\n- The `learning-to-rule-or-skill` skill identified something worth upstreaming\n- An override was created locally and should become the new default\n- A project-specific skill\u002Frule could be **generalized** to benefit all consumers\n- The `upstream-proposal` rule suggested a contribution and user agreed\n\nDo NOT use when:\n\n- **The user has NOT given explicit consent** — this is the #1 rule\n- The content already exists in the shared package\n- The learning is truly one-off and cannot be generalized\n\n## Goal\n\nDecide whether a learning, skill, rule, or fix from a consumer project is worth\ncontributing back to the shared `agent-config` package — and hand the ones that\nare to the single outward step, which owns everything that leaves the machine.\n\n## One way out\n\n```\nTHIS SKILL NEVER PUSHES, NEVER OPENS A PULL REQUEST, AND NEVER WRITES\nA SECOND, HAND-CONDENSED COPY OF AN ARTIFACT.\nEVERY BYTE THAT LEAVES — BRANCH NAME, COMMIT IDENTITY, COMMIT MESSAGE,\nDIFF, TITLE, BODY — LEAVES THROUGH `self-repair:release`.\nTHE COMMIT IDENTITY IS NOREPLY BY CONSTRUCTION; THE REST IS SCANNED FOR\nCREDENTIALS AND THE CONSUMER'S OWN NAMES ONLY. A NAME IN THE DIFF OUTSIDE\nTHOSE PASSES, AND SAYING SO IS THE POINT: AN UNSCANNED BYTE A READER\nBELIEVES WAS SCANNED IS THE WORSE STATE.\nA SECOND ROUTE WOULD BE A SECOND SET OF GUARANTEES.\n```\n\n`self-repair:release` carries the privacy floor over the record text, a\npayload floor over every object it pushes, the may-not-modify deny list, the\nroute ladder (pull request, then issue, then a local record) and an approval\nbound to the digest of the exact bytes. The per-turn Hard-Floor word is the\nperson's: they run `--approve \u003Cdigest>` themselves. A checkbox in a skill\ncarries none of them, which is why this skill asks a *worth it* question and\nnothing else.\n\nIt pushes one commit built on `origin\u002Fmain` from the branch's net change, as\nthe account's noreply identity. The floor reads credentials and the consumer's\nidentifiers; a finding skips the push.\n\n## Core principles\n\n- **Consent first** — NEVER create a PR, branch, or any upstream action without explicit user approval\n- **Universality first** — the contribution must work for ALL consumers, not just one project\n- **Generalize when possible** — project-specific content CAN become universal with adaptation\n- **Evidence-based** — meets `docs\u002Fcontracts\u002Fretro-v1.md` § Evidence threshold\n- **One source** — an artifact is authored in `src\u002F` only; projections are regenerated, never hand-written\n- **The floor is a check, not a tick** — a privacy judgement a human ticks is not a privacy check, and today it sees credentials and consumer names only\n- **Local benefit immediately** — use override for instant project benefit while the contribution is pending\n\n## A repeated override is a signal, and a signal is not evidence\n\n```\nTHE SAME ARTIFACT OVERRIDDEN IN INDEPENDENT INSTALLS IS THE CHEAPEST AVAILABLE\nHINT THAT A SHIPPED DEFAULT IS WRONG. IT IS A HINT.\nNEVER CHANGE A SHIPPED DEFAULT ON OVERRIDES FROM ONE ORGANISATION.\nINDEPENDENT MEANS DIFFERENT TEAMS, NOT DIFFERENT DIRECTORIES.\n```\n\n`agent-config doctor --check override-set` reports which shipped artifacts a\ntree overrides and in how many layers. Two same-culture installs overriding the\nsame artifact is **n=2 from one toolchain culture**, which is a discovery\nchannel and not a mandate — and the temptation to \"just fix the default, we\nalready know\" is exactly how a general package becomes one organisation's house\nstyle.\n\n**What makes an aggregate admissible** (package row of `retro-v1.md`):\n\n- overrides from **independently operated** consumers, not several repositories\n  of one team;\n- the overriding change **converging on the same substance**, not merely\n  touching the same filename — two teams deleting different halves of a rule\n  are not agreeing about anything;\n- a **named public mechanism** that explains why the shipped default is wrong,\n  rather than \"several people changed it\".\n\nBelow that bar, the signal is one input to a future aggregate and nothing more.\nRecord it and leave the default alone.\n\n**The signal carries no consumer content, by construction.** Artifact kind, name\nand a layer count — the type has no field that can hold a path, a diff or\nanything from the tree, so privacy is the schema's shape rather than a scrubbing\npass that could fail. Never widen it to make a proposal more persuasive; a\nproposal that needs the consumer's diff is a proposal that has not cleared the\nbar.\n\n## Package repository\n\nThe shared agent-config package lives at:\n\n```\ngit@github.com:event4u-app\u002Fagent-config.git\n```\n\nGitHub: `https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config`\n\n## Procedure\n\n### 0. Mandatory consent gate\n\n**This step is NON-NEGOTIABLE. No exceptions.**\n\nBefore ANY upstream work, ask the user:\n\n```\n> This [skill\u002Frule\u002Fguideline] could improve the shared agent-config package.\n> [Brief explanation of what would be contributed and why it's valuable]\n>\n> 1. Yes — hand it to the upstream step\n> 2. No — keep it project-local only\n```\n\n- **If user picks 2** — STOP. Do not mention upstream again for this item.\n- **If user picks 1** — continue with the procedure below.\n- **NEVER skip this step**, even if the user previously agreed to other contributions.\n\nConsent here authorizes the *preparation*. The send is a separate, per-turn\nword in step 6 and this gate never substitutes for it.\n\n### 1. Determine contribution type\n\n`src\u002F` is the only place an artifact is authored. ADR-201 copies every `.md`\nverbatim into the projections, so there is no second version to write and no\ncondensation ratio to hit.\n\n| Type | Source path |\n|---|---|\n| **New skill** | `src\u002Fskills\u002F{name}\u002FSKILL.md` |\n| **New rule** | `src\u002Frules\u002F{name}.md` |\n| **New command** | `src\u002Fdomains\u002F{domain}\u002F{name}\u002Fcommand.md` |\n| **New guideline** | `docs\u002Fguidelines\u002F{category}\u002F{name}.md` |\n| **Update to existing** | Same path as original |\n\n### 2. Apply locally as override (immediate benefit)\n\nCreate an override so the project benefits immediately:\n\n```\nagents\u002Foverrides\u002F{type}\u002F{name}.md\n```\n\nWith frontmatter:\n\n```yaml\n---\noverrides: {type}\u002F{name}\nmode: replace  # or extend\n---\n```\n\nOptional for a low-urgency change.\n\n### 2b. Generalize project-specific content (if needed)\n\nIf the content is project-specific but could be made universal:\n\n1. **Identify project-specific parts** — domain names, local paths, project conventions\n2. **Abstract them** — replace with generic patterns, configurable values, or examples\n3. **Show the user the diff** — original vs. generalized version\n4. **Get approval** — user must confirm the generalized version is correct\n\nExample: A project-specific \"import-csv\" skill becomes a generic \"file-import\"\nskill with a configurable format.\n\nGeneralizing is an editorial act and it is not the privacy floor. What the\nfloor refuses in step 4 stays local; it is never rewritten into shape.\n\n### 3. Proposal gate — MANDATORY when a proposal doc exists\n\nIf the contribution originates from a proposal under `agents\u002Fproposals\u002F`\n(produced by `learning-to-rule-or-skill` via the pipeline in\n[`self-improvement-pipeline`](..\u002F..\u002F..\u002Fdocs\u002Fguidelines\u002Fagent-infra\u002Fself-improvement-pipeline.md)),\nrun the Stage-4 gate first:\n\n```bash\n.\u002Fagent-config proposal:check agents\u002Fproposals\u002F{slug}.md\n```\n\n**Hard refusal rule:** if `.\u002Fagent-config proposal:check` exits non-zero, STOP.\nSurface the findings to the user, ask them to fix the proposal (add evidence,\nremove TODO markers, complete required sections), then rerun.\n\n**Also STOP unless `stage: gated`.** For `scope: package` that needs a review\nrecord and an owner authorization on one digest.\n\nWhen no proposal doc exists (small fix, typo, pure bug-fix), skip this step and\nrecord the rationale in the finding.\n\n### 4. See every byte before any byte leaves\n\n```bash\n.\u002Fagent-config self-repair:release \u003Cfingerprint> --dry-run\n```\n\nThe dry run prints the destination (repository, account, route, remote, base)\nand every byte that may leave except the commit date, then their digest. It\ncreates nothing. Read it with the user.\n\nA refusal from the privacy floor is **final**: the finding stays local. There\nis no scrubbing pass, because a rewritten identifier is still a leaked one.\n\n### 5. Quality gates (only inside a checkout of this package)\n\nRun the package's full CI pipeline and confirm it is green.\n[`package-ci-checks`](..\u002F..\u002Frules\u002Fpackage-ci-checks.md) owns the entry point\nand names it; a consumer has no such runner, so the command is not repeated.\nOutside a checkout the package CI runs after the issue or pull request exists.\n\n### 6. Send — one command, one turn, one word\n\n```bash\n.\u002Fagent-config self-repair:release \u003Cfingerprint> --approve \u003Cdigest>\n```\n\nThe user runs it; the agent prints it and never runs `--approve` itself. The\ndigest proves the bytes unchanged since the dry run, not consent — the agent\ncan read it too. Sending is a Hard-Floor action (`non-destructive-by-default`);\nno autonomy setting, standing instruction or earlier consent substitutes for it.\n\nA byte changed since the dry run voids the approval. The ladder picks the\nvehicle: a pull request only when the release runs from a checkout of this\npackage, an issue otherwise, a local record when nothing may leave.\n\n### 7. After merge — clean up override\n\nOnce the contribution is merged and the package is updated in the project:\n\n```bash\nrm agents\u002Foverrides\u002F{type}\u002F{name}.md\n```\n\n```bash\n.\u002Fagent-config update\n```\n\n`update` moves the `agent_config_version` pin in `.agent-settings.yml`; the\nproject's own package manager then fetches that version. The shared artifact\nreplaces the local override.\n\n## Output format\n\n1. Summary of what is being contributed (type, name, why)\n2. The source path under `src\u002F` that the contribution targets\n3. The dry-run output verbatim — destination, payload, digest. A field it did\n   not print is reported as unshown, never filled in\n4. The one command the user runs to send it, and nothing executed on their behalf\n5. Reminder to clean up the local override after the contribution merges\n\n## Gotcha\n\n- Agent in consumer project doesn't know the package repo URL — this skill provides it\n- Agent may include project-specific references — the floor in step 4 refuses them\n- Agent may not have git access to the package repo — the ladder degrades to an issue\n- A consumer install reaches the issue step, not the pull-request step\n\n## Do NOT\n\n- **Do NOT create any upstream artifact without explicit user consent** — this is the #1 rule\n- **Do NOT open a contribution if `.\u002Fagent-config proposal:check` blocks** — fix the proposal first (step 3)\n- Do NOT push, open a pull request, or open an issue by hand — the ladder owns the send\n- Do NOT edit a generated projection; author in `src\u002F` and let the package's sync step regenerate\n- Do NOT write a hand-condensed second copy of an artifact\n- Do NOT stage with a bare `git add .` — name the paths\n- Do NOT rewrite what the privacy floor refused; a refused finding stays local\n- Do NOT assume consent from a previous contribution — ask every time\n- Do NOT bypass quality gates — in a checkout of this package they run BEFORE\n  the send\n","# upstream-contribute\n\n## When to use\n\n- A new skill was created in a project that should be shared across all projects\n- A rule or skill improvement was discovered that benefits all consumers\n- A bug was found in a shared skill, rule, or command\n- The `learning-to-rule-or-skill` skill identified something worth upstreaming\n- An override was created locally and should become the new default\n- A project-specific skill\u002Frule could be **generalized** to benefit all consumers\n- The `upstream-proposal` rule suggested a contribution and user agreed\n\nDo NOT use when:\n\n- **The user has NOT given explicit consent** — this is the #1 rule\n- The content already exists in the shared package\n- The learning is truly one-off and cannot be generalized\n\n## Goal\n\nDecide whether a learning, skill, rule, or fix from a consumer project is worth\ncontributing back to the shared `agent-config` package — and hand the ones that\nare to the single outward step, which owns everything that leaves the machine.\n\n## One way out\n\n```\nTHIS SKILL NEVER PUSHES, NEVER OPENS A PULL REQUEST, AND NEVER WRITES\nA SECOND, HAND-CONDENSED COPY OF AN ARTIFACT.\nEVERY BYTE THAT LEAVES — BRANCH NAME, COMMIT IDENTITY, COMMIT MESSAGE,\nDIFF, TITLE, BODY — LEAVES THROUGH `self-repair:release`.\nTHE COMMIT IDENTITY IS NOREPLY BY CONSTRUCTION; THE REST IS SCANNED FOR\nCREDENTIALS AND THE CONSUMER'S OWN NAMES ONLY. A NAME IN THE DIFF OUTSIDE\nTHOSE PASSES, AND SAYING SO IS THE POINT: AN UNSCANNED BYTE A READER\nBELIEVES WAS SCANNED IS THE WORSE STATE.\nA SECOND ROUTE WOULD BE A SECOND SET OF GUARANTEES.\n```\n\n`self-repair:release` carries the privacy floor over the record text, a\npayload floor over every object it pushes, the may-not-modify deny list, the\nroute ladder (pull request, then issue, then a local record) and an approval\nbound to the digest of the exact bytes. The per-turn Hard-Floor word is the\nperson's: they run `--approve \u003Cdigest>` themselves. A checkbox in a skill\ncarries none of them, which is why this skill asks a *worth it* question and\nnothing else.\n\nIt pushes one commit built on `origin\u002Fmain` from the branch's net change, as\nthe account's noreply identity. The floor reads credentials and the consumer's\nidentifiers; a finding skips the push.\n\n## Core principles\n\n- **Consent first** — NEVER create a PR, branch, or any upstream action without explicit user approval\n- **Universality first** — the contribution must work for ALL consumers, not just one project\n- **Generalize when possible** — project-specific content CAN become universal with adaptation\n- **Evidence-based** — meets `docs\u002Fcontracts\u002Fretro-v1.md` § Evidence threshold\n- **One source** — an artifact is authored in `src\u002F` only; projections are regenerated, never hand-written\n- **The floor is a check, not a tick** — a privacy judgement a human ticks is not a privacy check, and today it sees credentials and consumer names only\n- **Local benefit immediately** — use override for instant project benefit while the contribution is pending\n\n## A repeated override is a signal, and a signal is not evidence\n\n```\nTHE SAME ARTIFACT OVERRIDDEN IN INDEPENDENT INSTALLS IS THE CHEAPEST AVAILABLE\nHINT THAT A SHIPPED DEFAULT IS WRONG. IT IS A HINT.\nNEVER CHANGE A SHIPPED DEFAULT ON OVERRIDES FROM ONE ORGANISATION.\nINDEPENDENT MEANS DIFFERENT TEAMS, NOT DIFFERENT DIRECTORIES.\n```\n\n`agent-config doctor --check override-set` reports which shipped artifacts a\ntree overrides and in how many layers. Two same-culture installs overriding the\nsame artifact is **n=2 from one toolchain culture**, which is a discovery\nchannel and not a mandate — and the temptation to \"just fix the default, we\nalready know\" is exactly how a general package becomes one organisation's house\nstyle.\n\n**What makes an aggregate admissible** (package row of `retro-v1.md`):\n\n- overrides from **independently operated** consumers, not several repositories\n  of one team;\n- the overriding change **converging on the same substance**, not merely\n  touching the same filename — two teams deleting different halves of a rule\n  are not agreeing about anything;\n- a **named public mechanism** that explains why the shipped default is wrong,\n  rather than \"several people changed it\".\n\nBelow that bar, the signal is one input to a future aggregate and nothing more.\nRecord it and leave the default alone.\n\n**The signal carries no consumer content, by construction.** Artifact kind, name\nand a layer count — the type has no field that can hold a path, a diff or\nanything from the tree, so privacy is the schema's shape rather than a scrubbing\npass that could fail. Never widen it to make a proposal more persuasive; a\nproposal that needs the consumer's diff is a proposal that has not cleared the\nbar.\n\n## Package repository\n\nThe shared agent-config package lives at:\n\n```\ngit@github.com:event4u-app\u002Fagent-config.git\n```\n\nGitHub: `https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config`\n\n## Procedure\n\n### 0. Mandatory consent gate\n\n**This step is NON-NEGOTIABLE. No exceptions.**\n\nBefore ANY upstream work, ask the user:\n\n```\n> This [skill\u002Frule\u002Fguideline] could improve the shared agent-config package.\n> [Brief explanation of what would be contributed and why it's valuable]\n>\n> 1. Yes — hand it to the upstream step\n> 2. No — keep it project-local only\n```\n\n- **If user picks 2** — STOP. Do not mention upstream again for this item.\n- **If user picks 1** — continue with the procedure below.\n- **NEVER skip this step**, even if the user previously agreed to other contributions.\n\nConsent here authorizes the *preparation*. The send is a separate, per-turn\nword in step 6 and this gate never substitutes for it.\n\n### 1. Determine contribution type\n\n`src\u002F` is the only place an artifact is authored. ADR-201 copies every `.md`\nverbatim into the projections, so there is no second version to write and no\ncondensation ratio to hit.\n\n| Type | Source path |\n|---|---|\n| **New skill** | `src\u002Fskills\u002F{name}\u002FSKILL.md` |\n| **New rule** | `src\u002Frules\u002F{name}.md` |\n| **New command** | `src\u002Fdomains\u002F{domain}\u002F{name}\u002Fcommand.md` |\n| **New guideline** | `docs\u002Fguidelines\u002F{category}\u002F{name}.md` |\n| **Update to existing** | Same path as original |\n\n### 2. Apply locally as override (immediate benefit)\n\nCreate an override so the project benefits immediately:\n\n```\nagents\u002Foverrides\u002F{type}\u002F{name}.md\n```\n\nWith frontmatter:\n\n```yaml\n---\noverrides: {type}\u002F{name}\nmode: replace  # or extend\n---\n```\n\nOptional for a low-urgency change.\n\n### 2b. Generalize project-specific content (if needed)\n\nIf the content is project-specific but could be made universal:\n\n1. **Identify project-specific parts** — domain names, local paths, project conventions\n2. **Abstract them** — replace with generic patterns, configurable values, or examples\n3. **Show the user the diff** — original vs. generalized version\n4. **Get approval** — user must confirm the generalized version is correct\n\nExample: A project-specific \"import-csv\" skill becomes a generic \"file-import\"\nskill with a configurable format.\n\nGeneralizing is an editorial act and it is not the privacy floor. What the\nfloor refuses in step 4 stays local; it is never rewritten into shape.\n\n### 3. Proposal gate — MANDATORY when a proposal doc exists\n\nIf the contribution originates from a proposal under `agents\u002Fproposals\u002F`\n(produced by `learning-to-rule-or-skill` via the pipeline in\n[`self-improvement-pipeline`](..\u002F..\u002F..\u002Fdocs\u002Fguidelines\u002Fagent-infra\u002Fself-improvement-pipeline.md)),\nrun the Stage-4 gate first:\n\n```bash\n.\u002Fagent-config proposal:check agents\u002Fproposals\u002F{slug}.md\n```\n\n**Hard refusal rule:** if `.\u002Fagent-config proposal:check` exits non-zero, STOP.\nSurface the findings to the user, ask them to fix the proposal (add evidence,\nremove TODO markers, complete required sections), then rerun.\n\n**Also STOP unless `stage: gated`.** For `scope: package` that needs a review\nrecord and an owner authorization on one digest.\n\nWhen no proposal doc exists (small fix, typo, pure bug-fix), skip this step and\nrecord the rationale in the finding.\n\n### 4. See every byte before any byte leaves\n\n```bash\n.\u002Fagent-config self-repair:release \u003Cfingerprint> --dry-run\n```\n\nThe dry run prints the destination (repository, account, route, remote, base)\nand every byte that may leave except the commit date, then their digest. It\ncreates nothing. Read it with the user.\n\nA refusal from the privacy floor is **final**: the finding stays local. There\nis no scrubbing pass, because a rewritten identifier is still a leaked one.\n\n### 5. Quality gates (only inside a checkout of this package)\n\nRun the package's full CI pipeline and confirm it is green.\n[`package-ci-checks`](..\u002F..\u002Frules\u002Fpackage-ci-checks.md) owns the entry point\nand names it; a consumer has no such runner, so the command is not repeated.\nOutside a checkout the package CI runs after the issue or pull request exists.\n\n### 6. Send — one command, one turn, one word\n\n```bash\n.\u002Fagent-config self-repair:release \u003Cfingerprint> --approve \u003Cdigest>\n```\n\nThe user runs it; the agent prints it and never runs `--approve` itself. The\ndigest proves the bytes unchanged since the dry run, not consent — the agent\ncan read it too. Sending is a Hard-Floor action (`non-destructive-by-default`);\nno autonomy setting, standing instruction or earlier consent substitutes for it.\n\nA byte changed since the dry run voids the approval. The ladder picks the\nvehicle: a pull request only when the release runs from a checkout of this\npackage, an issue otherwise, a local record when nothing may leave.\n\n### 7. After merge — clean up override\n\nOnce the contribution is merged and the package is updated in the project:\n\n```bash\nrm agents\u002Foverrides\u002F{type}\u002F{name}.md\n```\n\n```bash\n.\u002Fagent-config update\n```\n\n`update` moves the `agent_config_version` pin in `.agent-settings.yml`; the\nproject's own package manager then fetches that version. The shared artifact\nreplaces the local override.\n\n## Output format\n\n1. Summary of what is being contributed (type, name, why)\n2. The source path under `src\u002F` that the contribution targets\n3. The dry-run output verbatim — destination, payload, digest. A field it did\n   not print is reported as unshown, never filled in\n4. The one command the user runs to send it, and nothing executed on their behalf\n5. Reminder to clean up the local override after the contribution merges\n\n## Gotcha\n\n- Agent in consumer project doesn't know the package repo URL — this skill provides it\n- Agent may include project-specific references — the floor in step 4 refuses them\n- Agent may not have git access to the package repo — the ladder degrades to an issue\n- A consumer install reaches the issue step, not the pull-request step\n\n## Do NOT\n\n- **Do NOT create any upstream artifact without explicit user consent** — this is the #1 rule\n- **Do NOT open a contribution if `.\u002Fagent-config proposal:check` blocks** — fix the proposal first (step 3)\n- Do NOT push, open a pull request, or open an issue by hand — the ladder owns the send\n- Do NOT edit a generated projection; author in `src\u002F` and let the package's sync step regenerate\n- Do NOT write a hand-condensed second copy of an artifact\n- Do NOT stage with a bare `git add .` — name the paths\n- Do NOT rewrite what the privacy floor refused; a refused finding stays local\n- Do NOT assume consent from a previous contribution — ask every time\n- Do NOT bypass quality gates — in a checkout of this package they run BEFORE\n  the send\n",{"name":5,"packs":50,"scope":52,"domain":55,"execution":56,"model_tier":63,"workspaces":64,"description":7},[51],"meta",{"write":53,"verification_reason":54},[],"execution.handler is internal, so this skill spawns no subprocess — writes happen through the agent's declared allowed_tools. No command can prove a scope the skill never executes.","process",{"type":57,"handler":58,"allowed_tools":59},"assisted","internal",[60,61,62],"Bash(.\u002Fagent-config proposal:check:*)","Bash(.\u002Fagent-config self-repair:release:*)","Bash(.\u002Fagent-config doctor:*)","inherit",[65],"agent-config-maintainer","main","12bd765ce1d800501d45dfb8232102793af01290","src\u002Fskills\u002Fupstream-contribute",1,"https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config","https:\u002F\u002Fevent4u.app","https:\u002F\u002Fgithub.com\u002Fevent4u-app","Your events in your hand","2026-11-14 02:29:41",{"source":8,"skillName":5,"commands":76,"prompt":86,"zipAvailable":87},[77,80,83],{"tool":78,"command":79},"npx","npx skills add event4u-app\u002Fagent-config --skill upstream-contribute",{"tool":81,"command":82},"bunx","bunx skills add event4u-app\u002Fagent-config --skill upstream-contribute",{"tool":84,"command":85},"pnpm","pnpm dlx skills add event4u-app\u002Fagent-config --skill upstream-contribute","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Fsrc\u002Fskills\u002Fupstream-contribute\u002FSKILL.md",true,[89],{"path":90,"resourceType":91,"resourceTypeDesc":92,"sizeBytes":93,"sourceHtmlUrl":94},"evals\u002Ftriggers.json","REFERENCE","参考文档",3428,"https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Fsrc\u002Fskills\u002Fupstream-contribute\u002Fevals\u002Ftriggers.json",[96,110,123,135,147,157],{"skillNo":97,"name":98,"nameZh":6,"description":99,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":100,"categories":101,"keywords":103,"publishedAt":45},"01M6X84PK96XBPENXH66JCTSD1","unknown-key-fixture","Declares a key the schema does not know.","https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Ftests\u002Fscripts\u002Ffixtures\u002Fbody-portable\u002Funknown-key\u002FSKILL.md",[102],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[104,105,106,107,108,109],"unknown key fixture","Unknown key","fixture","unknown","schema","package",{"skillNo":111,"name":112,"nameZh":6,"description":113,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":114,"categories":115,"keywords":117,"publishedAt":45},"01M6X84HW7NAHZ7GZMQ9RXK1XJ","portable-fixture","Declares only semantics the MCP-lite carrier transports whole.","https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Ftests\u002Fscripts\u002Ffixtures\u002Fbody-portable\u002Fportable\u002FSKILL.md",[116],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[106,118,119,120,121,109,122],"portable","portable fixture","engineer","only","MCP",{"skillNo":124,"name":125,"nameZh":6,"description":126,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":127,"categories":128,"keywords":130,"publishedAt":45},"01M6X84F29FE0RGGZ1ZTFGZTX2","non-portable-fixture","Declares a runtime semantic the carrier drops.","https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Ftests\u002Fscripts\u002Ffixtures\u002Fbody-portable\u002Fnon-portable\u002FSKILL.md",[129],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[119,131,118,106,132,133,134,109],"non portable fixture","semantic","high","runtime",{"skillNo":136,"name":137,"nameZh":6,"description":138,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":139,"categories":140,"keywords":142,"publishedAt":45},"01M6X848F706PT9MDCX75JKJ6B","candidate-zero-width","A candidate whose prose carries an invisible joiner.","https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fskill-scout-candidates\u002Fzero-width-injection\u002FSKILL.md",[141],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[143,144,145,146],"candidate zero width","candidate","ZeRO","prose",{"skillNo":148,"name":149,"nameZh":6,"description":150,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":151,"categories":152,"keywords":154,"publishedAt":45},"01M6X841SSC2T31VDF41SA6DG1","candidate-disclosure-suppression","A candidate whose prose tells the agent to withhold from the user.","https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fskill-scout-candidates\u002Fdisclosure-suppression\u002FSKILL.md",[153],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[155,144,146,156],"candidate disclosure suppression","user",{"skillNo":158,"name":159,"nameZh":6,"description":160,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":161,"categories":162,"keywords":164,"publishedAt":45},"01M6X83TFS5AGPBPVTQNWP0BB3","candidate-dangerous-frontmatter","A candidate claiming an unscoped tool grant and a permission bypass.","https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fskill-scout-candidates\u002Fdangerous-frontmatter\u002FSKILL.md",[163],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[165,144,166,167,168,169],"candidate dangerous frontmatter","frontmatter","shell","permission","tool"]