<< All versions

Skill v1.0.0

currentLLM-judged scan90/100
babyworm/rtl-agent-team/cross-phase-contract-validator
──Details
PublishedOctober 16, 2026 at 11:43 PM
Content Hashsha256:030851d54da5e2e6...
Git SHA56c02875d77b
──Files
Files (1 file, 5.8 KB)
SKILL.md5.8 KBactive
SKILL.md · 149 lines · 5.8 KB

version: "1.0.0" name: cross-phase-contract-validator description: "Validate spec contracts across phase boundaries (P3 uarch to P4 RTL to P5 verify): port widths, memory class, REQ traceability. Use at P4/P5 entry." user-invocable: true argument-hint: "[phase-boundary: p3-p4 | p4-p5]" allowed-tools: Bash, Read, Write, Grep, Glob


<Purpose> Validate spec consistency across phase boundaries. Catches mismatches between upstream specifications and downstream implementations that individual phase gates cannot detect. </Purpose>

<Use_When>

  • P4 entry (before Wave 1): validate P3 uarch → P4 RTL contract
  • P5 entry (before Stage 1): validate P4 RTL → P5 verification contract
  • After P4 bugfix feedback loops: re-validate contracts after RTL changes
  • Manual invocation: user suspects cross-phase inconsistency

</Use_When>

<Do_Not_Use_When>

  • Within a single phase (use phase-specific review agents instead)
  • Phase 7 exploration (exempt from pipeline gates)

</Do_Not_Use_When>

Phase Boundary: P3→P4 Checks

1. Port Width Consistency

Compare across three sources — all must agree:

  • docs/phase-1-research/io_definition.json (if exists): port widths
  • docs/phase-3-uarch/*.md: interface width specifications
  • rtl/*/*.sv: actual module port declarations

For each port: io_definition[width] == uarch_spec[width] == RTL_port_width. Mismatch → CRITICAL.

2. Memory Classification Match

For each storage element in P3 uarch docs:

  • If P3 says "SRAM wrapper" → P4 RTL MUST contain sram_sp/sram_tp/sram_dp instance
  • If P3 says "register file" → P4 RTL should use logic [...] name [...] array
  • Anti-pattern: P3 says "SRAM 512×104" but P4 has logic [103:0] mem [511:0] with

combinational read → CRITICAL (register array where SRAM required)

  • Check: DEPTH * WIDTH > 4096 and no SRAM wrapper instantiated → CRITICAL

3. Pipeline Depth Match

For each module with pipeline specification in P3:

  • P3 spec states N pipeline stages
  • P4 RTL should have N always_ff sequential stages (±1 tolerance)
  • Check: count stage_* or sequential register chains in RTL
  • Mismatch beyond ±1 → MAJOR

4. Bus Width Parameterization

For each FIFO/bus width defined in P3 with a derivation formula:

  • P4 RTL localparam MUST use the same formula (derived from parameters)
  • Anti-pattern: P3 says WIDTH = PIXELS * COMPONENTS * (BPC+1) + META but P4 has

localparam L_FIFO_W = 672 → MAJOR

  • Check: grep for localparam.*WIDTH.*=.*[0-9]+; where a corresponding parameter exists

5. REQ→RTL Traceability

For each REQ-U-* in docs/phase-3-uarch/iron-requirements.json:

  • At least one RTL module must implement it
  • Check: REQ-U-* ID appears in RTL file header comments (// REQ: REQ-U-NNN)

or in docs/phase-4-rtl/functional-completeness.md

  • Missing REQ → CRITICAL

Phase Boundary: P4→P5 Checks

6. Unit Test Existence

For each RTL module in rtl/*/:

  • sim/{module}/tb_{module}.sv or equivalent must exist
  • sim/{module}/{module}_unit_results.json must exist with ref_mismatches=0
  • Missing → CRITICAL (P5 requires per-module unit tests from P4)

7. Stream B Artifact Completeness

Verify Stream B artifacts from P4 are present for P5 consumption:

  • docs/phase-4-rtl/stream-b-sva-skeletons.md → contains property/assert per module
  • docs/phase-4-rtl/stream-b-cdc-preliminary.md → references clock domain names
  • docs/phase-4-rtl/stream-b-tb-skeletons.md → references REQ tags per module
  • docs/phase-4-rtl/stream-b-synth-estimate.md → no inferred latches
  • Missing or empty → MAJOR

8. Coverage Infrastructure Readiness

  • sim/uvm/coverage/hier.cfg exists (if UVM flow) → TB infrastructure excluded from coverage
  • Coverage collector maps to REQ-U-* requirements
  • Missing → WARNING (not blocking, but coverage results will be skewed)

Execution

Read all upstream artifacts, perform checks, generate report:

Glob("docs/phase-3-uarch/*.md")
Glob("docs/phase-3-uarch/iron-requirements.json")
Glob("docs/phase-1-research/io_definition.json")
Glob("rtl/*/*.sv")
Glob("sim/*/tb_*.sv")
Glob("sim/*/*_unit_results.json")

For each check: collect evidence (file:line citations), classify (CRITICAL/MAJOR/WARNING/INFO).

Output

Write reviews/cross-phase-contract-validation.md:

markdown
# Cross-Phase Contract Validation
-Date: YYYY-MM-DD
-Boundary: P3→P4 | P4→P5
-Verdict: PASS | FAIL
## Check Results
| # | Check | Status | Evidence |
|---|-------|--------|----------|
| 1 | Port width consistency | PASS/FAIL | file:line details |
| 2 | Memory classification | PASS/FAIL | ... |
| ... | ... | ... | ... |
## Critical Findings
[details with file:line citations]
## Recommendations
[actionable fix suggestions]

Gate Behavior

  • CRITICAL findings: FAIL — blocks phase entry
  • MAJOR findings: FAIL — blocks phase entry
  • WARNING: PASS with advisory — proceed but flag for attention
  • INFO: PASS — informational only

Completion: Spec Cascade Marker Lifecycle

The edit-tracker hook creates spec-cascade-stale-p{1,2,3} markers in the project state dir (.rat/state/, or legacy .rtl-agent-team/state/ when .rat/ is absent) whenever an upstream phase doc is modified while downstream artifacts exist. This skill is the resolution path for those markers:

  • On overall Verdict: PASS (including PASS with advisory): remove all cascade

markers — rm -f .rat/state/spec-cascade-stale-p* (adjust the state dir for the legacy layout). Downstream artifacts are re-validated against the changed spec.

  • On Verdict: FAIL: keep the markers. They stay until findings are fixed and a

re-run of this skill passes.

Note: writing reviews/cross-phase-contract-validation.md with a PASS verdict also triggers hook-side auto-clear in rtl-edit-tracker.sh (PostToolUse). The explicit rm -f above is the fallback when the report is written to a non-standard path.

All versions