@junghanacs/entwurf 0.34.2 → 0.35.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/CHANGELOG.md +115 -0
- package/README.md +7 -0
- package/VERIFY.md +11 -1
- package/demo/README.md +109 -175
- package/demo/demo-baseline.sh +5 -1
- package/demo/demo.sh +6 -2
- package/demo/herdr-pi-cc-20261011.provenance.json +64 -0
- package/docs/assets/entwurf-demo.gif +0 -0
- package/package.json +4 -2
- package/run.sh +37 -0
- package/scripts/check-gate-qualification.ts +2 -1
- package/scripts/check-release-gate-outcomes.ts +159 -1
- package/scripts/ci-qualify-decide.sh +114 -17
- package/scripts/mutants/demo-reproducibility.json +155 -0
- package/scripts/mutants/release-gate.json +28 -2
- package/scripts/tsconfig.json +1 -0
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"lane": "demo-reproducibility",
|
|
4
|
+
"mutants": [
|
|
5
|
+
{
|
|
6
|
+
"claim": "DEMO-BASELINE-ARCHIVED",
|
|
7
|
+
"title": "the archived baseline resumes launching the retired scene and can overwrite the approved GIF",
|
|
8
|
+
"subject": "demo/demo-baseline.sh",
|
|
9
|
+
"find": ["exit 2"],
|
|
10
|
+
"replace": [":"],
|
|
11
|
+
"gate": ["bash", "run.sh", "check-demo-reproducibility"],
|
|
12
|
+
"timeoutSeconds": 120,
|
|
13
|
+
"signature": "[QK:DEMO-BASELINE-ARCHIVED]",
|
|
14
|
+
"signatureSource": "demo/maintenance-guards.test.ts"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"claim": "DEMO-PEER-ARCHIVED",
|
|
18
|
+
"title": "the archived peer scene becomes a second runnable v1 route again",
|
|
19
|
+
"subject": "demo/demo.sh",
|
|
20
|
+
"find": ["exit 2"],
|
|
21
|
+
"replace": [":"],
|
|
22
|
+
"gate": ["bash", "run.sh", "check-demo-reproducibility"],
|
|
23
|
+
"timeoutSeconds": 120,
|
|
24
|
+
"signature": "[QK:DEMO-PEER-ARCHIVED]",
|
|
25
|
+
"signatureSource": "demo/maintenance-guards.test.ts"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"claim": "DEMO-LIVE-OPT-IN",
|
|
29
|
+
"title": "the Herdr scene reaches preflight without the explicit LIVE grant",
|
|
30
|
+
"subject": "demo/take-herdr-pi-cc.ts",
|
|
31
|
+
"find": ["if (process.env.LIVE !== \"1\")"],
|
|
32
|
+
"replace": ["if (false)"],
|
|
33
|
+
"gate": ["bash", "run.sh", "check-demo-reproducibility"],
|
|
34
|
+
"timeoutSeconds": 120,
|
|
35
|
+
"signature": "[QK:DEMO-LIVE-OPT-IN]",
|
|
36
|
+
"signatureSource": "demo/maintenance-guards.test.ts"
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"claim": "DEMO-PUBLISHED-PROVENANCE",
|
|
40
|
+
"title": "the tracked provenance names another GIF digest while the approved pixels stay unchanged",
|
|
41
|
+
"subject": "demo/herdr-pi-cc-20261011.provenance.json",
|
|
42
|
+
"find": ["\t\t\"sha256\": \"b686739b5c68fa458dd47c844711aea0f6ab5819eb3eb5d2850449922fa084c0\","],
|
|
43
|
+
"replace": ["\t\t\"sha256\": \"0000000000000000000000000000000000000000000000000000000000000000\","],
|
|
44
|
+
"gate": ["bash", "run.sh", "check-demo-reproducibility"],
|
|
45
|
+
"timeoutSeconds": 120,
|
|
46
|
+
"signature": "[QK:DEMO-PUBLISHED-PROVENANCE]",
|
|
47
|
+
"signatureSource": "demo/maintenance-guards.test.ts"
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"claim": "DEMO-PACK-SOURCE-ONLY",
|
|
51
|
+
"title": "a directory allowlist ships maintainer TypeScript as if it were an installed entrypoint",
|
|
52
|
+
"subject": "package.json",
|
|
53
|
+
"find": [
|
|
54
|
+
"\t\t\"demo/README.md\",",
|
|
55
|
+
"\t\t\"demo/herdr-pi-cc-20261011.provenance.json\",",
|
|
56
|
+
"\t\t\"!demo/**/*.ts\","
|
|
57
|
+
],
|
|
58
|
+
"replace": ["\t\t\"demo/\","],
|
|
59
|
+
"gate": ["bash", "run.sh", "check-demo-reproducibility"],
|
|
60
|
+
"timeoutSeconds": 120,
|
|
61
|
+
"signature": "[QK:DEMO-PACK-SOURCE-ONLY]",
|
|
62
|
+
"signatureSource": "demo/maintenance-guards.test.ts"
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"claim": "DEMO-PUBLICATION-DESTINATION",
|
|
66
|
+
"title": "a live-pass renderer can overwrite publication assets through a direct or aliased destination",
|
|
67
|
+
"subject": "demo/render-take.ts",
|
|
68
|
+
"find": ["\tif (isPublicationOutput(out))"],
|
|
69
|
+
"replace": ["\tif (false)"],
|
|
70
|
+
"gate": ["bash", "run.sh", "check-demo-reproducibility"],
|
|
71
|
+
"timeoutSeconds": 120,
|
|
72
|
+
"signature": "[QK:DEMO-PUBLICATION-DESTINATION]",
|
|
73
|
+
"signatureSource": "demo/maintenance-guards.test.ts"
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
"claim": "DEMO-TMUX-SUBJECT-TAIL",
|
|
77
|
+
"title": "the tmux tail trimmer drops real subject text merged with the terminal teardown",
|
|
78
|
+
"subject": "demo/render-take.ts",
|
|
79
|
+
"find": ["\t\tisOnlyCsi(teardown[2])"],
|
|
80
|
+
"replace": ["\t\ttrue"],
|
|
81
|
+
"gate": ["bash", "run.sh", "check-demo-reproducibility"],
|
|
82
|
+
"timeoutSeconds": 120,
|
|
83
|
+
"signature": "[QK:DEMO-TMUX-SUBJECT-TAIL]",
|
|
84
|
+
"signatureSource": "demo/render-take.test.ts"
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"claim": "DEMO-RECORDING-REQUIRED",
|
|
88
|
+
"title": "no recorder means no assertion, so an empty capture again certifies live-pass",
|
|
89
|
+
"subject": "demo/lib/take-recorder.ts",
|
|
90
|
+
"find": [
|
|
91
|
+
"\t\tthis.step(",
|
|
92
|
+
"\t\t\t\"the recording ran until the take ended and the recorder stopped cleanly (no cut, no signal, exit 0)\","
|
|
93
|
+
],
|
|
94
|
+
"replace": [
|
|
95
|
+
"\t\tif (recorder) this.step(",
|
|
96
|
+
"\t\t\t\"the recording ran until the take ended and the recorder stopped cleanly (no cut, no signal, exit 0)\","
|
|
97
|
+
],
|
|
98
|
+
"gate": ["bash", "run.sh", "check-demo-reproducibility"],
|
|
99
|
+
"timeoutSeconds": 120,
|
|
100
|
+
"signature": "[QK:DEMO-RECORDING-REQUIRED]",
|
|
101
|
+
"signatureSource": "demo/lib/take-recorder.test.ts"
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
"claim": "DEMO-TEST-DISCOVERY",
|
|
105
|
+
"title": "a dead discovery glob produces no tests but the demo floor is still invoked",
|
|
106
|
+
"subject": "run.sh",
|
|
107
|
+
"find": [
|
|
108
|
+
" while IFS= read -r f; do [ -n \"$f\" ] && tests+=(\"$f\"); done < <(cd \"$REPO_DIR\" && find demo -type f -name '*.test.ts' -print | LC_ALL=C sort)"
|
|
109
|
+
],
|
|
110
|
+
"replace": [
|
|
111
|
+
" while IFS= read -r f; do [ -n \"$f\" ] && tests+=(\"$f\"); done < <(cd \"$REPO_DIR\" && find demo -type f -name '*.test.NO-MATCH' -print | LC_ALL=C sort)"
|
|
112
|
+
],
|
|
113
|
+
"gate": ["bash", "run.sh", "check-demo-reproducibility"],
|
|
114
|
+
"timeoutSeconds": 120,
|
|
115
|
+
"signature": "[QK:DEMO-TEST-DISCOVERY]",
|
|
116
|
+
"signatureSource": "run.sh"
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
"claim": "DEMO-NO-EARLY-RESOURCES",
|
|
120
|
+
"title": "a Take allocated before missing-LIVE refusal writes resources without calling any fake tool",
|
|
121
|
+
"subject": "demo/take-pi-cc.ts",
|
|
122
|
+
"find": ["if (process.env.LIVE !== \"1\") {"],
|
|
123
|
+
"replace": [
|
|
124
|
+
"if (process.env.LIVE !== \"1\") {",
|
|
125
|
+
"\tnew Take({ label: LABEL, repo: REPO, cols: 132, rows: 38 });"
|
|
126
|
+
],
|
|
127
|
+
"gate": ["bash", "run.sh", "check-demo-reproducibility"],
|
|
128
|
+
"timeoutSeconds": 120,
|
|
129
|
+
"signature": "[QK:DEMO-NO-EARLY-RESOURCES]",
|
|
130
|
+
"signatureSource": "demo/maintenance-guards.test.ts"
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
"claim": "DEMO-ORIGINAL-RENDER-INPUT",
|
|
134
|
+
"title": "rerendering replaces the original approved GIF's exact agg input inside the take directory",
|
|
135
|
+
"subject": "demo/render-take.ts",
|
|
136
|
+
"find": ["\tconst renderCast = path.join(path.dirname(out), `.${path.basename(out)}.${tag}.render.cast`);"],
|
|
137
|
+
"replace": ["\tconst renderCast = path.join(takeDir, \"take.render.cast\");"],
|
|
138
|
+
"gate": ["bash", "run.sh", "check-demo-reproducibility"],
|
|
139
|
+
"timeoutSeconds": 120,
|
|
140
|
+
"signature": "[QK:DEMO-ORIGINAL-RENDER-INPUT]",
|
|
141
|
+
"signatureSource": "demo/render-take.test.ts"
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
"claim": "DEMO-RAIL-POLICY",
|
|
145
|
+
"title": "the pi-durable scene stops refusing an OpenRouter base-URL redirect, so LIVE=1 could spend a sibling turn through OpenRouter",
|
|
146
|
+
"subject": "demo/take-pi-durable.ts",
|
|
147
|
+
"find": ["const routedVia = openRouterOverride(process.env);"],
|
|
148
|
+
"replace": ["const routedVia = null;"],
|
|
149
|
+
"gate": ["bash", "run.sh", "check-demo-reproducibility"],
|
|
150
|
+
"timeoutSeconds": 120,
|
|
151
|
+
"signature": "[QK:DEMO-RAIL-POLICY]",
|
|
152
|
+
"signatureSource": "demo/maintenance-guards.test.ts"
|
|
153
|
+
}
|
|
154
|
+
]
|
|
155
|
+
}
|
|
@@ -151,8 +151,12 @@
|
|
|
151
151
|
"claim": "QUALIFY-FILTER-READS-PUSH-RANGE",
|
|
152
152
|
"title": "the filter reads the tip commit instead of the two-dot push range - the exact misreading that once concluded four of the five historical qualification reds would have been skipped",
|
|
153
153
|
"subject": "scripts/ci-qualify-decide.sh",
|
|
154
|
-
"find": [
|
|
155
|
-
|
|
154
|
+
"find": [
|
|
155
|
+
"CHANGED=\"$(git -C \"$REPO_DIR\" diff --no-renames --no-ext-diff --no-textconv --name-only \"$BEFORE\"..\"$HEAD_SHA\" 2>/dev/null)\""
|
|
156
|
+
],
|
|
157
|
+
"replace": [
|
|
158
|
+
"CHANGED=\"$(git -C \"$REPO_DIR\" diff --no-renames --no-ext-diff --no-textconv --name-only \"$HEAD_SHA~1\"..\"$HEAD_SHA\" 2>/dev/null)\""
|
|
159
|
+
],
|
|
156
160
|
"gate": ["bash", "run.sh", "check-release-gate-outcomes"],
|
|
157
161
|
"timeoutSeconds": 180,
|
|
158
162
|
"signature": "[QK:QUALIFY-FILTER-READS-PUSH-RANGE]",
|
|
@@ -169,6 +173,28 @@
|
|
|
169
173
|
"signature": "[QK:QUALIFY-FILTER-REPLAYS-PAST-CATCHES]",
|
|
170
174
|
"signatureSource": "scripts/check-release-gate-outcomes.ts"
|
|
171
175
|
},
|
|
176
|
+
{
|
|
177
|
+
"claim": "QUALIFY-FILTER-SUBJECT-HUNKS",
|
|
178
|
+
"title": "data-subject hunk refinement collapses back to file identity, so a version-only pin repeats the unchanged mutant body",
|
|
179
|
+
"subject": "scripts/ci-qualify-decide.sh",
|
|
180
|
+
"find": ["\t\t\t\tif subject_find_untouched \"$file\"; then"],
|
|
181
|
+
"replace": ["\t\t\t\tif false; then"],
|
|
182
|
+
"gate": ["bash", "run.sh", "check-release-gate-outcomes"],
|
|
183
|
+
"timeoutSeconds": 180,
|
|
184
|
+
"signature": "[QK:QUALIFY-FILTER-SUBJECT-HUNKS]",
|
|
185
|
+
"signatureSource": "scripts/check-release-gate-outcomes.ts"
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
"claim": "QUALIFY-FILTER-TOML-ONLY-REFINEMENT",
|
|
189
|
+
"title": "Markdown/JSON data re-enter hunk refinement, so an out-of-find presence restatement or later duplicate JSON key skips a body whose mutant now survives",
|
|
190
|
+
"subject": "scripts/ci-qualify-decide.sh",
|
|
191
|
+
"find": ["\t\t\t\t\t*.toml) ;;"],
|
|
192
|
+
"replace": ["\t\t\t\t\t*.toml|*.json|*.md) ;;"],
|
|
193
|
+
"gate": ["bash", "run.sh", "check-release-gate-outcomes"],
|
|
194
|
+
"timeoutSeconds": 180,
|
|
195
|
+
"signature": "[QK:QUALIFY-FILTER-TOML-ONLY-REFINEMENT]",
|
|
196
|
+
"signatureSource": "scripts/check-release-gate-outcomes.ts"
|
|
197
|
+
},
|
|
172
198
|
{
|
|
173
199
|
"claim": "MUX-LIFECYCLE-IS-RELEASE-MUST",
|
|
174
200
|
"title": "the integrated mux lifecycle stays listed but bypasses run_live_step, so a missing prerequisite returns SKIP into a branch that never classifies it and the cut reads green",
|
package/scripts/tsconfig.json
CHANGED
|
@@ -27,6 +27,7 @@
|
|
|
27
27
|
"include": [
|
|
28
28
|
"./**/*.ts",
|
|
29
29
|
"../test/**/*.ts",
|
|
30
|
+
"../demo/**/*.ts",
|
|
30
31
|
"../pi-extensions/lib/**/*.ts",
|
|
31
32
|
// The behavior-adjacent tests the root config just excluded (#119 V2). Listed at
|
|
32
33
|
// pi-extensions/** rather than pi-extensions/lib/** so a test beside an extension
|