jig-ui 0.20.1 → 0.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jig-ui",
3
- "version": "0.20.1",
3
+ "version": "0.22.0",
4
4
  "description": "A design system for coding agents. 143 numbered UI rules, brand x mode design tokens, and an installer for Claude Code, Codex, Cursor and opencode.",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -6,7 +6,7 @@ these, say so, list them, and stop.
6
6
 
7
7
  There are two kinds of subcommand, and they are not run the same way.
8
8
 
9
- **CLI-backed** — `install`, `update`, `init`, `check`, `explain`, `verdicts`, `gate`, `probe`, `seo`. Run the
9
+ **CLI-backed** — `install`, `update`, `init`, `check`, `explain`, `verdicts`, `gate`, `probe`, `seo`, `ship`. Run the
10
10
  matching command with `{{scripts_path}}`, passing the flags through unchanged,
11
11
  then do the work below for that subcommand. Read the command's full output —
12
12
  findings are ordered by severity, not position, so `head`, `tail`, `grep` and
@@ -25,10 +25,14 @@ decide project-wide decisions, and the reason for each once per project
25
25
  spec what exactly is being built: its smallest useful version, at every screen size
26
26
  mockup low-fidelity design of that spec, reviewed before any code
27
27
  make high-fidelity: the actual page or feature, built from the spec & mockup
28
- critique scrutinises what was built against the rules, its spec & mockup
28
+ critique scrutinises what was built against the rules, its spec & mockup;
29
+ now, or later: a page judged as it stands gets the same verdicts
29
30
 
30
31
  tweak a small change the approved mockup does not show: decided if it is a
31
32
  decision, specced, built, and re-judged where it could matter
33
+
34
+ ship everything Jig checks, with nothing optional: critiques every page
35
+ that owes one, and says what Jig does not check
32
36
  ```
33
37
 
34
38
  ## init
@@ -50,10 +54,16 @@ the answer and the CLI is not. So, first:
50
54
  `editorial` for first-visit content, `product` for the signed-in app,
51
55
  `operator` for dense daily tools. State the mapping in one line and let them
52
56
  correct it.
53
- 3. **Write `jig.config.json`** with those surfaces before running anything.
54
- `init` reads an existing config and honours it — writing one mode file per
55
- declared mode — so this is how a decision reaches the tokens.
56
- 4. **Then run the command.**
57
+ 3. **Ask when pages should be critiqued**: after every build, left for
58
+ `{{command_prefix}}ship`, or decided page by page. Page by page is the default
59
+ and writes nothing; each spec then asks. The other two go in as
60
+ `"critique": "each"` or `"critique": "at-ship"`. It is how the owner works,
61
+ so it is asked here, not in `decide`.
62
+ 4. **Write `jig.config.json`** with those surfaces, and the critique answer,
63
+ before running anything. `init` reads an existing config and honours it —
64
+ writing one mode file per declared mode — so this is how a decision reaches
65
+ the tokens.
66
+ 5. **Then run the command.**
57
67
 
58
68
  Where there is genuinely one surface, say so and move on; the point is that the
59
69
  mode was chosen rather than defaulted into.
@@ -289,6 +299,7 @@ the example shows the shape. Say it is an example, not a suggestion.
289
299
  > plan goes straight to sign-up. Nothing on this page may ask for a sales
290
300
  > call."*
291
301
 
302
+
292
303
  **Ask about the phone by name.** What does the reader see first on a phone, and
293
304
  what moves, stacks, or goes behind a control?
294
305
  > *For example: "the plans come first on the phone" — that is the answer this
@@ -297,6 +308,16 @@ what moves, stacks, or goes behind a control?
297
308
  describes the wide screen, the phone composition will be derived from it rather
298
309
  than designed — and a derived phone composition is a squeezed desktop.
299
310
 
311
+ **Last, ask when this page is critiqued: after each build, or left for
312
+ `ship`?** It is the one question about how the owner works rather than what the
313
+ page is, so it comes after all of them. Skip it only where the owner has already
314
+ said, for this page or in asking for the spec. Where the page sets up what later
315
+ pages reuse (a header, a card, a layout), say why now is worth it; otherwise
316
+ offer the project's default from `{{config_file}}`, or "each" where it has none.
317
+ Write the answer as `critique: each` or `critique: at-ship`.
318
+ > *For example: "each: every page has this header, so a finding in it is fixed
319
+ > once, now, not in ten pages later."*
320
+
300
321
  ### 2. Run `L-01`
301
322
 
302
323
  Read `L-01 · Layout method` in `{{rules_path}}/03-patterns.md` and run its five
@@ -353,9 +374,10 @@ later: [social sign-in, remember this device] # cut from V1, by name — the n
353
374
  indexable: true # from the mode — editorial yes, product/operator no. Say why when you override it.
354
375
  title: "Pricing — Hoistline" # ≤ 60 characters, the search result's first line
355
376
  description: "Three plans, every price visible. No sales call." # ≤ 155
356
- mockup: pending # `mockup` sets approved or skipped, from the user's own words
377
+ mockup: pending # approved or skipped, quoting the user: approved by `mockup`, skipped by whichever command they said it to
357
378
  mockup_at: # where the approved drawing is: a .jig/mockups path, or a Figma or Stitch link
358
379
  deviations: [] # `make` writes here; `spec` leaves it empty
380
+ critique: each # optional: each, or at-ship; left out, the project's default in {{config_file}}
359
381
  ---
360
382
  ```
