@graphrefly/stack 0.1.1 → 0.1.4

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.
Files changed (55) hide show
  1. package/README.md +24 -11
  2. package/dist/assets/contracts/ci/v1/artifacts.schema.json +253 -0
  3. package/dist/assets/contracts/ci/v1/golden-suite.schema.json +17 -0
  4. package/dist/assets/contracts/repository/v1/review-bundle.schema.json +49 -0
  5. package/dist/assets/contracts/repository/v1/review-decision-request.schema.json +15 -0
  6. package/dist/assets/contracts/repository/v1/review-decision.schema.json +52 -0
  7. package/dist/assets/contracts/repository/v1/review.schema.json +46 -2
  8. package/dist/assets/contracts/semantic/v1/artifacts.schema.json +697 -0
  9. package/dist/assets/contracts/semantic/v1/golden-suite.schema.json +119 -0
  10. package/dist/assets/contracts/v1/schemas/cli-result.schema.json +11 -1
  11. package/dist/assets/fixtures/contracts/ci/v1/golden-digests.json +5 -0
  12. package/dist/assets/fixtures/contracts/ci/v1/golden-suite.json +104 -0
  13. package/dist/assets/fixtures/contracts/semantic/v1/golden-digests.json +17 -0
  14. package/dist/assets/fixtures/contracts/semantic/v1/golden-suite.json +715 -0
  15. package/dist/grfs.js +3745 -1395
  16. package/dist/review/assets/{abnfDiagram-VRR7QNED-5JVeQ-ZW.js → abnfDiagram-VRR7QNED-BjBHcddA.js} +1 -1
  17. package/dist/review/assets/{architectureDiagram-ZJ3FMSHR-BnEvDO7X.js → architectureDiagram-ZJ3FMSHR-D2YEagFX.js} +1 -1
  18. package/dist/review/assets/{chunk-EX3LRPZG-BrpCa9zr.js → chunk-EX3LRPZG-Cqlq9N1k.js} +1 -1
  19. package/dist/review/assets/{chunk-MOJQB5TN-BshP08Ez.js → chunk-MOJQB5TN-CrJU23I4.js} +1 -1
  20. package/dist/review/assets/{chunk-PUDLZKDR-HkwEqIVB.js → chunk-PUDLZKDR-D2gPOWiF.js} +1 -1
  21. package/dist/review/assets/{chunk-V7JOEXUC-CswDacm3.js → chunk-V7JOEXUC-zqKE0D3Z.js} +1 -1
  22. package/dist/review/assets/{classDiagram-OUVF2IWQ-U8e_ZvC4.js → classDiagram-OUVF2IWQ-CRJJUaPV.js} +1 -1
  23. package/dist/review/assets/{classDiagram-v2-EOCWNBFH-U8e_ZvC4.js → classDiagram-v2-EOCWNBFH-CRJJUaPV.js} +1 -1
  24. package/dist/review/assets/{cynefinDiagram-TSTJHNR4-CfYu2mB5.js → cynefinDiagram-TSTJHNR4-BkymIc14.js} +1 -1
  25. package/dist/review/assets/{dagre-VKFMJZFB-BvyihZfA.js → dagre-VKFMJZFB-e2nCgJcZ.js} +1 -1
  26. package/dist/review/assets/{diagram-G47NLZAW-qFNMv5An.js → diagram-G47NLZAW-QL9zGpjT.js} +1 -1
  27. package/dist/review/assets/{diagram-NH7WQ7WH-CsvacND9.js → diagram-NH7WQ7WH-DvCskT8T.js} +1 -1
  28. package/dist/review/assets/{diagram-OA4YK3LP-qFtWcyNi.js → diagram-OA4YK3LP-Cx9kjg5t.js} +1 -1
  29. package/dist/review/assets/{diagram-WEI45ONY-C5nYGL8t.js → diagram-WEI45ONY-CfwqC_md.js} +1 -1
  30. package/dist/review/assets/{ebnfDiagram-CCIWWBDH-D_0nhpry.js → ebnfDiagram-CCIWWBDH-G63kkvbq.js} +1 -1
  31. package/dist/review/assets/{erDiagram-Q63AITRT-CIS7hpdK.js → erDiagram-Q63AITRT-D3GzhK6w.js} +1 -1
  32. package/dist/review/assets/{flowDiagram-23GEKE2U-Df5sjnlg.js → flowDiagram-23GEKE2U-DqVi9C2r.js} +1 -1
  33. package/dist/review/assets/index-BGz0YQEi.css +1 -0
  34. package/dist/review/assets/index-D_ZKYhz7.js +64 -0
  35. package/dist/review/assets/{infoDiagram-FWYZ7A6U-CT7TZgi6.js → infoDiagram-FWYZ7A6U-WJv0WBae.js} +1 -1
  36. package/dist/review/assets/{ishikawaDiagram-FXEZZL3T-BUpotH7r.js → ishikawaDiagram-FXEZZL3T-BnZ5zRCL.js} +1 -1
  37. package/dist/review/assets/{kanban-definition-HUTT4EX6-e-emfNuh.js → kanban-definition-HUTT4EX6-BDdmEROe.js} +1 -1
  38. package/dist/review/assets/{mindmap-definition-LN4V7U3C-ClSEPrvR.js → mindmap-definition-LN4V7U3C-BH2EZxB3.js} +1 -1
  39. package/dist/review/assets/{pegDiagram-2B236MQR-Ck_v89jl.js → pegDiagram-2B236MQR-apJfnuaF.js} +1 -1
  40. package/dist/review/assets/{pieDiagram-ENE6RG2P-C63dxyZj.js → pieDiagram-ENE6RG2P-DBZNNsNI.js} +1 -1
  41. package/dist/review/assets/{railroadDiagram-RFXS5EU6-DYI7CPMt.js → railroadDiagram-RFXS5EU6-Csr5eB8z.js} +1 -1
  42. package/dist/review/assets/{requirementDiagram-TGXJPOKE-BMW46SXM.js → requirementDiagram-TGXJPOKE-DOGov392.js} +1 -1
  43. package/dist/review/assets/{sequenceDiagram-DBY2YBRQ-DVtyVuxr.js → sequenceDiagram-DBY2YBRQ-CGLEdxIQ.js} +1 -1
  44. package/dist/review/assets/{stateDiagram-2N3HPSRC-BM1s-zUo.js → stateDiagram-2N3HPSRC-DGc_GIR7.js} +1 -1
  45. package/dist/review/assets/{stateDiagram-v2-6OUMAXLB-BEfolAkc.js → stateDiagram-v2-6OUMAXLB-CB--qhqy.js} +1 -1
  46. package/dist/review/assets/{swimlanes-5IMT3BWC-Bnu9mzxz.js → swimlanes-5IMT3BWC-DWuBlI_u.js} +1 -1
  47. package/dist/review/assets/{swimlanesDiagram-G3AALYLV-DlNNBK53.js → swimlanesDiagram-G3AALYLV-dXt3qLQg.js} +1 -1
  48. package/dist/review/assets/{timeline-definition-FHXFAJF6-CwlO71Lp.js → timeline-definition-FHXFAJF6-Da2ReugN.js} +1 -1
  49. package/dist/review/assets/{vennDiagram-L72KCM5P-DZxbcc_O.js → vennDiagram-L72KCM5P-CnhNeNSC.js} +1 -1
  50. package/dist/review/assets/{wardleyDiagram-EHGQE667-DGQto3hn.js → wardleyDiagram-EHGQE667-CixYg3yw.js} +1 -1
  51. package/dist/review/assets/{xychartDiagram-FW5EYKEG-BfD1lSXX.js → xychartDiagram-FW5EYKEG-BwY7805o.js} +1 -1
  52. package/dist/review/index.html +2 -2
  53. package/package.json +2 -2
  54. package/dist/review/assets/index-Bt3i8n39.css +0 -1
  55. package/dist/review/assets/index-CqjR4YYp.js +0 -64
