Context
Release classification: post-release hardening (model-experience / cognitive-load guard; not required to ship v13).
This is a focused leaf under #10757 V2 (mutation-time gate). The latest friction chain is concrete:
- PR #13523 was closed unmerged after the operator challenged lifecycle skill bloat.
- PR #13529 was closed unmerged for the same accretion pattern.
- PR #13530 was closed unmerged after exact measurement showed another
+38/-1 lines and +2,232 bytes across three already-hot skill workflow payloads while still using Resolves #10777.
The repeated failure mode is not that agents lack prose telling them Map vs World Atlas exists. ADR 0008, the skill-authoring guide, and lint-skill-manifest.mjs already encode the doctrine. The gap is mechanical: the current linter catches per-file caps and two named oversized workflow maps, but a PR can still add kilobytes to other hot skill Markdown files as long as each file stays under the cap.
Live latest-open sweep: checked latest 20 open issues on 2026-06-19; no equivalent focused net-positive skill Markdown growth guard was found. Closest parent is #10757. Exact/local sweep found existing oversizedWorkflowMaps / maxPositiveDeltaBytes guard only, not a net skill Markdown delta guard. A2A in-flight claim sweep checked the latest 30 messages; no competing claim on this scope was present.
The Problem
Skill bloat is recurring because the present mechanical gates are cliff-based:
perFilePayloadBudget fails only when a single reference file exceeds the configured cap.
oversizedWorkflowMaps + maxPositiveDeltaBytes fails only for explicitly listed historical monoliths.
- Files just below the cap, or smaller hot workflow payloads, can still accumulate positive deltas every PR.
That shape lets the swarm repeatedly pass CI while making Codex-class 258k-context workflows worse. The rule that matters now is net loaded-surface direction: skill Markdown PRs should reduce or replace loaded workflow text, not merely stay below a per-file ceiling.
The Architectural Reality
.agents/skills/skills.manifest.json currently defines defaults.perFilePayloadBudget, defaults.oversizedWorkflowMaps, and defaults.maxPositiveDeltaBytes.
ai/scripts/lint/lint-skill-manifest.mjs already computes changed files against --base, reads base file sizes via git cat-file, and enforces positive-delta limits for oversizedWorkflowMaps.
test/playwright/unit/ai/scripts/lint/lintSkillManifest.spec.mjs already has focused tests for checkOversizedWorkflowMaps.
- ADR 0008 declares the recursive Map vs World Atlas discipline and names
lint-skill-manifest.mjs as the mechanical enforcement layer.
The Fix
Add a base-mode linter guard that measures the net byte delta across changed .agents/skills/**/*.md files and fails when the net skill Markdown delta is greater than defaults.maxPositiveDeltaBytes.
Expected behavior:
- Positive additions are allowed only up to the existing pointer allowance.
- Larger additions must be offset by reductions elsewhere in
.agents/skills/**/*.md.
- Pure reductions pass.
- Renames/deletes do not create false positives.
- The error message must point authors toward net reduction or replacement, not "move it to another book."
This is deliberately mechanical enforcement, not another skill prose rule.
Contract Ledger Matrix
| Target Surface |
Source of Authority |
Proposed Behavior |
Fallback |
Docs |
Evidence |
ai/scripts/lint/lint-skill-manifest.mjs --base <ref> |
#10757 V2 mutation gate + ADR 0008 Map vs World Atlas enforcement |
Fail PRs whose changed .agents/skills/**/*.md net byte delta exceeds defaults.maxPositiveDeltaBytes |
Existing per-file and oversized-map checks still run; reductions and pointer-sized deltas pass |
Keep docs minimal; error text should be self-explanatory |
Unit tests covering positive net growth, offset reduction, pure reduction, and non-skill Markdown exclusion |
defaults.maxPositiveDeltaBytes |
Existing manifest default used by the oversized-map guard |
Reuse the existing pointer allowance for net skill Markdown growth rather than adding a new config key |
If the value is omitted, preserve current zero/default behavior |
No new skill workflow prose |
lint-skill-manifest.mjs --base origin/dev plus focused Playwright unit spec |
Decision Record impact
Aligned with ADR 0008. This tightens the existing mechanical enforcement layer; it does not amend the ADR.
Acceptance Criteria
Out of Scope
- Compressing individual bloated workflows in this leaf.
- Creating new skills, new rule books, or new Atlas pages.
- Blocking all future skill additions forever; legitimate additions must pay for themselves by reducing or replacing existing skill Markdown.
- Changing MCP tool description budgets.
- Closing #10757.
Avoided Traps
- Adding another prose rule: rejected. The team already forgets the prose; this ticket targets CI/lint.
- Only adding more files to
oversizedWorkflowMaps: rejected. That would repeat the allowlist miss from #13530.
- Per-file cap tightening only: rejected. It catches cliffs, not accretion.
- New config surface by default: rejected. Reuse
maxPositiveDeltaBytes unless implementation proves a separate knob is necessary.
Related
- Parent: #10757
- ADR authority:
learn/agentos/decisions/0008-skill-anatomy-and-authoring-contract.md
- Recent calibration PRs: #13523, #13529, #13530
- Existing linter:
ai/scripts/lint/lint-skill-manifest.mjs
- Existing tests:
test/playwright/unit/ai/scripts/lint/lintSkillManifest.spec.mjs
Origin Session ID: 0a1dbe52-d3d0-43c4-8eb5-53a9e8499236
Retrieval Hint: skill bloat maxPositiveDeltaBytes net skill Markdown delta #13523 #13529 #13530 #10757
Context
Release classification: post-release hardening (model-experience / cognitive-load guard; not required to ship v13).
This is a focused leaf under #10757 V2 (mutation-time gate). The latest friction chain is concrete:
+38/-1lines and+2,232bytes across three already-hot skill workflow payloads while still usingResolves #10777.The repeated failure mode is not that agents lack prose telling them Map vs World Atlas exists. ADR 0008, the skill-authoring guide, and
lint-skill-manifest.mjsalready encode the doctrine. The gap is mechanical: the current linter catches per-file caps and two named oversized workflow maps, but a PR can still add kilobytes to other hot skill Markdown files as long as each file stays under the cap.Live latest-open sweep: checked latest 20 open issues on 2026-06-19; no equivalent focused net-positive skill Markdown growth guard was found. Closest parent is #10757. Exact/local sweep found existing
oversizedWorkflowMaps/maxPositiveDeltaBytesguard only, not a net skill Markdown delta guard. A2A in-flight claim sweep checked the latest 30 messages; no competing claim on this scope was present.The Problem
Skill bloat is recurring because the present mechanical gates are cliff-based:
perFilePayloadBudgetfails only when a single reference file exceeds the configured cap.oversizedWorkflowMaps+maxPositiveDeltaBytesfails only for explicitly listed historical monoliths.That shape lets the swarm repeatedly pass CI while making Codex-class 258k-context workflows worse. The rule that matters now is net loaded-surface direction: skill Markdown PRs should reduce or replace loaded workflow text, not merely stay below a per-file ceiling.
The Architectural Reality
.agents/skills/skills.manifest.jsoncurrently definesdefaults.perFilePayloadBudget,defaults.oversizedWorkflowMaps, anddefaults.maxPositiveDeltaBytes.ai/scripts/lint/lint-skill-manifest.mjsalready computes changed files against--base, reads base file sizes viagit cat-file, and enforces positive-delta limits foroversizedWorkflowMaps.test/playwright/unit/ai/scripts/lint/lintSkillManifest.spec.mjsalready has focused tests forcheckOversizedWorkflowMaps.lint-skill-manifest.mjsas the mechanical enforcement layer.The Fix
Add a base-mode linter guard that measures the net byte delta across changed
.agents/skills/**/*.mdfiles and fails when the net skill Markdown delta is greater thandefaults.maxPositiveDeltaBytes.Expected behavior:
.agents/skills/**/*.md.This is deliberately mechanical enforcement, not another skill prose rule.
Contract Ledger Matrix
ai/scripts/lint/lint-skill-manifest.mjs --base <ref>.agents/skills/**/*.mdnet byte delta exceedsdefaults.maxPositiveDeltaBytesdefaults.maxPositiveDeltaByteslint-skill-manifest.mjs --base origin/devplus focused Playwright unit specDecision Record impact
Aligned with ADR 0008. This tightens the existing mechanical enforcement layer; it does not amend the ADR.
Acceptance Criteria
lint-skill-manifest.mjs --base <ref>fails when changed.agents/skills/**/*.mdfiles have net positive growth abovedefaults.maxPositiveDeltaBytes.oversizedWorkflowMaps, per-file budget, section-trigger, and reference-integrity checks still run.wc -c/ byte-delta evidence and confirms no new skill prose payload was added.Out of Scope
Avoided Traps
oversizedWorkflowMaps: rejected. That would repeat the allowlist miss from #13530.maxPositiveDeltaBytesunless implementation proves a separate knob is necessary.Related
learn/agentos/decisions/0008-skill-anatomy-and-authoring-contract.mdai/scripts/lint/lint-skill-manifest.mjstest/playwright/unit/ai/scripts/lint/lintSkillManifest.spec.mjsOrigin Session ID: 0a1dbe52-d3d0-43c4-8eb5-53a9e8499236
Retrieval Hint:
skill bloat maxPositiveDeltaBytes net skill Markdown delta #13523 #13529 #13530 #10757