Arrow71

Keep AI-generatedUI on-system.

AI agents write most of the UI now, and drift off the system. Arrow71 is the fixed point they read over MCP and can’t drift from, and the CI check that catches the drift anyway.

$ npx arrow71 init
drift caught → fixed(01)
arrow checkfile · line · the fix
$ npx arrow71 check src/CTA.tsx
src/CTA.tsx
1:34no-raw-color#2b6cffuse color.action
1:50spacing-steppadding: 10use 8
1:63type-scalefontSize: 13use 14
1:79radius-stepborderRadius: 5use radius.sm (4)
arrow: 4 error(s), 0 advisory in 1 file(s).
$ npx arrow71 fix src/CTA.tsx && npx arrow71 check src/CTA.tsx
0 violations — output is on-system.
one source of truth, both ends of the loop(02)
01 / read

Served to the agent

Your intents, scales, and component grammar, compiled to compact context over MCP, before the agent generates.

02 / enforce

Validated in CI

The same engine runs as a post-hoc gate. A GitHub Action annotates the PR and fails on drift, even if the agent ignored the context.

03 / hold

No drift

Raw hex, off-scale spacing, a stray <button>, caught with the line and the fix. Built on your DTCG tokens.

the rule catalog(03)

Deterministicchecks,conservativebydefault.

no-raw-colorhex literals map to a color intenterror
spacing-steppadding / margin / gap / inset on the scaleerror
type-scalefont-size on the type scaleerror
radius-stepborder-radius is a named radiuserror
no-raw-componentuse the component, not raw HTMLerror
action-onceone primary action per viewadvisory
error-intenterror color only on destructive UIadvisory

Token references like var(--space-8) are recognized as on-system and never flagged. False positives are treated as P0.

the gate that doesn't depend on cooperation(04)

Runitoneverypullrequest.

The Action annotates the changed lines and fails on error-level drift. Adopting on a messy repo? arrow baseline once, and only new drift is reported — no wall of red on day one.

# .github/workflows/arrow.yml
name: Arrow71
on: pull_request
jobs:
  arrow:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: 71static/arrow/action@v1
        with: { fail-on: error }
open by default(05)

Freeissingle-playerandlocal.Paidismultiplayerandhosted.

The language, engine, CLI, MCP server, GitHub Action, and editor extension are Apache-2.0 and free, for good. A hosted layer for teams (shared registries, drift analytics, governance) is coming.