Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
1695160
feat(claude): trim each agent's skill preload and warn on oversized p…
Oct 30, 2026
bf600eb
fix(agents): move the skill-identifier brief rule into the orchestrat…
Oct 30, 2026
4b4b6c9
Merge remote-tracking branch 'origin/feat/agent-skill-index' into fea…
Oct 30, 2026
e10c923
feat(tests): add a static skill quality gate with a shrink-only baseline
Oct 30, 2026
eec39ae
merge: sync feat/skill-quality-check onto feat/claude-preload-docs
Oct 30, 2026
12d72d6
fix(tests): fail on a code fence that is never closed
Oct 30, 2026
f484120
fix(tests): stop loose wording from passing the activation check
Oct 30, 2026
1731f4e
fix(tests): skip links in inline code and check reference-style links
Oct 30, 2026
ef91149
fix(tests): make --print-baseline refuse a baseline that would grow
Oct 30, 2026
37b1507
docs(tests): say that renaming an oversized skill cannot pass the rat…
Oct 30, 2026
c04642c
docs(ci): give the right reason for reading OLD at the merge-base
Oct 30, 2026
883c6a9
docs(agents): point at the checker for the full rule list and the thr…
Oct 30, 2026
946bd70
docs(changelog): mention the fence check and the --print-baseline guard
Oct 30, 2026
5e77121
fix(tests): do not read a plural noun before a preposition as a verb
Oct 30, 2026
5cbae63
Merge branch 'feat/claude-preload-docs' into feat/skill-quality-check
Oct 30, 2026
8af255e
fix(tests): refuse an unreadable baseline with --allow-growth too
Oct 30, 2026
27f3b10
docs(agents): rewrap the skill quality bullet at 100 columns
Oct 30, 2026
f66dcdd
fix(tests): recognize code fences nested in list items
Oct 30, 2026
395bcb2
Merge branch 'feat/claude-preload-docs' into feat/skill-quality-check
Oct 30, 2026
f36cc33
fix(tests): treat a deep-indented fence marker outside a list as inde…
Oct 30, 2026
bbedf1f
Merge branch 'feat/claude-preload-docs' into feat/skill-quality-check
Oct 30, 2026
8fc3b08
fix(tests): let a top-level fence end the list the fence walk looks t…
Oct 30, 2026
8875de5
fix(tests): open a list-item fence only up to 3 spaces past the item'…
Oct 30, 2026
50b673d
Merge branch 'feat/claude-preload-docs' into feat/skill-quality-check
Oct 31, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions .github/workflows/validate-pr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,23 @@ jobs:
# the tests/ files import yaml.
run: python3 -m pip install --user pytest pyyaml

- name: Reject a skill-quality baseline that grew
# tests/skill-quality-baseline.json may only shrink. The pytest gate
# enforces "skill <= its entry"; this step enforces "entry <= what the
# base branch had" so a PR cannot raise or add a ceiling to pass.
# The working tree is the PR's test merge commit, so it already holds any
# slimming that landed on the base branch, and OLD could be base.sha or
# the merge-base. The merge-base is used to match the dist/ and CHANGELOG
# steps.
run: |
set -e
MERGE_BASE="$(git merge-base "${{ github.event.pull_request.base.sha }}" "${{ github.event.pull_request.head.sha }}")"
if git show "${MERGE_BASE}:tests/skill-quality-baseline.json" > /tmp/base-baseline.json 2>/dev/null; then
python3 tests/skill_quality.py --check-ratchet /tmp/base-baseline.json
else
echo "notice: no baseline at the merge-base; skipping ratchet diff" >&2
fi

- name: Validate the Kiro Power (powers/konductor/)
# Users import the Power from the tagged release matching VERSION
# (github.com/aws-solutions/konductor/tree/v<VERSION>/powers/konductor),
Expand Down
14 changes: 14 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,20 @@ instructions.
convert a description from one form to the other for consistency alone. Fix a description
that gives no activation condition at all. You may broaden an existing condition (for example,
add a disjunct) when the skill's actual scope grew, but do not churn the form otherwise.
- Reference material a skill needs only sometimes (catalogues, long templates, worked examples)
lives in `skills/<name>/references/*.md`, one level deep, Markdown only. `SKILL.md` keeps the
instructions and must name each reference file with a cue saying when to read it (for example
"Read `references/aws-best-practices.md` before Stage 3"). `make test-py` runs the checks
listed in the docstring of `tests/skill_quality.py`. Among them, it fails on a frontmatter
`name` that does not match the directory, a description that is too short or gives no
activation condition, a missing link target, an unclosed code fence, an unmentioned reference
file, a reference mention without a read cue, and any size over the thresholds in
`tests/skill-quality-baseline.json` (currently 500 lines, 32 KiB and 512 description
characters) that the baseline does not carry. The baseline may only shrink.
`make test-py` only checks each skill against its entry; CI rejects a raised or added entry,
and so does `python3 tests/skill_quality.py --print-baseline` when you regenerate. Renaming a
skill counts as adding an entry, so bring an oversized skill under every threshold before you
rename it.
- Orchestrators are named `konductor`, `konductor-mux-orchestrator`, and `konductor-cmux-orchestrator`;
every specialist uses a `k-*` name. Skills are unprefixed unless avoiding a known collision.
- **License headers:** All code files must carry an SPDX short-form identifier as the very first line
Expand Down
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,12 @@ not per individual commit.

## [Unreleased]

### Added

- `make test-py` now checks every skill's frontmatter, description, size, code fences, and
`references/` links against a shrink-only baseline in `tests/skill-quality-baseline.json`.
`python3 tests/skill_quality.py --print-baseline` refuses to write a baseline that grew.

### Changed

- Claude Code subagents now preload 1 to 4 skills each (90 KB in total, down from 1.8 MB); the rest
Expand Down
69 changes: 69 additions & 0 deletions tests/skill-quality-baseline.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
{
"_comment": "Shrink-only ratchet read by tests/test_skill_quality.py. An entry is the exact measured value of a dimension that is over its threshold. Lower or delete an entry when you slim a skill; never raise one; never add one for an existing skill unless the threshold above was lowered in the same change. Renaming a skill adds an entry, so bring a renamed skill under every threshold first. Regenerate with: python3 tests/skill_quality.py --print-baseline",
"skills": {
"cost-estimation": {
"lines": 667
},
"cypress-test-implementation": {
"bytes": 53895,
"lines": 1944
},
"dynamodb-design": {
"bytes": 75539,
"lines": 2195
},
"dynamodb-validation": {
"bytes": 64678,
"lines": 1903
},
"e2e-test-strategy": {
"bytes": 46255,
"lines": 1595
},
"humanize-writing": {
"bytes": 38522,
"lines": 567
},
"iam-policy-design": {
"bytes": 39567,
"lines": 969
},
"infra-validation": {
"bytes": 49149,
"lines": 1346
},
"policy-validation": {
"bytes": 36839,
"lines": 968
},
"security-test-generation": {
"lines": 736
},
"smithy-modeling": {
"lines": 603
},
"smithy-validation": {
"lines": 574
},
"sop-state-management": {
"bytes": 32890
},
"test-coverage-analysis": {
"bytes": 69262,
"lines": 2064
},
"ui-text-validation": {
"lines": 570
}
},
"thresholds": {
"bytes": 32768,
"description_chars": 512,
"lines": 500
},
"tolerance": {
"bytes": 1024,
"description_chars": 50,
"lines": 50
}
}
Loading
Loading