361
383
 
@@ -452,9 +474,83 @@ to the spec, never the spec to the decisions.
452
474
  say in the confirmation message which fields those are, so the user can decide
453
475
  them instead.
454
476
 
477
+ ### 3c. Have it checked by a reader who did not write it
478
+
479
+ Step 3b checks the spec against the decisions. Nothing after it checks the spec
480
+ against the owner's words or against the facts it states: `make` builds a
481
+ confirmed spec as written, and `critique` compares the page to the spec, never
482
+ the spec to what is true. On jig-site a confirmed spec for a docs chapter carried
483
+ seven errors to the built page, among them a procedure Jig does not have and a
484
+ lock written at the wrong moment, and the owner had confirmed it. The writer
485
+ cannot catch these, for the same reason a builder cannot review its own page.
486
+
487
+ **Delegate to a subagent.** Give it the spec, `DECISIONS.md`, the owner's messages
488
+ from this conversation, and read access to the project. Not your reasoning, and
489
+ not your summary of what the owner meant. It writes
490
+ `.jig/specs/<name>.checked.json`:
491
+
492
+ ```json
493
+ {
494
+ "spec": "sha256 of the spec file with its confirmed: line removed",
495
+ "quotes": [
496
+ { "quote": "Only where the steps differ by path", "said": "the owner, this conversation", "holds": true }
497
+ ],
498
+ "facts": [
499
+ { "claim": "the gate records the verdicts when a critique or tweak stops", "source": "templates/COMMAND.md.tmpl:1360", "holds": false, "note": "the spec says only after the findings are fixed" },
500
+ { "claim": "Stitch needs an API key", "source": "https://stitch.withgoogle.com", "holds": "unchecked", "note": "no network access in this session" }
501
+ ],
502
+ "copy": ["Before you start"],
503
+ "conditions": [{ "owner": "three columns from 1280 up", "spec": "desktop: three columns at 1280 and wider" }],
504
+ "open": ["density of the chapter list: unspecified, make chooses"]
505
+ }
506
+ ```
507
+
508
+ - **`quotes`**: every quotation the spec gives as the owner's, and where the owner
509
+ said it. One the owner's words do not hold is removed from the spec or put back
510
+ as they said it.
511
+ - **`facts`**: every statement the spec makes about how something works (the
512
+ product, an API, an existing page, a file, a tool), with the source the reader
513
+ opened: `path` or `path:line` in the project, or a URL. `holds` is `true`,
514
+ `false` or `"unchecked"`, with a `note` for anything but `true`. A fact that
515
+ does not hold is fixed in the spec before anyone is asked; `"unchecked"` says why
516
+ it could not be opened.
517
+ - **`copy`**: the words the spec writes for the page to show as written:
518
+ headings, labels, sentences.
519
+ - **`conditions`**: each condition the owner gave, beside the spec's line for it.
520
+ - **`open`**: every `unspecified` field and every **Unresolved** item the spec
521
+ touches.
522
+
523
+ Fix what it found, then have the spec checked again: the record is of the spec
524
+ you show, and the gate compares its `spec` checksum to the file. **If you cannot
525
+ delegate, write the record yourself, with `"reader": "the writer"` in it, and say
526
+ in the confirmation message that nobody else checked the spec.** That is an
527
+ honest gap the owner can close by reading more closely; a check you ran on your
528
+ own words and reported as independent is not.
529
+
455
530
  ### 4. Get it confirmed
