skill-improvement-pipeline
When to use
- Triggered by the
skill-improvement-triggerrule when user picks "Capture & improve" - Manually when user says "run the improvement pipeline" or "capture this learning"
Do NOT use for:
- Regular skill creation (use
skill-writing) - Regular skill editing (use
skill-management) - One-off fixes that don't represent a pattern
Procedure: Run the improvement pipeline
Step 1: Capture
Use the learning-to-rule-or-skill skill to extract 1–3 concrete learnings from the completed task.
Each learning must be:
- Specific — not "be more careful" but "always check X before Y"
- Actionable — can be turned into a rule constraint or skill step
- Observable — you can tell when it's followed or violated
Step 2: Promotion Gate
For each learning, apply ALL of these checks. ALL must be YES to promote:
| Check | Question |
|---|---|
| Repeated? | Has this pattern occurred 2+ times, or is it clearly generalizable? |
| Prevents failure? | Does it prevent a real observed failure or mistake? |
| Not covered? | Is there NO existing rule or skill that already covers this? |
| Actionable? | Is it a concrete constraint or workflow step (not vague advice)? |
| Result | Action |
|---|---|
| All YES | Promote — continue to Step 3 |
| One-off, never seen before | Reject — do nothing |
| Seen once, but generalizable | Record — write a model-noticed self-repair record naming the asset it is about; act on the second occurrence |
| Already covered | Update existing — skip to Step 4 with the existing skill/rule |
| Vague | Reject — not actionable |
Show the user:
> Learning: "{summary}"
> Category: {category-tag}
> Repeated: {yes/no} | Prevents failure: {yes/no} | Not covered: {yes/no} | Actionable: {yes/no}
>
> → {Promote / Reject / Record / Update existing}
Where a seen-once learning goes — and why not a host-native memory tool
The Record branch writes a model-noticed defect record through
upsertFinding in src/scripts/_lib/self_repair_store.ts, carrying a target
drawn from the closed rule: | skill: | command: | hook: vocabulary and
resolved against the tree at write time.
It used to route to a host-native memory tool, and that destination could not
work for this branch by construction: it is not target-addressed, nothing in
this repository can read it, it appears in no corroboration counter, and it is
simply absent on hosts that do not ship it. So the ≥2-origin counter at
src/scripts/learning_sidecar.ts:39 restarted at one every time, and the second
occurrence could never be recognised AS the second — which is the whole
mechanism this branch exists to feed. A record is readable, joinable, and
counted per target, so a third manifestation against one asset is a fact the
tree can establish rather than one that depends on a human recalling it.
Cross-project promotion signal (surfacing only — never an auto-writer)
If the same learning has now been observed in ≥ 2 distinct projects, it
is a strong promotion candidate for a shared surface (a global rule/skill or a
src/patterns/ recipe) rather than a project-local note. Surface that signal
to the user — do not auto-write it:
> Cross-project: this learning was also seen in {other-project}.
> ≥2 projects ⇒ candidate for a shared surface (global rule / skill / pattern).
> → surface for promotion (human decides; no auto-write)
This is a signal, not a promotion: there is no auto-write and no
auto-promotion — that half is the live boundary and is unchanged. The other
two clauses this sentence used to carry are retired, because the tree
contradicts them: src/scripts/learning_sidecar.ts:37 sets
HALF_LIFE_DAYS = 30 and decays a signal's weight over a per-project intake
store, and ADR-249 permits a supervised resident process in core,
superseding the blanket no-daemon clause this sentence inherited. Decay and
runtime are therefore governed, not prohibited. The human still decides
whether the cross-project recurrence justifies promotion.
Step 3: Classify
Category tag
Tag each learning with one category for tracking:
| Category | When |
|---|---|
skill-weakness |
Skill gave wrong or incomplete guidance |
rule-weakness |
Rule was too vague or missed a case |
routing-issue |
Wrong skill was selected for the task |
assumption-issue |
Agent made bad assumptions instead of asking |
verification-gap |
Verification step was missing or weak |
optimization-overreach |
Optimize command suggested harmful change |
Artifact type
Decide what to create:
| Learning type | Create |
|---|---|
| Behavioral constraint ("always do X", "never do Y") | Rule (auto-type) |
| Workflow/procedure ("when X happens, do Y then Z") | Skill |
| Existing rule/skill needs update | Update (use skill-management) |
Step 4: Create or Update
Anchor exact commands to the transcript, not the journal. A session journal is a lossy summary; a command, path, or flag reconstructed from it can be subtly wrong. Before writing a concrete step (a command, a file path, a config key) into a rule or skill, confirm it against the anchored source transcript — carry a
transcript:/ session anchor on the mined learning so the exact wording is recoverable, and verify against it rather than trusting the summary.
- New rule → create in
src/rules/, follow rule conventions - New skill → use
skill-writingskill, create insrc/skills/ - Update existing → use
skill-managementskill
After creation:
- Run
./scripts-run src/scripts/skill_linter {path}— must pass (0 fail) - Copy to
.augment/ - Regenerate tools:
./scripts-run src/scripts/condense --generate-tools - If the learning came from a knowledge page (
agents/knowledge/procedures/skill-candidates.mdor anyagents/knowledge/page) — degrade the source to a pointer; promotion is not complete otherwise (double-maintenance risk):./scripts-run src/scripts/degrade_to_pointer --source "<knowledge-path>[#<anchor>]" --artifact "{relative_path}" --date "<YYYY-MM-DD>"
Step 5: Decide scope
Ask the user:
> 📦 Improvement ready: {description}
>
> 1. Universal — apply locally + PR to upstream package
> 2. Project-specific — apply locally only (agents/overrides/)
> 3. Review first — show me the changes before deciding
Step 6: Apply
If project-specific (option 2):
- Create override in
agents/overrides/{type}/{name}.md - Done.
If universal (option 1):
- Read
project.upstream_repoandproject.improvement_pr_branch_prefixfrom.agent-settings.yml - If
project.upstream_repois empty → ask user for the target repo - Create branch:
{prefix}{learning-slug}frommain - Commit changes to
src/AND.augment/ - Push branch
- Create PR with title:
improve(agent): {short description} - Use the agent-improvement PR template if it exists
Classify the missing component BEFORE choosing the artifact
ON A FAILURE, NAME WHICH COMPONENT WAS ABSENT. THE CLASS PICKS THE ARTIFACT.
THE DEFAULT ANSWER TODAY IS "ANOTHER RULE". IT IS USUALLY THE WRONG ONE.
A failure means something was missing. Which something decides what to build, and the pipeline's own bias is to answer "a rule" regardless — which is how a tree accumulates prose for problems prose cannot solve.
| Absent component | What it becomes |
|---|---|
| Instruction — nothing said to do it | a rule or a skill section |
| Source of truth — the fact was not written down anywhere | a context or contract |
| Tool — the step was manual and got skipped | a script |
| Validator — nothing checked the result | a gate |
| Permission rule — authority was ambiguous | an authority-band edit |
| Sandbox signal — the environment did not say what it allowed | a capability probe |
| Evaluation — nothing would have caught the regression | a fixture |
| Recovery path — the failure had no exit | a runbook step |
Run this before the promotion gate, not after: a validator gap that reaches the gate as a proposed rule is judged on whether the rule is worth adding, which is the wrong question asked well.
The escalation threshold applies here too. A third recurrence of the same
violation class converts an observation into a deterministic gate — and a review
finding never silently becomes a hard gate. Both halves, specified in
decision-review § Removal is a disposition.
Output format
- Learning summary with promotion gate results
- Created/updated file path
- Linter result
- Scope decision and action taken
Gotcha
- The promotion gate is the most important step — most learnings should be REJECTED
- "Be more careful" is NOT a valid learning — it must be specific
- Always run the linter before declaring success
- The user controls every step — never auto-commit or auto-push
Do NOT
- Do NOT skip the promotion gate — it prevents skill/rule bloat
- Do NOT create both a rule AND a skill for the same learning
- Do NOT auto-push without user permission
- Do NOT create project-specific content in
src/ - Do NOT run this pipeline for trivial learnings
References
- Reflexion — arxiv.org/abs/2303.11366 Language agents that reinforce from verbal self-reflection on past trials. This pipeline adapts Reflexion by gating promotion with a human review step — learnings only harden into rules/skills after explicit approval, never auto-commit.