From vibekit
Parses and validates subagent or tool output against the brief's declared schema, stripping pleasantries and restatements to surface only signal. Rejects non-conforming output.
How this skill is triggered — by the user, by Claude, or both
Slash command
/vibekit:report-filterThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Immediately after **any** subagent or tool chain returns output. Applies to:
Immediately after any subagent or tool chain returns output. Applies to:
Task / Agent callsEvery dispatch that went out through an RTCO brief must come back through this filter.
Unfiltered agent output contains:
None of this is signal. It costs tokens on the return trip and dilutes the signal when the caller reads or feeds the output into the next stage.
This skill extracts the signal, validates against the brief's declared OUTPUT schema, and either emits clean structured output or rejects the report back to the subagent with a fix request.
Default stance: drop, don't compress. Reports should be mostly schema-conformant structured data plus verbatim evidence. There is little middle ground worth compressing.
Every brief declares an OUTPUT schema. On return:
Parse. If the schema is JSON: parse the output as JSON. If markdown with fixed headings: check all required headings exist.
Validate keys. Every declared key is present. Types match (string, list, object).
Validate content (syntactic only). Required file:line references are syntactically valid (path:line form). Commit SHAs match /^[0-9a-f]{7,40}$/. Numeric fields parse as numbers. Non-null where required.
This skill performs syntactic validation only — it is a prompt and has no git or filesystem access. Repo-level checks (does the file actually exist on disk, does the SHA resolve to a commit, does the SHA's subject match) belong to the caller (for example, exec-dispatch), which has tool access. Never assert a semantic claim this skill cannot verify.
Reject on failure. If validation fails, do NOT silently accept. Return a rejection to the subagent:
REJECT: report did not conform to declared OUTPUT schema.
Missing/invalid: <list>
Redispatch with corrected output. Do not re-run the work; only re-format.
Three rejections in a row on the same dispatch → escalate to user. Do not enter an infinite loop.
Some briefs (notably implementation briefs from exec-dispatch) declare two valid return shapes distinguished by a top-level status field. The filter routes before validating:
Read the discriminator first. Parse the top-level status field.
status: "complete" and route to the existing single-schema validation. Drop this fallback at the next major.status: "complete" → existing variant A validation rules (unchanged).status: "needs_input" → variant B validation rules (below).status discriminator missing or invalid: declare 'complete' or 'needs_input'.Variant B (needs_input) validation rules. In addition to the standard key/type checks:
blocking_step non-empty and not whitespace. Empty → REJECT (blocking_step required: quote the verbatim plan step you halted at).ambiguity_type is exactly spec-ambiguity or missing-context. Anything else → REJECT.tried non-empty AND not a placeholder. Strings matching /^(n\/a|nothing|none|tbd)$/i after trim → REJECT (tried required: state what you attempted to resolve from the brief alone — 'n/a' is not a valid answer).question non-empty AND ends with ?. A NEEDS_INPUT halt without a question is malformed.options array length ≥ 2. Each entry has non-empty label and summary. Single-option "questions" → REJECT.recommendation non-empty. Either references one of the option labels OR is exactly the string none — no clear preference. Other "no recommendation" wording → REJECT.rolled_back is bool, no string coercion.Caveat. Syntactic validation only. The filter cannot judge whether a NEEDS_INPUT question is substantively genuine — that judgment belongs to the orchestrator (exec-dispatch), which decides whether a syntactically-valid halt is worth surfacing to the user.
Raw return (~220 tokens):
Hi! I looked into the auth middleware as you asked. It was a really interesting
exploration! Here's what I found:
The main entry point is in cmd/server/main.go around line 42 where the HTTP
server gets set up. I think the middleware chain is registered there. Then I
followed through to internal/middleware/auth.go where the actual token
validation happens at line 67 — it uses JWT with RS256, which seems reasonable.
I also noticed there's no rate limiting, which might be a gap.
Let me know if you want me to dig deeper into any of these!
Filtered (schema-conformant, ~95 tokens):
{
"entry_points": [{"file": "cmd/server/main.go", "line": 42}],
"middleware_chain": ["auth", "logging"],
"token_validation": {
"file": "internal/middleware/auth.go",
"line": 67,
"approach": "JWT RS256"
},
"gaps": ["No rate limiting observed"]
}
All evidence (file:line) verbatim. All pleasantries dropped. Output is directly consumable by the next chain stage.
Raw return excerpt:
I've completed the dark mode toggle! Here's what I did: first I wrote a failing
test, which was great because it forced me to think about the interface. The
test file is at src/components/ThemeToggle/ThemeToggle.test.tsx. I committed
with sha abc1234 ("test: add failing ThemeToggle test"). Then I implemented...
Test output:
PASS src/components/ThemeToggle/ThemeToggle.test.tsx ThemeToggle ✓ renders with light theme by default (12 ms) ✓ toggles to dark theme on click (8 ms) ✓ persists theme to localStorage (15 ms)
Tests: 3 passed, 3 total
Let me know if you'd like me to add more edge cases!
Filtered:
{
"tests_added": ["src/components/ThemeToggle/ThemeToggle.test.tsx:1"],
"files_changed": [
"src/components/ThemeToggle/ThemeToggle.tsx",
"src/components/ThemeToggle/ThemeToggle.test.tsx",
"src/components/ThemeToggle/index.ts"
],
"test_command": "npm test -- ThemeToggle",
"test_output_tail": " PASS src/components/ThemeToggle/ThemeToggle.test.tsx\n ThemeToggle\n ✓ renders with light theme by default (12 ms)\n ✓ toggles to dark theme on click (8 ms)\n ✓ persists theme to localStorage (15 ms)\n\nTests: 3 passed, 3 total",
"commits": ["abc1234 — test: add failing ThemeToggle test", "def5678 — feat: implement ThemeToggle"]
}
Test output kept byte-for-byte — verification evidence must be exact. SHAs and subjects preserved. Pleasantries dropped.
Raw return:
I did the task. It went well. Files got changed.
Filtered output:
REJECT: report did not conform to declared OUTPUT schema.
Missing/invalid:
- tests_added (required, array) — absent
- files_changed (required, array of paths) — vague string, not a list
- test_command (required, string) — absent
- test_output_tail (required, string) — absent
- commits (required, array) — absent
Redispatch with corrected output. Do not re-run the work; only re-format.
test_output_tail, error_message, code_snippet — copy byte-for-byte, no edits.tried: "n/a" or a single-option options array because "the question seems reasonable." The filter's job is schema enforcement; reasonableness is the orchestrator's call after the schema passes. Reject and let the subagent re-format.Either:
Nothing else. No meta-commentary from this skill.
npx claudepluginhub rizukirr/vibekit --plugin vibekitValidates deliverables and builds evidence trails for multi-agent handoffs, with fidelity checks for compressed outputs and structured disagreement reporting.
Validates subagent task outputs against schemas for RST directives, Sphinx code links, YAML mappings, and JSON objects. Returns validity, errors, parsed data, recovery; gates writes to disk.
Provides standardized Markdown templates for research, planning, implementation, and review agent outputs. Use when generating or parsing agent responses in autonomous dev workflows.