456
531
 
457
- Show the spec and ask the user to confirm it. Then **stop**.
532
+ Show the spec, and with it the sheet the owner checks it by, from
533
+ `<name>.checked.json`:
534
+
535
+ - **Your words:** each quotation given as theirs, and where they said it.
536
+ - **Facts:** each claim and its source, the ones that could not be checked
537
+ first.
538
+ - **Copy the page will show as written.**
539
+ - **Your conditions**, beside the lines that carry them.
540
+ - **Left for you:** the `open` items, which they can decide now.
541
+
542
+ The owner confirms a spec by checking it, and the sheet is what makes that a few
543
+ minutes' work rather than a reread. Ask them to confirm it. Then **stop**.
544
+
545
+ If, in confirming, they also say to skip the mockup, record that too:
546
+ `mockup: skipped — "<their words>"`.
547
+
548
+ **Checking a spec for the owner.** When the owner asks an agent to check a spec
549
+ and confirm it on their behalf, that agent works from the same sheet and confirms
550
+ only what it checked itself: it opens every source marked `"unchecked"` and
551
+ every one it doubts, reads the copy as the person arriving would, and holds each
552
+ condition to the owner's own words. Anything it could not check it names to the
553
+ owner instead of confirming.
458
554
 
459
555
  `confirmed: true` records that **the user said so in their own response**. You
460
556
  may not set it on their behalf, and you may not treat your own summary,
@@ -657,7 +753,10 @@ down the spec's `regions:` and its `nav:` and find each one in that frame. A reg
657
753
  the spec names and the frame lacks is drawn now, not raised in review. The gate
658
754
  checks an HTML drawing when you stop: a frame for each of the four sizes, each
659
755
  size's regions labelled in its frame (by name where the spec names them), a
660
- frame either side of each recorded switch, and no icon or image in any frame. This matters
756
+ frame either side of each recorded switch, and no icon or image in any frame. It checks
757
+ the same while you wait for the user's word, so a drawing it refuses cannot be put to
758
+ them. When it stops you, say what it refused and fix it; never report a gate block as
759
+ waiting on the user. This matters
661
760
  most on the phone, where a region dropped for space is easy to miss and the reviewer
662
761
  is looking at what is there, not at what is not.
663
762
 
@@ -670,6 +769,27 @@ Then ask **structural** questions, not whether they like it: is the most importa
670
769
  thing the first thing seen at each size? Does anything belong in a different group?
671
770
  Is anything here that V1 does not need?
672
771
 
772
+ **Give them the sheet they check it by.** The drawing is the confirmed spec,
773
+ drawn, so what the owner checks first is that it matches. The gate has checked
774
+ that each region is labelled; whether each is drawn the way the spec says is
775
+ theirs to see. Size by size, set the spec's line beside what the frame shows:
776
+
777
+ - the regions in the spec's order, what comes first, what is grouped, where each
778
+ sits;
779
+ - `nav:` for that size, and the navigation drawn;
780
+ - each state in `states:` that changes the layout, and where it is drawn;
781
+ - anything the spec says a part does that a still drawing cannot show, quoted
782
+ from the spec. Name only what the spec says: a behaviour it does not mention is
783
+ not yours to raise here, and one you add is a spec change;
784
+ - the owner's conditions from the spec, beside the lines that carry them;
785
+ - and what the drawing leaves out on purpose: `later:`, and colour, type and
786
+ spacing, which the tokens settle.
787
+
788
+ **Checking a mockup for the owner.** When the owner asks an agent to check the
789
+ drawing and approve it on their behalf, that agent renders every frame, compares
790
+ each with its line in the spec, and approves only what it checked itself. What
791
+ it could not check, it names to the owner instead of approving.
792
+
673
793
  ### 4. Every change goes into the spec first
674
794
 
675
795
  When the review moves, adds, cuts or regroups anything, **edit the spec**, then
@@ -683,13 +803,20 @@ confirmed again.
683
803
 
684
804
  ### 5. Record the outcome in the user's words
685
805
 
