portal-responsive — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited portal-responsive (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Make a block behave at every width without breaking its data or design. The collapse recipes are spec, not taste — they live in `assets/design.md` (read it; don't work from memory). This skill is the thin orchestration; the responsive agent that applies it is `portal-responsive-specialist` (.claude/agents/). The block-authoring rules that still bind while you add breakpoints are in `assets/conventions.md` (CSS in the css field, every selector scoped under .wrapper, theme tokens via var(--token, fallback), no loading states), and the block data/structure model is the global `zportal` skill.
A block lives inside the portal layout grid (which has its own lg / md / sm breakpoints) and is sized to its own container's width, often far narrower than the viewport (a KPI block in a 4-column cell is ~25% of the page). So a @media (max-width:…) viewport query fires at the wrong time — the screen can be wide while the block is narrow.
@container) keyed on the block's own width. Setcontainer-type: inline-size on the block's own .wrapper (or an inner shell — never a global selector), then size children with @container rules / cqi units.
@media, treat thebreakpoint as "the block is probably this wide," not "the screen is." The design.md numbers (1100px, 640px) are block-content widths to collapse at.
assets/design.md exactly)repeat(6, 1fr) → 3-up ≤1100px → 2-up ≤640px. Keep the 14px gap; letcards reflow — don't shrink type below the scale.
canvas min-height (~200px) so charts don't collapse to zero height. (Chart redraw on resize is a ResizeObserver concern for the builder/debugger — you provide the box, not the JS.)
overflow-x:auto so wide tables scroll horizontally instead of clippingor forcing a page-wide block; keep the sticky header working and numeric columns right-aligned.
:focus-visible rings; keep hoveraffordances, just make them tap-friendly.
truncate with ellipsis (min-width:0 on flex/grid children that hold ellipsis text); nothing escapes the card radius.
prefers-reduced-motion; keep transitions ~.12–.2s ease.<script> logic, the element ids the script targets, or the data binding.You shape the boxes; the JS fills them.
quote / backtick / & / digit in any markup or CSS content you add.
update_block, re-send the existing `ui_queries` (get it from get_block first) —omitting it wipes the binding and the block goes blank. Run validate_block before writing.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.