package/README.md CHANGED
@@ -3,9 +3,9 @@
3
3
  **Semantic stacked diffs that know when their architectural assumptions expire.**
4
4
 
5
5
  GraphReFly Stack is an OpenAI Build Week developer tool built with Codex, GPT-5.6, Git, and
6
- GraphReFly. It adds a semantic validity layer above Git: every work-unit commit is bound to a
7
- GraphBlueprint witness, an allowed source scope, dependency claims, required checks, and a
8
- deterministic `GateResult`.
6
+ GraphReFly. Its generic local review binds every stacked commit to the GraphBlueprint generated at
7
+ that Git object and its exact parent diff. Repositories that adopt semantic change records can also
8
+ bind allowed source scopes, dependency claims, required checks, and a deterministic `GateResult`.
9
9
 
10
10
  Git can report a clean rebase while an agent-generated change is no longer valid under the
11
11
  architecture it was planned against. GraphReFly Stack makes that mismatch visible, keeps unaffected
@@ -15,8 +15,8 @@ decides validity.
15
15
  ## Install and review a GraphReFly repository
16
16
 
17
17
  Requirements: macOS or Linux, Node.js 24, pnpm 11.7, and Git. The CLI and local web review shell use
18
- no hosted service, database, or credentials. Once the package is published, install it in the
19
- GraphReFly repository you want to review:
18
+ no hosted service, database, or credentials. Install it in the GraphReFly repository you want to
19
+ review:
20
20
 