686
- - The user approves → set `mockup: approved` in the spec, and `confirmed: true` if
687
- review changed it. Record where the approved drawing is in `mockup_at:` — the
688
- file path, or the Figma or Stitch link. Only their own response counts; your summary of the drawing,
689
- or no objection, does not.
690
- - The user says to skip it → `mockup: skipped — <their reason>`. For a change small
691
- enough that drawing it costs more than building it, that is a reasonable call; it
692
- is still theirs to make.
806
+ - The user approves → set `mockup: approved — "<their words>"` in the spec,
807
+ quoting the reply that approved it, and `confirmed: true` if review changed it.
808
+ Record where the approved drawing is in `mockup_at:` — the file path, or the
809
+ Figma or Stitch link. Only their own response counts; your summary of the
810
+ drawing, or no objection, does not. **A condition they attach goes into the
811
+ spec first**, in their words, on the lines it governs: on jig-site the owner
812
+ approved with "three columns at 1280 and wider, inside the page margins", the
813
+ condition lived only in the conversation, and `make` moved the switch to 1290.
814
+ - The user says to skip it → `mockup: skipped — "<their words>"`. For a change
815
+ small enough that drawing it costs more than building it, that is a reasonable
816
+ call; it is still theirs to make.
817
+
818
+ With the Stop hook, the gate reads the quotation after `approved` or `skipped` and
819
+ holds it to what the owner said in this session.
693
820
 
694
821
  Then stop. The next step is `{{command_prefix}}make`.
695
822
 
@@ -710,9 +837,12 @@ each finding, run the finish again, and then `critique` runs again. See step 5 o
710
837
  prevent.
711
838
  - `confirmed: false` → the spec exists but nobody has agreed to it. Ask for
712
839
  confirmation and stop.
713
- - `mockup: pending` → the feature has not been looked at. Run
714
- `{{command_prefix}}mockup`, or ask the user whether to skip it. Do not decide to
715
- skip it yourself.
840
+ - `mockup: pending` → nobody has said whether to draw it. Unless the user already
841
+ said to skip it in asking for `make`, ask once: draw it with
842
+ `{{command_prefix}}mockup`, or skip it? If they skip it, write
843
+ `mockup: skipped — "<their words>"` in the spec and build from the spec alone.
844
+ Do not decide to skip it yourself, and do not finish with the spec still
845
+ pending: the gate holds a `make` that does.
716
846
 
717
847
  ### Build
718
848
 
@@ -817,7 +947,16 @@ and was never looked at on a phone has satisfied a third of its spec. Then run t
817
947
  self-check at the end of `{{rules_path}}/00-anti-patterns.md`.
818
948
 
819
949
  Report the `JIG_CHECK:` line, the table, and any new deviations. Then suggest
820
- `{{command_prefix}}critique`.
950
+ `{{command_prefix}}critique`, now or later: the owner decides when. A page judged
951
+ once, as it stands, gets the verdicts it would have got straight after this build,
952
+ so a critique can wait for a batch of pages, or for `{{command_prefix}}ship`,
953
+ which will not pass until every page is judged. Where the spec says
954
+ `critique: at-ship`, or it is silent and `{{config_file}}` says
955
+ `"critique": "at-ship"`, the owner has already said to wait; do not ask. Where the
956
+ spec says `critique: each`, suggest it now. One
957
+ thing to say when it applies: if this page sets up something later pages will
958
+ reuse (a header, a card, a layout), a finding in it found late is fixed in every
959
+ page built on it, so its critique is worth running now.
821
960
 
822
961
  ## critique
823
962
 
@@ -1159,11 +1298,16 @@ preserve while fixing them.
1159
1298
 
1160
1299
  **Say what happened to the last round's findings.** `verdicts` compares this
