@starci/hfs 4.7.34 → 4.7.36
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 +13 -0
- package/README.md +8 -11
- package/codemod/button-intent.mjs +356 -0
- package/lint/run.mjs +70 -29
- package/package.json +3 -2
- package/runtime/knowledge/grammars/index.yaml +111 -0
- package/runtime/knowledge/grammars/offset-pop/playbook.yaml +302 -0
- package/runtime/knowledge/grammars/starci/playbook.yaml +1190 -0
- package/runtime/knowledge/hfs/canon-pins.yaml +22 -8
- package/runtime/knowledge/hfs/fe-stack.yaml +12 -4
- package/runtime/knowledge/hfs/rules.yaml +163 -83
- package/runtime/knowledge/hfs/slots.yaml +3 -3
- package/runtime/knowledge/ui/presentation/font.yaml +101 -0
- package/runtime/knowledge/ui/presentation/padding.yaml +217 -0
- package/runtime/modules/kernel/failure-codes.yaml +102 -20
- package/runtime/modules/kernel/removed-vocabulary.yaml +29 -0
- package/runtime/modules/kernel/roles.yaml +1 -1
- package/runtime/packages/cli/src/catalog.generated.mjs +119 -9
- package/runtime/scripts/gates/canon-pins.mjs +103 -0
- package/runtime/scripts/gates/gate.mjs +3 -36
- package/runtime/scripts/gates/output.mjs +40 -0
- package/runtime/scripts/gates/test-world-run.mjs +2 -4
- package/runtime/scripts/guards/release-definition.mjs +22 -3
- package/runtime/scripts/hfs/architecture/config.mjs +8 -8
- package/runtime/scripts/hfs/check.mjs +1 -1
- package/runtime/scripts/hfs/db-restamp-verb.mjs +2 -2
- package/runtime/scripts/hfs/declaration-shape.mjs +8 -2
- package/runtime/scripts/hfs/grammar-presentation.mjs +152 -0
- package/runtime/scripts/hfs/rule-catalog.mjs +2 -2
- package/runtime/scripts/hfs/rules/a15-findings.mjs +1 -0
- package/runtime/scripts/hfs/rules/fe-stack.mjs +44 -1
- package/runtime/scripts/hfs/slots.mjs +1 -0
- package/runtime/scripts/hfs/view.mjs +1 -0
- package/runtime/scripts/lib/canon-binding-text.mjs +129 -0
- package/runtime/scripts/lib/css-rules.mjs +18 -0
- package/runtime/scripts/lib/example-refs.mjs +1 -1
- package/runtime/scripts/lib/grammar-lint.mjs +48 -0
- package/runtime/scripts/lib/grammar-vendor-parity-jsx.mjs +360 -0
- package/runtime/scripts/lib/grammar-vendor-parity.mjs +110 -157
- package/runtime/scripts/lib/numeric-match.mjs +5 -0
- package/runtime/scripts/lib/release-version.mjs +119 -0
- package/runtime/scripts/lib/runtime-publication-tags.mjs +3 -46
- package/runtime/scripts/lib/source-package-imports.mjs +111 -0
- package/runtime/scripts/work/draw/draw-layer.mjs +5 -4
- package/scaffold/app.mjs +7 -5
- package/src/main.mjs +30 -15
- package/stack/config.mjs +2 -1
- package/stack/render.mjs +24 -3
- package/sync/index.mjs +8 -2
- package/templates/app/skeleton/.starcistacks/dev/infra/compose/stack.yaml +0 -1
- package/templates/app/skeleton/.starcistacks/production/infra/swarm/stack.yaml +0 -1
- package/templates/app/skeleton-lite/.starcistacks/dev/infra/swarm/stack.yaml +0 -1
- package/templates/app/skeleton-lite/.starcistacks/production/infra/swarm/stack.yaml +0 -1
- package/templates/fe/tool-config/eslint.config.mjs +4 -1
|
@@ -2396,9 +2396,9 @@ slots:
|
|
|
2396
2396
|
presence: required
|
|
2397
2397
|
tracked: tracked
|
|
2398
2398
|
tier: foundation
|
|
2399
|
-
# The app's
|
|
2400
|
-
#
|
|
2401
|
-
#
|
|
2399
|
+
# The app's routing, request config and catalogs, or its adapter to the shared i18n factory. A single app
|
|
2400
|
+
# owns createNavigation in fe.modules.routes, keeping this public entry safe for its proxy. Shared stacks
|
|
2401
|
+
# belong to fe.package.i18n and expose a routing-only proxy entry separately from navigation.
|
|
2402
2402
|
requires: [index.ts]
|
|
2403
2403
|
tests: none
|
|
2404
2404
|
rules: [FE_I18N_PLACEMENT, FE_I18N_CATALOG]
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
schema: starci/knowledge-source@1
|
|
2
|
+
id: ui.presentation.font
|
|
3
|
+
title: Font presentation
|
|
4
|
+
appliesTo:
|
|
5
|
+
- ui
|
|
6
|
+
family: presentation
|
|
7
|
+
purpose: Choose information rank and document semantics before typography. A heading establishes structure;
|
|
8
|
+
ordinary copy does not. The selected Grammar owns the concrete type scale, renderers, props, weights, line
|
|
9
|
+
heights and tracking under FE-RULE-OWNERSHIP. Applications compose that public contract and write
|
|
10
|
+
layout-only CSS.
|
|
11
|
+
ownerVocabulary:
|
|
12
|
+
owners:
|
|
13
|
+
- name: The selected text renderer
|
|
14
|
+
meaning: Ordinary copy has no heading semantics
|
|
15
|
+
applicationWrites: The published semantic rank through the selected Grammar API
|
|
16
|
+
- name: The selected heading renderer
|
|
17
|
+
meaning: A heading declares its actual document position
|
|
18
|
+
applicationWrites: Its semantic level and any published emphasis treatment
|
|
19
|
+
notes: Information rank belongs to the application; its visual realization belongs to the selected Grammar. A
|
|
20
|
+
missing typography capability is a Grammar gap, never permission to override a component with application
|
|
21
|
+
typography CSS.
|
|
22
|
+
guidance:
|
|
23
|
+
- id: weight
|
|
24
|
+
title: Weight
|
|
25
|
+
requirement: Weight refines an already chosen information rank. It does not create a hierarchy level or
|
|
26
|
+
substitute for a heading. Use only the selected Grammar's published weight treatment; its concrete
|
|
27
|
+
weights, defaults and renderer props belong to that family. Document structure remains meaningful when
|
|
28
|
+
weight or colour is removed.
|
|
29
|
+
rules:
|
|
30
|
+
- id: FONT-1
|
|
31
|
+
title: Lowest supporting rank
|
|
32
|
+
governs: Supporting metadata remains subordinate while staying readable. The selected Grammar chooses its
|
|
33
|
+
exact size and treatment.
|
|
34
|
+
cases:
|
|
35
|
+
- id: case-1
|
|
36
|
+
when: Brief metadata remains understandable at the lowest supporting rank
|
|
37
|
+
owner: The selected text renderer
|
|
38
|
+
render: Compose its published supporting-copy treatment.
|
|
39
|
+
- id: case-2
|
|
40
|
+
when: A nested region has a label within an already titled section
|
|
41
|
+
owner: The selected heading renderer
|
|
42
|
+
render: Declare the nested region's actual document position; use the selected Grammar's corresponding recipe.
|
|
43
|
+
notThisRule: Ordinary sentences and important facts must not be demoted to the lowest supporting rank.
|
|
44
|
+
- id: FONT-2
|
|
45
|
+
title: Supporting reading rank
|
|
46
|
+
governs: A complete supporting line remains readable and visibly below ordinary reading copy.
|
|
47
|
+
cases:
|
|
48
|
+
- id: case-1
|
|
49
|
+
when: A complete supporting line such as a timestamp or short fact sits below normal body copy
|
|
50
|
+
owner: The selected text renderer
|
|
51
|
+
render: Compose the published supporting reading rank without reducing readability.
|
|
52
|
+
- id: case-2
|
|
53
|
+
when: A subordinate region is nested within a section
|
|
54
|
+
owner: The selected heading renderer
|
|
55
|
+
render: Keep its document nesting and published heading treatment aligned.
|
|
56
|
+
notThisRule: Do not shrink body copy to fit an undersized container; repair its layout.
|
|
57
|
+
- id: FONT-3
|
|
58
|
+
title: Ordinary reading rank
|
|
59
|
+
governs: Explanatory copy has the normal reading priority of its region. Its visual recipe comes from the
|
|
60
|
+
selected Grammar.
|
|
61
|
+
cases:
|
|
62
|
+
- id: case-1
|
|
63
|
+
when: Ordinary explanatory copy has normal reading priority
|
|
64
|
+
owner: The selected text renderer
|
|
65
|
+
render: Use the normal reading treatment supplied by the selected Grammar.
|
|
66
|
+
- id: case-2
|
|
67
|
+
when: A section has its own heading inside a page
|
|
68
|
+
owner: The selected heading renderer
|
|
69
|
+
render: Declare the section's structural position independently of its size.
|
|
70
|
+
- id: FONT-4
|
|
71
|
+
title: Page-heading rank
|
|
72
|
+
governs: The heading that names a page carries the primary structural rank of that document.
|
|
73
|
+
cases:
|
|
74
|
+
- id: case-1
|
|
75
|
+
when: The single heading names the whole page or route
|
|
76
|
+
owner: The selected heading renderer
|
|
77
|
+
render: Use the page-heading role and its published family treatment.
|
|
78
|
+
notThisRule: One document has one top-level page heading. A second page-heading role is a structural conflict.
|
|
79
|
+
- id: FONT-5
|
|
80
|
+
title: Leading-value emphasis
|
|
81
|
+
governs: The principal numeric value or short fact of a region may carry emphasis without acquiring heading
|
|
82
|
+
semantics.
|
|
83
|
+
cases:
|
|
84
|
+
- id: case-1
|
|
85
|
+
when: A leading metric or short value is the main fact of its region
|
|
86
|
+
owner: The selected text renderer
|
|
87
|
+
render: Use the family's published value-emphasis treatment while retaining text semantics.
|
|
88
|
+
notThisRule: Value emphasis is not decoration, sentence styling or an imitation of a heading.
|
|
89
|
+
- id: FONT-6
|
|
90
|
+
title: Display emphasis preserves structure
|
|
91
|
+
governs: A page introduction may use the selected Grammar's display treatment while preserving the heading's
|
|
92
|
+
actual semantic position.
|
|
93
|
+
cases:
|
|
94
|
+
- id: case-1
|
|
95
|
+
when: A page introduction needs marketing or landing emphasis
|
|
96
|
+
owner: The selected heading renderer
|
|
97
|
+
render: Apply the published display treatment while keeping the document outline unchanged.
|
|
98
|
+
notThisRule: A nested heading never gains a different outline position merely to obtain visual emphasis.
|
|
99
|
+
doesNotDecide: |-
|
|
100
|
+
Which colour expresses the rank is [Tone](tone.yaml). How the line wraps, aligns, or truncates is
|
|
101
|
+
[Text flow](text-flow.yaml). How much room the text region gets is [Measure](measure.yaml).
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
schema: starci/knowledge-source@1
|
|
2
|
+
id: ui.presentation.padding
|
|
3
|
+
title: Padding presentation
|
|
4
|
+
appliesTo:
|
|
5
|
+
- ui
|
|
6
|
+
family: presentation
|
|
7
|
+
purpose: Resolve one owned content edge per boundary. Applications write layout insets only for boundaries
|
|
8
|
+
they own; a selected Grammar owns its components' internal insets and the values of its published scale.
|
|
9
|
+
FE-RULE-OWNERSHIP keeps these universal requirements separate from family recipes.
|
|
10
|
+
ownerVocabulary:
|
|
11
|
+
owners:
|
|
12
|
+
- name: Application layout
|
|
13
|
+
meaning: The application owns this layout boundary
|
|
14
|
+
applicationWrites: Its one layout inset from the selected Grammar scale
|
|
15
|
+
- name: Selected Grammar component
|
|
16
|
+
meaning: The published component owns this boundary
|
|
17
|
+
applicationWrites: Compose its published API
|
|
18
|
+
notes: Every boundary has one inset owner. Reimplementing an owned component inset or overriding its internal
|
|
19
|
+
geometry violates that ownership. A missing component capability is repaired in the Grammar.
|
|
20
|
+
guidance:
|
|
21
|
+
- id: side-contact
|
|
22
|
+
title: Side contact
|
|
23
|
+
requirement: Resolve each side from the boundary it meets. An outer edge takes the published content
|
|
24
|
+
clearance; a separator-facing side takes the published separator clearance; a side already owned by a
|
|
25
|
+
child adds no inset. Inline sides of peer bands align. The selected Grammar owns the exact values and
|
|
26
|
+
flush-band API.
|
|
27
|
+
- id: composite-insets
|
|
28
|
+
title: Composite insets
|
|
29
|
+
requirement: An asymmetric inset recipe composes published scale values. Each side has an explicit boundary
|
|
30
|
+
reason; the recipe introduces no new value. Preserve an existing recipe identity when its purpose is
|
|
31
|
+
unchanged, and declare a new recipe only for a distinct boundary relationship.
|
|
32
|
+
- id: axis-variants
|
|
33
|
+
title: Axis variants
|
|
34
|
+
requirement: An inset may apply to logical inline sides, block sides or one side independently. A narrower
|
|
35
|
+
declaration on the same element replaces its selected sides; padding on nested elements adds. Do not
|
|
36
|
+
introduce a wrapper merely to change a side that its owner already controls.
|
|
37
|
+
rules:
|
|
38
|
+
- id: PADDING-0
|
|
39
|
+
title: No duplicate inset
|
|
40
|
+
governs: A boundary contributes no extra space when content or a child already owns its edge.
|
|
41
|
+
cases:
|
|
42
|
+
- id: case-1
|
|
43
|
+
when: A container only groups children that each carry their own boundary
|
|
44
|
+
owner: Application layout
|
|
45
|
+
render: Group without adding another inset.
|
|
46
|
+
- id: case-2
|
|
47
|
+
when: Surface bands run flush to the surface edge
|
|
48
|
+
owner: The surface component
|
|
49
|
+
render: Compose its published flush-band treatment.
|
|
50
|
+
- id: case-3
|
|
51
|
+
when: A list sits inside a panel or its rows own their own inset
|
|
52
|
+
owner: The list component
|
|
53
|
+
render: "Owner ruling 2026-10-25 (owner:panel-list-box-edge): the row box aligns with the panel content
|
|
54
|
+
edge, like the search field and tabs boxes. Content retains the vendor item inset and rounded
|
|
55
|
+
interaction background inside that box; the list keeps its vendor inset without negative-margin
|
|
56
|
+
bleed. Compose without padding wrappers. The selected Grammar supplies the panel-alignment API;
|
|
57
|
+
the universal FE canon reports stacked padding as FE_LIST_PANEL_PADDING."
|
|
58
|
+
notThisRule: The boundary protecting readable content keeps its one owned inset from the selected Grammar scale.
|
|
59
|
+
- id: PADDING-1
|
|
60
|
+
title: Minimal clearance
|
|
61
|
+
governs: Use the selected Grammar's smallest published inset where a deliberately tiny boundary nearly fits
|
|
62
|
+
its content.
|
|
63
|
+
cases:
|
|
64
|
+
- id: case-1
|
|
65
|
+
when: A compact marker or key floats over an application-owned canvas
|
|
66
|
+
owner: Application layout
|
|
67
|
+
render: Choose the smallest published inset that clears the marker content.
|
|
68
|
+
- id: case-2
|
|
69
|
+
when: A scroll region reserves room for focus visibility
|
|
70
|
+
owner: The scroll-region component
|
|
71
|
+
render: Compose the region; its focus clearance owns this inset.
|
|
72
|
+
- id: case-3
|
|
73
|
+
when: A short hint is attached to a control
|
|
74
|
+
owner: The hint component
|
|
75
|
+
render: Compose the hint; its internal inset stays with the component.
|
|
76
|
+
- id: PADDING-2
|
|
77
|
+
title: Compact clearance
|
|
78
|
+
governs: Use the published compact inset for an auxiliary boundary that needs clear but economical edge space.
|
|
79
|
+
cases:
|
|
80
|
+
- id: case-1
|
|
81
|
+
when: An auxiliary strip shares one inset on all sides
|
|
82
|
+
owner: Application layout
|
|
83
|
+
render: Apply the published compact inset once.
|
|
84
|
+
- id: case-2
|
|
85
|
+
when: A compact control bar sits above application-owned content
|
|
86
|
+
owner: Application layout
|
|
87
|
+
render: Keep its edge clearance and sibling gap as separate decisions.
|
|
88
|
+
notThisRule: Space between siblings belongs to the parent gap, not the boundary inset.
|
|
89
|
+
- id: PADDING-3
|
|
90
|
+
title: Dense content clearance
|
|
91
|
+
governs: Use the published dense inset for readable nested content and separator-facing band edges.
|
|
92
|
+
cases:
|
|
93
|
+
- id: case-1
|
|
94
|
+
when: A nested container owns a boundary distinct from its parent
|
|
95
|
+
owner: Application layout
|
|
96
|
+
render: Apply the published dense inset to that distinct boundary.
|
|
97
|
+
- id: case-2
|
|
98
|
+
when: A tab strip or secondary navigation needs inline clearance
|
|
99
|
+
owner: The navigation component
|
|
100
|
+
render: Compose its published inset API.
|
|
101
|
+
- id: case-3
|
|
102
|
+
when: A band side meets a separator inside a flush surface
|
|
103
|
+
owner: The selected Grammar recipe
|
|
104
|
+
render: Use its separator-facing clearance while retaining inline alignment.
|
|
105
|
+
- id: case-4
|
|
106
|
+
when: A metric cell or list row meets a separator
|
|
107
|
+
owner: The metric or list component
|
|
108
|
+
render: The separator-facing side uses its published dense clearance.
|
|
109
|
+
notThisRule: Repeating the same inset for the same boundary doubles it along the path from outer edge to content.
|
|
110
|
+
- id: PADDING-4
|
|
111
|
+
title: Readable content clearance
|
|
112
|
+
governs: Use the published content inset once at the boundary that protects readable content.
|
|
113
|
+
cases:
|
|
114
|
+
- id: case-1
|
|
115
|
+
when: An application section owns the distance from its border to its content
|
|
116
|
+
owner: Application layout
|
|
117
|
+
render: Apply the published content inset once.
|
|
118
|
+
- id: case-2
|
|
119
|
+
when: Content sits inside a card
|
|
120
|
+
owner: The card component
|
|
121
|
+
render: Compose the card; its content inset remains component-owned.
|
|
122
|
+
- id: case-3
|
|
123
|
+
when: A disclosure has a trigger and expanded panel
|
|
124
|
+
owner: The disclosure component
|
|
125
|
+
render: Compose the disclosure; its trigger and panel own their insets.
|
|
126
|
+
- id: case-4
|
|
127
|
+
when: An empty-state notice occupies a region
|
|
128
|
+
owner: The notice component
|
|
129
|
+
render: Compose the notice without adding its internal inset again.
|
|
130
|
+
- id: case-5
|
|
131
|
+
when: A fenced code block is displayed
|
|
132
|
+
owner: The code-block component
|
|
133
|
+
render: Compose the block without duplicating its content inset.
|
|
134
|
+
- id: case-6
|
|
135
|
+
when: A band side meets the outer edge of a flush surface
|
|
136
|
+
owner: The selected Grammar recipe
|
|
137
|
+
render: Use the published outer-edge content clearance.
|
|
138
|
+
- id: case-7
|
|
139
|
+
when: Inline sides of bands meet the same surface boundary
|
|
140
|
+
owner: The selected Grammar recipe
|
|
141
|
+
render: Use the same published inline inset on every band.
|
|
142
|
+
- id: PADDING-5
|
|
143
|
+
title: Generous section clearance
|
|
144
|
+
governs: A deliberately more spacious section uses its selected Grammar's published generous inset.
|
|
145
|
+
cases:
|
|
146
|
+
- id: case-1
|
|
147
|
+
when: A section deliberately uses equal generous clearance
|
|
148
|
+
owner: Application layout
|
|
149
|
+
render: Choose the published generous inset for that density.
|
|
150
|
+
- id: case-2
|
|
151
|
+
when: A tab frame owns page-level inline clearance
|
|
152
|
+
owner: The navigation component
|
|
153
|
+
render: Compose its published page-inset API.
|
|
154
|
+
notThisRule: Space between child sections is a gap, not a boundary inset.
|
|
155
|
+
- id: PADDING-6
|
|
156
|
+
title: Low-density region clearance
|
|
157
|
+
governs: A large, low-density region may use the selected Grammar's larger frame inset where its content
|
|
158
|
+
density calls for it.
|
|
159
|
+
cases:
|
|
160
|
+
- id: case-1
|
|
161
|
+
when: A large page region needs equal generous clearance
|
|
162
|
+
owner: Application layout
|
|
163
|
+
render: Choose its published larger frame inset.
|
|
164
|
+
- id: case-2
|
|
165
|
+
when: An empty or waiting region occupies most of the viewport
|
|
166
|
+
owner: Application layout
|
|
167
|
+
render: Give the region its own published frame clearance while its notice retains internal ownership.
|
|
168
|
+
notThisRule: A large frame inset is not the default for ordinary content boundaries.
|
|
169
|
+
- id: PADDING-7
|
|
170
|
+
title: Responsive inset follows its boundary
|
|
171
|
+
governs: A boundary keeps its meaning across widths. Its responsive inset follows adjacent published scale
|
|
172
|
+
steps. Separator-facing sides retain their separator clearance; block sides change only when the
|
|
173
|
+
boundary owns them.
|
|
174
|
+
cases:
|
|
175
|
+
- id: case-1
|
|
176
|
+
when: A decision surface gains room at a wider viewport
|
|
177
|
+
owner: The selected Grammar recipe
|
|
178
|
+
render: Step inline clearance to the adjacent published inset.
|
|
179
|
+
- id: case-2
|
|
180
|
+
when: That surface's outer-edge block sides gain room with it
|
|
181
|
+
owner: The selected Grammar recipe
|
|
182
|
+
render: Step only the block sides owned by the outer boundary.
|
|
183
|
+
- id: case-3
|
|
184
|
+
when: A side meets an internal separator
|
|
185
|
+
owner: The selected Grammar recipe
|
|
186
|
+
render: Keep the separator-facing clearance at both widths.
|
|
187
|
+
notThisRule: A separator-facing side does not step merely because the viewport widens.
|
|
188
|
+
- id: PADDING-8
|
|
189
|
+
title: Subordinate content indents at the inline start
|
|
190
|
+
governs: An inset that expresses nested hierarchy applies at logical inline start. The end edge remains
|
|
191
|
+
aligned with its parent so the reading measure stays available. The selected Grammar supplies the
|
|
192
|
+
indentation step and disclosure recipe.
|
|
193
|
+
cases:
|
|
194
|
+
- id: case-1
|
|
195
|
+
when: A disclosure body belongs under its trigger
|
|
196
|
+
owner: The disclosure component
|
|
197
|
+
render: Use its published leading indentation and unchanged trailing edge.
|
|
198
|
+
- id: case-2
|
|
199
|
+
when: A nested group belongs to a named parent row
|
|
200
|
+
owner: The group component
|
|
201
|
+
render: Use the selected Grammar's per-level leading indentation.
|
|
202
|
+
notThisRule: Indenting both sides reads as an inset block rather than subordinate content. A missing
|
|
203
|
+
disclosure capability is repaired in the Grammar.
|
|
204
|
+
- id: PADDING-9
|
|
205
|
+
title: Routed content owns its block inset
|
|
206
|
+
governs: A routed content region may step its block inset with the viewport while the page container retains
|
|
207
|
+
inline inset ownership. Its responsive values use adjacent published steps and never duplicate the page
|
|
208
|
+
edge.
|
|
209
|
+
cases:
|
|
210
|
+
- id: case-1
|
|
211
|
+
when: Routed content sits directly beneath the page shell
|
|
212
|
+
owner: Application layout
|
|
213
|
+
render: Apply its published responsive block inset; leave inline clearance with the page container.
|
|
214
|
+
notThisRule: Inline clearance on routed content duplicates the page-container edge and is refused.
|
|
215
|
+
doesNotDecide: Space between siblings is Gap (gap.yaml), and external offsets are Margin (margin.yaml). The
|
|
216
|
+
selected Grammar owns page-container geometry, its closed inset scale and component recipes under
|
|
217
|
+
FE-RULE-OWNERSHIP; its playbook supplies the concrete values used in proof.
|
|
@@ -2130,17 +2130,17 @@ FE_APP_SHELL_BOTTOM_TABS:
|
|
|
2130
2130
|
meaning_vi: "Khung ứng dụng tại <file> đặt điều hướng trong thanh tab dưới thay vì Sidebar drawer."
|
|
2131
2131
|
causes_vi:
|
|
2132
2132
|
- "Cấu trúc shell không theo canon ứng dụng."
|
|
2133
|
-
nextStep_vi: "Dùng hàng mở drawer bên dưới navbar và Sidebar presentation=\"drawer\"."
|
|
2133
|
+
nextStep_vi: "Dùng hàng mở drawer bên dưới navbar và Sidebar presentation=\"drawer\" (R316; FE-RULE-OWNERSHIP: knowledge/patterns/fe/index.yaml; packages/eslint/grammar-starci/README.md)."
|
|
2134
2134
|
owner: op-retry
|
|
2135
2135
|
kind: check-finding
|
|
2136
2136
|
|
|
2137
2137
|
FE_APP_SHELL_FRAME:
|
|
2138
|
-
title: "The application frame
|
|
2138
|
+
title: "The application frame bypasses the selected Grammar shell"
|
|
2139
2139
|
title_vi: "Khung ứng dụng không dùng WorkspaceShell cố định"
|
|
2140
2140
|
meaning_vi: "Khung ứng dụng tại <file> không giao bố cục và cuộn cho WorkspaceShell."
|
|
2141
2141
|
causes_vi:
|
|
2142
2142
|
- "Cấu trúc shell không theo canon ứng dụng."
|
|
2143
|
-
nextStep_vi: "Ghép khung ứng dụng bằng WorkspaceShell viewport=\"fixed\"."
|
|
2143
|
+
nextStep_vi: "Ghép khung ứng dụng bằng WorkspaceShell viewport=\"fixed\" (R313; FE-RULE-OWNERSHIP: knowledge/patterns/fe/index.yaml; packages/eslint/grammar-starci/README.md)."
|
|
2144
2144
|
owner: op-retry
|
|
2145
2145
|
kind: check-finding
|
|
2146
2146
|
|
|
@@ -2155,6 +2155,38 @@ FE_BLOCK_PRODUCT_HOOK_DEFINITION:
|
|
|
2155
2155
|
owner: other-op:interface.implement
|
|
2156
2156
|
kind: check-finding
|
|
2157
2157
|
|
|
2158
|
+
FE_BUTTON_INTENT:
|
|
2159
|
+
title: "Button variant is chosen by hand instead of by intent"
|
|
2160
|
+
title_vi: "Variant của nút được chọn thủ công thay vì theo intent"
|
|
2161
|
+
meaning_vi: "Button hoặc IconButton của ứng dụng thiếu intent, truyền variant, đặt nút xác nhận xoá ngoài hộp thoại xác nhận, có nhiều hơn một nút commit trong một lần render, hoặc đặt nút commit trong từng phần tử của danh sách."
|
|
2162
|
+
causes_vi:
|
|
2163
|
+
- "Truyền variant thay vì intent cho Button hoặc IconButton"
|
|
2164
|
+
- "Đặt intent destructive với step confirm ngoài AlertDialog hoặc ConfirmDialog"
|
|
2165
|
+
- "Đặt hai nút commit trong cùng một lần render hoặc một nút commit trong mỗi thẻ của danh sách"
|
|
2166
|
+
nextStep_vi: "Khai báo intent (và step cho destructive) theo hệ quả của hành động, bỏ variant để Grammar tự suy ra, và chạy codemod button-intent cho các nút cũ."
|
|
2167
|
+
owner: "op-retry"
|
|
2168
|
+
kind: "check-finding"
|
|
2169
|
+
|
|
2170
|
+
FE_BUTTON_INTENT_REQUIRED:
|
|
2171
|
+
title: "A button has no declared intent"
|
|
2172
|
+
title_vi: "Nút chưa khai báo intent"
|
|
2173
|
+
meaning_vi: "Button hoặc IconButton tại <file> chưa nêu ý định của lệnh."
|
|
2174
|
+
causes_vi:
|
|
2175
|
+
- "Bỏ intent nên Grammar không có dữ kiện để chọn variant."
|
|
2176
|
+
nextStep_vi: "Khai báo intent theo hệ quả và thứ hạng của lệnh trong quyết định (CTA-6)."
|
|
2177
|
+
owner: op-retry
|
|
2178
|
+
kind: check-finding
|
|
2179
|
+
|
|
2180
|
+
FE_BUTTON_NO_VARIANT:
|
|
2181
|
+
title: "An app button chooses a visual variant"
|
|
2182
|
+
title_vi: "Nút ứng dụng tự chọn variant"
|
|
2183
|
+
meaning_vi: "Button hoặc IconButton tại <file> truyền variant thay vì để Grammar suy ra từ intent và vị trí."
|
|
2184
|
+
causes_vi:
|
|
2185
|
+
- "Ứng dụng truyền variant trực tiếp hoặc qua props spread."
|
|
2186
|
+
nextStep_vi: "Thay variant bằng intent theo hệ quả của lệnh (CTA-6)."
|
|
2187
|
+
owner: op-retry
|
|
2188
|
+
kind: check-finding
|
|
2189
|
+
|
|
2158
2190
|
FE_CALLBACK_SHAPE:
|
|
2159
2191
|
title: "An auth callback performs more than code exchange and redirect"
|
|
2160
2192
|
title_vi: "Callback xác thực làm thêm việc ngoài đổi mã và chuyển hướng"
|
|
@@ -2205,7 +2237,7 @@ FE_COMPONENT_API:
|
|
|
2205
2237
|
- "Component nhận className từ ngoài"
|
|
2206
2238
|
- "Khối kết nối không có bản trình bày thuần"
|
|
2207
2239
|
- "Trạng thái dữ liệu tự chế thay vì qua SlotView"
|
|
2208
|
-
nextStep_vi: "Sửa chữ ký component theo luật drawing và tách phần trình bày; op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra."
|
|
2240
|
+
nextStep_vi: "Sửa chữ ký component theo luật drawing và tách phần trình bày; op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra (R92; FE-RULE-OWNERSHIP: knowledge/patterns/fe/index.yaml; packages/eslint/grammar-starci/README.md)."
|
|
2209
2241
|
owner: op-retry
|
|
2210
2242
|
kind: check-finding
|
|
2211
2243
|
|
|
@@ -2306,6 +2338,16 @@ FE_DANGEROUS_HTML:
|
|
|
2306
2338
|
owner: op-retry
|
|
2307
2339
|
kind: check-finding
|
|
2308
2340
|
|
|
2341
|
+
FE_DESTRUCTIVE_CONFIRM_IN_DIALOG:
|
|
2342
|
+
title: "A destructive confirm is outside its confirmation dialog"
|
|
2343
|
+
title_vi: "Lệnh xác nhận phá hủy nằm ngoài hộp thoại xác nhận"
|
|
2344
|
+
meaning_vi: "Nút destructive confirm tại <file> không nằm trong nội dung AlertDialog hoặc ConfirmDialog cùng tệp."
|
|
2345
|
+
causes_vi:
|
|
2346
|
+
- "Đặt lần nhấn cuối ngoài hộp thoại hoặc trên trigger."
|
|
2347
|
+
nextStep_vi: "Đặt confirm trong nội dung hộp thoại cùng tệp; trigger dùng step entry (CTA-6)."
|
|
2348
|
+
owner: op-retry
|
|
2349
|
+
kind: check-finding
|
|
2350
|
+
|
|
2309
2351
|
FE_EFFECT_CLEANUP:
|
|
2310
2352
|
title: "What an effect starts, its cleanup releases"
|
|
2311
2353
|
title_vi: "Effect khởi động thứ không được dọn"
|
|
@@ -2348,6 +2390,16 @@ FE_ERROR_BOUNDARY_MISSING:
|
|
|
2348
2390
|
owner: op-retry
|
|
2349
2391
|
kind: check-finding
|
|
2350
2392
|
|
|
2393
|
+
FE_GRAMMAR_LAYOUT_ONLY:
|
|
2394
|
+
title: "App surface paint violates layout-only composition"
|
|
2395
|
+
title_vi: "Ứng dụng tự tô surface thay vì chỉ viết CSS bố cục"
|
|
2396
|
+
meaning_vi: "Ứng dụng thêm lớp bg-surface thay vì dùng surface có nền của Grammar."
|
|
2397
|
+
causes_vi:
|
|
2398
|
+
- "Thêm lớp bg-surface vào phần tử do ứng dụng dựng"
|
|
2399
|
+
nextStep_vi: "Giữ CSS ứng dụng chỉ lo bố cục và dùng SurfaceCard hoặc surface có nền khác của Grammar."
|
|
2400
|
+
owner: "op-retry"
|
|
2401
|
+
kind: "check-finding"
|
|
2402
|
+
|
|
2351
2403
|
FE_GRAPHQL_CONTRACT:
|
|
2352
2404
|
title: "A front-end GraphQL document is one its back end serves"
|
|
2353
2405
|
title_vi: "Tài liệu GraphQL của front end không khớp hợp đồng của back end"
|
|
@@ -2457,7 +2509,7 @@ FE_ICON_INLINE_SVG:
|
|
|
2457
2509
|
causes_vi:
|
|
2458
2510
|
- "Leaf Icon tự vẽ path hoặc SVG thay vì dùng Heroicons"
|
|
2459
2511
|
- "Component vẽ SVG trực tiếp mà không phải leaf nhãn hiệu được khai báo"
|
|
2460
|
-
nextStep_vi: "Thay glyph bằng Heroicons qua leaf Icon; nếu là nhãn hiệu, đặt nó trong leaf nhãn hiệu và khai báo đúng chủ của leaf."
|
|
2512
|
+
nextStep_vi: "Thay glyph bằng Heroicons qua leaf Icon; nếu là nhãn hiệu, đặt nó trong leaf nhãn hiệu và khai báo đúng chủ của leaf (R286; FE-RULE-OWNERSHIP: knowledge/patterns/fe/index.yaml; packages/eslint/grammar-starci/README.md)."
|
|
2461
2513
|
owner: op-retry
|
|
2462
2514
|
kind: check-finding
|
|
2463
2515
|
|
|
@@ -2474,7 +2526,7 @@ FE_LIST_KEY:
|
|
|
2474
2526
|
FE_LIST_PANEL_PADDING:
|
|
2475
2527
|
title: "Panel list wrapper stacks horizontal content padding"
|
|
2476
2528
|
title_vi: "Phần tử bọc danh sách trong panel cộng dồn padding ngang"
|
|
2477
|
-
meaning_vi: "Ứng dụng thêm
|
|
2529
|
+
meaning_vi: "Ứng dụng thêm padding ngang vào phần tử bọc ListBox của Grammar hoặc nhãn nhóm bên trong surface có nền, khiến nội dung lệch khỏi mép panel."
|
|
2478
2530
|
causes_vi:
|
|
2479
2531
|
- "Bọc ListBox bằng phần tử có padding ngang"
|
|
2480
2532
|
- "Thêm padding ngang quanh nhãn nhóm của danh sách"
|
|
@@ -2488,7 +2540,7 @@ FE_NATIVE_FORM_CONTROL:
|
|
|
2488
2540
|
meaning_vi: "`<tag>` thô ở `<file>`. Dùng renderer của grammar."
|
|
2489
2541
|
causes_vi:
|
|
2490
2542
|
- "Vi phạm luật R62: Không `<select>/<input>/<textarea>/<button>`, `<img>` thô và không thẻ cấu trúc thô (`<section>`, `<p>`, `<ul>`, `<h1>`...) ở tầng sản phẩm; dùng renderer grammar."
|
|
2491
|
-
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra và mục của luật trong tiêu chuẩn HFS; nợ cũ cần quyết định thiết kế nên op không thêm ngoại lệ, chỉ tách hoặc chuyển về đúng
|
|
2543
|
+
nextStep_vi: "Op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra và mục của luật trong tiêu chuẩn HFS; nợ cũ cần quyết định thiết kế nên op không thêm ngoại lệ, chỉ tách hoặc chuyển về đúng chủ (R62; FE-RULE-OWNERSHIP: knowledge/patterns/fe/index.yaml; packages/eslint/grammar-starci/README.md)."
|
|
2492
2544
|
owner: op-retry
|
|
2493
2545
|
kind: check-finding
|
|
2494
2546
|
|
|
@@ -2508,17 +2560,17 @@ FE_NAVBAR_CLUSTER:
|
|
|
2508
2560
|
meaning_vi: "Cụm navbar tại <file> không giữ thứ tự ngôn ngữ, giao diện, thông báo và tài khoản."
|
|
2509
2561
|
causes_vi:
|
|
2510
2562
|
- "Cấu trúc shell không theo canon ứng dụng."
|
|
2511
|
-
nextStep_vi: "Ghép IconButton ngôn ngữ, Switch giao diện, IconButton chuông và AvatarButton theo đúng thứ
|
|
2563
|
+
nextStep_vi: "Ghép IconButton ngôn ngữ, Switch giao diện, IconButton chuông và AvatarButton theo đúng thứ tự (R315; FE-RULE-OWNERSHIP: knowledge/patterns/fe/index.yaml; packages/eslint/grammar-starci/README.md)."
|
|
2512
2564
|
owner: op-retry
|
|
2513
2565
|
kind: check-finding
|
|
2514
2566
|
|
|
2515
2567
|
FE_NAVBAR_CONTROL_SIZE:
|
|
2516
|
-
title: "A navbar control
|
|
2568
|
+
title: "A navbar control bypasses the selected Grammar control scale"
|
|
2517
2569
|
title_vi: "Điều khiển navbar không dùng cỡ control"
|
|
2518
2570
|
meaning_vi: "Điều khiển trong navbar tại <file> không khai báo cùng cỡ control của Grammar."
|
|
2519
2571
|
causes_vi:
|
|
2520
2572
|
- "Cấu trúc shell không theo canon ứng dụng."
|
|
2521
|
-
nextStep_vi: "Đặt size=\"control\" trên từng điều khiển trong thanh."
|
|
2573
|
+
nextStep_vi: "Đặt size=\"control\" trên từng điều khiển trong thanh (R314; FE-RULE-OWNERSHIP: knowledge/patterns/fe/index.yaml; packages/eslint/grammar-starci/README.md)."
|
|
2522
2574
|
owner: op-retry
|
|
2523
2575
|
kind: check-finding
|
|
2524
2576
|
|
|
@@ -2528,18 +2580,18 @@ FE_NAVBAR_CREATE:
|
|
|
2528
2580
|
meaning_vi: "Navbar tại <file> chứa thao tác tạo mới thuộc nội dung trang."
|
|
2529
2581
|
causes_vi:
|
|
2530
2582
|
- "Cấu trúc shell không theo canon ứng dụng."
|
|
2531
|
-
nextStep_vi: "Đưa thao tác tạo mới về trang sở hữu
|
|
2583
|
+
nextStep_vi: "Đưa thao tác tạo mới về trang sở hữu nó (R317; FE-RULE-OWNERSHIP: knowledge/patterns/fe/index.yaml; packages/eslint/grammar-starci/README.md)."
|
|
2532
2584
|
owner: op-retry
|
|
2533
2585
|
kind: check-finding
|
|
2534
2586
|
|
|
2535
2587
|
FE_NESTED_VARIANT:
|
|
2536
|
-
title: "
|
|
2537
|
-
title_vi: "
|
|
2538
|
-
meaning_vi: "
|
|
2588
|
+
title: "App variants bypass Grammar surface context"
|
|
2589
|
+
title_vi: "Variant ứng dụng vượt qua context surface của Grammar"
|
|
2590
|
+
meaning_vi: "Ứng dụng đặt variant tĩnh cho trường Grammar trên bất kỳ lớp nào, hoặc ép Tabs dùng primary trong surface có nền."
|
|
2539
2591
|
causes_vi:
|
|
2540
|
-
- "Truyền variant
|
|
2541
|
-
- "
|
|
2542
|
-
nextStep_vi: "
|
|
2592
|
+
- "Truyền variant tĩnh cho trường Grammar"
|
|
2593
|
+
- "Ép Tabs dùng primary bên trong surface có nền"
|
|
2594
|
+
nextStep_vi: "Bỏ variant để Grammar tự cấp mặc định theo context surface."
|
|
2543
2595
|
owner: "op-retry"
|
|
2544
2596
|
kind: "check-finding"
|
|
2545
2597
|
|
|
@@ -2566,6 +2618,16 @@ FE_NO_ALERT:
|
|
|
2566
2618
|
owner: op-retry
|
|
2567
2619
|
kind: check-finding
|
|
2568
2620
|
|
|
2621
|
+
FE_NO_COMMIT_IN_COLLECTION_ITEM:
|
|
2622
|
+
title: "A collection item repeats a commit"
|
|
2623
|
+
title_vi: "Phần tử danh sách lặp lại lệnh commit"
|
|
2624
|
+
meaning_vi: "Một phần tử collection hoặc callback map tại <file> hiển thị nút commit."
|
|
2625
|
+
causes_vi:
|
|
2626
|
+
- "Mỗi hàng giành vai trò hành động chính của toàn màn hình."
|
|
2627
|
+
nextStep_vi: "Dùng alternative cho hành động tiếp theo của hàng và giữ commit ở quyết định của màn hình (CTA-6)."
|
|
2628
|
+
owner: op-retry
|
|
2629
|
+
kind: check-finding
|
|
2630
|
+
|
|
2569
2631
|
FE_NO_TESTS:
|
|
2570
2632
|
title: "Front end holds a test file, test tooling or a test dependency"
|
|
2571
2633
|
title_vi: "Front end có tệp test, công cụ test hoặc thư viện test"
|
|
@@ -2801,6 +2863,16 @@ FE_SERVICE_ROLE_FORBIDDEN:
|
|
|
2801
2863
|
owner: op-retry
|
|
2802
2864
|
kind: check-finding
|
|
2803
2865
|
|
|
2866
|
+
FE_SINGLE_COMMIT_PER_RENDER:
|
|
2867
|
+
title: "A component renders more than one commit"
|
|
2868
|
+
title_vi: "Component hiển thị nhiều hơn một lệnh commit"
|
|
2869
|
+
meaning_vi: "Một đường render của component tại <file> có nhiều nút commit cùng lúc."
|
|
2870
|
+
causes_vi:
|
|
2871
|
+
- "Nhiều lệnh cùng nhận thứ hạng hành động tiếp theo."
|
|
2872
|
+
nextStep_vi: "Giữ một lệnh tiếp theo là commit và phân loại các lệnh còn lại theo hệ quả (CTA-6)."
|
|
2873
|
+
owner: op-retry
|
|
2874
|
+
kind: check-finding
|
|
2875
|
+
|
|
2804
2876
|
FE_SIZE_AND_STATE_BUDGET:
|
|
2805
2877
|
title: "Hook and state budgets; no hand-written poll loop"
|
|
2806
2878
|
title_vi: "Vượt ngân sách hook và state"
|
|
@@ -2855,6 +2927,16 @@ FE_STACK_CORE_MISSING:
|
|
|
2855
2927
|
owner: op-retry
|
|
2856
2928
|
kind: check-finding
|
|
2857
2929
|
|
|
2930
|
+
FE_STACK_FAMILY_LINT_MISSING:
|
|
2931
|
+
title: "The front end installs canon-fe 9 without the selected Grammar family's lint package"
|
|
2932
|
+
title_vi: "Front end dùng canon-fe 9 nhưng thiếu gói lint của họ Grammar đã chọn"
|
|
2933
|
+
meaning_vi: "hfs.json chọn sides.fe.grammar (starci hoặc offset-pop) và front end khai báo @starci/eslint-canon-fe 9 trở lên, nhưng không manifest nào khai báo gói lint của họ đó; từ canon-fe 9 các luật component Grammar nằm trong gói này, thiếu gói thì các luật ấy không chạy."
|
|
2934
|
+
causes_vi:
|
|
2935
|
+
- "Nâng @starci/eslint-canon-fe lên 9 mà chưa thêm @starci/eslint-grammar-starci (Grammar StarCi) hoặc @starci/eslint-grammar-offset-pop (Grammar Offset Pop)."
|
|
2936
|
+
nextStep_vi: "Thêm @starci/eslint-grammar-starci (hoặc @starci/eslint-grammar-offset-pop) cạnh @starci/eslint-canon-fe, ghép starciGrammarConfig({ hfs }) (hoặc offsetPopGrammarConfig({ hfs })) sau starciFeConfig({ hfs }) trong fe/eslint.config.mjs, hoặc chạy starci app sync."
|
|
2937
|
+
owner: op-retry
|
|
2938
|
+
kind: check-finding
|
|
2939
|
+
|
|
2858
2940
|
FE_STACK_FORBIDDEN:
|
|
2859
2941
|
title: "A front end declares or imports a package or scoped package family forbidden by the stack"
|
|
2860
2942
|
title_vi: "Front end dùng thư viện hoặc họ package bị fe-stack cấm"
|
|
@@ -2908,7 +2990,7 @@ FE_STYLE_TOKEN_ONLY:
|
|
|
2908
2990
|
- "@media dùng breakpoint ngoài thang của grammar"
|
|
2909
2991
|
- "brand.css thiếu cặp mềm của một tông trạng thái ở sáng hoặc tối, chữ mềm dưới 3:1 trên nền nhạt hoặc nền trang, --foreground dưới 4.5:1, hoặc giá trị màu không phân giải được"
|
|
2910
2992
|
- "Component tô chữ hoặc icon bằng text-success, text-danger, fill-warning, stroke-info (tông đặc) thay vì text-<tông>-soft-foreground"
|
|
2911
|
-
nextStep_vi: "Op interface.implement bỏ CSS riêng, dùng component và token của grammar; giá trị màu thương hiệu chỉ khai ở modules/brand/brand.css cho cả sáng và tối, đủ cặp mềm cho mọi tông trạng thái; chữ và icon trạng thái dùng text-<tông>-soft-foreground."
|
|
2993
|
+
nextStep_vi: "Op interface.implement bỏ CSS riêng, dùng component và token của grammar; giá trị màu thương hiệu chỉ khai ở modules/brand/brand.css cho cả sáng và tối, đủ cặp mềm cho mọi tông trạng thái; chữ và icon trạng thái dùng text-<tông>-soft-foreground (R61; FE-RULE-OWNERSHIP: knowledge/patterns/fe/index.yaml; packages/eslint/grammar-starci/README.md)."
|
|
2912
2994
|
owner: other-op:interface.implement
|
|
2913
2995
|
kind: check-finding
|
|
2914
2996
|
|
|
@@ -3027,7 +3109,7 @@ FE_VENDOR_BOUNDARY:
|
|
|
3027
3109
|
- "Dùng bộ glyph thứ hai ngoài họ heroicons (Phosphor, Lucide, Iconify...)"
|
|
3028
3110
|
- "Dùng kích thước biểu tượng ngoài thang"
|
|
3029
3111
|
- "Primitive thư viện ngoài dùng trực tiếp ở nhiều nơi"
|
|
3030
|
-
nextStep_vi: "Dùng lá icon và chủ sở hữu primitive có sẵn; op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra."
|
|
3112
|
+
nextStep_vi: "Dùng lá icon và chủ sở hữu primitive có sẵn; op vừa tạo ra bản này sẽ được chạy lại để sửa theo lời nhắn của bộ kiểm tra (R93; FE-RULE-OWNERSHIP: knowledge/patterns/fe/index.yaml; packages/eslint/grammar-starci/README.md)."
|
|
3031
3113
|
owner: op-retry
|
|
3032
3114
|
kind: check-finding
|
|
3033
3115
|
|
|
@@ -4903,7 +4985,7 @@ RT_GENERATED_BLOCK_STALE:
|
|
|
4903
4985
|
RT_GENERATED_DRIFT:
|
|
4904
4986
|
title: "Generated copy drifted"
|
|
4905
4987
|
title_vi: "Bản sao sinh tự động bị lệch"
|
|
4906
|
-
meaning_vi: "Một bản sao sinh tự động trong packages/hfs/runtime, packages/eslint/be/runtime hoặc packages/eslint/fe/runtime khác với nội dung mà scripts/hfs/sync-runtime.mjs ghi ra từ nguồn duy nhất: thiếu, cũ, hoặc thừa tệp."
|
|
4988
|
+
meaning_vi: "Một bản sao sinh tự động trong packages/hfs/runtime, packages/eslint/be/runtime hoặc packages/eslint/fe/runtime, packages/eslint/grammar-starci/runtime, packages/eslint/grammar-offset-pop/runtime khác với nội dung mà scripts/hfs/sync-runtime.mjs ghi ra từ nguồn duy nhất: thiếu, cũ, hoặc thừa tệp."
|
|
4907
4989
|
causes_vi:
|
|
4908
4990
|
- "Sửa một tệp nguồn được đóng gói mà quên chạy sync-runtime"
|
|
4909
4991
|
- "Sửa tay một tệp trong thư mục runtime/ của gói"
|
|
@@ -8,6 +8,22 @@
|
|
|
8
8
|
# a word to scan for).
|
|
9
9
|
kinds: [config-key, bias-field, verb, flag, code, vocabulary, file]
|
|
10
10
|
removed:
|
|
11
|
+
- id: fe-landmark-branch-inventory
|
|
12
|
+
kind: vocabulary
|
|
13
|
+
name: LANDMARK_BRANCHES
|
|
14
|
+
use: 'the selected Grammar lint package owns its component vocabulary; the universal FE canon exposes no component inventory'
|
|
15
|
+
since: 1.0.0-alpha.31
|
|
16
|
+
- id: fe-grammar-rule-namespace
|
|
17
|
+
kind: vocabulary
|
|
18
|
+
name: starci-fe Grammar component rules
|
|
19
|
+
match: 'starci-fe/(?:app-shell-frame|no-shell-bottom-tabs|navbar-control-size|navbar-cluster|no-navbar-create|no-raw-structural-element|no-heading-tag-outside-heading-component|status-text-uses-soft-foreground|vendor-primitive-has-named-owner|no-vendor-icon-outside-icon-leaf|heroicons-is-the-glyph-vendor|no-off-scale-glyph-size|no-icon-size-class|destructive-menu-entry-needs-danger-tone|no-decorative-icon-in-metric-cell|no-inline-svg-outside-brand-mark-leaf|no-fractional-step|no-hand-rolled-heading|no-unresolved-token-class|slot-status-through-slotview)\b'
|
|
20
|
+
use: 'the same rule id under starci-grammar/ from the selected Grammar lint package; FE-RULE-OWNERSHIP governs placement'
|
|
21
|
+
since: 1.0.0-alpha.31
|
|
22
|
+
- id: offset-pop-toaster-content-guidance
|
|
23
|
+
kind: vocabulary
|
|
24
|
+
name: toaster-clear-of-the-dock
|
|
25
|
+
use: 'toaster-clear-of-content in the Offset Pop playbook'
|
|
26
|
+
since: 1.0.0-alpha.31
|
|
11
27
|
- id: cut-seam-command
|
|
12
28
|
kind: flag
|
|
13
29
|
name: cut-seam --command
|
|
@@ -401,3 +417,16 @@ removed:
|
|
|
401
417
|
use: 'the release tag is always <release.tagPrefix><package.json version>; delete the key'
|
|
402
418
|
since: 1.0.0-alpha.31
|
|
403
419
|
match: '\btagMatchesVersion\b'
|
|
420
|
+
|
|
421
|
+
- id: grammar-surfacecard-manual-layer
|
|
422
|
+
kind: vocabulary
|
|
423
|
+
name: SurfaceCard manual depth and unpainted frame
|
|
424
|
+
use: 'SurfaceCard derives its depth from the painted parent surface; use an unpainted layout container for grouping and a bounded SurfaceCard for a painted face'
|
|
425
|
+
since: 1.0.0-alpha.31
|
|
426
|
+
match: 'SurfaceCard[^\r\n>]*\s(?:depth=|frame="frameless")'
|
|
427
|
+
- id: grammar-dropdown-negative-tone
|
|
428
|
+
kind: vocabulary
|
|
429
|
+
name: DropdownMenuItem negative tone
|
|
430
|
+
use: 'DropdownMenuItem.tone uses neutral or danger; destructive commands use danger'
|
|
431
|
+
since: 1.0.0-alpha.31
|
|
432
|
+
match: 'DropdownMenuItem(?:Tone|\.tone)[^\r\n]*["'']negative["'']'
|
|
@@ -84,7 +84,7 @@ rulings:
|
|
|
84
84
|
critic-coverage: "Who judges each op's product is declared once, in the required judge field of its contract (modules/kernel/op-judges.yaml): machine, critic, owner or next-leg, never nobody. An independent Critic of another provider, on the frontier tier, runs for drawing (inside the op) and, run by the runtime at settle, for scope.define, business.decide and architecture.decide (modules/kernel/critic.yaml coverage); the op-judge check holds that table and the contracts to each other."
|
|
85
85
|
debug-is-time-boxed: "Debug is a time-boxed auditor of role conformance for the stabilisation phase, bound to a chat session; the runtime is self-sufficient, every edge case Debug meets becomes a rule plus an edge-case entry, and the loop is set up no more once the end condition of the debug role holds."
|
|
86
86
|
updating-the-runtime: "The runtime tree can be updated while workflows run, and no running workflow conflicts with the update. What a change asks of each role is declared once in modules/kernel/revision-scope.yaml and checked against the tree. A change that concerns no role costs no seat anything. A live seat is updated in place by default: woken once per revision change, even with an empty menu, with exactly the changed files that concern it, it reads and attests them (one wake, never a second for the same revision; several commits deployed together are one change). A seat is replaced by a fresh one that boots from the stores only when a rule of its contract was removed or reversed (a line deleted or modified in its declared contract files; a commit may declare an edit wording-only, and the declaration holds only for a file that keeps its structure), when the files its launch prompt is built from changed, or when it is already due for rotation (the revision change folds into that replacement). A replacement happens at the seat's next yield, never in the middle of a decision. An Op is neither updated nor restarted inside an attempt: it keeps the rules of its admission, the next try and the next Critic run are admitted under the new rules, and only guards bite at once. The engine restarts only for the files its process loaded, derived from its import graph; every other command is a new process that reads the tree."
|
|
87
|
-
debug-fix-lanes: "A runtime defect Debug catches is fixed at once, never queued behind another: Debug splits it by independent cause and opens one fix lane per cause in the same turn, each in its own clone with the files it may touch named, so the lanes run in parallel; each lane's fix reaches the host as soon as `starci runtime verify` prints `verified <sha>` for it (the check, the package clean-test and the scaffold e2e on one commit; the line of `npm run check` alone runs no test and is never the report), through `starci runtime deploy --from <clone>` (one verified revision change; never a hand fast-forward of the live checkout followed by a hand restart). Nothing a lane found is left listed as later: it is fixed in that round or handed to another lane opened then.
|
|
87
|
+
debug-fix-lanes: "A runtime defect Debug catches is fixed at once, never queued behind another: Debug splits it by independent cause and opens one fix lane per cause in the same turn, each in its own clone with the files it may touch named, so the lanes run in parallel; each lane's fix reaches the host as soon as `starci runtime verify` prints `verified <sha>` for it (the check, the package clean-test and the scaffold e2e on one commit; the line of `npm run check` alone runs no test and is never the report), through `starci runtime deploy --from <clone>` (one verified revision change; never a hand fast-forward of the live checkout followed by a hand restart). Nothing a lane found is left listed as later: it is fixed in that round or handed to another lane opened then. A verified fix ships as its own release wave, the next alpha.N.M, as soon as it is green (owner ruling release-waves)."
|
|
88
88
|
debug-replay-before-done: "A fix for a defect found on a live host is done when the runtime change that handles it (the contract, prompt, policy row, gate, guard or code) and its edge-case entry (found: live, the rule that now handles it) land on one commit and starci runtime verify is green on that commit. The runtime has no specs of its own (owner ruling no-runtime-specs): no runtime spec or replay spec is written; an entry may name a package spec or the scaffold e2e that already covers it."
|
|
89
89
|
debug-channels: "Debug speaks only through runtime channels (starci supervisor tell; a durable ruling to a Kernel through the Supervisor's notify), never by typing into a seat's terminal, and never to an Op or a Critic."
|
|
90
90
|
|