21
21
  ```bash
22
22
  pnpm add -D @graphrefly/stack
@@ -34,8 +34,17 @@ automatically. Open the printed URL (normally <http://127.0.0.1:4173>), then:
34
34
  runtime.
35
35
  3. Verify that commit OID, Blueprint hash, upstream Mermaid diagram, delta events, and split code diff
36
36
  move together.
37
- 4. Expand repository evidence or commit lineage only when needed. No session, delivery, fixture, or
38
- fake semantic-gate state appears in the generic review.
37
+ 4. Use **Review changes** to record Approve or Request changes for the exact commit and Blueprint.
38
+ 5. Open **Help** for the Git → Blueprint delta → code diff relationship, and expand **Technical
39
+ details** only when troubleshooting runtime or immutable identities.
40
+
41
+ Local review decisions and their summaries are strict immutable records under the repository's Git
42
+ common directory at `.git/grfs/reviews`; they never appear in `git status`, change source files, or
43
+ update Git refs. The Technical details disclosure offers an explicit portable review export after a
44
+ decision exists. That content-hashed bundle is the explicit sharing boundary for another reviewer or
45
+ CI. A future hosted GraphReFly Stack can wrap selected exported artifacts in its policy-redacted
46
+ upload envelope; this release neither treats the local export as upload-ready nor uploads review
47
+ state automatically.
39
48
 
40
49
  `--graph-module` means the repository's root Graph construction module, not the only Graph module
41
50
  allowed in the repository. That root module may import, compose, and mount any number of Graphs and
@@ -83,8 +92,10 @@ pnpm exec grfs review --repo . --base "$BASE" --head HEAD --json
83
92
  ```
84
93
 
85
94
  The generic payload is commit-centric. When a repository has not adopted semantic change records,
86
- the UI says `Semantic gate not configured`; it never turns missing semantic evidence into a passing
87
- `GateResult`.
95
+ the payload records that internal absence but the primary UI does not advertise an unavailable
96
+ gate, and it never turns missing semantic evidence into a passing `GateResult`. A local human
97
+ decision remains separate from any future semantic gate and does not approve or merge a GitHub pull
98
+ request.
88
99
 
89
100
  Before registry publication, the same install path is exercised from the packed tarball rather than
