Skip to content

t27f: deps card -- who imports a spec and what it imports, as a social card (Closes #10720) - #10725

Merged
gHashTag merged 5 commits into
masterfrom
claude/t27f-cycle-card
Oct 19, 2026
Merged

gHashTag merged 5 commits into
masterfrom
claude/t27f-cycle-card

Conversation

@gHashTag

Copy link
Copy Markdown
Owner

Closes #10720

What

TRI CLAW gets a new social-visual skill: a card showing who uses one spec and what it uses.

  • specs/t27f/deps_card.t27 reads the t27c use-edges list and returns an ffmpeg filter graph for a 1080x1350 card:
    • the spec's first three direct importers above it, then the spec, then its first three direct imports below it, each band in edge-list order;
    • each band's label carries its direct count, and +N more appears exactly when the band holds more specs than it shows;
    • the footer carries the transitive counts both ways, each spec counted once;
    • every box and connector is in spec_graph_view's exact style;
    • a gold ON AN IMPORT CYCLE line appears exactly when deps_on_cycle holds for the spec.
  • It reuses deps_walk (spec_deps) and why_card's card_* drawing helpers by import and copies neither. Its main takes the edge list on stdin, plus DEPS_SPEC and DEPS_FONT.
  • Skill card specs/skills/t27-deps-card.t27 (t27/deps-card, tags social-visual / t27f / deps / card), with its seal.

It draws nothing (returns 0) when:

  • the spec is on no line of the edge list;
  • either walk is refused;
  • the spec has neither importers nor imports;
  • the font path or a shown name cannot be quoted, or a shown name is over 58 bytes. A name past the third row is not drawn, so it is not checked.

A graph that does not fit the caller's buffer returns cap + 1, never a cut graph.

Tests (11, all pass, 0 vacuous)

  • On the fixture, focus a draws 10 boxes and 12 texts: importer e above, imports b and c below, each at its row's y. The footer reads reaches 3 / reached by 2.
  • A band of 5 shows 3 rows and +2 more; a band of 4 shows +1 more; a band of exactly 3 shows no more.
  • d, reached two ways, is counted once (reached by 5). With an empty band, the label reads 0 and the band gets no connector.
  • A two-spec cycle shows the cycle line; a spec off the cycle does not.
  • Geometry: for 1 to 3 rows and every name length up to 58, the bands, the focus and the footer stay inside the card without overlap, and every name fits its box.
  • Negative controls:
    • an unknown spec or an empty list;
    • a refused walk in either direction;
    • an unquotable shown name above or below, or an unquotable focus. An unquotable fourth name still draws;
    • a buffer 1 or 3 bytes short;
    • an unquotable or empty font path.

Evidence (Railway lab)

  • Mutants: 9 mutants, each failing at least one test:

    • the direct count;
    • the transitive count;
    • when +N more shows;
    • the N in +N more;
    • the cycle line;
    • the hidden-name rule;
    • the lonely-spec refusal;
    • two fit bounds.

    One fit mutant, w > cap + 1, behaves exactly like the original, because both return cap + 1. The looser w > cap + 3 first survived a ten-bytes-short test. The test that kills it, three bytes short, is in this PR.

  • Build: t27c gen and zig build-exe -lc pass. Importing why_card does not pull in a second main.

  • Corpus: 2483 edge lines name 813 specs; 783 cards drew and 30 were refused.

    • 29 refusals are for a spec whose own name is over 58 bytes (port/trios/.../CR-CHAT-03/...).
    • 1 is for trios-chat/common/helpers, whose importers' names are 75 to 92 bytes.
    • base/types is the hub: 378 direct importers, reached by 400.
    • No spec in the corpus is on an import cycle.
  • Renders: the hub (base/types), a leaf (automation/owner_voice_reel) and a mid-graph spec (t27f/why_card) were rendered with ffmpeg and passed 70 of 70 pixel checks:

    • per row: fill, stroke, both inner edges, and the backdrop in the gap;
    • the focus fill and its 8 px stroke;
    • each connector, or the backdrop where a band is empty;
    • two backdrop controls.

    White text pixels appear in every row and in the focus (1438 to 5397 per box), and 0 below the bands. A deliberately wrong expectation misses on all three cards.

  • Seals and ratchet: t27c seal --verify reports all hashes MATCH for both new specs and for why_card. t27c suite --ratchet --corpus-only is RATCHET CLEAN.

Not claimed

Skill

.claude/skills/t27f/SKILL.md gets the card recipe, the pixel-check coordinates, the corpus numbers and four traps:

  • a shell helper that clobbers the caller's variable;
  • sort -k3,3n -r sorting ascending;
  • why a one-byte-short fit test cannot kill a looser bound;
  • the edge-list order on a hub.

🤖 Generated with Claude Code

gHashTag and others added 5 commits October 19, 2026 06:55
…l card (WIP, Refs #10720)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nd would differ (Refs #10720)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
 #10720)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

PR Dashboard

Generated at: 2026-10-19 00:08:35 UTC

Summary

Status Count
Total Open PRs 50
PRs with Failing Checks 45
PRs with All Checks Green 5
READY 4
FAILING 45
PENDING 0
NO CHECKS YET 0

These columns do not partition: 4 + 45 + 0 + 0 = 49, and there are 50 open PRs. A PR is being counted twice or not at all.

Seal Status

  • ⚠️ STALE -- sha256(compiler.rs)=fad12492937a != manifest seal=87e5cbd3ad94.
    The committed NMSE numbers were certified against an older compiler.rs.
    Run scripts/reseal-check.sh locally for the two-step reseal command (advisory; not a merge gate).

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.

t27f: deps card -- one spec's importers and imports as a social card

1 participant