A validator that fails when an agent-compose attribute names no runnable act: measured, 0 of 21 name one today #1399

Open
opened 2026-08-29 10:36:55 +00:00 by coilyco-ops · 0 comments
Owner

Filed by science, 2026-08-29. The mechanical half of agent-compose#388, authored here because a pre-commit validation is authored in agentic-os and rolled out from ansible. agent-compose-size and agent-compose-dedup are the precedent, though both target AGENTS.COMPOSE.md rather than the person data, so this is a new file target rather than an extension.

The measurement

Ran against coilyco-flight-deck/agent-compose at f87e651 (2026-08-29 00:36 -0700), over internal/person/data/*/SKILL.md. 21 attributes: 7 roles, 10 personalities, 4 boundaries. 1,168 lines total.

Grepped case-insensitively for websearch|webfetch|search|retrieve|fetch|look up|browse|grep|curl|kubectl|git |pytest|mcp__.

Four files matched. All four matches are the word "search" used as a noun in prose, and none names a tool:

  • role-frontend/SKILL.md:19 - "behavior, validation, or research"
  • role-platform/SKILL.md:46 - "the file over the search hit"
  • role-science/SKILL.md:87 - "An absence established by one search modality is"
  • boundary-seek-external-validation/SKILL.md:27-28 - "One search modality proves nothing: searching issues establishes nothing about a repository tree"

So the count of attribute files naming a single runnable command, tool, or API is zero out of 21. No WebSearch, no WebFetch, no mcp__*, no curl, no kubectl, no git, no pytest, anywhere in 1,168 lines of doctrine.

That is stronger than the claim in agent-compose#388, which reported two files with none. Measured across all 21, none has one.

Why it matters

personality-outward is 27 lines instructing a seat to "go find the reference point that sits outside it: what other people building this hit, what the thing cost a year ago, what the alternative would have delivered, what the field already settled." Four things to go find, and no word about how. role-director, 95 lines, is the seat that exclusively owns reaching outside the local frame, and names no method for doing it.

The observed consequence, measured over a 2h49m session at coilysiren/inbox#495: the seat grepped its own tracker fastidiously, cited issue numbers correctly, and never opened a browser to check whether a post got 2.2M views or 6.5M.

An attitude with no verb is a preference, and a preference does not fire. The attributes that do fire unprompted are the ones naming a concrete act.

The check

Fail when an attribute's SKILL.md names no literal tool, command, or API. The token set is the design question rather than the mechanism, and the mechanism is a grep -c per file.

This is a hook rather than a habit, which is the point. A rule an agent has to remember is weaker than a check that fails.

Open, and not decided here

  1. The token set. A naive allowlist of tool names rots as the surface changes, and a regex for backticked identifiers admits any inline code. Neither is obviously right.
  2. Portability. A named tool absent on the composing host reads as a satisfied instruction, which is exactly #1381's shape. A check that rewards naming aosguard makes doctrine host-specific. Deciding whether the check demands a portable act, or whether portability is handled elsewhere, gates the token set.
  3. Whether invariant/ is in scope. There are 22 directories under internal/person/data/, and invariant is not one of the 21 attributes.
  4. Where the threshold sits. agent-compose#388 proposes three acts per attribute, and notes three is Kai's number rather than a measured optimum. The check can enforce one and leave three to review.

Done when

The hook exists, is listed in .pre-commit-hooks.yaml, and fails on the current agent-compose tree until the attributes carry acts. A check that passes today would be measuring nothing.

Refs coilyco-flight-deck/agent-compose#388, #389, #390, coilysiren/inbox#495, #1381

Filed by science, 2026-08-29. The mechanical half of `agent-compose#388`, authored here because a pre-commit validation is authored in agentic-os and rolled out from ansible. `agent-compose-size` and `agent-compose-dedup` are the precedent, though both target `AGENTS.COMPOSE.md` rather than the person data, so this is a new file target rather than an extension. ## The measurement Ran against `coilyco-flight-deck/agent-compose` at `f87e651` (2026-08-29 00:36 -0700), over `internal/person/data/*/SKILL.md`. 21 attributes: 7 roles, 10 personalities, 4 boundaries. 1,168 lines total. Grepped case-insensitively for `websearch|webfetch|search|retrieve|fetch|look up|browse|grep|curl|kubectl|git |pytest|mcp__`. **Four files matched. All four matches are the word "search" used as a noun in prose, and none names a tool:** * `role-frontend/SKILL.md:19` - *"behavior, validation, or research"* * `role-platform/SKILL.md:46` - *"the file over the search hit"* * `role-science/SKILL.md:87` - *"An absence established by one search modality is"* * `boundary-seek-external-validation/SKILL.md:27-28` - *"One search modality proves nothing: searching issues establishes nothing about a repository tree"* **So the count of attribute files naming a single runnable command, tool, or API is zero out of 21.** No `WebSearch`, no `WebFetch`, no `mcp__*`, no `curl`, no `kubectl`, no `git`, no `pytest`, anywhere in 1,168 lines of doctrine. That is stronger than the claim in `agent-compose#388`, which reported two files with none. Measured across all 21, none has one. ## Why it matters `personality-outward` is 27 lines instructing a seat to *"go find the reference point that sits outside it: what other people building this hit, what the thing cost a year ago, what the alternative would have delivered, what the field already settled."* Four things to go find, and no word about how. `role-director`, 95 lines, is the seat that exclusively owns reaching outside the local frame, and names no method for doing it. The observed consequence, measured over a 2h49m session at `coilysiren/inbox#495`: the seat grepped its own tracker fastidiously, cited issue numbers correctly, and never opened a browser to check whether a post got 2.2M views or 6.5M. **An attitude with no verb is a preference, and a preference does not fire.** The attributes that do fire unprompted are the ones naming a concrete act. ## The check Fail when an attribute's `SKILL.md` names no literal tool, command, or API. The token set is the design question rather than the mechanism, and the mechanism is a `grep -c` per file. **This is a hook rather than a habit**, which is the point. A rule an agent has to remember is weaker than a check that fails. ## Open, and not decided here 1. **The token set.** A naive allowlist of tool names rots as the surface changes, and a regex for backticked identifiers admits any inline code. Neither is obviously right. 2. **Portability.** A named tool absent on the composing host reads as a satisfied instruction, which is exactly `#1381`'s shape. A check that rewards naming `aosguard` makes doctrine host-specific. Deciding whether the check demands a *portable* act, or whether portability is handled elsewhere, gates the token set. 3. **Whether `invariant/` is in scope.** There are 22 directories under `internal/person/data/`, and `invariant` is not one of the 21 attributes. 4. **Where the threshold sits.** `agent-compose#388` proposes three acts per attribute, and notes three is Kai's number rather than a measured optimum. The check can enforce one and leave three to review. ## Done when The hook exists, is listed in `.pre-commit-hooks.yaml`, and fails on the current agent-compose tree until the attributes carry acts. A check that passes today would be measuring nothing. Refs `coilyco-flight-deck/agent-compose#388`, `#389`, `#390`, `coilysiren/inbox#495`, `#1381`
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
coilyco-flight-deck/agentic-os#1399
No description provided.