supertensor lint.py now rejects role= used before \stsetrole, matching
superfig and superderive lint behavior. Previously this was only caught
at TeX compile time by \stcheckrole.
- Bracket ink is part of the fit: \st@facebody drops -inkw/-inke extreme
coordinates and \stface/\ststack register them with the enclosing
group/col/row fit, so a group outline can no longer be crossed by a
member's bracket arms
- \stlink inside \stgroup or \stcol is now a package error: sub-flow
members never terminate a pending connector, so the arrow was dropped
silently while the label still rendered
- \stgroup requires role= (explicit role=neutral for mixed groups) and
must bind at least two members or one \stcol partition; a lone stack
or face inside a group is a dirty-build warning
- lint: default budget is one \stcallout per figure; the
allow-multiple-callouts directive relaxes it to one per band
- build.sh: clean-build hint no longer names hue budget (lint owns it)
- tests/group-callout.tex reworked: multi-member group with a bracketed
member as a regression probe, single callout; new negative fixtures
group-link, group-norole, group-single, callout-budget
- api.md, checklist.md, style.md, layout.md, SKILL.md updated to match
- scripts/lint.py: reject raw rectangles, absolute coordinates, hue-budget
and callout/group/formula-order violations at the source level
- tests/invalid/ + tests/lint-invalid/: negative fixtures proving the
package and linter reject bad input; test.sh now runs both directions
- references/fallback.md: degraded path when no LaTeX is available
- tests/group-callout.tex: exercise \stgroup and \stcallout
- agents/openai.yaml: agent config
- Docs and .sty updated to match