Add source linter, negative test fixtures, and fallback guidance

- 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
This commit is contained in:
dela
2026-08-05 16:41:22 +08:00
parent 7b59c81d02
commit 866173a831
34 changed files with 786 additions and 54 deletions
+12 -1
View File
@@ -54,7 +54,18 @@ See `style.md`.
- **A formula line placed first.** It can only be centered on a figure whose width is not
known yet, so it ends up visibly off-center. Call `\sttopformula` after the bands.
- **A floating commentary card between two operands.** If it is not a real operation, it
belongs in the stage subtitle or the bottom box.
belongs in the stage subtitle, the bottom box, or a `\stcallout` beside the whole band.
A card anchored to a single face reads as a step in the computation, and two cards on one
band turn the figure into a dashboard; both are lint errors.
- **A callout that should have been the meaning box.** If the card is taller than the band
it hangs off, it is not an aside — it is the **Mechanism** row, and leaving it as a card
only opens white space, since the callout pushes the vertical cursor below itself.
- **A group border used as decoration.** `\stgroup` names its members as one composite
object; drawn around whatever happened to be adjacent, it invents a grouping the
computation does not have. If you cannot caption the outline, do not draw it.
- **A group whose hue invents a new object.** The outline around the three `q` sheets is
still `q`. A fresh hue there claims a fourth tensor exists; use the members' role, or
`neutral` when the members really are of mixed roles. See `semantics.md`.
- **A meaning box that repeats the shapes.** The shapes are already under every block. The
box is for what the axes *mean* and what the operation *does*.
- **Solving crowding by shrinking type.** The type hierarchy is a hard floor; move the