super-ux 0.67.0 → 0.67.1
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/CHANGELOG.md +45 -0
- package/cursor/rules/copywriting.mdc +4 -4
- package/cursor/rules/ux-audit.mdc +6 -6
- package/package.json +1 -1
- package/templates/brand/README.md +5 -5
- package/templates/brand/channels.md +1 -1
- package/templates/brand/facts.md +2 -2
- package/templates/brand/locale.md +3 -3
- package/templates/brand/strings.md +7 -7
- package/templates/brand/terminology.md +2 -2
- package/templates/brand/voice.md +2 -2
- package/templates/foundation.md +6 -6
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,48 @@
|
|
|
1
|
+
## 0.67.1 (2026-11-11): delegated mode, task-pipeline handoff, seeds without the em dash
|
|
2
|
+
|
|
3
|
+
From the family audit of 2026-11-11.
|
|
4
|
+
|
|
5
|
+
- **Delegated mode.** `system-map.md` gains *Delegated mode: who takes a
|
|
6
|
+
decision*: when the host's instructions delegate decisions, a stop that is
|
|
7
|
+
not a gate takes the recorded decision or the documented default, has the
|
|
8
|
+
pick judged by a second, different model where the host provides one,
|
|
9
|
+
records it (`Approved-by: agent (delegated)`) and continues; trial or first
|
|
10
|
+
versions show the variants and wait; without delegation every stop asks as
|
|
11
|
+
before. brand-voice (pack pick, humanization pass, section approval),
|
|
12
|
+
ux-foundation (layer approval), ux-flows (2-up pick, web surfaces question),
|
|
13
|
+
copywriting (headline options), `/ux-init` (vision question) and
|
|
14
|
+
`/ux-flows` (Figma question) point to it in one clause.
|
|
15
|
+
- **Plans go to task-pipeline.** ux-audit step 9, `/ux` option 14,
|
|
16
|
+
`flow-improve.md` and the plan template hand the fix plan to
|
|
17
|
+
`/task-pipeline` when it is installed; the superpowers `writing-plans`
|
|
18
|
+
branch is gone.
|
|
19
|
+
- **One install block.** The sheleg-design and task-pipeline install commands
|
|
20
|
+
live in `system-map.md` → Companions; `/ux`, `visual-identity.md` and
|
|
21
|
+
ux-flows point to it.
|
|
22
|
+
- **ux-scenarios reads less.** Editing a scenario reads the contract's
|
|
23
|
+
Contents and the touched section; a full read only for a new scenarios
|
|
24
|
+
file. The body names its non-goal (implementation is task-pipeline's).
|
|
25
|
+
- **Seeds without the em dash.** `templates/brand/` (22), `templates/foundation.md`
|
|
26
|
+
(6, the journey example in `scenario-format.md` with it) and the manifest
|
|
27
|
+
description. `validate_seed_no_em_dash` scans all of `templates/` and the
|
|
28
|
+
manifests; eight templates that mirror contract formats or hard-rule keys
|
|
29
|
+
are listed as pending (board B-034).
|
|
30
|
+
- **copywriting** reads `facts.md` beside voice, terminology and channels; with
|
|
31
|
+
no pack it runs brand-voice Init and continues; a copy-check MCP tool such
|
|
32
|
+
as Copylot's `copylot_check` runs on every string in every shipped locale,
|
|
33
|
+
with its report id recorded (`/copy` step 6).
|
|
34
|
+
- **Commands that share a skill's name** (`/ux-audit`, `/ux-flows`,
|
|
35
|
+
`/ux-foundation`, `/vision`) carry `disable-model-invocation: true`: people
|
|
36
|
+
type them, and the model now sees the skill's own description instead of
|
|
37
|
+
the command's (checked with `claude -p --plugin-dir` on Claude Code
|
|
38
|
+
2.1.299, 2026-11-11).
|
|
39
|
+
- **Smaller fixes.** ux-flows no longer names the retired Lazyweb MCP and says
|
|
40
|
+
a missing reference server means the sweep did not run; `seo-aeo-safety.md`
|
|
41
|
+
drops the "until 0.28 is installed" sentence; `.cursor/rules` is mirrored
|
|
42
|
+
from the shipped `cursor/rules` by `sync_references.py` and checked by
|
|
43
|
+
`validate_cursor_self_install`; `SKILL-CARD.md` and `test/evals/RESULTS.md`
|
|
44
|
+
say the 2026-08-31 eval rates predate the current descriptions.
|
|
45
|
+
|
|
1
46
|
## 0.67.0 (2026-11-09): contract v5, agents and capabilities (opt-in)
|
|
2
47
|
|
|
3
48
|
Packet P-SU of the family run `2026-11-09-ai-native` (hub plan and design:
|
|
@@ -11,10 +11,10 @@ finish a button is how a product ends up with six voices.
|
|
|
11
11
|
|
|
12
12
|
## First action, every time
|
|
13
13
|
|
|
14
|
-
Read the pack: `docs/brand/voice.md`, `terminology.md`, and
|
|
15
|
-
`channels.md` record for the surface being written. **No pack?
|
|
16
|
-
`/brand-init
|
|
17
|
-
pause.
|
|
14
|
+
Read the pack: `docs/brand/voice.md`, `terminology.md`, `facts.md`, and
|
|
15
|
+
the `channels.md` record for the surface being written. **No pack? Run
|
|
16
|
+
`/brand-init`, then continue.** Guessing the voice and being wrong costs
|
|
17
|
+
more than the pause.
|
|
18
18
|
|
|
19
19
|
Ownership is by file: `brand-voice` owns voice, terms, facts, channels and
|
|
20
20
|
locale policy. Missing terms or facts are reported, never invented. This pass
|
|
@@ -53,9 +53,9 @@ to-do list, and the surface that needs rebuilding gets patched forever.
|
|
|
53
53
|
CREATE/MODIFY/DELETE change table, every row traced to
|
|
54
54
|
scenario/flow/finding IDs, prioritized Frequency × Severity ×
|
|
55
55
|
Solvability. Then tell the user what they have in hand (plan, audit
|
|
56
|
-
report, docs/ux chain, Figma) and
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
`/plugin
|
|
60
|
-
|
|
61
|
-
executable without the conversation
|
|
56
|
+
report, docs/ux chain, Figma) and hand the plan to the ssheleg
|
|
57
|
+
task-pipeline plugin when it is installed (`/task-pipeline <plan
|
|
58
|
+
file>`); otherwise its optional install is
|
|
59
|
+
`/plugin marketplace add ssheleg/task-pipeline` +
|
|
60
|
+
`/plugin install task-pipeline@task-pipeline`, or implement by hand. The
|
|
61
|
+
plan is executable without the conversation.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "super-ux",
|
|
3
|
-
"version": "0.67.
|
|
3
|
+
"version": "0.67.1",
|
|
4
4
|
"scripts": {
|
|
5
5
|
"test": "python3 test/validate.py && python3 test/family_gate.py && python3 test/family_gate.py --self-test && python3 test/brand_lint_test.py && python3 test/display_copy_test.py && python3 test/ux_lint_test.py && python3 docs/ux/lint.py && python3 docs/brand/lint.py && node test/installer_test.js && npm run test:audit",
|
|
6
6
|
"test:audit": "for t in test/audit_regressions/*.py; do python3 \"$t\" || exit 1; done"
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
Contract: brand-contract v1
|
|
2
2
|
|
|
3
|
-
# docs/brand
|
|
3
|
+
# docs/brand/: how this product speaks
|
|
4
4
|
|
|
5
5
|
`docs/ux/` decides **what the product does**. This folder decides **how it
|
|
6
|
-
speaks
|
|
6
|
+
speaks**: in the interface, on the landing page, in the store listing, in a
|
|
7
7
|
post. One voice, many registers.
|
|
8
8
|
|
|
9
9
|
Owned by the `brand-voice` skill. Written by `copywriting`. Checked by
|
|
@@ -13,7 +13,7 @@ Owned by the `brand-voice` skill. Written by `copywriting`. Checked by
|
|
|
13
13
|
|---|---|
|
|
14
14
|
| `voice.md` | the identity: pack, five axes, narrative, invariants |
|
|
15
15
|
| `terminology.md` | our words, banned words, entity and tier names |
|
|
16
|
-
| `facts.md` | canonical numbers and proof
|
|
16
|
+
| `facts.md` | canonical numbers and proof, the only source of a figure |
|
|
17
17
|
| `channels.md` | one record per surface: register, limits, bans |
|
|
18
18
|
| `copy-brief.md` | current marketing task inputs; unknowns stay explicit |
|
|
19
19
|
| `strings.md` | interface string registry → `file:line` → scenario |
|
|
@@ -23,7 +23,7 @@ Owned by the `brand-voice` skill. Written by `copywriting`. Checked by
|
|
|
23
23
|
|
|
24
24
|
**Fill this in before anything else.** The linter scans nothing outside these
|
|
25
25
|
paths, and refuses to report a clean run over a surface it never read
|
|
26
|
-
(`B006` for no block, `B009` for an unmatched glob). Delete the keys this project does not have
|
|
26
|
+
(`B006` for no block, `B009` for an unmatched glob). Delete the keys this project does not have: a declared-but-absent
|
|
27
27
|
source is worse than an omitted one.
|
|
28
28
|
|
|
29
29
|
```
|
|
@@ -41,7 +41,7 @@ no-title-period rule a required gate, run the resolved brand linter with
|
|
|
41
41
|
`--fail-on B063`; default warnings remain advisory. The placeholder source
|
|
42
42
|
patterns above must be replaced before the first real lint run.
|
|
43
43
|
|
|
44
|
-
`ui` and `marketing` also classify findings
|
|
44
|
+
`ui` and `marketing` also classify findings: several checks apply to only
|
|
45
45
|
one of the two.
|
|
46
46
|
|
|
47
47
|
## The hard rule
|
|
@@ -3,7 +3,7 @@ Contract: brand-contract v1
|
|
|
3
3
|
# Channels
|
|
4
4
|
|
|
5
5
|
One record per surface. `Register` is deltas against the five axes in
|
|
6
|
-
`voice.md
|
|
6
|
+
`voice.md`: a register moves the axes, never the invariants.
|
|
7
7
|
|
|
8
8
|
`Forbidden` always carries both halves, even when one is `none`. Platform
|
|
9
9
|
physics and brand choice written on one line become indistinguishable within
|
package/templates/brand/facts.md
CHANGED
|
@@ -13,7 +13,7 @@ A missing fact is reported, never invented to close a gap.
|
|
|
13
13
|
| <what the number counts> | <448> | <api/catalog.json> | <2026-08-05> | <2026-11-05> | <yes> |
|
|
14
14
|
| <internal figure> | <$3.10> | <billing export> | <2026-08-05> | <2026-11-05> | <no> |
|
|
15
15
|
|
|
16
|
-
`Public: no` marks figures that exist and must never be quoted
|
|
16
|
+
`Public: no` marks figures that exist and must never be quoted: internal
|
|
17
17
|
margins, unreleased counts, anything under embargo. The linter treats
|
|
18
18
|
quoting one as the same failure as quoting a number that does not exist.
|
|
19
19
|
|
|
@@ -28,7 +28,7 @@ dated, and re-checked.
|
|
|
28
28
|
|
|
29
29
|
## Required disclaimers
|
|
30
30
|
|
|
31
|
-
Text that must appear alongside specific claims
|
|
31
|
+
Text that must appear alongside specific claims: regulatory, contractual, or
|
|
32
32
|
promised. Locale differences live in `locales/<code>.md`.
|
|
33
33
|
|
|
34
34
|
| Claim it attaches to | Required text |
|
|
@@ -5,13 +5,13 @@ Address form: <Sie>
|
|
|
5
5
|
Length coefficient: <1.30>
|
|
6
6
|
Humor: <-1 from base>
|
|
7
7
|
Never translated: <product name, entity names, tier names>
|
|
8
|
-
Keywords: <own research
|
|
8
|
+
Keywords: <own research, see below>
|
|
9
9
|
Reviewed by: <name of someone who reads this language daily, or `unreviewed`>
|
|
10
10
|
|
|
11
11
|
# Locale delta
|
|
12
12
|
|
|
13
13
|
Copy this file to `locales/<code>.md`, one per declared locale. The invariant
|
|
14
|
-
half of the voice does not appear here
|
|
14
|
+
half of the voice does not appear here: it is in `voice.md` and holds in
|
|
15
15
|
every language. This file carries only what is decided again.
|
|
16
16
|
|
|
17
17
|
## Address form
|
|
@@ -51,7 +51,7 @@ a missing one is a defect even when parity is otherwise complete.
|
|
|
51
51
|
|
|
52
52
|
## Length notes
|
|
53
53
|
|
|
54
|
-
Surfaces where the coefficient bites hardest in this locale
|
|
54
|
+
Surfaces where the coefficient bites hardest in this locale, usually
|
|
55
55
|
buttons, tab labels, store title and subtitle. Recorded here so the
|
|
56
56
|
constraint reaches the primary-locale original, where it can still be
|
|
57
57
|
designed around.
|
|
@@ -7,7 +7,7 @@ does not replace i18n keys. It records which strings have been reconciled
|
|
|
7
7
|
with the voice, which scenario each serves, and where each one lives.
|
|
8
8
|
|
|
9
9
|
This is what makes "one action, two names" (`B020`) checkable at all. Without
|
|
10
|
-
it, that defect is only findable by reading the entire interface
|
|
10
|
+
it, that defect is only findable by reading the entire interface, which is
|
|
11
11
|
why it survives in every product that has not written one down.
|
|
12
12
|
|
|
13
13
|
Populated by an inventory sweep at init, not by hand.
|
|
@@ -18,14 +18,14 @@ Populated by an inventory sweep at init, not by hand.
|
|
|
18
18
|
|
|
19
19
|
## Columns
|
|
20
20
|
|
|
21
|
-
- **Key
|
|
21
|
+
- **Key:** dot-separated, stable, names the action rather than the screen.
|
|
22
22
|
Two rows sharing a `Key` with different `Text` is `B020`.
|
|
23
|
-
- **Text (primary)
|
|
23
|
+
- **Text (primary):** the string in the primary locale. Other locales live
|
|
24
24
|
in the project's own i18n files; parity is computed against this column.
|
|
25
|
-
- **Location
|
|
26
|
-
- **Scenario
|
|
25
|
+
- **Location:** `file:line`. A location that no longer resolves is `B023`.
|
|
26
|
+
- **Scenario:** the `SCN-NNN` this string serves. A string serving no
|
|
27
27
|
scenario is a question for `ux-scenarios`, not a copy problem.
|
|
28
|
-
- **Status
|
|
28
|
+
- **Status:** `agreed` · `proposed` · `drifted` · `orphan`.
|
|
29
29
|
|
|
30
30
|
## Statuses
|
|
31
31
|
|
|
@@ -36,6 +36,6 @@ Populated by an inventory sweep at init, not by hand.
|
|
|
36
36
|
| `drifted` | the code no longer matches this row (`B021`) |
|
|
37
37
|
| `orphan` | in the registry, no longer in the code |
|
|
38
38
|
|
|
39
|
-
A string found in code with no row here is `B022
|
|
39
|
+
A string found in code with no row here is `B022`: a warning, not an error,
|
|
40
40
|
so adopting this registry on an existing product does not block from day one.
|
|
41
41
|
It becomes an error only once someone agrees the row.
|
|
@@ -5,7 +5,7 @@ Contract: brand-contract v1
|
|
|
5
5
|
The dictionary the linter reads. Column one of **Product terms** and
|
|
6
6
|
**Banned** drives `B010` and `B011`; **Entity and tier names** drives `B012`.
|
|
7
7
|
|
|
8
|
-
## Product terms
|
|
8
|
+
## Product terms: always
|
|
9
9
|
|
|
10
10
|
Where the product has its own word, the generic one is a defect, not a
|
|
11
11
|
synonym.
|
|
@@ -14,7 +14,7 @@ synonym.
|
|
|
14
14
|
|---|---|---|
|
|
15
15
|
| <Run> | <Execution, Job> | <what the product performs> |
|
|
16
16
|
|
|
17
|
-
## Entity and tier names
|
|
17
|
+
## Entity and tier names: exact spelling
|
|
18
18
|
|
|
19
19
|
One spelling, everywhere: interface, marketing, billing, support, docs.
|
|
20
20
|
|
package/templates/brand/voice.md
CHANGED
|
@@ -2,7 +2,7 @@ Contract: brand-contract v1
|
|
|
2
2
|
Voice pack: <pack id from voice-packs.md, or `custom`>
|
|
3
3
|
Locales: <en (primary)>
|
|
4
4
|
Locale parity threshold: 80%
|
|
5
|
-
Derived-from: <P-NN, JTBD-NN from docs/ux/foundation.md
|
|
5
|
+
Derived-from: <P-NN, JTBD-NN from docs/ux/foundation.md, or `inferred`>
|
|
6
6
|
Status: draft
|
|
7
7
|
Last calibrated: <YYYY-MM-DD>
|
|
8
8
|
Humanization: on # on | off; on is the default, off needs a reason below
|
|
@@ -30,7 +30,7 @@ against exactly these five.
|
|
|
30
30
|
|
|
31
31
|
```
|
|
32
32
|
Hero: <who the reader is, in the role this product meets them in>
|
|
33
|
-
Enemy: <the state of the world that costs them
|
|
33
|
+
Enemy: <the state of the world that costs them, not a competitor>
|
|
34
34
|
Product role: <instrument | guide | weapon>
|
|
35
35
|
Promise: <one line, checkable against a row in facts.md>
|
|
36
36
|
```
|
package/templates/foundation.md
CHANGED
|
@@ -35,7 +35,7 @@ outside systems. People stay in Personas.
|
|
|
35
35
|
|
|
36
36
|
## Customer journeys
|
|
37
37
|
|
|
38
|
-
<!-- ### JRN-01: <persona
|
|
38
|
+
<!-- ### JRN-01: <persona>, <job> (JTBD-01)
|
|
39
39
|
- **Owner:** unknown
|
|
40
40
|
| # | Stage | User action | Performed by | Touchpoint | Emotion (1-5) | Pain | Opportunity |
|
|
41
41
|
|---|-------|------------|--------------|------------|---------------|------|-------------|
|
|
@@ -45,10 +45,10 @@ Performed by: the P- and A- ids that do this stage.
|
|
|
45
45
|
## Monetization
|
|
46
46
|
|
|
47
47
|
<!-- When the product earns money (choose with data, BP-067..070):
|
|
48
|
-
- **Model:** hard paywall | freemium | hybrid | trial (type, length)
|
|
48
|
+
- **Model:** hard paywall | freemium | hybrid | trial (type, length), and why
|
|
49
49
|
- **Value metric:** <what the paid tier meters>
|
|
50
50
|
- **Free boundary:** <what stays free, where the visible limit sits>
|
|
51
|
-
- **Purchase surface:** in-app (IAP) | web checkout | web2app (web funnel -> app)
|
|
51
|
+
- **Purchase surface:** in-app (IAP) | web checkout | web2app (web funnel -> app); BP-030/BP-078/BP-127, and which storefronts
|
|
52
52
|
- **Money moments:** <paywall placement, upgrade triggers, checkout, failed payment, cancel, rating prompts, winback>
|
|
53
53
|
- **Acquisition coherence:** <the one story ad -> landing/listing -> onboarding tells>
|
|
54
54
|
-->
|
|
@@ -57,9 +57,9 @@ Performed by: the P- and A- ids that do this stage.
|
|
|
57
57
|
|
|
58
58
|
<!-- Two dimensions the practice-selection profile reads; record them once,
|
|
59
59
|
even when the answer is "none":
|
|
60
|
-
- **Personalization:** none | rule-based | inferred/model-driven
|
|
61
|
-
- **Engagement mechanics:** none | streaks/tiers | points/badges/leaderboards
|
|
62
|
-
- **Accessibility regime:** none stated | EAA (EU) | ADA (US) | both
|
|
60
|
+
- **Personalization:** none | rule-based | inferred/model-driven; BP-143/BP-144 (what gets asked when, and how a wrong inference is corrected)
|
|
61
|
+
- **Engagement mechanics:** none | streaks/tiers | points/badges/leaderboards; BP-141/BP-142 (which traced job each mechanic reinforces, and the recovery path when progress is lost)
|
|
62
|
+
- **Accessibility regime:** none stated | EAA (EU) | ADA (US) | both; BP-138, with the owner
|
|
63
63
|
-->
|
|
64
64
|
|
|
65
65
|
## Design tooling
|