90
101
  from workspace imports:
@@ -197,8 +208,10 @@ and canonical milestones in `docs/evidence/milestones.jsonl` distinguish that wo
197
208
  - The portable bundle is not self-listed in its manifest because that would create a circular hash.
198
209
  - Raw provider responses, generated repositories, and sensitive submission drafts stay under
199
210
  ignored `.private/` paths.
200
- - The review server only binds to `127.0.0.1`, sends a restrictive CSP, accepts only GET/HEAD, and
201
- exposes no write endpoint.
211
+ - The review server only binds to `127.0.0.1` and sends a restrictive CSP. Its sole write surface is
212
+ a size-bounded, same-origin `application/json` endpoint that appends validated review decisions
213
+ below `.git/grfs`; source files, Git objects and refs, repository config, and `GateResult` remain
214
+ read-only.
202
215
  - Generic Blueprint entrypoints run with an empty environment, a five-second timeout, a one-MiB
203
216
  stdout bound, read-only filesystem allowlists, and no network or child-process permission.
204
217
  - Generic payloads omit Blueprint provenance and reject absolute paths in topology metadata before
@@ -0,0 +1,253 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "urn:graphrefly-stack:schema:ci-artifacts:v1",
4
+ "title": "GraphReFly Stack CI artifacts v1",
5
+ "definitions": {
6
+ "Hash": {
7
+ "type": "object",
8
+ "additionalProperties": false,
9
+ "required": ["algorithm", "value"],
10
+ "properties": {
11
+ "algorithm": { "const": "sha256" },
12
+ "value": { "type": "string", "pattern": "^[0-9a-f]{64}$" }
13
+ }
14
+ },
15
+ "GitOid": {
16
+ "type": "object",
17
+ "additionalProperties": false,
18
+ "required": ["algorithm", "value"],
19
+ "properties": {
20
+ "algorithm": { "enum": ["sha1", "sha256"] },
21
+ "value": { "type": "string", "pattern": "^(?:[0-9a-f]{40}|[0-9a-f]{64})$" }
22
+ }
23
+ },
24
+ "DecimalId": {
25
+ "type": "string",
26
+ "pattern": "^[1-9][0-9]*$",
27
+ "maxLength": 32
28
+ },
29
+ "Identifier": {
30
+ "type": "string",
31
+ "minLength": 1,
32
+ "maxLength": 64,
33
+ "pattern": "^[A-Za-z][A-Za-z0-9._-]*$"
34
+ },
35
+ "RuntimeVersion": {
36
+ "type": "string",
37
+ "minLength": 1,
38
+ "maxLength": 64,
39
+ "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+(?:[-+][0-9A-Za-z.-]+)?$"
40
+ },
41
+ "GitHubEvent": {
42
+ "type": "object",
43
+ "additionalProperties": false,
44
+ "required": ["name", "pullRequestNumber", "base", "head"],
45
+ "properties": {
46
+ "name": { "const": "pull_request" },
47
+ "pullRequestNumber": { "type": "integer", "minimum": 1 },
48
+ "base": { "$ref": "#/definitions/GitOid" },
49
+ "head": { "$ref": "#/definitions/GitOid" }
50
+ }
51
+ },
52
+ "CacheInputs": {
53
+ "type": "object",
54
+ "additionalProperties": false,
55
+ "required": [
56
+ "operatingSystem",
57
+ "architecture",
58
+ "nodeVersion",
59
+ "pnpmVersion",
60
+ "lockfilePath",
61
+ "lockfileDigest",
62
+ "packageManifestDigest",
63
+ "stackVersion",
64
+ "graphreflyVersion",
65
+ "cacheKey"
66
+ ],
67
+ "properties": {
68
+ "operatingSystem": { "type": "string", "minLength": 1, "maxLength": 64 },
69
+ "architecture": { "type": "string", "minLength": 1, "maxLength": 32 },
70
+ "nodeVersion": { "$ref": "#/definitions/RuntimeVersion" },
71
+ "pnpmVersion": { "$ref": "#/definitions/RuntimeVersion" },
72
+ "lockfilePath": { "const": "pnpm-lock.yaml" },
73
+ "lockfileDigest": { "$ref": "#/definitions/Hash" },
74
+ "packageManifestDigest": { "$ref": "#/definitions/Hash" },
75
+ "stackVersion": { "$ref": "#/definitions/RuntimeVersion" },
76
+ "graphreflyVersion": { "$ref": "#/definitions/RuntimeVersion" },
77
+ "cacheKey": { "type": "string", "minLength": 1, "maxLength": 512 }
78
+ }
79
+ },
80
+ "CIInvocation": {
81
+ "type": "object",
82
+ "additionalProperties": false,
83
+ "required": [
84
+ "schema",
85
+ "adapter",
86
+ "repository",
87
+ "event",
88
+ "workflow",
89
+ "run",
90
+ "plan",
91
+ "cacheInputs",
92
+ "identity"
93
+ ],
94
+ "properties": {
95
+ "schema": { "const": "graphrefly.stack.ci-invocation.v1" },
96
+ "adapter": {
97
+ "type": "object",
98
+ "additionalProperties": false,
99
+ "required": ["provider", "version"],
100
+ "properties": {
101
+ "provider": { "const": "github-actions" },
102
+ "version": { "const": "v1" }
103
+ }
104
+ },
105
+ "repository": {
106
+ "type": "object",
107
+ "additionalProperties": false,
108
+ "required": ["id", "ownerId", "headRepositoryId"],
109
+ "properties": {
110
+ "id": { "$ref": "#/definitions/DecimalId" },
111
+ "ownerId": { "$ref": "#/definitions/DecimalId" },
112
+ "headRepositoryId": { "$ref": "#/definitions/DecimalId" }
113
+ }
114
+ },
115
+ "event": { "$ref": "#/definitions/GitHubEvent" },
116
+ "workflow": {
117
+ "type": "object",
118
+ "additionalProperties": false,
119
+ "required": ["ref", "sha"],
120
+ "properties": {
121
+ "ref": { "type": "string", "minLength": 1, "maxLength": 1024 },
122
+ "sha": { "$ref": "#/definitions/GitOid" }
123
+ }
124
+ },
125
+ "run": {
126
+ "type": "object",
127
+ "additionalProperties": false,
128
+ "required": ["id", "attempt", "actorId", "jobName"],
129
+ "properties": {
130
+ "id": { "$ref": "#/definitions/DecimalId" },
131
+ "attempt": { "type": "integer", "minimum": 1 },
132
+ "actorId": { "$ref": "#/definitions/DecimalId" },
133
+ "jobName": { "const": "GraphReFly Stack / Semantic Gate" }
134
+ }
135
+ },
136
+ "plan": {
137
+ "type": "object",
138
+ "additionalProperties": false,
139
+ "required": ["id", "policyDigest"],
140
+ "properties": {
141
+ "id": { "$ref": "#/definitions/Identifier" },
142
+ "policyDigest": { "$ref": "#/definitions/Hash" }
143
+ }
144
+ },
145
+ "cacheInputs": { "$ref": "#/definitions/CacheInputs" },
146
+ "identity": {
147
+ "type": "object",
148
+ "additionalProperties": false,
149
+ "required": ["assurance"],
150
+ "properties": { "assurance": { "const": "platform-asserted" } }
151
+ }
152
+ }
153
+ },
154
+ "CIResult": {
155
+ "type": "object",
156
+ "additionalProperties": false,
157
+ "required": [
158
+ "schema",
159
+ "invocationDigest",
160
+ "outcome",
161
+ "gateInputDigest",
162
+ "gateResult",
163
+ "portableBundleDigest",
164
+ "provenance",
165
+ "redaction",
166
+ "summary",
167
+ "artifactName"
168
+ ],
169
+ "properties": {
170
+ "schema": { "const": "graphrefly.stack.ci-result.v1" },
171
+ "invocationDigest": { "$ref": "#/definitions/Hash" },
172
+ "outcome": { "enum": ["pass", "blocked", "error"] },
173
+ "gateInputDigest": { "$ref": "#/definitions/Hash" },
174
+ "gateResult": {
175
+ "$ref": "urn:graphrefly-stack:schema:semantic-artifacts:v1#/definitions/GateResult"
176
+ },
177
+ "portableBundleDigest": { "$ref": "#/definitions/Hash" },
178
+ "provenance": {
179
+ "type": "object",
180
+ "additionalProperties": false,
181
+ "required": ["provider", "repositoryId", "workflowSha", "runId", "attempt"],
182
+ "properties": {
183
+ "provider": { "const": "github-actions" },
184
+ "repositoryId": { "$ref": "#/definitions/DecimalId" },
185
+ "workflowSha": { "$ref": "#/definitions/GitOid" },
186
+ "runId": { "$ref": "#/definitions/DecimalId" },
187
+ "attempt": { "type": "integer", "minimum": 1 }
188
+ }
189
+ },
190
+ "redaction": {
191
+ "type": "object",
192
+ "additionalProperties": false,
193
+ "required": ["excludes"],
194
+ "properties": {
195
+ "excludes": {
196
+ "type": "array",
197
+ "items": {
198
+ "enum": [
199
+ "source-content",
200
+ "raw-blueprint",
201
+ "check-output",
202
+ "credentials",
203
+ "environment",
204
+ "model-response"
205
+ ]
206
+ },
207
+ "minItems": 6,
208
+ "maxItems": 6,
209
+ "uniqueItems": true
210
+ }
211
+ }
212
+ },
213
+ "summary": {
214
+ "type": "object",
215
+ "additionalProperties": false,
216
+ "required": ["verdict", "affectedWorkUnitIds", "reasonCodes"],
217
+ "properties": {
218
+ "verdict": { "enum": ["pass", "blocked", "error"] },
219
+ "affectedWorkUnitIds": {
220
+ "type": "array",
221
+ "items": { "type": "string", "minLength": 1, "maxLength": 64 },
222
+ "uniqueItems": true
223
+ },
224
+ "reasonCodes": {
225
+ "type": "array",
226
+ "items": {
227
+ "$ref": "urn:graphrefly-stack:schema:semantic-artifacts:v1#/definitions/ReasonCode"
228
+ },
229
+ "uniqueItems": true
230
+ }
231
+ }
232
+ },
233
+ "artifactName": {
234
+ "type": "string",
235
+ "pattern": "^graphrefly-stack-ci-[0-9a-f]{64}$"
236
+ }
237
+ }
238
+ },
239
+ "CIBundle": {
240
+ "type": "object",
241
+ "additionalProperties": false,
242
+ "required": ["schema", "invocation", "result", "portableBundle"],
243
+ "properties": {
244
+ "schema": { "const": "graphrefly.stack.ci-bundle.v1" },
245
+ "invocation": { "$ref": "#/definitions/CIInvocation" },
246
+ "result": { "$ref": "#/definitions/CIResult" },
247
+ "portableBundle": {
248
+ "$ref": "urn:graphrefly-stack:schema:semantic-artifacts:v1#/definitions/SemanticPortableBundle"
249
+ }
250
+ }
251
+ }
252
+ }
253
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "urn:graphrefly-stack:schema:ci-golden-suite:v1",
4
+ "title": "GraphReFly Stack CI golden suite v1",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["schema", "invocation", "result"],
8
+ "properties": {
9
+ "schema": { "const": "graphrefly.stack.ci-golden-suite.v1" },
10
+ "invocation": {
11
+ "$ref": "urn:graphrefly-stack:schema:ci-artifacts:v1#/definitions/CIInvocation"
12
+ },
13
+ "result": {
14
+ "$ref": "urn:graphrefly-stack:schema:ci-artifacts:v1#/definitions/CIResult"
15
+ }
16
+ }
17
+ }
@@ -0,0 +1,49 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "urn:graphrefly-stack:schema:repository-review-bundle:v1",
4
+ "title": "GraphReFly Stack portable repository review bundle v1",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["schema", "repository", "artifacts"],
8
+ "properties": {
9
+ "schema": { "const": "graphrefly.stack.repository-review-bundle.v1" },
10
+ "repository": {
11
+ "type": "object",
12
+ "additionalProperties": false,
13
+ "required": ["label", "baseOid", "headOid"],
14
+ "properties": {
15
+ "label": { "type": "string", "minLength": 1 },
16
+ "baseOid": {
17
+ "$ref": "urn:graphrefly-stack:schema:repository-review:v1#/definitions/GitOid"
18
+ },
19
+ "headOid": {
20
+ "$ref": "urn:graphrefly-stack:schema:repository-review:v1#/definitions/GitOid"
21
+ }
22
+ }
23
+ },
24
+ "artifacts": {
25
+ "type": "array",
26
+ "items": {
27
+ "type": "object",
28
+ "additionalProperties": false,
29
+ "required": ["path", "hash", "record"],
30
+ "properties": {
31
+ "path": {
32
+ "type": "string",
33
+ "pattern": "^reviews/[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}\\.json$"
34
+ },
35
+ "hash": {
36
+ "type": "object",
37
+ "additionalProperties": false,
38
+ "required": ["algorithm", "value"],
39
+ "properties": {
40
+ "algorithm": { "const": "sha256" },
41
+ "value": { "type": "string", "pattern": "^[0-9a-f]{64}$" }
42
+ }
43
+ },
44
+ "record": { "$ref": "urn:graphrefly-stack:schema:repository-review-decision:v1" }
45
+ }
46
+ }
47
+ }
48
+ }
49
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "urn:graphrefly-stack:schema:repository-review-decision-request:v1",
4
+ "title": "GraphReFly Stack local repository review decision request v1",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["schema", "commitOid", "decision", "reviewerLabel", "summary"],
8
+ "properties": {
9
+ "schema": { "const": "graphrefly.stack.repository-review-decision-request.v1" },
10
+ "commitOid": { "$ref": "urn:graphrefly-stack:schema:repository-review:v1#/definitions/GitOid" },
11
+ "decision": { "enum": ["approve", "request-changes"] },
12
+ "reviewerLabel": { "type": "string", "minLength": 1, "maxLength": 120 },
13
+ "summary": { "type": "string", "maxLength": 10000 }
14
+ }
15
+ }
@@ -0,0 +1,52 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "urn:graphrefly-stack:schema:repository-review-decision:v1",
4
+ "title": "GraphReFly Stack local repository review decision v1",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": [
8
+ "schema",
9
+ "id",
10
+ "target",
11
+ "decision",
12
+ "reviewerLabel",
13
+ "summary",
14
+ "recordedAt",
15
+ "identityVerified"
16
+ ],
17
+ "properties": {
18
+ "schema": { "const": "graphrefly.stack.repository-review-decision.v1" },
19
+ "id": {
20
+ "type": "string",
21
+ "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"
22
+ },
23
+ "target": {
24
+ "type": "object",
25
+ "additionalProperties": false,
26
+ "required": ["baseOid", "headOid", "parentOid", "commitOid", "blueprintHash"],
27
+ "properties": {
28
+ "baseOid": {
29
+ "$ref": "urn:graphrefly-stack:schema:repository-review:v1#/definitions/GitOid"
30
+ },
31
+ "headOid": {
32
+ "$ref": "urn:graphrefly-stack:schema:repository-review:v1#/definitions/GitOid"
33
+ },
34
+ "parentOid": {
35
+ "$ref": "urn:graphrefly-stack:schema:repository-review:v1#/definitions/GitOid"
36
+ },
37
+ "commitOid": {
38
+ "$ref": "urn:graphrefly-stack:schema:repository-review:v1#/definitions/GitOid"
39
+ },
40
+ "blueprintHash": { "type": "string", "pattern": "^[0-9a-f]{64}$" }
41
+ }
42
+ },
43
+ "decision": { "enum": ["approve", "request-changes"] },
44
+ "reviewerLabel": { "type": "string", "minLength": 1, "maxLength": 120 },
45
+ "summary": { "type": "string", "maxLength": 10000 },
46
+ "recordedAt": {
47
+ "type": "string",
48
+ "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}\\.[0-9]{3}Z$"
49
+ },
50
+ "identityVerified": { "const": false }
51
+ }
52
+ }
@@ -11,9 +11,10 @@
11
11
  "repository": {
12
12
  "type": "object",
13
13
  "additionalProperties": false,
14
- "required": ["label", "graphreflyVersion", "entrypoint", "baseOid", "headOid"],
14
+ "required": ["label", "headLabel", "graphreflyVersion", "entrypoint", "baseOid", "headOid"],
15
15
  "properties": {
16
16
  "label": { "type": "string", "minLength": 1 },
17
+ "headLabel": { "type": "string", "minLength": 1 },
17
18
  "graphreflyVersion": { "type": "string", "pattern": "^0\\.3\\.[0-9]+$" },
18
19
  "entrypoint": {
19
20
  "$ref": "urn:graphrefly-stack:schema:repository-config:v1#/properties/blueprint/properties/entrypoint"
@@ -28,8 +29,51 @@
28
29
  "minItems": 1,
29
30
  "items": { "$ref": "#/definitions/ReviewCommit" }
30
31
  },
31
- "semanticStatus": { "const": "not-configured" }
32
+ "semanticStatus": { "enum": ["not-configured", "evaluated"] },
33
+ "semantic": {
34
+ "type": "object",
35
+ "additionalProperties": false,
36
+ "required": ["plan", "bindings", "records", "checks", "gateResult", "invalidWorkUnitIds"],
37
+ "properties": {
38
+ "plan": {
39
+ "$ref": "urn:graphrefly-stack:schema:semantic-artifacts:v1#/definitions/AcceptedChangePlan"
40
+ },
41
+ "bindings": {
42
+ "type": "array",
43
+ "items": {
44
+ "$ref": "urn:graphrefly-stack:schema:semantic-artifacts:v1#/definitions/CommitWorkUnitBinding"
45
+ }
46
+ },
47
+ "records": {
48
+ "type": "array",
49
+ "items": {
50
+ "$ref": "urn:graphrefly-stack:schema:semantic-artifacts:v1#/definitions/SemanticChangeRecord"
51
+ }
52
+ },
53
+ "checks": {
54
+ "type": "array",
55
+ "items": {
56
+ "$ref": "urn:graphrefly-stack:schema:semantic-artifacts:v1#/definitions/CheckResult"
57
+ }
58
+ },
59
+ "gateResult": {
60
+ "$ref": "urn:graphrefly-stack:schema:semantic-artifacts:v1#/definitions/GateResult"
61
+ },
62
+ "invalidWorkUnitIds": {
63
+ "type": "array",
64
+ "items": { "type": "string" },
65
+ "uniqueItems": true
66
+ }
67
+ }
68
+ }
32
69
  },
70
+ "allOf": [
71
+ {
72
+ "if": { "properties": { "semanticStatus": { "const": "evaluated" } } },
73
+ "then": { "properties": { "semantic": {} }, "required": ["semantic"] },
74
+ "else": { "not": { "required": ["semantic"] } }
75
+ }
76
+ ],
33
77
  "definitions": {
34
78
  "GitOid": { "type": "string", "pattern": "^(?:[0-9a-f]{40}|[0-9a-f]{64})$" },
35
79
  "Hash": {