1161
1300
  critique with the one before it in git and prints `Since the critique before
1162
- this one: <n> fixed, <n> still open, <n> ruled by the owner, <n> new`, with the
1163
- ids. Put that line in the report, as `verdicts` printed it, above the findings.
1164
- The owner should not have to set two reports side by side to learn whether the
1165
- make round worked. The comparison is made after both arms have written, so it
1166
- tells the arms nothing.
1301
+ this one: <n> fixed, <n> judged ok though the lines they cited did not change, <n>
1302
+ still open, <n> ruled by the owner, <n> new`, with the ids. Put that line in the
1303
+ report, as `verdicts` printed it, above the findings. The owner should not have to set two reports side
1304
+ by side to learn whether the make round worked. The comparison is made after both
1305
+ arms have written, so it tells the arms nothing.
1306
+
1307
+ A finding counts as fixed only where the lines it cited changed. One judged ok
1308
+ where nothing it pointed at changed is either two readers disagreeing about the
1309
+ same code, or a fix made somewhere the finding did not point. Look at which, and
1310
+ say so: the reading you stand by and why, or where the fix landed.
1167
1311
 
1168
1312
  List `ruled` verdicts after the findings, under their own heading, each with the
1169
1313
  decision it cites. They are not findings, and they are not hidden either.
@@ -1238,7 +1382,9 @@ because the drawing stays true, and no full critique, because nothing else moved
1238
1382
  a page being made, not changed. Run `{{command_prefix}}spec`, `mockup` and
1239
1383
  `make`.
1240
1384
  - **No critique record for the page yet** (`.jig/critique/<surface>/`) → nothing
1241
- has been judged, so nothing can be re-judged. Run `{{command_prefix}}critique`.
1385
+ has been judged, so nothing can be re-judged. Run `{{command_prefix}}critique`,
1386
+ unless the re-judge is deferred (step 4): then the page's first critique judges
1387
+ it whole.
1242
1388
  - **The change adds, removes, reorders or regroups a region, changes the
1243
1389
  navigation at any size, or would make the drawing wrong** → it is not a tweak.
1244
1390
  Say so and name the route: `spec`, then `mockup`, then `make`. The gate checks
@@ -1256,6 +1402,14 @@ colour for a mark, how versions are written), record it in `DECISIONS.md` the wa
1256
1402
  applies a rule, or answers a finding the rules already settle (a word stranded on
1257
1403
  its own line, `B-106`), there is nothing to decide; do not invent a decision.
1258
1404
 
1405
+ The owner's words are the ones tweak.json records as `change`. A `**Why:**` you
1406
+ add quotes them, in quotation marks, and nothing else; what you read into them,
1407
+ or into a screenshot the owner pointed at, goes under `**Why (inferred):**`. On
1408
+ jig-site a tweak shown a picture of a copy button wrote an exception to `E-51`
1409
+ "given directly by the owner … by reference rather than words": a ruling nobody
1410
+ gave, which every later critique would have judged the page by. The gate stops a
1411
+ tweak whose new `**Why:**` quotes words tweak.json does not hold.
1412
+
1259
1413
  ### 2. Bring the spec in line, if it disagrees
1260
1414
 
1261
1415
  If the spec says something the change contradicts, or the page will no longer
@@ -1297,12 +1451,61 @@ verdict and reason, adding `"tweak": "<at>"`. It changes nothing else. Then run
1297
1451
  The gate holds both ends: it refuses a tweak that changed a verdict it did not
1298
1452
  name, and one that named a verdict it did not re-judge.
1299
1453
 
1454
+ **The re-judge can wait**, when the owner says so. Write their words in
1455
+ tweak.json as `"deferred": "<what they said>"`, or `"deferred": true` where the
1456
+ page's spec says `critique: at-ship` (or, the spec silent, `{{config_file}}`
1457
+ does); keep `ids` named for whoever
1458
+ judges it, and leave the verdicts alone. The page then owes a critique, and
1459
+ `{{command_prefix}}ship` will not pass until one has judged it. Never defer it
1460
+ on your own account: the gate refuses a deferral nobody gave.
1461
+
1300
1462
  ### Finish
1301
1463
 
1302
1464
  Report what changed, in the owner's words; the decision and spec lines you
1303
1465
  touched, if any; each re-judged verdict and what it says now; and the
1304
1466
  `JIG_CHECK` line. A re-judged verdict that is a finding goes to the owner: it is
1305
- fixed by another tweak, or by `make` if it needs more.
1467
+ fixed by another tweak, or by `make` if it needs more. A deferred re-judge is
1468
+ reported as deferred, with the ids it will cover.
1469
+
1470
+ ## ship
1471
+
1472
+ **Get the project ready to ship, by everything Jig checks.** `critique` can wait
1473
+ while pages are built and tweaked; here nothing is optional. `ship` does not
1474
+ deploy anything, and it is not a security review: Jig has no rules for security,
1475
+ performance or what a real screen reader does, and the report says so every time.
1476
+
1477
+ ### 1. Build, then ask the CLI what is owed
1478
+
1479
+ Build the project the way it ships, then run `{{scripts_path}} ship`. It runs
1480
+ `check --all --ci` and `seo`, and reads every confirmed spec's critique: a page
1481
+ is owed a critique when it has none, when its page changed after it was judged,
1482
+ when a tweak deferred its re-judge, when its verdicts are incomplete, or when a
1483
+ finding stands that the owner has not ruled on. It prints each page's state and
1484
+ a `JIG_SHIP:` line, and exits non-zero until the project is ready. A spec that
1485
+ is not confirmed yet is in progress and not held against the ship.
1486
+
1487
+ ### 2. Clear what it names
1488
+
1489
+ - **Mechanical or `seo` errors** → fix them as `make` would, and run `check`
1490
+ again.
1491
+ - **A page owed a critique** → run `critique` on it by its own procedure, in
1492
+ full: three arms, each a reader that has not seen this conversation or the
1493
+ build. The readers are independent here as everywhere; that you are
1494
+ orchestrating does not make you one of them.
1495
+ - **Findings** → put them to the owner. Each is fixed (by `make`, or `tweak` for
1496
+ a small one), or the owner rules on it in their own words and the ruling is
1497
+ recorded (`decide`, or `tweak`'s decision step), after which the verdict is
1498
+ `ruled`. Your view that a finding is minor is not a ruling.
1499
+
1500
+ Then build again and run `{{scripts_path}} ship` again. Repeat until it says
1501
+ `ready=yes`.
1502
+
1503
+ ### Finish
1504
+
1505
+ Report the `JIG_SHIP:` line as printed, each page's state, what was fixed and
1506
+ what the owner ruled, and the line the CLI ends with naming what Jig does not
1507
+ check. With the Stop hook, a `ship` session is held while `jig ship` fails,
1508
+ unless you stop to ask the owner something.
1306
1509
 
1307
1510
  ## probe
1308
1511
 
@@ -1341,6 +1544,18 @@ blocking. It also refuses when a critique's verdict files changed after `critiqu
1341
1544
  wrote them, in a session that did not run `critique`: a fix is judged by the next
