Skip to content

fix(wf-skills): state owned lifecycle transitions as observable postconditions and enforce the mapping with a guardrail test#268

Merged
aagnone3 merged 3 commits into
mainfrom
feat/262-owned-transition-postconditions-and-lint
Jul 22, 2026
Merged

fix(wf-skills): state owned lifecycle transitions as observable postconditions and enforce the mapping with a guardrail test#268
aagnone3 merged 3 commits into
mainfrom
feat/262-owned-transition-postconditions-and-lint

Conversation

@aagnone3

Copy link
Copy Markdown
Collaborator

Closes #262

Summary

Testing

  • bun test (426 pass), bun run typecheck, bun run docs:build && bun run docs:check all green; full Python suite via python3 -m unittest discover -s plugins/agentic-engineering/tests -p '*_test.py' green (new module auto-discovered by the CI pattern).
  • Real mutation check: stripping --groom-verify from wf-grooming's files makes the guardrail fail naming the skill and missing token; restored, suite green.

Post-Deploy Monitoring & Validation

  • If no operational impact
    • No additional operational monitoring required: plugin prose and a repository test only; no runtime code paths changed.

Compound Engineered 🤖 Generated with Claude Code

@aagnone3

Copy link
Copy Markdown
Collaborator Author

wf-review: comprehensive review — verdict: ready

Conformance (independent acceptance-criteria pass): every criterion of #262, #263, and #264 verified against the diff; all validation commands re-run green (Python suite 425 incl. the new module's 8 tests, bun test 426, typecheck, docs gates). Both adversarial experiments reproduced: token deletion fails naming skill + missing token; a synthetic unmapped Owns: … transition trips the inverse guard. CI green across all checks.

Findings (deduplicated):

  • P3, fixed in 57803d9: the test module's docstring documented an un-runnable invocation (python3 -m unittest tests.skill_transition_ownership_test; no tests/__init__.py). Now documents the discovery form.
  • Per-spec, deferred (design decisions from test(plugin): guardrail — every owned lifecycle transition maps to an engine procedure and read-back #264's grooming, not defects): token matching is scoped to the SKILL.md+references union (a router sentence could move into references without failing the lint), and the inverse guard matches lowercase transition only. Both are the deliberate category-over-literal tradeoff; revisit only if the class of bug recurs at router level.

Wording note: #264's "runs under the bun test gate" is satisfied via the CI unittest discover step (.github/workflows/ci.yml), not bun test itself — enforcement intent delivered.

No unresolved P1/P2 findings. Ready for wf-delivery.

@aagnone3

Copy link
Copy Markdown
Collaborator Author

Final compounding check
Head: 57803d9
Result: captured
Artifacts: plugins/agentic-engineering/tests/skill_transition_ownership_test.py; plugins/agentic-engineering/skills/wf-grooming/SKILL.md; plugins/agentic-engineering/skills/wf-development/SKILL.md; plugins/agentic-engineering/skills/wf-delivery/SKILL.md
Reason: the durable lesson (an owned lifecycle transition must state its engine procedure and observable read-back) is encoded in the router prose and enforced by the guardrail test in this same PR, per the working agreement's prefer-a-test rule; incident record lives in #262.

@aagnone3
aagnone3 merged commit 4926e33 into main Jul 22, 2026
6 checks passed
@aagnone3
aagnone3 deleted the feat/262-owned-transition-postconditions-and-lint branch July 22, 2026 04:36
@github-actions github-actions Bot mentioned this pull request Jul 22, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Guardrail owned lifecycle transitions: router-level postconditions + a lint binding every owned transition to its engine procedure

1 participant