@tacuchi/agent-workflow-cli 21.0.0 → 21.3.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/README.md +3 -2
- package/dist/adapters/git-cli.js +12 -7
- package/dist/adapters/git-cli.js.map +1 -1
- package/dist/application/capability/compose.js +161 -0
- package/dist/application/capability/compose.js.map +1 -0
- package/dist/application/capability/descriptor-loader.js +109 -0
- package/dist/application/capability/descriptor-loader.js.map +1 -0
- package/dist/application/capability/design-handler.js +299 -0
- package/dist/application/capability/design-handler.js.map +1 -0
- package/dist/application/capability/dispatcher.js +312 -0
- package/dist/application/capability/dispatcher.js.map +1 -0
- package/dist/application/capability/durable-effect.js +220 -0
- package/dist/application/capability/durable-effect.js.map +1 -0
- package/dist/application/capability/installed-inventory.js +168 -0
- package/dist/application/capability/installed-inventory.js.map +1 -0
- package/dist/application/capability/readiness.js +204 -0
- package/dist/application/capability/readiness.js.map +1 -0
- package/dist/application/capability/resolution.js +264 -0
- package/dist/application/capability/resolution.js.map +1 -0
- package/dist/application/capability/wrapper.js +195 -0
- package/dist/application/capability/wrapper.js.map +1 -0
- package/dist/application/context/manifest.js +11 -5
- package/dist/application/context/manifest.js.map +1 -1
- package/dist/application/context/measure.js +5 -2
- package/dist/application/context/measure.js.map +1 -1
- package/dist/application/context/plan-service.js +6 -6
- package/dist/application/context/plan-service.js.map +1 -1
- package/dist/application/design/design-bundle-service.js +148 -0
- package/dist/application/design/design-bundle-service.js.map +1 -0
- package/dist/application/design/design-proposal-service.js +69 -0
- package/dist/application/design/design-proposal-service.js.map +1 -0
- package/dist/application/design/design-publish-service.js +275 -7
- package/dist/application/design/design-publish-service.js.map +1 -1
- package/dist/application/design/design-record-service.js +100 -0
- package/dist/application/design/design-record-service.js.map +1 -0
- package/dist/application/flow/advance.js +533 -0
- package/dist/application/flow/advance.js.map +1 -0
- package/dist/application/flow/flow-service.js +65 -0
- package/dist/application/flow/flow-service.js.map +1 -0
- package/dist/application/flow/run-projection.js +80 -0
- package/dist/application/flow/run-projection.js.map +1 -0
- package/dist/application/flow/run-state-service.js +107 -0
- package/dist/application/flow/run-state-service.js.map +1 -0
- package/dist/application/flow/submit.js +423 -0
- package/dist/application/flow/submit.js.map +1 -0
- package/dist/application/markdown.js +16 -2
- package/dist/application/markdown.js.map +1 -1
- package/dist/application/resume-service.js +23 -10
- package/dist/application/resume-service.js.map +1 -1
- package/dist/application/self/hooks-toml.js +137 -17
- package/dist/application/self/hooks-toml.js.map +1 -1
- package/dist/application/self/host-states.js +87 -1
- package/dist/application/self/host-states.js.map +1 -1
- package/dist/application/self/install-hooks.js +62 -6
- package/dist/application/self/install-hooks.js.map +1 -1
- package/dist/application/self/install-skill.js +37 -6
- package/dist/application/self/install-skill.js.map +1 -1
- package/dist/application/self/uninstall.js +21 -0
- package/dist/application/self/uninstall.js.map +1 -1
- package/dist/application/skills-resolver-service.js +8 -2
- package/dist/application/skills-resolver-service.js.map +1 -1
- package/dist/application/status-service.js +4 -1
- package/dist/application/status-service.js.map +1 -1
- package/dist/application/workline-index-service.js +15 -2
- package/dist/application/workline-index-service.js.map +1 -1
- package/dist/application/workspace-init-service.js +13 -1
- package/dist/application/workspace-init-service.js.map +1 -1
- package/dist/cli/commands/capability.js +182 -0
- package/dist/cli/commands/capability.js.map +1 -0
- package/dist/cli/commands/flow.js +71 -0
- package/dist/cli/commands/flow.js.map +1 -0
- package/dist/cli/commands/index.js +4 -0
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/skills.js +55 -2
- package/dist/cli/commands/skills.js.map +1 -1
- package/dist/cli/commands/status.js +5 -0
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/help-groups.js +6 -0
- package/dist/cli/help-groups.js.map +1 -1
- package/dist/cli/parser.js +6 -0
- package/dist/cli/parser.js.map +1 -1
- package/dist/cli/tui/components/host-admin-section.js +14 -2
- package/dist/cli/tui/components/host-admin-section.js.map +1 -1
- package/dist/cli/tui/data/workflow-content.js +13 -1
- package/dist/cli/tui/data/workflow-content.js.map +1 -1
- package/dist/cli/tui/tabs/workflow-tab.js +8 -1
- package/dist/cli/tui/tabs/workflow-tab.js.map +1 -1
- package/dist/domain/capability/descriptor.js +553 -0
- package/dist/domain/capability/descriptor.js.map +1 -0
- package/dist/domain/capability/effects.js +90 -0
- package/dist/domain/capability/effects.js.map +1 -0
- package/dist/domain/capability/protocol.js +494 -0
- package/dist/domain/capability/protocol.js.map +1 -0
- package/dist/domain/contract-reader.js +84 -0
- package/dist/domain/contract-reader.js.map +1 -0
- package/dist/domain/design/adapter.js +161 -0
- package/dist/domain/design/adapter.js.map +1 -0
- package/dist/domain/design/artifact.js +148 -4
- package/dist/domain/design/artifact.js.map +1 -1
- package/dist/domain/design/capability.js +263 -4
- package/dist/domain/design/capability.js.map +1 -1
- package/dist/domain/design/direct.js +108 -0
- package/dist/domain/design/direct.js.map +1 -0
- package/dist/domain/design/external-send.js +65 -0
- package/dist/domain/design/external-send.js.map +1 -0
- package/dist/domain/design/maturity.js +71 -0
- package/dist/domain/design/maturity.js.map +1 -1
- package/dist/domain/design/offline.js +92 -0
- package/dist/domain/design/offline.js.map +1 -0
- package/dist/domain/design/profiles.js +212 -0
- package/dist/domain/design/profiles.js.map +1 -0
- package/dist/domain/design/proposal.js +234 -0
- package/dist/domain/design/proposal.js.map +1 -0
- package/dist/domain/design/render-bundle.js +0 -0
- package/dist/domain/design/render-bundle.js.map +1 -0
- package/dist/domain/design/rendition.js +472 -0
- package/dist/domain/design/rendition.js.map +1 -0
- package/dist/domain/design/sources.js +180 -0
- package/dist/domain/design/sources.js.map +1 -0
- package/dist/domain/design/validation.js +12 -68
- package/dist/domain/design/validation.js.map +1 -1
- package/dist/domain/design/visual-evidence.js +155 -0
- package/dist/domain/design/visual-evidence.js.map +1 -0
- package/dist/domain/flow/answer.js +459 -0
- package/dist/domain/flow/answer.js.map +1 -0
- package/dist/domain/flow/authority.js +2338 -0
- package/dist/domain/flow/authority.js.map +1 -0
- package/dist/domain/flow/authorization.js +62 -0
- package/dist/domain/flow/authorization.js.map +1 -0
- package/dist/domain/flow/directive.js +421 -0
- package/dist/domain/flow/directive.js.map +1 -0
- package/dist/domain/flow/rules.js +140 -0
- package/dist/domain/flow/rules.js.map +1 -0
- package/dist/domain/flow/run-state.js +317 -0
- package/dist/domain/flow/run-state.js.map +1 -0
- package/dist/domain/harnesses.js +124 -4
- package/dist/domain/harnesses.js.map +1 -1
- package/dist/domain/host-verification.js +8 -8
- package/dist/domain/skills.js +13 -14
- package/dist/domain/skills.js.map +1 -1
- package/dist/domain/structured-choice-stamp.js +106 -0
- package/dist/domain/structured-choice-stamp.js.map +1 -0
- package/package.json +1 -1
- package/skills/w/SKILL.md +5 -5
- package/skills/w/context/MANIFEST.json +42 -1
- package/skills/w/harness/HARNESS.md +30 -4
- package/skills/w/loops/CHASSIS.md +11 -20
- package/skills/w/loops/CODE-POLICIES.md +9 -15
- package/skills/w/loops/plan-exec-loop/LOOP.md +11 -13
- package/skills/w/loops/plan-new-loop/LOOP.md +6 -4
- package/skills/w/loops/plan-refine-loop/LOOP.md +5 -3
- package/skills/w/loops/quick-loop/LOOP.md +18 -26
- package/skills/w/loops/spec-refine-loop/LOOP.md +14 -18
- package/skills/w/modules/COMPACTION.md +2 -6
- package/skills/w/modules/DB-SCRIPTS-ONLY.md +2 -0
- package/skills/w/modules/DESIGN-REFERENCES.md +15 -11
- package/skills/w/modules/IDEATION-GATE.md +3 -3
- package/skills/w/modules/PLAN-EXECUTION-BATCHES.md +17 -36
- package/skills/w/modules/PLAN-INPUT.md +5 -3
- package/skills/w/modules/PLAN-REFINE-SPLIT.md +3 -1
- package/skills/w/modules/PLAN-SPLIT-GATE.md +7 -5
- package/skills/w/modules/PROMPT-CONTINUITY.md +3 -1
- package/skills/w/modules/SPEC-CHANGE-SHAPE.md +4 -4
- package/skills/w/roles/README.md +2 -0
- package/skills/w/roles/design/CONTRACT.md +80 -0
- package/skills/w/roles/design/ROLE.md +7 -0
- package/skills/w/schemas/capability-descriptor.schema.json +260 -0
- package/skills/w/schemas/design/design-render-bundle.v1.schema.json +191 -0
- package/skills/w/schemas/design/design-rendition.v1.schema.json +232 -0
- package/skills/w/schemas/design/ui-screen.v1.schema.json +29 -1
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://workline.dev/schemas/design/design-render-bundle.v1.schema.json",
|
|
4
|
+
"title": "Workline UI Design Package v1 — Render Context Bundle",
|
|
5
|
+
"description": "The single exchange payload every renderer and adapter receives. Deterministic for a baseline, a selection and an adapter profile: the digest is taken over canonical JSON without `digest` and without `generated`, so two equivalent runs seal the same bytes. It carries context, never authority — an integration transforms it over its own copy and the package stays untouched.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"additionalProperties": false,
|
|
8
|
+
"required": [
|
|
9
|
+
"schema",
|
|
10
|
+
"package",
|
|
11
|
+
"baseline",
|
|
12
|
+
"baseline_digest",
|
|
13
|
+
"adapter",
|
|
14
|
+
"roots",
|
|
15
|
+
"closure",
|
|
16
|
+
"assets",
|
|
17
|
+
"data_classification",
|
|
18
|
+
"accessibility",
|
|
19
|
+
"losses",
|
|
20
|
+
"digest",
|
|
21
|
+
"generated"
|
|
22
|
+
],
|
|
23
|
+
"properties": {
|
|
24
|
+
"schema": {
|
|
25
|
+
"const": "workline.design-render-bundle/v1"
|
|
26
|
+
},
|
|
27
|
+
"package": {
|
|
28
|
+
"description": "The package this bundle was cut from.",
|
|
29
|
+
"type": "string",
|
|
30
|
+
"pattern": "^DES-(?:[0-9]{3}|[1-9][0-9]{3,})$"
|
|
31
|
+
},
|
|
32
|
+
"baseline": {
|
|
33
|
+
"description": "The published revision the selection was read at.",
|
|
34
|
+
"$ref": "#/$defs/revision"
|
|
35
|
+
},
|
|
36
|
+
"baseline_digest": {
|
|
37
|
+
"$ref": "#/$defs/digest"
|
|
38
|
+
},
|
|
39
|
+
"adapter": {
|
|
40
|
+
"description": "Which profile, at which version, this bundle was cut for. Determinism is a promise PER profile version: a profile that changes what it needs produces a different bundle.",
|
|
41
|
+
"type": "object",
|
|
42
|
+
"additionalProperties": false,
|
|
43
|
+
"required": ["profile", "version"],
|
|
44
|
+
"properties": {
|
|
45
|
+
"profile": {
|
|
46
|
+
"type": "string",
|
|
47
|
+
"pattern": "^[a-z0-9]+(-[a-z0-9]+)*$"
|
|
48
|
+
},
|
|
49
|
+
"version": {
|
|
50
|
+
"type": "integer",
|
|
51
|
+
"minimum": 1
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
"roots": {
|
|
56
|
+
"description": "The selection, sorted. A selection is a set, so the order it was typed in is not part of the bundle. An anchor is allowed here: a root may ask for one state.",
|
|
57
|
+
"type": "array",
|
|
58
|
+
"minItems": 1,
|
|
59
|
+
"uniqueItems": true,
|
|
60
|
+
"items": {
|
|
61
|
+
"type": "string",
|
|
62
|
+
"pattern": "^DES-(?:[0-9]{3}|[1-9][0-9]{3,})/(?:FLW|SCR|RUL|TOK|VIS)-(?:[0-9]{3}|[1-9][0-9]{3,})@r[1-9][0-9]{0,5}(?:#[A-Za-z0-9][A-Za-z0-9_-]*)?$"
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
"closure": {
|
|
66
|
+
"description": "Every revision the selection reaches, ordered by reference, with the content type and the digest of the bytes found on disk.",
|
|
67
|
+
"type": "array",
|
|
68
|
+
"items": {
|
|
69
|
+
"type": "object",
|
|
70
|
+
"additionalProperties": false,
|
|
71
|
+
"required": ["ref", "kind", "path", "content_type", "sha256", "states"],
|
|
72
|
+
"properties": {
|
|
73
|
+
"ref": {
|
|
74
|
+
"description": "The revision, never anchored: the states demanded travel in `states`.",
|
|
75
|
+
"type": "string",
|
|
76
|
+
"pattern": "^DES-(?:[0-9]{3}|[1-9][0-9]{3,})/(?:FLW|SCR|RUL|TOK|VIS)-(?:[0-9]{3}|[1-9][0-9]{3,})@r[1-9][0-9]{0,5}$"
|
|
77
|
+
},
|
|
78
|
+
"kind": {
|
|
79
|
+
"enum": ["flow", "screen", "rule", "token", "rendition"]
|
|
80
|
+
},
|
|
81
|
+
"path": {
|
|
82
|
+
"description": "Package-relative path. Never absolute and never escaping the package.",
|
|
83
|
+
"type": "string",
|
|
84
|
+
"minLength": 1
|
|
85
|
+
},
|
|
86
|
+
"content_type": {
|
|
87
|
+
"description": "Declared, not sniffed: a renderer decides how to read a member from this field.",
|
|
88
|
+
"type": "string",
|
|
89
|
+
"minLength": 1
|
|
90
|
+
},
|
|
91
|
+
"sha256": {
|
|
92
|
+
"$ref": "#/$defs/digest"
|
|
93
|
+
},
|
|
94
|
+
"states": {
|
|
95
|
+
"description": "State anchors the selection asked for. Empty means the whole revision.",
|
|
96
|
+
"type": "array",
|
|
97
|
+
"uniqueItems": true,
|
|
98
|
+
"items": {
|
|
99
|
+
"type": "string",
|
|
100
|
+
"pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$"
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
},
|
|
106
|
+
"assets": {
|
|
107
|
+
"description": "The assets this bundle is allowed to hand over — only bytes the package custodies.",
|
|
108
|
+
"type": "array",
|
|
109
|
+
"items": {
|
|
110
|
+
"type": "object",
|
|
111
|
+
"additionalProperties": false,
|
|
112
|
+
"required": ["digest", "path", "content_type"],
|
|
113
|
+
"properties": {
|
|
114
|
+
"digest": {
|
|
115
|
+
"$ref": "#/$defs/digest"
|
|
116
|
+
},
|
|
117
|
+
"path": {
|
|
118
|
+
"type": "string",
|
|
119
|
+
"pattern": "^assets/"
|
|
120
|
+
},
|
|
121
|
+
"content_type": {
|
|
122
|
+
"type": "string",
|
|
123
|
+
"minLength": 1
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
},
|
|
128
|
+
"data_classification": {
|
|
129
|
+
"description": "How the material was prepared. `synthetic` is the default; `real` is an authorization somebody had to give.",
|
|
130
|
+
"enum": ["synthetic", "redacted", "real"]
|
|
131
|
+
},
|
|
132
|
+
"accessibility": {
|
|
133
|
+
"description": "The accessibility obligations the selected revisions state. A design states them; a rendition never discharges them.",
|
|
134
|
+
"type": "array",
|
|
135
|
+
"items": {
|
|
136
|
+
"type": "object",
|
|
137
|
+
"additionalProperties": false,
|
|
138
|
+
"required": ["ref", "statement"],
|
|
139
|
+
"properties": {
|
|
140
|
+
"ref": {
|
|
141
|
+
"type": "string",
|
|
142
|
+
"pattern": "^DES-(?:[0-9]{3}|[1-9][0-9]{3,})/(?:FLW|SCR|RUL|TOK|VIS)-(?:[0-9]{3}|[1-9][0-9]{3,})@r[1-9][0-9]{0,5}(?:#[A-Za-z0-9][A-Za-z0-9_-]*)?$"
|
|
143
|
+
},
|
|
144
|
+
"statement": {
|
|
145
|
+
"type": "string",
|
|
146
|
+
"minLength": 1
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
},
|
|
151
|
+
"losses": {
|
|
152
|
+
"description": "What this profile cannot represent, enumerated instead of omitted. A loss is part of the result, not a defect.",
|
|
153
|
+
"type": "array",
|
|
154
|
+
"items": {
|
|
155
|
+
"type": "object",
|
|
156
|
+
"additionalProperties": false,
|
|
157
|
+
"required": ["subject", "why"],
|
|
158
|
+
"properties": {
|
|
159
|
+
"subject": {
|
|
160
|
+
"description": "What is lost: `capability:pull`, `section:localization`, `medium:motion`.",
|
|
161
|
+
"type": "string",
|
|
162
|
+
"minLength": 1
|
|
163
|
+
},
|
|
164
|
+
"why": {
|
|
165
|
+
"type": "string",
|
|
166
|
+
"minLength": 1
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
},
|
|
171
|
+
"digest": {
|
|
172
|
+
"description": "Over canonical JSON of this object WITHOUT `digest` and WITHOUT `generated`. That exclusion is the determinism boundary made checkable.",
|
|
173
|
+
"$ref": "#/$defs/digest"
|
|
174
|
+
},
|
|
175
|
+
"generated": {
|
|
176
|
+
"description": "YYYY-MM-DD. Outside the seal: a date is not part of what was selected.",
|
|
177
|
+
"type": "string",
|
|
178
|
+
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
|
|
179
|
+
}
|
|
180
|
+
},
|
|
181
|
+
"$defs": {
|
|
182
|
+
"revision": {
|
|
183
|
+
"type": "integer",
|
|
184
|
+
"minimum": 1
|
|
185
|
+
},
|
|
186
|
+
"digest": {
|
|
187
|
+
"type": "string",
|
|
188
|
+
"pattern": "^sha256:[0-9a-f]{64}$"
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://workline.dev/schemas/design/design-rendition.v1.schema.json",
|
|
4
|
+
"title": "Workline UI Design Package v1 — Design Rendition",
|
|
5
|
+
"description": "What a picture of a design knows about itself. Three separations never collapse here: fidelity is a property of the picture and never moves the screen's maturity; staleness against the source is DERIVED (`source_digest` is recomputable from the sources' bytes) while sync with the provider is a claim and lives inside `provider`; and a locator locates without ever identifying — it never replaces the Workline id, revision or digest, and never carries a credential.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"additionalProperties": false,
|
|
8
|
+
"required": [
|
|
9
|
+
"schema",
|
|
10
|
+
"id",
|
|
11
|
+
"revision",
|
|
12
|
+
"supersedes",
|
|
13
|
+
"purpose",
|
|
14
|
+
"medium",
|
|
15
|
+
"fidelity",
|
|
16
|
+
"tool",
|
|
17
|
+
"format",
|
|
18
|
+
"context",
|
|
19
|
+
"sources",
|
|
20
|
+
"source_digest",
|
|
21
|
+
"coverage",
|
|
22
|
+
"files",
|
|
23
|
+
"provider",
|
|
24
|
+
"access",
|
|
25
|
+
"interaction_evidence",
|
|
26
|
+
"data_classification"
|
|
27
|
+
],
|
|
28
|
+
"properties": {
|
|
29
|
+
"schema": {
|
|
30
|
+
"const": "workline.design-rendition/v1"
|
|
31
|
+
},
|
|
32
|
+
"id": {
|
|
33
|
+
"description": "Qualified identity WITHOUT the revision — the revision is its own field.",
|
|
34
|
+
"type": "string",
|
|
35
|
+
"pattern": "^DES-(?:[0-9]{3}|[1-9][0-9]{3,})/VIS-(?:[0-9]{3}|[1-9][0-9]{3,})$"
|
|
36
|
+
},
|
|
37
|
+
"revision": {
|
|
38
|
+
"type": "integer",
|
|
39
|
+
"minimum": 1
|
|
40
|
+
},
|
|
41
|
+
"supersedes": {
|
|
42
|
+
"description": "An EARLIER revision of this same rendition, or null.",
|
|
43
|
+
"type": ["string", "null"],
|
|
44
|
+
"pattern": "^DES-(?:[0-9]{3}|[1-9][0-9]{3,})/VIS-(?:[0-9]{3}|[1-9][0-9]{3,})@r[1-9][0-9]{0,5}$"
|
|
45
|
+
},
|
|
46
|
+
"purpose": {
|
|
47
|
+
"type": "string",
|
|
48
|
+
"minLength": 1
|
|
49
|
+
},
|
|
50
|
+
"medium": {
|
|
51
|
+
"description": "What kind of artifact it is. Only `prototype` and `storyboard` can sustain interaction evidence — a still frame cannot show a transition.",
|
|
52
|
+
"enum": ["static_image", "document", "interactive_html", "prototype", "storyboard"]
|
|
53
|
+
},
|
|
54
|
+
"fidelity": {
|
|
55
|
+
"description": "How polished the PICTURE is. Deliberately not sharing vocabulary with maturity: raising fidelity never promotes a screen.",
|
|
56
|
+
"enum": ["low", "medium", "high"]
|
|
57
|
+
},
|
|
58
|
+
"tool": {
|
|
59
|
+
"description": "The tool that produced it, as a human would name it.",
|
|
60
|
+
"type": "string",
|
|
61
|
+
"minLength": 1
|
|
62
|
+
},
|
|
63
|
+
"format": {
|
|
64
|
+
"description": "Closed so it can be cross-checked against the file actually on disk.",
|
|
65
|
+
"enum": ["svg", "png", "jpeg", "webp", "pdf", "html"]
|
|
66
|
+
},
|
|
67
|
+
"context": {
|
|
68
|
+
"description": "The same design looks different depending on where it was rendered.",
|
|
69
|
+
"type": "object",
|
|
70
|
+
"additionalProperties": false,
|
|
71
|
+
"required": ["platform", "viewport", "theme", "locale", "variants"],
|
|
72
|
+
"properties": {
|
|
73
|
+
"platform": {
|
|
74
|
+
"type": "string",
|
|
75
|
+
"minLength": 1
|
|
76
|
+
},
|
|
77
|
+
"viewport": {
|
|
78
|
+
"description": "`1280x800`, `390x844`, or a named breakpoint.",
|
|
79
|
+
"type": "string",
|
|
80
|
+
"minLength": 1
|
|
81
|
+
},
|
|
82
|
+
"theme": {
|
|
83
|
+
"type": "string",
|
|
84
|
+
"minLength": 1
|
|
85
|
+
},
|
|
86
|
+
"locale": {
|
|
87
|
+
"type": "string",
|
|
88
|
+
"minLength": 1
|
|
89
|
+
},
|
|
90
|
+
"variants": {
|
|
91
|
+
"type": "array",
|
|
92
|
+
"uniqueItems": true,
|
|
93
|
+
"items": {
|
|
94
|
+
"type": "string",
|
|
95
|
+
"minLength": 1
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
"sources": {
|
|
101
|
+
"description": "The exact revisions this rendition was produced from, with the bytes it saw. An anchor is meaningful here: a preview of one state is a preview of one state.",
|
|
102
|
+
"type": "array",
|
|
103
|
+
"minItems": 1,
|
|
104
|
+
"items": {
|
|
105
|
+
"type": "object",
|
|
106
|
+
"additionalProperties": false,
|
|
107
|
+
"required": ["ref", "sha256"],
|
|
108
|
+
"properties": {
|
|
109
|
+
"ref": {
|
|
110
|
+
"type": "string",
|
|
111
|
+
"pattern": "^DES-(?:[0-9]{3}|[1-9][0-9]{3,})/(?:FLW|SCR|RUL|TOK)-(?:[0-9]{3}|[1-9][0-9]{3,})@r[1-9][0-9]{0,5}(?:#[A-Za-z0-9][A-Za-z0-9_-]*)?$"
|
|
112
|
+
},
|
|
113
|
+
"sha256": {
|
|
114
|
+
"$ref": "#/$defs/digest"
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
"source_digest": {
|
|
120
|
+
"description": "One digest over the canonical list of `sources`. Recomputable from the package as it stands right now — that is what makes obsolescence detectable instead of asserted.",
|
|
121
|
+
"$ref": "#/$defs/digest"
|
|
122
|
+
},
|
|
123
|
+
"coverage": {
|
|
124
|
+
"description": "What this rendition demonstrates, in the screen's own vocabulary. The reverse direction of the screen's classification matrix; the handoff gate crosses the two.",
|
|
125
|
+
"type": "object",
|
|
126
|
+
"additionalProperties": false,
|
|
127
|
+
"required": ["criteria", "states"],
|
|
128
|
+
"properties": {
|
|
129
|
+
"criteria": {
|
|
130
|
+
"type": "array",
|
|
131
|
+
"uniqueItems": true,
|
|
132
|
+
"items": {
|
|
133
|
+
"type": "string",
|
|
134
|
+
"pattern": "^S\\d{3}/AC-(?:[A-Z]+-)?\\d+$"
|
|
135
|
+
}
|
|
136
|
+
},
|
|
137
|
+
"states": {
|
|
138
|
+
"type": "array",
|
|
139
|
+
"uniqueItems": true,
|
|
140
|
+
"items": {
|
|
141
|
+
"type": "string",
|
|
142
|
+
"pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$"
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
},
|
|
147
|
+
"files": {
|
|
148
|
+
"description": "The local evidence, relative to the rendition's OWN directory. Never empty: a rendition with no local file is exactly the evidence that disappears when the provider does.",
|
|
149
|
+
"type": "array",
|
|
150
|
+
"minItems": 1,
|
|
151
|
+
"items": {
|
|
152
|
+
"type": "object",
|
|
153
|
+
"additionalProperties": false,
|
|
154
|
+
"required": ["path", "sha256"],
|
|
155
|
+
"properties": {
|
|
156
|
+
"path": {
|
|
157
|
+
"description": "`preview.svg` — relative to this rendition's folder, never escaping it.",
|
|
158
|
+
"type": "string",
|
|
159
|
+
"minLength": 1
|
|
160
|
+
},
|
|
161
|
+
"sha256": {
|
|
162
|
+
"$ref": "#/$defs/digest"
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
},
|
|
167
|
+
"provider": {
|
|
168
|
+
"description": "The external object, when there is one. `sync` lives in here because it only means something once a provider copy exists.",
|
|
169
|
+
"type": ["object", "null"],
|
|
170
|
+
"additionalProperties": false,
|
|
171
|
+
"required": ["name", "locator", "version", "sync"],
|
|
172
|
+
"properties": {
|
|
173
|
+
"name": {
|
|
174
|
+
"type": "string",
|
|
175
|
+
"minLength": 1
|
|
176
|
+
},
|
|
177
|
+
"locator": {
|
|
178
|
+
"description": "Provider-shaped keys (`file_key`, `node_id`, `project_id`, `artifact`, …). The key set is the adapter profile's business, not this schema's. Never a credential.",
|
|
179
|
+
"type": "object",
|
|
180
|
+
"minProperties": 1,
|
|
181
|
+
"additionalProperties": {
|
|
182
|
+
"type": "string",
|
|
183
|
+
"minLength": 1
|
|
184
|
+
}
|
|
185
|
+
},
|
|
186
|
+
"version": {
|
|
187
|
+
"description": "The provider's own version identity, or null when it has no stable one.",
|
|
188
|
+
"type": ["string", "null"],
|
|
189
|
+
"minLength": 1
|
|
190
|
+
},
|
|
191
|
+
"sync": {
|
|
192
|
+
"description": "A CLAIM about the provider's copy, not a derivation. `unknown` is the honest answer without consulting it.",
|
|
193
|
+
"enum": ["in_sync", "diverged", "unknown"]
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
},
|
|
197
|
+
"access": {
|
|
198
|
+
"description": "Who can reach the editable original, as a class. `local_only` is what keeps working when the provider does not.",
|
|
199
|
+
"enum": ["local_only", "public", "link_shared", "team", "private"]
|
|
200
|
+
},
|
|
201
|
+
"interaction_evidence": {
|
|
202
|
+
"description": "A trigger, a transition and an outcome — what a still frame cannot show. Null for a static rendition.",
|
|
203
|
+
"type": ["object", "null"],
|
|
204
|
+
"additionalProperties": false,
|
|
205
|
+
"required": ["trigger", "transition", "outcome"],
|
|
206
|
+
"properties": {
|
|
207
|
+
"trigger": {
|
|
208
|
+
"type": "string",
|
|
209
|
+
"minLength": 1
|
|
210
|
+
},
|
|
211
|
+
"transition": {
|
|
212
|
+
"type": "string",
|
|
213
|
+
"minLength": 1
|
|
214
|
+
},
|
|
215
|
+
"outcome": {
|
|
216
|
+
"type": "string",
|
|
217
|
+
"minLength": 1
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
},
|
|
221
|
+
"data_classification": {
|
|
222
|
+
"description": "How the material shown was prepared. `synthetic` is the default; `real` is an authorization somebody had to give.",
|
|
223
|
+
"enum": ["synthetic", "redacted", "real"]
|
|
224
|
+
}
|
|
225
|
+
},
|
|
226
|
+
"$defs": {
|
|
227
|
+
"digest": {
|
|
228
|
+
"type": "string",
|
|
229
|
+
"pattern": "^sha256:[0-9a-f]{64}$"
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
@@ -146,7 +146,7 @@
|
|
|
146
146
|
"enum": ["outline", "handoff"]
|
|
147
147
|
},
|
|
148
148
|
"trace": {
|
|
149
|
-
"description": "Acceptance criteria this
|
|
149
|
+
"description": "Acceptance criteria this screen answers to, and how each one is DEMONSTRATED (AC-REN-02). The classification lives here because a `not_visual` reason is an assertion about the criterion, not about any picture of it; which criteria a given rendition covers travels the other way, in `rendition.json`, and the handoff gate crosses the two. Emptiness — and an unclassified entry — is the maturity profile's business, not this schema's.",
|
|
150
150
|
"type": "array",
|
|
151
151
|
"items": {
|
|
152
152
|
"type": "object",
|
|
@@ -160,6 +160,34 @@
|
|
|
160
160
|
"source": {
|
|
161
161
|
"type": ["string", "null"],
|
|
162
162
|
"minLength": 1
|
|
163
|
+
},
|
|
164
|
+
"classification": {
|
|
165
|
+
"description": "`visual` — you can see whether it holds. `interaction` — you can only see it happen. `not_visual` — nothing to look at, and `reason` says why. Null until the author classifies it: a `handoff` is what demands all three be settled.",
|
|
166
|
+
"type": ["string", "null"],
|
|
167
|
+
"enum": ["visual", "interaction", "not_visual", null]
|
|
168
|
+
},
|
|
169
|
+
"states": {
|
|
170
|
+
"description": "Anchors of THIS revision where the criterion is demonstrated. Empty on a `not_visual` entry.",
|
|
171
|
+
"type": "array",
|
|
172
|
+
"uniqueItems": true,
|
|
173
|
+
"items": {
|
|
174
|
+
"type": "string",
|
|
175
|
+
"pattern": "^[A-Za-z0-9][A-Za-z0-9_-]*$"
|
|
176
|
+
}
|
|
177
|
+
},
|
|
178
|
+
"renditions": {
|
|
179
|
+
"description": "Renditions that show it, by exact reference. Empty on a `not_visual` entry.",
|
|
180
|
+
"type": "array",
|
|
181
|
+
"uniqueItems": true,
|
|
182
|
+
"items": {
|
|
183
|
+
"type": "string",
|
|
184
|
+
"pattern": "^DES-(?:[0-9]{3}|[1-9][0-9]{3,})/VIS-(?:[0-9]{3}|[1-9][0-9]{3,})@r[1-9][0-9]{0,5}$"
|
|
185
|
+
}
|
|
186
|
+
},
|
|
187
|
+
"reason": {
|
|
188
|
+
"description": "Why there is nothing to look at. Only a `not_visual` entry carries one.",
|
|
189
|
+
"type": ["string", "null"],
|
|
190
|
+
"minLength": 1
|
|
163
191
|
}
|
|
164
192
|
}
|
|
165
193
|
}
|