1342
1545
  review, never by the builder editing the last one.
1343
1546
 
1547
+ When a `critique` or `tweak` session stops, the gate records its verdicts in
1548
+ `.jig/critique/<surface>/verdicts.lock`. That happens after you have committed, so
1549
+ if your verdicts are committed it stops you once more to commit the lock on its
1550
+ own; the next stop passes.
1551
+
1552
+ **The lock is the gate's to write, never yours.** When the gate is wrong (it
1553
+ misreads the session, or asks for something the procedure does not), say what it
1554
+ got wrong, leave the lock as it is, and report the work as held by the gate. On
1555
+ jig-site the gate misread a tweak as no command at all, and the session computed
1556
+ the lock by hand and committed it. The lock was right that time, and a lock an
1557
+ agent can write is still a record of nothing.
1558
+
1344
1559
  It judges the critiques this session touched: any with a file changed since the
1345
1560
  session began, and the current spec's surface when you ran `critique`. Another
1346
1561
  page's older critique does not hold you back. To set a critique aside for good,
@@ -31,6 +31,11 @@ cite the number when you follow or deliberately break one.
31
31
  so ask for the step you need rather than doing it from this summary. Never design the whole product up front. Critique findings go back to
32
32
  `make`, then `critique` again, until clean or accepted by the user — then the
33
33
  next feature.
34
+ **Asked to check or confirm a spec, or a mockup, for the owner?** Work from
35
+ the sheet the command shows with it: `{{command_prefix}}spec`'s from
36
+ `.jig/specs/<name>.checked.json` (its step 4), `{{command_prefix}}mockup`'s
37
+ size by size against the spec (its step 3, rendering every frame). Confirm
38
+ only what you checked yourself, and name to the owner what you could not.
34
39
  **Building a screen rather than a single component?** Read `L-01 · Layout
35
40
  method` in `{{rules_path}}/03-patterns.md` and run its five steps before
36
41
  writing any markup. It is a procedure, not a component, so step 4 never
@@ -29,6 +29,11 @@
29
29
  "argumentHint": "[--json]",
30
30
  "status": "available"
31
31
  },
32
+ "ship": {
33
+ "description": "Say whether the project is ready to ship, by everything Jig checks: no mechanical or seo errors, and every confirmed page critiqued as it stands, with nothing the owner has not ruled on. The slash command critiques what is owed first. Security, performance and deployment are not Jig's to check.",
34
+ "argumentHint": "",
35
+ "status": "available"
36
+ },
32
37
  "verdicts": {
33
38
  "description": "Verify a critique's verdict files: every rule in each pass judged once, no id that does not exist, no rule in the wrong arm, rendered only with a screenshot. Computes the counts the critique reports, so the agent never writes them.",
34
39
  "argumentHint": "<surface>",