@open-agent-toolkit/cli 0.2.73 → 0.2.74
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/assets/bundle-metadata.json +1 -1
- package/assets/docs/cli-utilities/configuration.md +3 -56
- package/assets/docs/cli-utilities/tool-packs.md +4 -4
- package/assets/docs/contributing/code.md +2 -2
- package/assets/docs/contributing/index.md +0 -1
- package/assets/docs/reference/cli-reference.md +1 -1
- package/assets/docs/reference/troubleshooting.md +17 -40
- package/assets/docs/workflows/projects/artifacts.md +16 -34
- package/assets/docs/workflows/projects/lifecycle.md +20 -19
- package/assets/docs/workflows/skills/explainer-kit.md +180 -440
- package/assets/docs/workflows/skills/index.md +1 -2
- package/assets/public-package-versions.json +4 -4
- package/assets/skills/explainer-kit/SKILL.md +96 -171
- package/assets/skills/explainer-kit/recipes/engineer-tour.json +1 -22
- package/assets/skills/explainer-kit/recipes/program-recap.json +1 -29
- package/assets/skills/explainer-kit/recipes/project-explainer.json +1 -22
- package/assets/skills/explainer-kit/recipes/project-recap.v2.json +1 -43
- package/assets/skills/explainer-kit/references/fact-base-contract.md +76 -101
- package/assets/skills/explainer-kit/references/recap-authoring.md +99 -0
- package/assets/skills/explainer-kit/schemas/manifest.schema.json +13 -135
- package/assets/skills/explainer-kit/scripts/bundle.mjs +712 -0
- package/assets/skills/explainer-kit/scripts/lib/claim-subject.mjs +40 -0
- package/assets/skills/explainer-kit/scripts/lib/contracts.mjs +113 -1504
- package/assets/skills/explainer-kit/scripts/lib/failure.mjs +13 -0
- package/assets/skills/explainer-kit/scripts/lib/package-coverage.mjs +57 -403
- package/assets/skills/explainer-kit/scripts/lib/qa-result.mjs +168 -0
- package/assets/skills/explainer-kit/scripts/lib/qa.mjs +90 -488
- package/assets/skills/explainer-kit/scripts/lib/recipes.mjs +28 -545
- package/assets/skills/explainer-kit/scripts/lib/run-package.mjs +120 -0
- package/assets/skills/explainer-kit/scripts/lib/sanitize.mjs +42 -0
- package/assets/skills/explainer-kit/scripts/record.mjs +335 -0
- package/assets/skills/explainer-kit/scripts/verify.mjs +648 -0
- package/assets/skills/oat-explainer-kit/SKILL.md +57 -117
- package/assets/skills/oat-explainer-kit/references/config-contract.md +20 -64
- package/assets/skills/oat-explainer-kit/references/lifecycle-contract.md +85 -237
- package/assets/skills/oat-explainer-kit/scripts/bind-project-sources.mjs +18 -10
- package/assets/skills/oat-explainer-kit/scripts/check-core.mjs +1 -0
- package/assets/skills/oat-explainer-kit/scripts/check-terminal-outcome.mjs +256 -21
- package/assets/skills/oat-explainer-kit/scripts/persist-intent.mjs +82 -3
- package/assets/skills/oat-explainer-kit/scripts/resolve-config.mjs +0 -162
- package/assets/skills/oat-explainer-kit/scripts/resolve-intent.mjs +57 -123
- package/assets/skills/oat-project-autonomous/SKILL.md +14 -13
- package/assets/skills/oat-project-autonomous/references/gate-inventory.md +165 -165
- package/assets/skills/oat-project-complete/SKILL.md +168 -349
- package/assets/skills/oat-project-complete/scripts/consume-persisted-recap-intent.mjs +125 -0
- package/assets/skills/oat-project-complete/scripts/execute-synced-archive-entry.mjs +0 -30
- package/assets/skills/oat-project-complete/scripts/parse-completion-retry-fields.mjs +4 -37
- package/assets/skills/oat-project-complete/scripts/parse-synced-archive-resume-fields.mjs +17 -16
- package/assets/skills/oat-project-complete/scripts/recover-completion-receipts.mjs +9 -174
- package/assets/skills/oat-project-complete/scripts/resolve-completion-retry.mjs +1 -2
- package/assets/skills/oat-project-document/SKILL.md +1 -1
- package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +165 -165
- package/assets/skills/oat-project-implement/SKILL.md +1 -1
- package/assets/skills/oat-project-implement/references/completion-and-closeout.md +44 -56
- package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +165 -165
- package/assets/skills/oat-project-lite/SKILL.md +1 -1
- package/assets/skills/oat-project-lite/references/docs/autonomy-contract.md +165 -165
- package/assets/skills/oat-project-plan/SKILL.md +5 -6
- package/assets/skills/oat-project-pr-final/SKILL.md +1 -1
- package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +165 -165
- package/assets/skills/oat-project-quick-start/SKILL.md +1 -1
- package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +165 -165
- package/assets/skills/oat-project-summary/SKILL.md +35 -25
- package/assets/skills/oat-wave-execute/SKILL.md +11 -36
- package/assets/skills/oat-wave-program/SKILL.md +13 -37
- package/dist/commands/config/index.d.ts.map +1 -1
- package/dist/commands/config/index.js +9 -113
- package/dist/commands/project/archive/archive-utils.d.ts.map +1 -1
- package/dist/commands/project/archive/archive-utils.js +32 -184
- package/dist/commands/project/archive/explainer-package-coverage.d.ts +3 -8
- package/dist/commands/project/archive/explainer-package-coverage.d.ts.map +1 -1
- package/dist/commands/project/archive/explainer-package-coverage.js +1 -1
- package/dist/config/oat-config.d.ts +0 -11
- package/dist/config/oat-config.d.ts.map +1 -1
- package/dist/config/oat-config.js +0 -34
- package/dist/config/resolve.d.ts.map +1 -1
- package/dist/config/resolve.js +0 -8
- package/dist/release/public-package-contract.d.ts.map +1 -1
- package/dist/release/public-package-contract.js +2 -10
- package/dist/validation/project-state.d.ts.map +1 -1
- package/dist/validation/project-state.js +42 -3
- package/package.json +2 -2
- package/assets/docs/contributing/explainer-kit-verification.md +0 -133
- package/assets/docs/workflows/skills/explainer-kit-providers.md +0 -155
- package/assets/skills/explainer-kit/briefs/deep-dive.md +0 -35
- package/assets/skills/explainer-kit/briefs/project-page.md +0 -38
- package/assets/skills/explainer-kit/briefs/supporting-diagram.md +0 -28
- package/assets/skills/explainer-kit/briefs/walkthrough-deck.md +0 -35
- package/assets/skills/explainer-kit/examples/project-explainer/content.md +0 -31
- package/assets/skills/explainer-kit/examples/project-explainer/fact-base.md +0 -22
- package/assets/skills/explainer-kit/examples/project-recap/content.md +0 -77
- package/assets/skills/explainer-kit/examples/project-recap/fact-base.json +0 -104
- package/assets/skills/explainer-kit/examples/project-recap/fact-base.md +0 -44
- package/assets/skills/explainer-kit/examples/theme-bundle.json +0 -87
- package/assets/skills/explainer-kit/recipes/project-recap.v1.json +0 -93
- package/assets/skills/explainer-kit/references/contracts.md +0 -324
- package/assets/skills/explainer-kit/references/destination-contract.md +0 -210
- package/assets/skills/explainer-kit/references/extension-contract.md +0 -80
- package/assets/skills/explainer-kit/references/golden-conformance.md +0 -80
- package/assets/skills/explainer-kit/references/visual-review.md +0 -71
- package/assets/skills/explainer-kit/schemas/author-request.v2.schema.json +0 -212
- package/assets/skills/explainer-kit/schemas/author-request.v3.schema.json +0 -241
- package/assets/skills/explainer-kit/schemas/author-result.v2.schema.json +0 -52
- package/assets/skills/explainer-kit/schemas/build-record.schema.json +0 -98
- package/assets/skills/explainer-kit/schemas/durability-evidence.schema.json +0 -53
- package/assets/skills/explainer-kit/schemas/publish-receipt.v1.schema.json +0 -97
- package/assets/skills/explainer-kit/schemas/publish-receipt.v2.schema.json +0 -215
- package/assets/skills/explainer-kit/schemas/publish-request.v1.schema.json +0 -32
- package/assets/skills/explainer-kit/schemas/publish-request.v2.schema.json +0 -34
- package/assets/skills/explainer-kit/schemas/run-request.schema.json +0 -147
- package/assets/skills/explainer-kit/schemas/set-plan.v1.schema.json +0 -149
- package/assets/skills/explainer-kit/schemas/terminal-evidence.v1.schema.json +0 -81
- package/assets/skills/explainer-kit/schemas/visual-review-evidence.v1.schema.json +0 -66
- package/assets/skills/explainer-kit/schemas/visual-review-request.v1.schema.json +0 -117
- package/assets/skills/explainer-kit/schemas/visual-review-result.v1.schema.json +0 -80
- package/assets/skills/explainer-kit/scripts/lib/catalog.mjs +0 -349
- package/assets/skills/explainer-kit/scripts/lib/content-approval.mjs +0 -418
- package/assets/skills/explainer-kit/scripts/lib/diagram.mjs +0 -514
- package/assets/skills/explainer-kit/scripts/lib/durability.mjs +0 -643
- package/assets/skills/explainer-kit/scripts/lib/fact-base.mjs +0 -664
- package/assets/skills/explainer-kit/scripts/lib/internal-references.mjs +0 -538
- package/assets/skills/explainer-kit/scripts/lib/markdown.mjs +0 -414
- package/assets/skills/explainer-kit/scripts/lib/publication-policy.mjs +0 -54
- package/assets/skills/explainer-kit/scripts/lib/records.mjs +0 -954
- package/assets/skills/explainer-kit/scripts/lib/render.mjs +0 -703
- package/assets/skills/explainer-kit/scripts/lib/s3-roots.mjs +0 -353
- package/assets/skills/explainer-kit/scripts/lib/s3-static.mjs +0 -759
- package/assets/skills/explainer-kit/scripts/lib/set-plan.mjs +0 -209
- package/assets/skills/explainer-kit/scripts/lib/source-backlinks.mjs +0 -218
- package/assets/skills/explainer-kit/scripts/lib/terminal-evidence.mjs +0 -157
- package/assets/skills/explainer-kit/scripts/lib/visual-review.mjs +0 -400
- package/assets/skills/explainer-kit/scripts/publish.mjs +0 -76
- package/assets/skills/explainer-kit/scripts/record-durability.mjs +0 -64
- package/assets/skills/explainer-kit/scripts/render-qa.mjs +0 -461
- package/assets/skills/explainer-kit/scripts/run.mjs +0 -3038
- package/assets/skills/explainer-kit/scripts/validate.mjs +0 -59
- package/assets/skills/oat-explainer-kit/references/author-callback.md +0 -53
- package/assets/skills/oat-explainer-kit/references/migration.md +0 -144
- package/assets/skills/oat-explainer-kit/references/visual-review-callback.md +0 -83
- package/assets/skills/oat-explainer-kit/scripts/derive-destination.mjs +0 -91
- package/assets/skills/oat-explainer-kit/scripts/finalize-tracked-run.mjs +0 -531
- package/assets/skills/oat-explainer-kit/scripts/probe-recap-seams.mjs +0 -371
- package/assets/skills/oat-explainer-kit/scripts/run.mjs +0 -905
- package/dist/commands/project/archive/explainer-source-backlinks.d.ts +0 -18
- package/dist/commands/project/archive/explainer-source-backlinks.d.ts.map +0 -1
- package/dist/commands/project/archive/explainer-source-backlinks.js +0 -27
- package/dist/commands/project/archive/explainer-terminal-evidence.d.ts +0 -29
- package/dist/commands/project/archive/explainer-terminal-evidence.d.ts.map +0 -1
- package/dist/commands/project/archive/explainer-terminal-evidence.js +0 -37
|
@@ -1,210 +0,0 @@
|
|
|
1
|
-
# S3 static destination contract
|
|
2
|
-
|
|
3
|
-
The `s3-static` connector publishes only files declared as built artifacts in a
|
|
4
|
-
validated manifest. Publishing is human-gated:
|
|
5
|
-
|
|
6
|
-
```bash
|
|
7
|
-
node scripts/publish.mjs \
|
|
8
|
-
--request /path/to/publish-request.json \
|
|
9
|
-
--receipt /path/to/publish-receipt.json \
|
|
10
|
-
--confirm-publish
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
New requests use `explainer-kit.publish-request/v2` and explicitly declare
|
|
14
|
-
`publicAccess` as `public` or `protected`. V1 remains readable as public-mode
|
|
15
|
-
replay. Credentials come only from the standard AWS credential chain or the
|
|
16
|
-
request's optional profile. Never put access keys, secret keys, session tokens,
|
|
17
|
-
or SSO tokens in a request.
|
|
18
|
-
|
|
19
|
-
## How the two roots compose
|
|
20
|
-
|
|
21
|
-
`s3Uri` and `publicBaseUrl` are each normalized without trailing slashes. For a
|
|
22
|
-
path `P` relative to `siteRoot`, the connector writes `<s3Uri>/P` and verifies
|
|
23
|
-
`<publicBaseUrl>/P`. That composition is the whole of the relationship.
|
|
24
|
-
|
|
25
|
-
**No relational validation is performed between the two roots, by design.** The
|
|
26
|
-
mapping from an S3 key to a public URL is underdetermined by these two strings:
|
|
27
|
-
it lives in CDN configuration the connector cannot read. Both of these are
|
|
28
|
-
legitimate, and they disagree structurally:
|
|
29
|
-
|
|
30
|
-
| Shape | `s3Uri` | `publicBaseUrl` |
|
|
31
|
-
| ----- | ---------------------------- | ----------------------------- |
|
|
32
|
-
| A | `s3://bucket/repositories/x` | `https://host/repositories/x` |
|
|
33
|
-
| B | `s3://bucket/explainers` | `https://host` |
|
|
34
|
-
|
|
35
|
-
B is an ordinary CloudFront **Origin Path** deployment, where a bucket prefix is
|
|
36
|
-
mapped to the distribution root. Requiring the public path to equal the S3 key
|
|
37
|
-
prefix rejects it. Suffix-containment does not rescue the rule either — an empty
|
|
38
|
-
public path is a suffix of everything, so B would pass vacuously while
|
|
39
|
-
path-rewriting deployments (CloudFront Functions, Lambda@Edge, custom origins)
|
|
40
|
-
still produce false rejections.
|
|
41
|
-
|
|
42
|
-
Divergence between the two paths is therefore reported as a **non-blocking
|
|
43
|
-
warning**, never a failure. Correctness of an advertised URL is established by
|
|
44
|
-
verification, not by string shape — which is also why `publicAccess: protected`,
|
|
45
|
-
where no anonymous fetch happens, cannot establish it at all.
|
|
46
|
-
|
|
47
|
-
For example:
|
|
48
|
-
|
|
49
|
-
| Input | Value |
|
|
50
|
-
| ----------------------- | --------------------------------------------------------------- |
|
|
51
|
-
| `siteRoot` | `/tmp/run/site` |
|
|
52
|
-
| manifest `renderedPath` | `site/initiatives/demo/index.html` |
|
|
53
|
-
| `s3Uri` | `s3://example-bucket/published` |
|
|
54
|
-
| `publicBaseUrl` | `https://cdn.example.com/published` |
|
|
55
|
-
| object | `s3://example-bucket/published/initiatives/demo/index.html` |
|
|
56
|
-
| public URL | `https://cdn.example.com/published/initiatives/demo/index.html` |
|
|
57
|
-
|
|
58
|
-
Use explicit `index.html` URLs. Directory redirects are not portable evidence.
|
|
59
|
-
The destination must serve the uploaded bytes at the composed public path. That
|
|
60
|
-
is a requirement on the deployment, not something the connector validates from
|
|
61
|
-
the two root strings; see below.
|
|
62
|
-
|
|
63
|
-
## The manifest a connector receives is intentionally incomplete
|
|
64
|
-
|
|
65
|
-
The core persists the manifest **before** it invokes the publisher callback, so
|
|
66
|
-
the file at `manifestPath` carries `outcome: "incomplete"` while the `publish`
|
|
67
|
-
stage is still `running`. This is a contractually intended intermediate state,
|
|
68
|
-
not a corrupt or half-written record, and a connector must not reject it on the
|
|
69
|
-
strength of `outcome` alone.
|
|
70
|
-
|
|
71
|
-
Do not decide publishability from the manifest by itself. Read the build record
|
|
72
|
-
named by `manifest.buildRecord.path` (resolved relative to the manifest) and
|
|
73
|
-
require all of:
|
|
74
|
-
|
|
75
|
-
- the manifest carries no `visual-review-required:` warning;
|
|
76
|
-
- the build record's own `outcome` is `incomplete`;
|
|
77
|
-
- its `publish` stage exists and is `running`; and
|
|
78
|
-
- every stage before `publish` is `passed`, `warned`, or `skipped` and carries
|
|
79
|
-
no `visual-review-required:` warning.
|
|
80
|
-
|
|
81
|
-
Only that combination makes an `incomplete` manifest publishable. The one other
|
|
82
|
-
eligible shape is a finalized `built-durable` manifest that is not
|
|
83
|
-
review-flagged. Any other `incomplete` manifest, and every manifest whose run is
|
|
84
|
-
flagged, failed, or superseded, must be refused. The built-in connector performs
|
|
85
|
-
exactly this check before its first network call; third-party connectors are
|
|
86
|
-
required to perform an equivalent one.
|
|
87
|
-
|
|
88
|
-
The published bytes cannot diverge from the finalized manifest: the catalog
|
|
89
|
-
projection omits `outcome` and `warnings`, and both manifest writes share one
|
|
90
|
-
`finalizedAt`. After the callback returns a valid receipt, the core rewrites the
|
|
91
|
-
manifest with its terminal outcome.
|
|
92
|
-
|
|
93
|
-
## Safety and ordering
|
|
94
|
-
|
|
95
|
-
The connector validates the request, manifest, paths, hashes, and duplicate
|
|
96
|
-
site-relative paths before network access. It then:
|
|
97
|
-
|
|
98
|
-
1. uploads a sentinel whose path contains the run ID and a random 128-bit
|
|
99
|
-
suffix;
|
|
100
|
-
2. verifies the sentinel with a service-computed SHA-256 checksum or an
|
|
101
|
-
authenticated download hash;
|
|
102
|
-
3. for public destinations, fetches that exact sentinel anonymously through the
|
|
103
|
-
public root; protected destinations skip this public fetch explicitly;
|
|
104
|
-
4. deletes only that sentinel;
|
|
105
|
-
5. uploads or idempotently skips each declared artifact;
|
|
106
|
-
6. verifies exact object bytes from service-computed SHA-256 evidence or an
|
|
107
|
-
authenticated download hash, then additionally verifies the exact anonymous
|
|
108
|
-
response bytes for public destinations; and
|
|
109
|
-
7. atomically writes `explainer-kit.publish-receipt/v2` with separate
|
|
110
|
-
authenticated-object and anonymous-public verification facts.
|
|
111
|
-
|
|
112
|
-
If required sentinel verification fails or its verification capability is
|
|
113
|
-
unavailable, no artifact is uploaded. The connector attempts sentinel cleanup
|
|
114
|
-
and emits no successful receipt. An undeclared `401` or `403` in public mode is
|
|
115
|
-
a verification failure, never evidence that the destination is protected.
|
|
116
|
-
|
|
117
|
-
Publishing is additive. The implementation uses individual `put-object`,
|
|
118
|
-
`head-object`, and sentinel-only `delete-object` operations. It never performs
|
|
119
|
-
root-wide synchronization, never passes a delete flag, never walks or uploads
|
|
120
|
-
undeclared files, and never deletes an artifact object. Existing declared
|
|
121
|
-
objects with matching hash and metadata are skipped; changed declared objects
|
|
122
|
-
may be replaced.
|
|
123
|
-
|
|
124
|
-
## Metadata
|
|
125
|
-
|
|
126
|
-
Every upload sets metadata explicitly:
|
|
127
|
-
|
|
128
|
-
| File | Content type |
|
|
129
|
-
| ------- | ------------------------------------------------- |
|
|
130
|
-
| `.html` | `text/html; charset=utf-8` |
|
|
131
|
-
| `.json` | `application/json` |
|
|
132
|
-
| `.css` | `text/css; charset=utf-8` |
|
|
133
|
-
| `.js` | `text/javascript; charset=utf-8` |
|
|
134
|
-
| `.svg` | `image/svg+xml` |
|
|
135
|
-
| `.txt` | `text/plain; charset=utf-8` |
|
|
136
|
-
| other | manifest media type or `application/octet-stream` |
|
|
137
|
-
|
|
138
|
-
Artifacts use `Cache-Control: public, max-age=300`. The connector stores the
|
|
139
|
-
SHA-256 digest as object metadata for idempotency and supplies
|
|
140
|
-
`--checksum-sha256` on upload. It requests service checksum evidence with
|
|
141
|
-
`--checksum-mode ENABLED`; caller-authored metadata and ETags are never treated
|
|
142
|
-
as object-byte proof. When service SHA-256 evidence is unavailable, the
|
|
143
|
-
connector hashes bytes from an authenticated download. Public verification
|
|
144
|
-
separately hashes response bytes without text decoding, so binary artifacts and
|
|
145
|
-
stale wrong-byte 200 responses are covered.
|
|
146
|
-
|
|
147
|
-
## Failures and retries
|
|
148
|
-
|
|
149
|
-
Authentication and permission failures stop immediately. The connector does
|
|
150
|
-
not run `aws sso login`, retry with another profile, expose AWS diagnostics, or
|
|
151
|
-
persist credentials. Refresh credentials separately and rerun after approval.
|
|
152
|
-
|
|
153
|
-
Only transient individual object-operation failures receive bounded retries.
|
|
154
|
-
Input, authorization, metadata, and public-verification failures are not
|
|
155
|
-
retried. A failed publish preserves the local package.
|
|
156
|
-
|
|
157
|
-
Public roots must be credential-free HTTPS URLs with no username, password,
|
|
158
|
-
query, or fragment. Three further rejections apply, all before any AWS or HTTP
|
|
159
|
-
operation, and none of them are ever persisted in receipts:
|
|
160
|
-
|
|
161
|
-
- **Control characters.** Any codepoint in `0x00`–`0x1f` or `0x7f`–`0x9f`, and
|
|
162
|
-
any backslash, in either root. These otherwise reach S3 object keys, composed
|
|
163
|
-
public URLs, the catalog, the receipt and `aws` argv; `0x9b` is the 8-bit CSI.
|
|
164
|
-
- **Non-public addresses.** Loopback, link-local (`169.254.0.0/16`, `fe80::/10`,
|
|
165
|
-
including the `169.254.169.254` instance-metadata address), unique-local
|
|
166
|
-
(`fc00::/7`) and RFC 1918 private hosts, in both literal IPv4 and IPv6 forms
|
|
167
|
-
including IPv4-mapped spellings. Public verification issues an outbound GET
|
|
168
|
-
against whatever the root names, so an unconstrained root is a request
|
|
169
|
-
primitive aimed at internal addresses. Set
|
|
170
|
-
`EXPLAINER_KIT_ALLOW_PRIVATE_PUBLIC_ROOT=1` to opt back in for a genuinely
|
|
171
|
-
internal mirror. The policy is address-literal only: a hostname that happens
|
|
172
|
-
to resolve inward is not detected.
|
|
173
|
-
- **Redirects.** Public verification uses `redirect: 'error'`. A canonical
|
|
174
|
-
artifact URL is uploaded to a known key and should never legitimately
|
|
175
|
-
redirect, so any redirecting destination is a hard verification failure rather
|
|
176
|
-
than something to follow. A destination that requires redirects is
|
|
177
|
-
incompatible with this connector and will report as such rather than failing
|
|
178
|
-
opaquely later.
|
|
179
|
-
|
|
180
|
-
## The generated initiative catalog
|
|
181
|
-
|
|
182
|
-
The connector generates one auxiliary artifact the manifest does not declare: an
|
|
183
|
-
initiative catalog at `site/initiatives/<slug>/catalog.json`, uploaded alongside
|
|
184
|
-
the declared artifacts and recorded in the receipt as
|
|
185
|
-
`source: { kind: 'auxiliary', name: 'catalog' }`.
|
|
186
|
-
|
|
187
|
-
A third-party connector must reproduce it **byte for byte**, because
|
|
188
|
-
`recordDurability` rebuilds it from the manifest and compares hashes; a mismatch
|
|
189
|
-
rejects the publication with `cross-record-mismatch`. Build it with
|
|
190
|
-
`catalogFromManifest(manifest, publicBaseUrl, { publicAccess })` and serialize
|
|
191
|
-
with `serializeInitiativeCatalog`, rather than constructing it by hand.
|
|
192
|
-
|
|
193
|
-
Two properties matter most:
|
|
194
|
-
|
|
195
|
-
- The `{ publicAccess }` option is **required**. Omitting it raises a
|
|
196
|
-
`TypeError` rather than defaulting, because the policy selects a field inside
|
|
197
|
-
the serialized bytes and therefore changes the hash. Pass
|
|
198
|
-
`{ publicAccess: undefined }` for `publish-request/v1`, which has no such
|
|
199
|
-
field and is public by definition.
|
|
200
|
-
- `publicVerification` carries **policy, never outcome**: `"required"` for
|
|
201
|
-
public destinations and `"skipped-by-policy"` for protected ones. The catalog
|
|
202
|
-
is serialized and hashed before the first upload and long before any
|
|
203
|
-
per-artifact verification runs, so it cannot carry a verification result
|
|
204
|
-
without invalidating its own hash. The authoritative outcome lives in the
|
|
205
|
-
publish receipt, which the catalog's `runId` identifies. Never write
|
|
206
|
-
`"verified"` into a catalog.
|
|
207
|
-
|
|
208
|
-
Publishability is gated by `assertManifestPublishable`, which raises
|
|
209
|
-
`E_PUBLISH_OUTCOME` for a manifest that is not eligible; see the intermediate
|
|
210
|
-
`incomplete` state described above.
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
# Wrapper extension contract
|
|
2
|
-
|
|
3
|
-
V1 freezes one destination-neutral extension seam:
|
|
4
|
-
|
|
5
|
-
1. **Pre-resolution:** the caller resolves presets, private source systems,
|
|
6
|
-
accounts, and destination topology without exposing them as public config.
|
|
7
|
-
2. **`ExplainerRunRequestV1`:** the caller translates only the inputs required
|
|
8
|
-
by `explainer-kit.run-request/v1`.
|
|
9
|
-
3. **Core run:** the caller invokes `runExplainer(request, options)` once. The
|
|
10
|
-
core owns validation, fact-base processing, content, theme, render, QA, and
|
|
11
|
-
run records.
|
|
12
|
-
4. **Manifest consumption:** the caller accepts only
|
|
13
|
-
`explainer-kit.manifest/v1`, verifies its run, recipe, and slug identity, and
|
|
14
|
-
reads built artifact paths from the manifest.
|
|
15
|
-
5. **Post-run linking:** the caller may create companion notes, synchronize
|
|
16
|
-
external documents, or maintain private links from manifest and optional
|
|
17
|
-
publish-receipt data.
|
|
18
|
-
|
|
19
|
-
Private wrappers may retain presets, vault conventions, Google Docs behavior,
|
|
20
|
-
and personal destinations around this seam. Those values are wrapper-owned;
|
|
21
|
-
they are not OAT config keys and must not be discovered by the core.
|
|
22
|
-
|
|
23
|
-
## Frozen versioned boundary
|
|
24
|
-
|
|
25
|
-
The versioned request, artifact package, manifest, build record, durability
|
|
26
|
-
request, publish request, and publish receipt are the public boundary. New
|
|
27
|
-
publication work uses the immutable `explainer-kit.publish-request/v2` and
|
|
28
|
-
`explainer-kit.publish-receipt/v2` contracts. The corresponding
|
|
29
|
-
`publish-request/v1` and `publish-receipt/v1` contracts remain readable for
|
|
30
|
-
replay; v2 is a new contract version, not an in-place mutation of v1. The
|
|
31
|
-
extension seam has no plugin registry and no mid-pipeline callback API for
|
|
32
|
-
private destinations. Provider-neutral callbacks already documented by the
|
|
33
|
-
core remain explicit run options; they do not transfer stage ownership to a
|
|
34
|
-
wrapper.
|
|
35
|
-
|
|
36
|
-
V1 readers reject unsupported contract majors and identity mismatches rather
|
|
37
|
-
than guessing. Wrappers should preserve unknown future versions for diagnosis,
|
|
38
|
-
stop before post-processing, and migrate deliberately.
|
|
39
|
-
|
|
40
|
-
The compatibility smoke fixture at
|
|
41
|
-
`tools/smoke/explainer-kit/wrapper-compatibility.test.mjs` proves this sequence
|
|
42
|
-
with the actual core. It uses sanitized private-wrapper inputs and is not a
|
|
43
|
-
substitute for the operator-owned release-candidate gate.
|
|
44
|
-
|
|
45
|
-
Release-candidate execution requires the retained tarball directory explicitly:
|
|
46
|
-
|
|
47
|
-
```bash
|
|
48
|
-
# Pre: resolve private inputs and write the external run request.
|
|
49
|
-
node tools/release/run-explainer-rc.mjs \
|
|
50
|
-
--rc-manifest /path/to/acceptance/rc.json \
|
|
51
|
-
--artifacts-dir /path/to/retained/explainer-kit-rc \
|
|
52
|
-
--entry scripts/run.mjs \
|
|
53
|
-
--record /path/to/acceptance/private-wrapper-execution.json \
|
|
54
|
-
-- --request /path/to/private/request.json
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
The packaged CLI stdout contract is exactly one complete JSON result document.
|
|
58
|
-
The document may be pretty-printed across lines; progress text and
|
|
59
|
-
line-delimited JSON are not part of this machine framing. The RC runner parses
|
|
60
|
-
the complete document, then binds the request, child-reported manifest, and core
|
|
61
|
-
run ID. It binds a receipt only when the packaged child itself reports that
|
|
62
|
-
output. The sanitized record does not store paths, argument values, credentials,
|
|
63
|
-
or private content.
|
|
64
|
-
|
|
65
|
-
After the core command returns, the wrapper performs its post-run publication
|
|
66
|
-
and linking work. It retains the immutable core manifest as
|
|
67
|
-
`private-wrapper-manifest.json`, the complete `publish-receipt/v2` as
|
|
68
|
-
`private-wrapper-publish-receipt.json`, and its sanitized wrapper result as
|
|
69
|
-
`private-wrapper-result.json`. The wrapper result repeats canonical hashes for
|
|
70
|
-
the request, manifest, and post-run receipt.
|
|
71
|
-
|
|
72
|
-
The wrapper acceptance stage reads those post-run files separately. It
|
|
73
|
-
validates the closed receipt contract, complete manifest and catalog evidence,
|
|
74
|
-
every source identity, path, artifact hash, destination, and verification fact,
|
|
75
|
-
the run-unique sentinel, the manifest hash, and the core run ID against
|
|
76
|
-
`private-wrapper-execution.json`. Public and protected v2 receipts must each
|
|
77
|
-
provide exactly one entry for every finalized manifest artifact and exactly one
|
|
78
|
-
generated catalog entry. A `publish-receipt/v1` remains consumable only for
|
|
79
|
-
replay. Repeating a matching hash cannot make a foreign, duplicate, incomplete,
|
|
80
|
-
or stale receipt attributable to the packaged run.
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
# Golden conformance contract
|
|
2
|
-
|
|
3
|
-
Golden conformance runs the unattended project-recap workflow from portable
|
|
4
|
-
semantic inputs and validates its live output in real Chromium. It is a
|
|
5
|
-
behavioral oracle, not a pixel snapshot: output may change markup, spacing, or
|
|
6
|
-
composition when it clears the same quality bar.
|
|
7
|
-
|
|
8
|
-
## Cases
|
|
9
|
-
|
|
10
|
-
Each case directory under `tests/fixtures/golden/` contains:
|
|
11
|
-
|
|
12
|
-
- `simple` checks viewport-sized lead evidence and a cohesive baseline recap.
|
|
13
|
-
- `non-linear` checks branch, fan-in, and cycle preservation.
|
|
14
|
-
- `explainer-authoring-redesign` checks an archive-only rebuild from a dense
|
|
15
|
-
completed project record.
|
|
16
|
-
|
|
17
|
-
| Path | Contract |
|
|
18
|
-
| ----------------------------- | --------------------------------------------------------------- |
|
|
19
|
-
| `descriptor.json` | Case identity plus paths and SHA-256 hashes for semantic inputs |
|
|
20
|
-
| `source-input.json` | Source-grounded claims, topology, and reader questions |
|
|
21
|
-
| `evidence/source-record.json` | Retained source claims, upstream repository hash, and topology |
|
|
22
|
-
|
|
23
|
-
All cases share `tests/fixtures/golden/rubric.json`. Generated HTML, browser
|
|
24
|
-
captures, measurements, manifests, catalogs, and review records are temporary
|
|
25
|
-
test output and must not be committed.
|
|
26
|
-
|
|
27
|
-
The descriptor's retained-file set is case-relative and content addressed. The
|
|
28
|
-
loader recomputes each hash, resolves source records, and rejects missing,
|
|
29
|
-
changed, duplicate, non-portable, or ungrounded input.
|
|
30
|
-
`sharedRubricPath` resolves from `tests/fixtures/golden/`, and
|
|
31
|
-
`sharedRubricSha256` content-addresses that common contract.
|
|
32
|
-
|
|
33
|
-
## Required rubric
|
|
34
|
-
|
|
35
|
-
The shared `explainer-kit.golden-rubric/v1` `checks` object has exactly these
|
|
36
|
-
required fields:
|
|
37
|
-
|
|
38
|
-
1. `adaptiveMinimumSet`
|
|
39
|
-
2. `firstViewport`
|
|
40
|
-
3. `hierarchy`
|
|
41
|
-
4. `representationChoice`
|
|
42
|
-
5. `legibility`
|
|
43
|
-
6. `cohesion`
|
|
44
|
-
7. `sourceCoverage`
|
|
45
|
-
8. `interactions`
|
|
46
|
-
9. `topologyPreservation`
|
|
47
|
-
10. `catalogParity`
|
|
48
|
-
11. `boundedCorrection`
|
|
49
|
-
|
|
50
|
-
The benchmark enforces every field against live runtime evidence. A passing set
|
|
51
|
-
contains exactly the project recap, architecture, and deck; preserves source
|
|
52
|
-
meaning and topology; has catalog-to-manifest parity; includes real browser
|
|
53
|
-
captures and measurements; and reaches a passing terminal review without a
|
|
54
|
-
correction. Integration suites separately exercise the one-correction ceiling.
|
|
55
|
-
|
|
56
|
-
## Runtime evidence
|
|
57
|
-
|
|
58
|
-
The suite generates one complete recap package per case in a temporary
|
|
59
|
-
directory. It validates artifact membership, claim markers, exact topology,
|
|
60
|
-
catalog parity, independent visual review, real Chromium identity, viewport
|
|
61
|
-
dimensions, lead-content presence, heading order, capture identity, overflow,
|
|
62
|
-
keyboard and deck-arrow behavior, and bounded review. The temporary package is
|
|
63
|
-
removed when the test completes.
|
|
64
|
-
|
|
65
|
-
Claims are accepted only when their source ID exists and their text exactly
|
|
66
|
-
matches a claim in the retained source record. Repository-backed records also
|
|
67
|
-
pin the upstream repository file and prove every retained claim occurs there.
|
|
68
|
-
Runtime tests must not load an operator plugin, home directory, active project,
|
|
69
|
-
or moving branch.
|
|
70
|
-
|
|
71
|
-
## Portability rules
|
|
72
|
-
|
|
73
|
-
- Retained descriptor paths are relative to their case and cannot escape it;
|
|
74
|
-
the shared rubric path is relative to the golden fixture root.
|
|
75
|
-
- POSIX roots, Windows drive paths, UNC paths, home-relative paths, and
|
|
76
|
-
`file://` locators are rejected wherever they occur in committed inputs.
|
|
77
|
-
- Repository-relative paths and supported `https://` source URLs are allowed.
|
|
78
|
-
- Every claim, topology node, and topology edge resolves to retained,
|
|
79
|
-
hash-verified source input, so later runs do not need the original
|
|
80
|
-
workstation.
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
# Visual review guidance
|
|
2
|
-
|
|
3
|
-
Review the rendered artifact set against its reconciled fact base, shared
|
|
4
|
-
ledger, set plan, and browser evidence. This rubric is independent of authoring
|
|
5
|
-
guidance: it tells a critic what to assess, not how an author should compose.
|
|
6
|
-
An optional installed visual-explainer capability may assist, but review must
|
|
7
|
-
remain possible from bundled evidence and rules alone.
|
|
8
|
-
|
|
9
|
-
## Review the whole set
|
|
10
|
-
|
|
11
|
-
Inspect the complete set before assigning artifact findings. Verify:
|
|
12
|
-
|
|
13
|
-
- **First viewport:** each artifact establishes purpose, project state, and the
|
|
14
|
-
primary reader question without scrolling.
|
|
15
|
-
- **Typography:** titles, framing text, headings, labels, body copy, and
|
|
16
|
-
annotations have distinct, readable roles that remain consistent across the
|
|
17
|
-
set.
|
|
18
|
-
- **Hierarchy:** the most important outcome or relationship is dominant, with
|
|
19
|
-
secondary detail grouped and ordered consistently.
|
|
20
|
-
- **Composition:** grouping, alignment, spacing, and emphasis create a clear
|
|
21
|
-
reading path suited to the artifact's evidence.
|
|
22
|
-
- **Density:** crowded material is restructured instead of miniaturized, while
|
|
23
|
-
sparse material is not padded with decorative filler.
|
|
24
|
-
- **Medium leverage:** the selected medium makes a relationship, comparison,
|
|
25
|
-
sequence, or decision easier to understand than plain prose would.
|
|
26
|
-
- **Legibility:** text, labels, status cues, tables, and connectors remain
|
|
27
|
-
readable at every required viewport.
|
|
28
|
-
- **Medium fit:** the hub orients and links, the system visual preserves
|
|
29
|
-
relationships, the deck paces a narrative, and optional artifacts add a
|
|
30
|
-
distinct source-backed perspective.
|
|
31
|
-
- **Template repetition:** sections, cards, and slides vary when the evidence
|
|
32
|
-
calls for a different treatment instead of repeating one shell mechanically.
|
|
33
|
-
- **Diagram semantics:** topology, direction, labels, edge meaning, and
|
|
34
|
-
fit-to-content framing communicate the planned relationships without false
|
|
35
|
-
linearization or decorative ambiguity.
|
|
36
|
-
- **Cross-artifact cohesion:** terminology, status labels, numbers, color
|
|
37
|
-
meaning, typographic roles, and visual language match the shared ledger and
|
|
38
|
-
one another.
|
|
39
|
-
- **Coverage and redundancy:** planned sources and reader questions are covered
|
|
40
|
-
once at the right depth; optional artifacts do not repeat the hub or deck
|
|
41
|
-
without a justified purpose.
|
|
42
|
-
- **Interaction:** navigation, links, keyboard controls, reduced motion, table
|
|
43
|
-
overflow, and diagram pan or zoom work without hiding content.
|
|
44
|
-
|
|
45
|
-
## Artifact-scoped findings
|
|
46
|
-
|
|
47
|
-
Every finding identifies an artifact ID, the failed rubric area, evidence, and
|
|
48
|
-
a concrete correction. Distinguish factual or ledger conflicts from visual
|
|
49
|
-
judgment. Never infer a fact that is absent from the retained sources.
|
|
50
|
-
|
|
51
|
-
Use severity proportionally:
|
|
52
|
-
|
|
53
|
-
- Critical: unsafe, fabricated, or materially false output.
|
|
54
|
-
- Important: the artifact cannot answer its primary question or loses required
|
|
55
|
-
topology, content, or legibility.
|
|
56
|
-
- Medium: meaningful visual or cohesion weakness that does not invalidate the
|
|
57
|
-
set.
|
|
58
|
-
- Minor: localized polish issue.
|
|
59
|
-
|
|
60
|
-
## Disposition
|
|
61
|
-
|
|
62
|
-
Return exactly one provider-neutral disposition:
|
|
63
|
-
|
|
64
|
-
- `pass` when the full set clears the rubric with no required correction.
|
|
65
|
-
- `correct` when bounded artifact-scoped changes can clear the rubric; every
|
|
66
|
-
finding must name a concrete, actionable correction.
|
|
67
|
-
- `fail` when evidence is missing, the plan or ledger is internally invalid, or
|
|
68
|
-
correction would require unsupported facts or a different artifact set.
|
|
69
|
-
|
|
70
|
-
Do not award `pass` from source code inspection alone. Base visual findings on
|
|
71
|
-
the retained browser evidence available to the review request.
|
|
@@ -1,212 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
-
"$id": "explainer-kit.author-request/v2",
|
|
4
|
-
"title": "AuthorRequestV2",
|
|
5
|
-
"type": "object",
|
|
6
|
-
"additionalProperties": false,
|
|
7
|
-
"required": [
|
|
8
|
-
"schemaVersion",
|
|
9
|
-
"artifactId",
|
|
10
|
-
"artifactType",
|
|
11
|
-
"authoring",
|
|
12
|
-
"brief",
|
|
13
|
-
"visualAuthoringGuidance",
|
|
14
|
-
"factBase",
|
|
15
|
-
"theme",
|
|
16
|
-
"setContext",
|
|
17
|
-
"plannedArtifact"
|
|
18
|
-
],
|
|
19
|
-
"properties": {
|
|
20
|
-
"schemaVersion": { "const": "explainer-kit.author-request/v2" },
|
|
21
|
-
"artifactId": { "type": "string", "minLength": 1 },
|
|
22
|
-
"artifactType": {
|
|
23
|
-
"enum": ["hub", "diagram", "explainer", "deck", "catalog"]
|
|
24
|
-
},
|
|
25
|
-
"authoring": { "enum": ["markdown", "html"] },
|
|
26
|
-
"brief": { "type": "string", "minLength": 1 },
|
|
27
|
-
"visualAuthoringGuidance": { "type": "string", "minLength": 1 },
|
|
28
|
-
"factBase": { "$ref": "explainer-kit.fact-base/v1" },
|
|
29
|
-
"shell": { "type": "string", "minLength": 1 },
|
|
30
|
-
"theme": { "$ref": "explainer-kit.theme/v1" },
|
|
31
|
-
"setContext": { "$ref": "explainer-kit.set-plan/v1" },
|
|
32
|
-
"plannedArtifact": { "$ref": "#/$defs/plannedArtifact" },
|
|
33
|
-
"graphSemantics": {
|
|
34
|
-
"type": "array",
|
|
35
|
-
"items": { "$ref": "#/$defs/graphSemantics" },
|
|
36
|
-
"minItems": 1
|
|
37
|
-
},
|
|
38
|
-
"floor": {
|
|
39
|
-
"type": "object",
|
|
40
|
-
"additionalProperties": false,
|
|
41
|
-
"required": ["requiredNarrative"],
|
|
42
|
-
"properties": {
|
|
43
|
-
"requiredNarrative": {
|
|
44
|
-
"type": "array",
|
|
45
|
-
"items": { "type": "string", "minLength": 1 },
|
|
46
|
-
"minItems": 1,
|
|
47
|
-
"uniqueItems": true
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
},
|
|
52
|
-
"$defs": {
|
|
53
|
-
"graphSemantics": {
|
|
54
|
-
"type": "object",
|
|
55
|
-
"additionalProperties": false,
|
|
56
|
-
"required": ["direction", "nodes", "edges", "topology"],
|
|
57
|
-
"properties": {
|
|
58
|
-
"direction": { "enum": ["TD", "LR"] },
|
|
59
|
-
"nodes": {
|
|
60
|
-
"type": "array",
|
|
61
|
-
"items": {
|
|
62
|
-
"type": "object",
|
|
63
|
-
"additionalProperties": false,
|
|
64
|
-
"required": ["id", "label", "shape", "explicit"],
|
|
65
|
-
"properties": {
|
|
66
|
-
"id": { "type": "string", "pattern": "^[A-Za-z][A-Za-z0-9_-]*$" },
|
|
67
|
-
"label": { "type": "string", "minLength": 1 },
|
|
68
|
-
"shape": { "enum": ["rectangle", "rounded", "diamond"] },
|
|
69
|
-
"explicit": { "type": "boolean" }
|
|
70
|
-
}
|
|
71
|
-
},
|
|
72
|
-
"minItems": 1,
|
|
73
|
-
"uniqueItems": true
|
|
74
|
-
},
|
|
75
|
-
"edges": {
|
|
76
|
-
"type": "array",
|
|
77
|
-
"items": {
|
|
78
|
-
"type": "object",
|
|
79
|
-
"additionalProperties": false,
|
|
80
|
-
"required": ["from", "to", "kind", "label"],
|
|
81
|
-
"properties": {
|
|
82
|
-
"from": {
|
|
83
|
-
"type": "string",
|
|
84
|
-
"pattern": "^[A-Za-z][A-Za-z0-9_-]*$"
|
|
85
|
-
},
|
|
86
|
-
"to": { "type": "string", "pattern": "^[A-Za-z][A-Za-z0-9_-]*$" },
|
|
87
|
-
"kind": { "enum": ["arrow", "line"] },
|
|
88
|
-
"label": { "type": "string" }
|
|
89
|
-
}
|
|
90
|
-
},
|
|
91
|
-
"minItems": 1
|
|
92
|
-
},
|
|
93
|
-
"topology": {
|
|
94
|
-
"type": "object",
|
|
95
|
-
"additionalProperties": false,
|
|
96
|
-
"required": [
|
|
97
|
-
"kind",
|
|
98
|
-
"features",
|
|
99
|
-
"branchNodes",
|
|
100
|
-
"fanInNodes",
|
|
101
|
-
"cycle",
|
|
102
|
-
"order"
|
|
103
|
-
],
|
|
104
|
-
"properties": {
|
|
105
|
-
"kind": { "const": "non-linear" },
|
|
106
|
-
"features": {
|
|
107
|
-
"type": "array",
|
|
108
|
-
"items": {
|
|
109
|
-
"enum": [
|
|
110
|
-
"branch",
|
|
111
|
-
"fan-in",
|
|
112
|
-
"cycle",
|
|
113
|
-
"disconnected",
|
|
114
|
-
"non-linear"
|
|
115
|
-
]
|
|
116
|
-
},
|
|
117
|
-
"minItems": 1,
|
|
118
|
-
"uniqueItems": true
|
|
119
|
-
},
|
|
120
|
-
"branchNodes": {
|
|
121
|
-
"type": "array",
|
|
122
|
-
"items": {
|
|
123
|
-
"type": "string",
|
|
124
|
-
"pattern": "^[A-Za-z][A-Za-z0-9_-]*$"
|
|
125
|
-
},
|
|
126
|
-
"uniqueItems": true
|
|
127
|
-
},
|
|
128
|
-
"fanInNodes": {
|
|
129
|
-
"type": "array",
|
|
130
|
-
"items": {
|
|
131
|
-
"type": "string",
|
|
132
|
-
"pattern": "^[A-Za-z][A-Za-z0-9_-]*$"
|
|
133
|
-
},
|
|
134
|
-
"uniqueItems": true
|
|
135
|
-
},
|
|
136
|
-
"cycle": { "type": "boolean" },
|
|
137
|
-
"order": {
|
|
138
|
-
"type": "array",
|
|
139
|
-
"items": {
|
|
140
|
-
"type": "string",
|
|
141
|
-
"pattern": "^[A-Za-z][A-Za-z0-9_-]*$"
|
|
142
|
-
},
|
|
143
|
-
"maxItems": 0
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
},
|
|
149
|
-
"plannedArtifact": {
|
|
150
|
-
"type": "object",
|
|
151
|
-
"additionalProperties": false,
|
|
152
|
-
"required": [
|
|
153
|
-
"artifactId",
|
|
154
|
-
"artifactType",
|
|
155
|
-
"profileId",
|
|
156
|
-
"required",
|
|
157
|
-
"sourceIds",
|
|
158
|
-
"draft",
|
|
159
|
-
"visualIntent"
|
|
160
|
-
],
|
|
161
|
-
"properties": {
|
|
162
|
-
"artifactId": {
|
|
163
|
-
"type": "string",
|
|
164
|
-
"pattern": "^[a-z0-9]+(?:[._-][a-z0-9]+)*$"
|
|
165
|
-
},
|
|
166
|
-
"artifactType": {
|
|
167
|
-
"enum": ["hub", "diagram", "explainer", "deck", "catalog"]
|
|
168
|
-
},
|
|
169
|
-
"profileId": {
|
|
170
|
-
"type": "string",
|
|
171
|
-
"pattern": "^[a-z0-9]+(?:[._-][a-z0-9]+)*$"
|
|
172
|
-
},
|
|
173
|
-
"required": { "type": "boolean" },
|
|
174
|
-
"sourceIds": {
|
|
175
|
-
"type": "array",
|
|
176
|
-
"items": {
|
|
177
|
-
"type": "string",
|
|
178
|
-
"pattern": "^[a-z0-9]+(?:[._-][a-z0-9]+)*$"
|
|
179
|
-
},
|
|
180
|
-
"minItems": 1,
|
|
181
|
-
"uniqueItems": true
|
|
182
|
-
},
|
|
183
|
-
"draft": { "type": "string", "minLength": 1 },
|
|
184
|
-
"visualIntent": { "type": "string", "minLength": 1 },
|
|
185
|
-
"justification": {
|
|
186
|
-
"type": "object",
|
|
187
|
-
"additionalProperties": false,
|
|
188
|
-
"required": ["kind", "sourceIds", "rationale"],
|
|
189
|
-
"properties": {
|
|
190
|
-
"kind": {
|
|
191
|
-
"enum": [
|
|
192
|
-
"status-change",
|
|
193
|
-
"rollout-complexity",
|
|
194
|
-
"source-backed-detail"
|
|
195
|
-
]
|
|
196
|
-
},
|
|
197
|
-
"sourceIds": {
|
|
198
|
-
"type": "array",
|
|
199
|
-
"items": {
|
|
200
|
-
"type": "string",
|
|
201
|
-
"pattern": "^[a-z0-9]+(?:[._-][a-z0-9]+)*$"
|
|
202
|
-
},
|
|
203
|
-
"minItems": 1,
|
|
204
|
-
"uniqueItems": true
|
|
205
|
-
},
|
|
206
|
-
"rationale": { "type": "string", "minLength": 1 }
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
}
|