@golden-frijoles/kit 0.9.0 → 0.10.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/dist/intent-match.mjs +664 -0
- package/dist/jev-eval.fixtures.json +1390 -0
- package/dist/jev-eval.mjs +38 -6
- package/dist/lib/jev.mjs +7 -2
- package/package.json +1 -1
|
@@ -7867,5 +7867,1395 @@
|
|
|
7867
7867
|
"decider": "jev"
|
|
7868
7868
|
}
|
|
7869
7869
|
}
|
|
7870
|
+
],
|
|
7871
|
+
"intent": [
|
|
7872
|
+
{
|
|
7873
|
+
"id": "perf-probe-coverage_in-c1",
|
|
7874
|
+
"question": "coverage_in",
|
|
7875
|
+
"item": "c1",
|
|
7876
|
+
"label": true,
|
|
7877
|
+
"source": "golden-frijoles seed perf-probe-target-allowlist (trimmed; acceptance list added for the fixture)",
|
|
7878
|
+
"pitch": "# Seed — bound where a smoke probe may point\n\n## Problem\n\n`perf-probe.mjs` takes `baseUrl` from config, checks only for an `http(s)` prefix, and then follows `/_next/static/…`\nasset URLs the returned HTML names. A PR that edits the config could point a runner at an internal address\n(`169.254.169.254`).\n\n## Rough shape\n\nRefuse link-local, loopback and private ranges unless the project opts in, and fetch assets only from the\n`baseUrl`'s own origin. Tests for each refusal.\n\n## Acceptance criteria\n- `node scripts/perf-probe.mjs` with `baseUrl: http://169.254.169.254` exits non-zero and names the refused range.\n- An asset URL on another origin is not fetched, and the report lists it as skipped.\n- The probe is robust.\n- The probe's report gains a p95 latency chart per route.",
|
|
7879
|
+
"claims": {
|
|
7880
|
+
"c1": "A smoke probe refuses to point at internal addresses such as the cloud metadata IP.",
|
|
7881
|
+
"c2": "Assets are only fetched from the probed site itself.",
|
|
7882
|
+
"c3": "Every refusal is posted to the security channel in Slack.",
|
|
7883
|
+
"c4": "A project can still probe localhost when it deliberately chooses to."
|
|
7884
|
+
},
|
|
7885
|
+
"criteria": {
|
|
7886
|
+
"a1": "`node scripts/perf-probe.mjs` with `baseUrl: http://169.254.169.254` exits non-zero and names the refused range.",
|
|
7887
|
+
"a2": "An asset URL on another origin is not fetched, and the report lists it as skipped.",
|
|
7888
|
+
"a3": "The probe is robust.",
|
|
7889
|
+
"a4": "The probe's report gains a p95 latency chart per route."
|
|
7890
|
+
},
|
|
7891
|
+
"recorded": {
|
|
7892
|
+
"model": "jev-1.13.0",
|
|
7893
|
+
"answers": {
|
|
7894
|
+
"in_c1": {
|
|
7895
|
+
"type": "noul",
|
|
7896
|
+
"noul": 0.97
|
|
7897
|
+
}
|
|
7898
|
+
}
|
|
7899
|
+
},
|
|
7900
|
+
"decision": {
|
|
7901
|
+
"value": true,
|
|
7902
|
+
"p": 0.97,
|
|
7903
|
+
"decider": "jev"
|
|
7904
|
+
}
|
|
7905
|
+
},
|
|
7906
|
+
{
|
|
7907
|
+
"id": "perf-probe-coverage_in-c2",
|
|
7908
|
+
"question": "coverage_in",
|
|
7909
|
+
"item": "c2",
|
|
7910
|
+
"label": true,
|
|
7911
|
+
"source": "golden-frijoles seed perf-probe-target-allowlist (trimmed; acceptance list added for the fixture)",
|
|
7912
|
+
"pitch": "# Seed — bound where a smoke probe may point\n\n## Problem\n\n`perf-probe.mjs` takes `baseUrl` from config, checks only for an `http(s)` prefix, and then follows `/_next/static/…`\nasset URLs the returned HTML names. A PR that edits the config could point a runner at an internal address\n(`169.254.169.254`).\n\n## Rough shape\n\nRefuse link-local, loopback and private ranges unless the project opts in, and fetch assets only from the\n`baseUrl`'s own origin. Tests for each refusal.\n\n## Acceptance criteria\n- `node scripts/perf-probe.mjs` with `baseUrl: http://169.254.169.254` exits non-zero and names the refused range.\n- An asset URL on another origin is not fetched, and the report lists it as skipped.\n- The probe is robust.\n- The probe's report gains a p95 latency chart per route.",
|
|
7913
|
+
"claims": {
|
|
7914
|
+
"c1": "A smoke probe refuses to point at internal addresses such as the cloud metadata IP.",
|
|
7915
|
+
"c2": "Assets are only fetched from the probed site itself.",
|
|
7916
|
+
"c3": "Every refusal is posted to the security channel in Slack.",
|
|
7917
|
+
"c4": "A project can still probe localhost when it deliberately chooses to."
|
|
7918
|
+
},
|
|
7919
|
+
"criteria": {
|
|
7920
|
+
"a1": "`node scripts/perf-probe.mjs` with `baseUrl: http://169.254.169.254` exits non-zero and names the refused range.",
|
|
7921
|
+
"a2": "An asset URL on another origin is not fetched, and the report lists it as skipped.",
|
|
7922
|
+
"a3": "The probe is robust.",
|
|
7923
|
+
"a4": "The probe's report gains a p95 latency chart per route."
|
|
7924
|
+
},
|
|
7925
|
+
"recorded": {
|
|
7926
|
+
"model": "jev-1.13.0",
|
|
7927
|
+
"answers": {
|
|
7928
|
+
"in_c2": {
|
|
7929
|
+
"type": "noul",
|
|
7930
|
+
"noul": 0.96
|
|
7931
|
+
}
|
|
7932
|
+
}
|
|
7933
|
+
},
|
|
7934
|
+
"decision": {
|
|
7935
|
+
"value": true,
|
|
7936
|
+
"p": 0.96,
|
|
7937
|
+
"decider": "jev"
|
|
7938
|
+
}
|
|
7939
|
+
},
|
|
7940
|
+
{
|
|
7941
|
+
"id": "perf-probe-coverage_in-c3",
|
|
7942
|
+
"question": "coverage_in",
|
|
7943
|
+
"item": "c3",
|
|
7944
|
+
"label": false,
|
|
7945
|
+
"source": "golden-frijoles seed perf-probe-target-allowlist (trimmed; acceptance list added for the fixture)",
|
|
7946
|
+
"pitch": "# Seed — bound where a smoke probe may point\n\n## Problem\n\n`perf-probe.mjs` takes `baseUrl` from config, checks only for an `http(s)` prefix, and then follows `/_next/static/…`\nasset URLs the returned HTML names. A PR that edits the config could point a runner at an internal address\n(`169.254.169.254`).\n\n## Rough shape\n\nRefuse link-local, loopback and private ranges unless the project opts in, and fetch assets only from the\n`baseUrl`'s own origin. Tests for each refusal.\n\n## Acceptance criteria\n- `node scripts/perf-probe.mjs` with `baseUrl: http://169.254.169.254` exits non-zero and names the refused range.\n- An asset URL on another origin is not fetched, and the report lists it as skipped.\n- The probe is robust.\n- The probe's report gains a p95 latency chart per route.",
|
|
7947
|
+
"claims": {
|
|
7948
|
+
"c1": "A smoke probe refuses to point at internal addresses such as the cloud metadata IP.",
|
|
7949
|
+
"c2": "Assets are only fetched from the probed site itself.",
|
|
7950
|
+
"c3": "Every refusal is posted to the security channel in Slack.",
|
|
7951
|
+
"c4": "A project can still probe localhost when it deliberately chooses to."
|
|
7952
|
+
},
|
|
7953
|
+
"criteria": {
|
|
7954
|
+
"a1": "`node scripts/perf-probe.mjs` with `baseUrl: http://169.254.169.254` exits non-zero and names the refused range.",
|
|
7955
|
+
"a2": "An asset URL on another origin is not fetched, and the report lists it as skipped.",
|
|
7956
|
+
"a3": "The probe is robust.",
|
|
7957
|
+
"a4": "The probe's report gains a p95 latency chart per route."
|
|
7958
|
+
},
|
|
7959
|
+
"recorded": {
|
|
7960
|
+
"model": "jev-1.13.0",
|
|
7961
|
+
"answers": {
|
|
7962
|
+
"in_c3": {
|
|
7963
|
+
"type": "noul",
|
|
7964
|
+
"noul": 0.05
|
|
7965
|
+
}
|
|
7966
|
+
}
|
|
7967
|
+
},
|
|
7968
|
+
"decision": {
|
|
7969
|
+
"value": false,
|
|
7970
|
+
"p": 0.05,
|
|
7971
|
+
"decider": "jev"
|
|
7972
|
+
}
|
|
7973
|
+
},
|
|
7974
|
+
{
|
|
7975
|
+
"id": "perf-probe-coverage_in-c4",
|
|
7976
|
+
"question": "coverage_in",
|
|
7977
|
+
"item": "c4",
|
|
7978
|
+
"label": true,
|
|
7979
|
+
"source": "golden-frijoles seed perf-probe-target-allowlist (trimmed; acceptance list added for the fixture)",
|
|
7980
|
+
"pitch": "# Seed — bound where a smoke probe may point\n\n## Problem\n\n`perf-probe.mjs` takes `baseUrl` from config, checks only for an `http(s)` prefix, and then follows `/_next/static/…`\nasset URLs the returned HTML names. A PR that edits the config could point a runner at an internal address\n(`169.254.169.254`).\n\n## Rough shape\n\nRefuse link-local, loopback and private ranges unless the project opts in, and fetch assets only from the\n`baseUrl`'s own origin. Tests for each refusal.\n\n## Acceptance criteria\n- `node scripts/perf-probe.mjs` with `baseUrl: http://169.254.169.254` exits non-zero and names the refused range.\n- An asset URL on another origin is not fetched, and the report lists it as skipped.\n- The probe is robust.\n- The probe's report gains a p95 latency chart per route.",
|
|
7981
|
+
"claims": {
|
|
7982
|
+
"c1": "A smoke probe refuses to point at internal addresses such as the cloud metadata IP.",
|
|
7983
|
+
"c2": "Assets are only fetched from the probed site itself.",
|
|
7984
|
+
"c3": "Every refusal is posted to the security channel in Slack.",
|
|
7985
|
+
"c4": "A project can still probe localhost when it deliberately chooses to."
|
|
7986
|
+
},
|
|
7987
|
+
"criteria": {
|
|
7988
|
+
"a1": "`node scripts/perf-probe.mjs` with `baseUrl: http://169.254.169.254` exits non-zero and names the refused range.",
|
|
7989
|
+
"a2": "An asset URL on another origin is not fetched, and the report lists it as skipped.",
|
|
7990
|
+
"a3": "The probe is robust.",
|
|
7991
|
+
"a4": "The probe's report gains a p95 latency chart per route."
|
|
7992
|
+
},
|
|
7993
|
+
"recorded": {
|
|
7994
|
+
"model": "jev-1.13.0",
|
|
7995
|
+
"answers": {
|
|
7996
|
+
"in_c4": {
|
|
7997
|
+
"type": "noul",
|
|
7998
|
+
"noul": 0.71
|
|
7999
|
+
}
|
|
8000
|
+
}
|
|
8001
|
+
},
|
|
8002
|
+
"decision": {
|
|
8003
|
+
"value": true,
|
|
8004
|
+
"p": 0.71,
|
|
8005
|
+
"decider": "jev"
|
|
8006
|
+
}
|
|
8007
|
+
},
|
|
8008
|
+
{
|
|
8009
|
+
"id": "perf-probe-clarity-a1",
|
|
8010
|
+
"question": "clarity",
|
|
8011
|
+
"item": "a1",
|
|
8012
|
+
"label": true,
|
|
8013
|
+
"source": "golden-frijoles seed perf-probe-target-allowlist (trimmed; acceptance list added for the fixture)",
|
|
8014
|
+
"pitch": "# Seed — bound where a smoke probe may point\n\n## Problem\n\n`perf-probe.mjs` takes `baseUrl` from config, checks only for an `http(s)` prefix, and then follows `/_next/static/…`\nasset URLs the returned HTML names. A PR that edits the config could point a runner at an internal address\n(`169.254.169.254`).\n\n## Rough shape\n\nRefuse link-local, loopback and private ranges unless the project opts in, and fetch assets only from the\n`baseUrl`'s own origin. Tests for each refusal.\n\n## Acceptance criteria\n- `node scripts/perf-probe.mjs` with `baseUrl: http://169.254.169.254` exits non-zero and names the refused range.\n- An asset URL on another origin is not fetched, and the report lists it as skipped.\n- The probe is robust.\n- The probe's report gains a p95 latency chart per route.",
|
|
8015
|
+
"claims": {
|
|
8016
|
+
"c1": "A smoke probe refuses to point at internal addresses such as the cloud metadata IP.",
|
|
8017
|
+
"c2": "Assets are only fetched from the probed site itself.",
|
|
8018
|
+
"c3": "Every refusal is posted to the security channel in Slack.",
|
|
8019
|
+
"c4": "A project can still probe localhost when it deliberately chooses to."
|
|
8020
|
+
},
|
|
8021
|
+
"criteria": {
|
|
8022
|
+
"a1": "`node scripts/perf-probe.mjs` with `baseUrl: http://169.254.169.254` exits non-zero and names the refused range.",
|
|
8023
|
+
"a2": "An asset URL on another origin is not fetched, and the report lists it as skipped.",
|
|
8024
|
+
"a3": "The probe is robust.",
|
|
8025
|
+
"a4": "The probe's report gains a p95 latency chart per route."
|
|
8026
|
+
},
|
|
8027
|
+
"recorded": {
|
|
8028
|
+
"model": "jev-1.13.0",
|
|
8029
|
+
"answers": {
|
|
8030
|
+
"clar_a1": {
|
|
8031
|
+
"type": "score",
|
|
8032
|
+
"score": 2.38,
|
|
8033
|
+
"confidence": 0.61,
|
|
8034
|
+
"legend": {
|
|
8035
|
+
"0": "No: it states an aim or a quality (\"works well\", \"is clear\", \"feels fast\") with nothing anyone could observe.",
|
|
8036
|
+
"1": "Barely: it names what to look at, but not what counts as passing, so two testers would likely disagree.",
|
|
8037
|
+
"2": "Mostly: it names an action and an outcome but leaves one thing to judgement, such as a threshold, a wording or which case to try.",
|
|
8038
|
+
"3": "Yes: it names the action, where to do it and the exact result to observe, so two testers would agree."
|
|
8039
|
+
},
|
|
8040
|
+
"probabilities": {
|
|
8041
|
+
"0": 0,
|
|
8042
|
+
"1": 0,
|
|
8043
|
+
"2": 0.62,
|
|
8044
|
+
"3": 0.38
|
|
8045
|
+
}
|
|
8046
|
+
}
|
|
8047
|
+
}
|
|
8048
|
+
},
|
|
8049
|
+
"decision": {
|
|
8050
|
+
"value": true,
|
|
8051
|
+
"p": 0.793,
|
|
8052
|
+
"decider": "jev"
|
|
8053
|
+
}
|
|
8054
|
+
},
|
|
8055
|
+
{
|
|
8056
|
+
"id": "perf-probe-clarity-a3",
|
|
8057
|
+
"question": "clarity",
|
|
8058
|
+
"item": "a3",
|
|
8059
|
+
"label": false,
|
|
8060
|
+
"source": "golden-frijoles seed perf-probe-target-allowlist (trimmed; acceptance list added for the fixture)",
|
|
8061
|
+
"pitch": "# Seed — bound where a smoke probe may point\n\n## Problem\n\n`perf-probe.mjs` takes `baseUrl` from config, checks only for an `http(s)` prefix, and then follows `/_next/static/…`\nasset URLs the returned HTML names. A PR that edits the config could point a runner at an internal address\n(`169.254.169.254`).\n\n## Rough shape\n\nRefuse link-local, loopback and private ranges unless the project opts in, and fetch assets only from the\n`baseUrl`'s own origin. Tests for each refusal.\n\n## Acceptance criteria\n- `node scripts/perf-probe.mjs` with `baseUrl: http://169.254.169.254` exits non-zero and names the refused range.\n- An asset URL on another origin is not fetched, and the report lists it as skipped.\n- The probe is robust.\n- The probe's report gains a p95 latency chart per route.",
|
|
8062
|
+
"claims": {
|
|
8063
|
+
"c1": "A smoke probe refuses to point at internal addresses such as the cloud metadata IP.",
|
|
8064
|
+
"c2": "Assets are only fetched from the probed site itself.",
|
|
8065
|
+
"c3": "Every refusal is posted to the security channel in Slack.",
|
|
8066
|
+
"c4": "A project can still probe localhost when it deliberately chooses to."
|
|
8067
|
+
},
|
|
8068
|
+
"criteria": {
|
|
8069
|
+
"a1": "`node scripts/perf-probe.mjs` with `baseUrl: http://169.254.169.254` exits non-zero and names the refused range.",
|
|
8070
|
+
"a2": "An asset URL on another origin is not fetched, and the report lists it as skipped.",
|
|
8071
|
+
"a3": "The probe is robust.",
|
|
8072
|
+
"a4": "The probe's report gains a p95 latency chart per route."
|
|
8073
|
+
},
|
|
8074
|
+
"recorded": {
|
|
8075
|
+
"model": "jev-1.13.0",
|
|
8076
|
+
"answers": {
|
|
8077
|
+
"clar_a3": {
|
|
8078
|
+
"type": "score",
|
|
8079
|
+
"score": 0.1,
|
|
8080
|
+
"confidence": 0.9,
|
|
8081
|
+
"legend": {
|
|
8082
|
+
"0": "No: it states an aim or a quality (\"works well\", \"is clear\", \"feels fast\") with nothing anyone could observe.",
|
|
8083
|
+
"1": "Barely: it names what to look at, but not what counts as passing, so two testers would likely disagree.",
|
|
8084
|
+
"2": "Mostly: it names an action and an outcome but leaves one thing to judgement, such as a threshold, a wording or which case to try.",
|
|
8085
|
+
"3": "Yes: it names the action, where to do it and the exact result to observe, so two testers would agree."
|
|
8086
|
+
},
|
|
8087
|
+
"probabilities": {
|
|
8088
|
+
"0": 0.91,
|
|
8089
|
+
"1": 0.09,
|
|
8090
|
+
"2": 0,
|
|
8091
|
+
"3": 0
|
|
8092
|
+
}
|
|
8093
|
+
}
|
|
8094
|
+
}
|
|
8095
|
+
},
|
|
8096
|
+
"decision": {
|
|
8097
|
+
"value": false,
|
|
8098
|
+
"p": 0.033,
|
|
8099
|
+
"decider": "jev"
|
|
8100
|
+
}
|
|
8101
|
+
},
|
|
8102
|
+
{
|
|
8103
|
+
"id": "perf-probe-coverage_out-a1",
|
|
8104
|
+
"question": "coverage_out",
|
|
8105
|
+
"item": "a1",
|
|
8106
|
+
"label": true,
|
|
8107
|
+
"source": "golden-frijoles seed perf-probe-target-allowlist (trimmed; acceptance list added for the fixture)",
|
|
8108
|
+
"pitch": "# Seed — bound where a smoke probe may point\n\n## Problem\n\n`perf-probe.mjs` takes `baseUrl` from config, checks only for an `http(s)` prefix, and then follows `/_next/static/…`\nasset URLs the returned HTML names. A PR that edits the config could point a runner at an internal address\n(`169.254.169.254`).\n\n## Rough shape\n\nRefuse link-local, loopback and private ranges unless the project opts in, and fetch assets only from the\n`baseUrl`'s own origin. Tests for each refusal.\n\n## Acceptance criteria\n- `node scripts/perf-probe.mjs` with `baseUrl: http://169.254.169.254` exits non-zero and names the refused range.\n- An asset URL on another origin is not fetched, and the report lists it as skipped.\n- The probe is robust.\n- The probe's report gains a p95 latency chart per route.",
|
|
8109
|
+
"claims": {
|
|
8110
|
+
"c1": "A smoke probe refuses to point at internal addresses such as the cloud metadata IP.",
|
|
8111
|
+
"c2": "Assets are only fetched from the probed site itself.",
|
|
8112
|
+
"c3": "Every refusal is posted to the security channel in Slack.",
|
|
8113
|
+
"c4": "A project can still probe localhost when it deliberately chooses to."
|
|
8114
|
+
},
|
|
8115
|
+
"criteria": {
|
|
8116
|
+
"a1": "`node scripts/perf-probe.mjs` with `baseUrl: http://169.254.169.254` exits non-zero and names the refused range.",
|
|
8117
|
+
"a2": "An asset URL on another origin is not fetched, and the report lists it as skipped.",
|
|
8118
|
+
"a3": "The probe is robust.",
|
|
8119
|
+
"a4": "The probe's report gains a p95 latency chart per route."
|
|
8120
|
+
},
|
|
8121
|
+
"recorded": {
|
|
8122
|
+
"model": "jev-1.13.0",
|
|
8123
|
+
"answers": {
|
|
8124
|
+
"out_a1": {
|
|
8125
|
+
"type": "noul",
|
|
8126
|
+
"noul": 0.93
|
|
8127
|
+
}
|
|
8128
|
+
}
|
|
8129
|
+
},
|
|
8130
|
+
"decision": {
|
|
8131
|
+
"value": true,
|
|
8132
|
+
"p": 0.93,
|
|
8133
|
+
"decider": "jev"
|
|
8134
|
+
}
|
|
8135
|
+
},
|
|
8136
|
+
{
|
|
8137
|
+
"id": "perf-probe-coverage_out-a4",
|
|
8138
|
+
"question": "coverage_out",
|
|
8139
|
+
"item": "a4",
|
|
8140
|
+
"label": false,
|
|
8141
|
+
"source": "golden-frijoles seed perf-probe-target-allowlist (trimmed; acceptance list added for the fixture)",
|
|
8142
|
+
"pitch": "# Seed — bound where a smoke probe may point\n\n## Problem\n\n`perf-probe.mjs` takes `baseUrl` from config, checks only for an `http(s)` prefix, and then follows `/_next/static/…`\nasset URLs the returned HTML names. A PR that edits the config could point a runner at an internal address\n(`169.254.169.254`).\n\n## Rough shape\n\nRefuse link-local, loopback and private ranges unless the project opts in, and fetch assets only from the\n`baseUrl`'s own origin. Tests for each refusal.\n\n## Acceptance criteria\n- `node scripts/perf-probe.mjs` with `baseUrl: http://169.254.169.254` exits non-zero and names the refused range.\n- An asset URL on another origin is not fetched, and the report lists it as skipped.\n- The probe is robust.\n- The probe's report gains a p95 latency chart per route.",
|
|
8143
|
+
"claims": {
|
|
8144
|
+
"c1": "A smoke probe refuses to point at internal addresses such as the cloud metadata IP.",
|
|
8145
|
+
"c2": "Assets are only fetched from the probed site itself.",
|
|
8146
|
+
"c3": "Every refusal is posted to the security channel in Slack.",
|
|
8147
|
+
"c4": "A project can still probe localhost when it deliberately chooses to."
|
|
8148
|
+
},
|
|
8149
|
+
"criteria": {
|
|
8150
|
+
"a1": "`node scripts/perf-probe.mjs` with `baseUrl: http://169.254.169.254` exits non-zero and names the refused range.",
|
|
8151
|
+
"a2": "An asset URL on another origin is not fetched, and the report lists it as skipped.",
|
|
8152
|
+
"a3": "The probe is robust.",
|
|
8153
|
+
"a4": "The probe's report gains a p95 latency chart per route."
|
|
8154
|
+
},
|
|
8155
|
+
"recorded": {
|
|
8156
|
+
"model": "jev-1.13.0",
|
|
8157
|
+
"answers": {
|
|
8158
|
+
"out_a4": {
|
|
8159
|
+
"type": "noul",
|
|
8160
|
+
"noul": 0.19
|
|
8161
|
+
}
|
|
8162
|
+
}
|
|
8163
|
+
},
|
|
8164
|
+
"decision": {
|
|
8165
|
+
"value": false,
|
|
8166
|
+
"p": 0.19,
|
|
8167
|
+
"decider": "jev"
|
|
8168
|
+
}
|
|
8169
|
+
},
|
|
8170
|
+
{
|
|
8171
|
+
"id": "board-links-coverage_in-c1",
|
|
8172
|
+
"question": "coverage_in",
|
|
8173
|
+
"item": "c1",
|
|
8174
|
+
"label": true,
|
|
8175
|
+
"source": "golden-frijoles seed board-link-depth (trimmed; acceptance list added for the fixture)",
|
|
8176
|
+
"pitch": "# Seed: the board's epic links resolve one folder too high\n\n## Problem\n\n`scripts/build-order.mjs` renders each epic link as `../../${doc_link without \"Roadmap/\"}`. `BUILD-ORDER.md` lives at\n`Roadmap/00-ideas/`, so `../../` resolves to the repo root, and every epic link on the board 404s on GitHub (37\nlinks). Seed links (`seeds/<slug>.md`) are fine.\n\n## Sketch\n\n- Change the one expression to `../${…}` and regenerate. Add a test that resolves every rendered link against the\n filesystem, so the link depth can't regress.\n- The same generator ships in the kit and in the template. Fix it at the source (the template), then sync the copies.\n\n## Acceptance criteria\n- Every link in the regenerated `BUILD-ORDER.md` resolves to a file that exists; the new test walks them all and fails on the first that does not.\n- The board looks right.\n- After the fix, the template's `build-order.mjs` and this repo's copy are byte-identical (`cmp` exits 0).",
|
|
8177
|
+
"claims": {
|
|
8178
|
+
"c1": "Every epic link on the board opens that epic's page on GitHub.",
|
|
8179
|
+
"c2": "A test stops the link depth from breaking again.",
|
|
8180
|
+
"c3": "The board also shows each epic's last-merged date."
|
|
8181
|
+
},
|
|
8182
|
+
"criteria": {
|
|
8183
|
+
"a1": "Every link in the regenerated `BUILD-ORDER.md` resolves to a file that exists; the new test walks them all and fails on the first that does not.",
|
|
8184
|
+
"a2": "The board looks right.",
|
|
8185
|
+
"a3": "After the fix, the template's `build-order.mjs` and this repo's copy are byte-identical (`cmp` exits 0)."
|
|
8186
|
+
},
|
|
8187
|
+
"recorded": {
|
|
8188
|
+
"model": "jev-1.13.0",
|
|
8189
|
+
"answers": {
|
|
8190
|
+
"in_c1": {
|
|
8191
|
+
"type": "noul",
|
|
8192
|
+
"noul": 0.85
|
|
8193
|
+
}
|
|
8194
|
+
}
|
|
8195
|
+
},
|
|
8196
|
+
"decision": {
|
|
8197
|
+
"value": true,
|
|
8198
|
+
"p": 0.85,
|
|
8199
|
+
"decider": "jev"
|
|
8200
|
+
}
|
|
8201
|
+
},
|
|
8202
|
+
{
|
|
8203
|
+
"id": "board-links-coverage_in-c2",
|
|
8204
|
+
"question": "coverage_in",
|
|
8205
|
+
"item": "c2",
|
|
8206
|
+
"label": true,
|
|
8207
|
+
"source": "golden-frijoles seed board-link-depth (trimmed; acceptance list added for the fixture)",
|
|
8208
|
+
"pitch": "# Seed: the board's epic links resolve one folder too high\n\n## Problem\n\n`scripts/build-order.mjs` renders each epic link as `../../${doc_link without \"Roadmap/\"}`. `BUILD-ORDER.md` lives at\n`Roadmap/00-ideas/`, so `../../` resolves to the repo root, and every epic link on the board 404s on GitHub (37\nlinks). Seed links (`seeds/<slug>.md`) are fine.\n\n## Sketch\n\n- Change the one expression to `../${…}` and regenerate. Add a test that resolves every rendered link against the\n filesystem, so the link depth can't regress.\n- The same generator ships in the kit and in the template. Fix it at the source (the template), then sync the copies.\n\n## Acceptance criteria\n- Every link in the regenerated `BUILD-ORDER.md` resolves to a file that exists; the new test walks them all and fails on the first that does not.\n- The board looks right.\n- After the fix, the template's `build-order.mjs` and this repo's copy are byte-identical (`cmp` exits 0).",
|
|
8209
|
+
"claims": {
|
|
8210
|
+
"c1": "Every epic link on the board opens that epic's page on GitHub.",
|
|
8211
|
+
"c2": "A test stops the link depth from breaking again.",
|
|
8212
|
+
"c3": "The board also shows each epic's last-merged date."
|
|
8213
|
+
},
|
|
8214
|
+
"criteria": {
|
|
8215
|
+
"a1": "Every link in the regenerated `BUILD-ORDER.md` resolves to a file that exists; the new test walks them all and fails on the first that does not.",
|
|
8216
|
+
"a2": "The board looks right.",
|
|
8217
|
+
"a3": "After the fix, the template's `build-order.mjs` and this repo's copy are byte-identical (`cmp` exits 0)."
|
|
8218
|
+
},
|
|
8219
|
+
"recorded": {
|
|
8220
|
+
"model": "jev-1.13.0",
|
|
8221
|
+
"answers": {
|
|
8222
|
+
"in_c2": {
|
|
8223
|
+
"type": "noul",
|
|
8224
|
+
"noul": 0.96
|
|
8225
|
+
}
|
|
8226
|
+
}
|
|
8227
|
+
},
|
|
8228
|
+
"decision": {
|
|
8229
|
+
"value": true,
|
|
8230
|
+
"p": 0.96,
|
|
8231
|
+
"decider": "jev"
|
|
8232
|
+
}
|
|
8233
|
+
},
|
|
8234
|
+
{
|
|
8235
|
+
"id": "board-links-coverage_in-c3",
|
|
8236
|
+
"question": "coverage_in",
|
|
8237
|
+
"item": "c3",
|
|
8238
|
+
"label": false,
|
|
8239
|
+
"source": "golden-frijoles seed board-link-depth (trimmed; acceptance list added for the fixture)",
|
|
8240
|
+
"pitch": "# Seed: the board's epic links resolve one folder too high\n\n## Problem\n\n`scripts/build-order.mjs` renders each epic link as `../../${doc_link without \"Roadmap/\"}`. `BUILD-ORDER.md` lives at\n`Roadmap/00-ideas/`, so `../../` resolves to the repo root, and every epic link on the board 404s on GitHub (37\nlinks). Seed links (`seeds/<slug>.md`) are fine.\n\n## Sketch\n\n- Change the one expression to `../${…}` and regenerate. Add a test that resolves every rendered link against the\n filesystem, so the link depth can't regress.\n- The same generator ships in the kit and in the template. Fix it at the source (the template), then sync the copies.\n\n## Acceptance criteria\n- Every link in the regenerated `BUILD-ORDER.md` resolves to a file that exists; the new test walks them all and fails on the first that does not.\n- The board looks right.\n- After the fix, the template's `build-order.mjs` and this repo's copy are byte-identical (`cmp` exits 0).",
|
|
8241
|
+
"claims": {
|
|
8242
|
+
"c1": "Every epic link on the board opens that epic's page on GitHub.",
|
|
8243
|
+
"c2": "A test stops the link depth from breaking again.",
|
|
8244
|
+
"c3": "The board also shows each epic's last-merged date."
|
|
8245
|
+
},
|
|
8246
|
+
"criteria": {
|
|
8247
|
+
"a1": "Every link in the regenerated `BUILD-ORDER.md` resolves to a file that exists; the new test walks them all and fails on the first that does not.",
|
|
8248
|
+
"a2": "The board looks right.",
|
|
8249
|
+
"a3": "After the fix, the template's `build-order.mjs` and this repo's copy are byte-identical (`cmp` exits 0)."
|
|
8250
|
+
},
|
|
8251
|
+
"recorded": {
|
|
8252
|
+
"model": "jev-1.13.0",
|
|
8253
|
+
"answers": {
|
|
8254
|
+
"in_c3": {
|
|
8255
|
+
"type": "noul",
|
|
8256
|
+
"noul": 0.07
|
|
8257
|
+
}
|
|
8258
|
+
}
|
|
8259
|
+
},
|
|
8260
|
+
"decision": {
|
|
8261
|
+
"value": false,
|
|
8262
|
+
"p": 0.07,
|
|
8263
|
+
"decider": "jev"
|
|
8264
|
+
}
|
|
8265
|
+
},
|
|
8266
|
+
{
|
|
8267
|
+
"id": "board-links-clarity-a1",
|
|
8268
|
+
"question": "clarity",
|
|
8269
|
+
"item": "a1",
|
|
8270
|
+
"label": true,
|
|
8271
|
+
"source": "golden-frijoles seed board-link-depth (trimmed; acceptance list added for the fixture)",
|
|
8272
|
+
"pitch": "# Seed: the board's epic links resolve one folder too high\n\n## Problem\n\n`scripts/build-order.mjs` renders each epic link as `../../${doc_link without \"Roadmap/\"}`. `BUILD-ORDER.md` lives at\n`Roadmap/00-ideas/`, so `../../` resolves to the repo root, and every epic link on the board 404s on GitHub (37\nlinks). Seed links (`seeds/<slug>.md`) are fine.\n\n## Sketch\n\n- Change the one expression to `../${…}` and regenerate. Add a test that resolves every rendered link against the\n filesystem, so the link depth can't regress.\n- The same generator ships in the kit and in the template. Fix it at the source (the template), then sync the copies.\n\n## Acceptance criteria\n- Every link in the regenerated `BUILD-ORDER.md` resolves to a file that exists; the new test walks them all and fails on the first that does not.\n- The board looks right.\n- After the fix, the template's `build-order.mjs` and this repo's copy are byte-identical (`cmp` exits 0).",
|
|
8273
|
+
"claims": {
|
|
8274
|
+
"c1": "Every epic link on the board opens that epic's page on GitHub.",
|
|
8275
|
+
"c2": "A test stops the link depth from breaking again.",
|
|
8276
|
+
"c3": "The board also shows each epic's last-merged date."
|
|
8277
|
+
},
|
|
8278
|
+
"criteria": {
|
|
8279
|
+
"a1": "Every link in the regenerated `BUILD-ORDER.md` resolves to a file that exists; the new test walks them all and fails on the first that does not.",
|
|
8280
|
+
"a2": "The board looks right.",
|
|
8281
|
+
"a3": "After the fix, the template's `build-order.mjs` and this repo's copy are byte-identical (`cmp` exits 0)."
|
|
8282
|
+
},
|
|
8283
|
+
"recorded": {
|
|
8284
|
+
"model": "jev-1.13.0",
|
|
8285
|
+
"answers": {
|
|
8286
|
+
"clar_a1": {
|
|
8287
|
+
"type": "score",
|
|
8288
|
+
"score": 2.93,
|
|
8289
|
+
"confidence": 0.93,
|
|
8290
|
+
"legend": {
|
|
8291
|
+
"0": "No: it states an aim or a quality (\"works well\", \"is clear\", \"feels fast\") with nothing anyone could observe.",
|
|
8292
|
+
"1": "Barely: it names what to look at, but not what counts as passing, so two testers would likely disagree.",
|
|
8293
|
+
"2": "Mostly: it names an action and an outcome but leaves one thing to judgement, such as a threshold, a wording or which case to try.",
|
|
8294
|
+
"3": "Yes: it names the action, where to do it and the exact result to observe, so two testers would agree."
|
|
8295
|
+
},
|
|
8296
|
+
"probabilities": {
|
|
8297
|
+
"0": 0,
|
|
8298
|
+
"1": 0,
|
|
8299
|
+
"2": 0.07,
|
|
8300
|
+
"3": 0.93
|
|
8301
|
+
}
|
|
8302
|
+
}
|
|
8303
|
+
}
|
|
8304
|
+
},
|
|
8305
|
+
"decision": {
|
|
8306
|
+
"value": true,
|
|
8307
|
+
"p": 0.977,
|
|
8308
|
+
"decider": "jev"
|
|
8309
|
+
}
|
|
8310
|
+
},
|
|
8311
|
+
{
|
|
8312
|
+
"id": "board-links-clarity-a2",
|
|
8313
|
+
"question": "clarity",
|
|
8314
|
+
"item": "a2",
|
|
8315
|
+
"label": false,
|
|
8316
|
+
"source": "golden-frijoles seed board-link-depth (trimmed; acceptance list added for the fixture)",
|
|
8317
|
+
"pitch": "# Seed: the board's epic links resolve one folder too high\n\n## Problem\n\n`scripts/build-order.mjs` renders each epic link as `../../${doc_link without \"Roadmap/\"}`. `BUILD-ORDER.md` lives at\n`Roadmap/00-ideas/`, so `../../` resolves to the repo root, and every epic link on the board 404s on GitHub (37\nlinks). Seed links (`seeds/<slug>.md`) are fine.\n\n## Sketch\n\n- Change the one expression to `../${…}` and regenerate. Add a test that resolves every rendered link against the\n filesystem, so the link depth can't regress.\n- The same generator ships in the kit and in the template. Fix it at the source (the template), then sync the copies.\n\n## Acceptance criteria\n- Every link in the regenerated `BUILD-ORDER.md` resolves to a file that exists; the new test walks them all and fails on the first that does not.\n- The board looks right.\n- After the fix, the template's `build-order.mjs` and this repo's copy are byte-identical (`cmp` exits 0).",
|
|
8318
|
+
"claims": {
|
|
8319
|
+
"c1": "Every epic link on the board opens that epic's page on GitHub.",
|
|
8320
|
+
"c2": "A test stops the link depth from breaking again.",
|
|
8321
|
+
"c3": "The board also shows each epic's last-merged date."
|
|
8322
|
+
},
|
|
8323
|
+
"criteria": {
|
|
8324
|
+
"a1": "Every link in the regenerated `BUILD-ORDER.md` resolves to a file that exists; the new test walks them all and fails on the first that does not.",
|
|
8325
|
+
"a2": "The board looks right.",
|
|
8326
|
+
"a3": "After the fix, the template's `build-order.mjs` and this repo's copy are byte-identical (`cmp` exits 0)."
|
|
8327
|
+
},
|
|
8328
|
+
"recorded": {
|
|
8329
|
+
"model": "jev-1.13.0",
|
|
8330
|
+
"answers": {
|
|
8331
|
+
"clar_a2": {
|
|
8332
|
+
"type": "score",
|
|
8333
|
+
"score": 0.8,
|
|
8334
|
+
"confidence": 0.66,
|
|
8335
|
+
"legend": {
|
|
8336
|
+
"0": "No: it states an aim or a quality (\"works well\", \"is clear\", \"feels fast\") with nothing anyone could observe.",
|
|
8337
|
+
"1": "Barely: it names what to look at, but not what counts as passing, so two testers would likely disagree.",
|
|
8338
|
+
"2": "Mostly: it names an action and an outcome but leaves one thing to judgement, such as a threshold, a wording or which case to try.",
|
|
8339
|
+
"3": "Yes: it names the action, where to do it and the exact result to observe, so two testers would agree."
|
|
8340
|
+
},
|
|
8341
|
+
"probabilities": {
|
|
8342
|
+
"0": 0.27,
|
|
8343
|
+
"1": 0.66,
|
|
8344
|
+
"2": 0.07,
|
|
8345
|
+
"3": 0
|
|
8346
|
+
}
|
|
8347
|
+
}
|
|
8348
|
+
}
|
|
8349
|
+
},
|
|
8350
|
+
"decision": {
|
|
8351
|
+
"value": false,
|
|
8352
|
+
"p": 0.267,
|
|
8353
|
+
"decider": "jev"
|
|
8354
|
+
}
|
|
8355
|
+
},
|
|
8356
|
+
{
|
|
8357
|
+
"id": "board-links-clarity-a3",
|
|
8358
|
+
"question": "clarity",
|
|
8359
|
+
"item": "a3",
|
|
8360
|
+
"label": true,
|
|
8361
|
+
"source": "golden-frijoles seed board-link-depth (trimmed; acceptance list added for the fixture)",
|
|
8362
|
+
"pitch": "# Seed: the board's epic links resolve one folder too high\n\n## Problem\n\n`scripts/build-order.mjs` renders each epic link as `../../${doc_link without \"Roadmap/\"}`. `BUILD-ORDER.md` lives at\n`Roadmap/00-ideas/`, so `../../` resolves to the repo root, and every epic link on the board 404s on GitHub (37\nlinks). Seed links (`seeds/<slug>.md`) are fine.\n\n## Sketch\n\n- Change the one expression to `../${…}` and regenerate. Add a test that resolves every rendered link against the\n filesystem, so the link depth can't regress.\n- The same generator ships in the kit and in the template. Fix it at the source (the template), then sync the copies.\n\n## Acceptance criteria\n- Every link in the regenerated `BUILD-ORDER.md` resolves to a file that exists; the new test walks them all and fails on the first that does not.\n- The board looks right.\n- After the fix, the template's `build-order.mjs` and this repo's copy are byte-identical (`cmp` exits 0).",
|
|
8363
|
+
"claims": {
|
|
8364
|
+
"c1": "Every epic link on the board opens that epic's page on GitHub.",
|
|
8365
|
+
"c2": "A test stops the link depth from breaking again.",
|
|
8366
|
+
"c3": "The board also shows each epic's last-merged date."
|
|
8367
|
+
},
|
|
8368
|
+
"criteria": {
|
|
8369
|
+
"a1": "Every link in the regenerated `BUILD-ORDER.md` resolves to a file that exists; the new test walks them all and fails on the first that does not.",
|
|
8370
|
+
"a2": "The board looks right.",
|
|
8371
|
+
"a3": "After the fix, the template's `build-order.mjs` and this repo's copy are byte-identical (`cmp` exits 0)."
|
|
8372
|
+
},
|
|
8373
|
+
"recorded": {
|
|
8374
|
+
"model": "jev-1.13.0",
|
|
8375
|
+
"answers": {
|
|
8376
|
+
"clar_a3": {
|
|
8377
|
+
"type": "score",
|
|
8378
|
+
"score": 2.98,
|
|
8379
|
+
"confidence": 0.98,
|
|
8380
|
+
"legend": {
|
|
8381
|
+
"0": "No: it states an aim or a quality (\"works well\", \"is clear\", \"feels fast\") with nothing anyone could observe.",
|
|
8382
|
+
"1": "Barely: it names what to look at, but not what counts as passing, so two testers would likely disagree.",
|
|
8383
|
+
"2": "Mostly: it names an action and an outcome but leaves one thing to judgement, such as a threshold, a wording or which case to try.",
|
|
8384
|
+
"3": "Yes: it names the action, where to do it and the exact result to observe, so two testers would agree."
|
|
8385
|
+
},
|
|
8386
|
+
"probabilities": {
|
|
8387
|
+
"0": 0,
|
|
8388
|
+
"1": 0,
|
|
8389
|
+
"2": 0.02,
|
|
8390
|
+
"3": 0.98
|
|
8391
|
+
}
|
|
8392
|
+
}
|
|
8393
|
+
}
|
|
8394
|
+
},
|
|
8395
|
+
"decision": {
|
|
8396
|
+
"value": true,
|
|
8397
|
+
"p": 0.993,
|
|
8398
|
+
"decider": "jev"
|
|
8399
|
+
}
|
|
8400
|
+
},
|
|
8401
|
+
{
|
|
8402
|
+
"id": "board-links-coverage_out-a1",
|
|
8403
|
+
"question": "coverage_out",
|
|
8404
|
+
"item": "a1",
|
|
8405
|
+
"label": true,
|
|
8406
|
+
"source": "golden-frijoles seed board-link-depth (trimmed; acceptance list added for the fixture)",
|
|
8407
|
+
"pitch": "# Seed: the board's epic links resolve one folder too high\n\n## Problem\n\n`scripts/build-order.mjs` renders each epic link as `../../${doc_link without \"Roadmap/\"}`. `BUILD-ORDER.md` lives at\n`Roadmap/00-ideas/`, so `../../` resolves to the repo root, and every epic link on the board 404s on GitHub (37\nlinks). Seed links (`seeds/<slug>.md`) are fine.\n\n## Sketch\n\n- Change the one expression to `../${…}` and regenerate. Add a test that resolves every rendered link against the\n filesystem, so the link depth can't regress.\n- The same generator ships in the kit and in the template. Fix it at the source (the template), then sync the copies.\n\n## Acceptance criteria\n- Every link in the regenerated `BUILD-ORDER.md` resolves to a file that exists; the new test walks them all and fails on the first that does not.\n- The board looks right.\n- After the fix, the template's `build-order.mjs` and this repo's copy are byte-identical (`cmp` exits 0).",
|
|
8408
|
+
"claims": {
|
|
8409
|
+
"c1": "Every epic link on the board opens that epic's page on GitHub.",
|
|
8410
|
+
"c2": "A test stops the link depth from breaking again.",
|
|
8411
|
+
"c3": "The board also shows each epic's last-merged date."
|
|
8412
|
+
},
|
|
8413
|
+
"criteria": {
|
|
8414
|
+
"a1": "Every link in the regenerated `BUILD-ORDER.md` resolves to a file that exists; the new test walks them all and fails on the first that does not.",
|
|
8415
|
+
"a2": "The board looks right.",
|
|
8416
|
+
"a3": "After the fix, the template's `build-order.mjs` and this repo's copy are byte-identical (`cmp` exits 0)."
|
|
8417
|
+
},
|
|
8418
|
+
"recorded": {
|
|
8419
|
+
"model": "jev-1.13.0",
|
|
8420
|
+
"answers": {
|
|
8421
|
+
"out_a1": {
|
|
8422
|
+
"type": "noul",
|
|
8423
|
+
"noul": 0.86
|
|
8424
|
+
}
|
|
8425
|
+
}
|
|
8426
|
+
},
|
|
8427
|
+
"decision": {
|
|
8428
|
+
"value": true,
|
|
8429
|
+
"p": 0.86,
|
|
8430
|
+
"decider": "jev"
|
|
8431
|
+
}
|
|
8432
|
+
},
|
|
8433
|
+
{
|
|
8434
|
+
"id": "cli-coverage_in-c1",
|
|
8435
|
+
"question": "coverage_in",
|
|
8436
|
+
"item": "c1",
|
|
8437
|
+
"label": true,
|
|
8438
|
+
"source": "golden-frijoles seed golden-frijoles-cli (trimmed: problem, shape, a subset of the acceptance list, one added)",
|
|
8439
|
+
"pitch": "# Seed: gf — a CLI so an agent can operate Golden Frijoles\n\n## Problem\n\nThe kill-switch story can't be completed by an agent. Every `risk: high` epic must ship behind a flag, and the story\nmandates \"create it in every env\" — but there is no command for that, so the step waits for a human to click in the\nconsole. The MCP connector is read-only and scoped to one project. Consumers hand-roll the gap: one project wrote a\n200-line admin-API wrapper because there was no CLI.\n\n## Shape\n\nA small Node CLI, `gf`, published to npm: `login`, `whoami`, `init`, `flags create|kill|get`, `doctor`, each with\n`--json`. The MCP connector stays read-only this epic; its gap is written down as a parity table, not built.\n\n## Acceptance criteria\n0. On a machine with only Node installed, one command installs `gf` and `gf --version` prints.\n1. `gf flags create <key> --kill-switch --all-envs` creates the flag enabled in every environment and the console shows it; a partial failure prints which environments succeeded and exits non-zero.\n2. `gf doctor` diagnoses each of: no credentials, expired credentials, wrong project, unreachable API, an out-of-date CLI.\n3. The CLI feels native to developers.\n4. `gf` ships a live terminal dashboard of flag evaluations.",
|
|
8440
|
+
"claims": {
|
|
8441
|
+
"c1": "An agent can create a kill-switch flag in every environment without a human clicking anything.",
|
|
8442
|
+
"c2": "The CLI runs on a machine that only has Node installed.",
|
|
8443
|
+
"c3": "The MCP connector gains write tools, so an agent can change flags through it.",
|
|
8444
|
+
"c4": "CLI usage is billed per seat."
|
|
8445
|
+
},
|
|
8446
|
+
"criteria": {
|
|
8447
|
+
"a1": "On a machine with only Node installed, one command installs `gf` and `gf --version` prints.",
|
|
8448
|
+
"a2": "`gf flags create <key> --kill-switch --all-envs` creates the flag enabled in every environment and the console shows it; a partial failure prints which environments succeeded and exits non-zero.",
|
|
8449
|
+
"a3": "`gf doctor` diagnoses each of: no credentials, expired credentials, wrong project, unreachable API, an out-of-date CLI.",
|
|
8450
|
+
"a4": "The CLI feels native to developers.",
|
|
8451
|
+
"a5": "`gf` ships a live terminal dashboard of flag evaluations."
|
|
8452
|
+
},
|
|
8453
|
+
"recorded": {
|
|
8454
|
+
"model": "jev-1.13.0",
|
|
8455
|
+
"answers": {
|
|
8456
|
+
"in_c1": {
|
|
8457
|
+
"type": "noul",
|
|
8458
|
+
"noul": 0.94
|
|
8459
|
+
}
|
|
8460
|
+
}
|
|
8461
|
+
},
|
|
8462
|
+
"decision": {
|
|
8463
|
+
"value": true,
|
|
8464
|
+
"p": 0.94,
|
|
8465
|
+
"decider": "jev"
|
|
8466
|
+
}
|
|
8467
|
+
},
|
|
8468
|
+
{
|
|
8469
|
+
"id": "cli-coverage_in-c2",
|
|
8470
|
+
"question": "coverage_in",
|
|
8471
|
+
"item": "c2",
|
|
8472
|
+
"label": true,
|
|
8473
|
+
"source": "golden-frijoles seed golden-frijoles-cli (trimmed: problem, shape, a subset of the acceptance list, one added)",
|
|
8474
|
+
"pitch": "# Seed: gf — a CLI so an agent can operate Golden Frijoles\n\n## Problem\n\nThe kill-switch story can't be completed by an agent. Every `risk: high` epic must ship behind a flag, and the story\nmandates \"create it in every env\" — but there is no command for that, so the step waits for a human to click in the\nconsole. The MCP connector is read-only and scoped to one project. Consumers hand-roll the gap: one project wrote a\n200-line admin-API wrapper because there was no CLI.\n\n## Shape\n\nA small Node CLI, `gf`, published to npm: `login`, `whoami`, `init`, `flags create|kill|get`, `doctor`, each with\n`--json`. The MCP connector stays read-only this epic; its gap is written down as a parity table, not built.\n\n## Acceptance criteria\n0. On a machine with only Node installed, one command installs `gf` and `gf --version` prints.\n1. `gf flags create <key> --kill-switch --all-envs` creates the flag enabled in every environment and the console shows it; a partial failure prints which environments succeeded and exits non-zero.\n2. `gf doctor` diagnoses each of: no credentials, expired credentials, wrong project, unreachable API, an out-of-date CLI.\n3. The CLI feels native to developers.\n4. `gf` ships a live terminal dashboard of flag evaluations.",
|
|
8475
|
+
"claims": {
|
|
8476
|
+
"c1": "An agent can create a kill-switch flag in every environment without a human clicking anything.",
|
|
8477
|
+
"c2": "The CLI runs on a machine that only has Node installed.",
|
|
8478
|
+
"c3": "The MCP connector gains write tools, so an agent can change flags through it.",
|
|
8479
|
+
"c4": "CLI usage is billed per seat."
|
|
8480
|
+
},
|
|
8481
|
+
"criteria": {
|
|
8482
|
+
"a1": "On a machine with only Node installed, one command installs `gf` and `gf --version` prints.",
|
|
8483
|
+
"a2": "`gf flags create <key> --kill-switch --all-envs` creates the flag enabled in every environment and the console shows it; a partial failure prints which environments succeeded and exits non-zero.",
|
|
8484
|
+
"a3": "`gf doctor` diagnoses each of: no credentials, expired credentials, wrong project, unreachable API, an out-of-date CLI.",
|
|
8485
|
+
"a4": "The CLI feels native to developers.",
|
|
8486
|
+
"a5": "`gf` ships a live terminal dashboard of flag evaluations."
|
|
8487
|
+
},
|
|
8488
|
+
"recorded": {
|
|
8489
|
+
"model": "jev-1.13.0",
|
|
8490
|
+
"answers": {
|
|
8491
|
+
"in_c2": {
|
|
8492
|
+
"type": "noul",
|
|
8493
|
+
"noul": 0.95
|
|
8494
|
+
}
|
|
8495
|
+
}
|
|
8496
|
+
},
|
|
8497
|
+
"decision": {
|
|
8498
|
+
"value": true,
|
|
8499
|
+
"p": 0.95,
|
|
8500
|
+
"decider": "jev"
|
|
8501
|
+
}
|
|
8502
|
+
},
|
|
8503
|
+
{
|
|
8504
|
+
"id": "cli-coverage_in-c3",
|
|
8505
|
+
"question": "coverage_in",
|
|
8506
|
+
"item": "c3",
|
|
8507
|
+
"label": false,
|
|
8508
|
+
"source": "golden-frijoles seed golden-frijoles-cli (trimmed: problem, shape, a subset of the acceptance list, one added)",
|
|
8509
|
+
"pitch": "# Seed: gf — a CLI so an agent can operate Golden Frijoles\n\n## Problem\n\nThe kill-switch story can't be completed by an agent. Every `risk: high` epic must ship behind a flag, and the story\nmandates \"create it in every env\" — but there is no command for that, so the step waits for a human to click in the\nconsole. The MCP connector is read-only and scoped to one project. Consumers hand-roll the gap: one project wrote a\n200-line admin-API wrapper because there was no CLI.\n\n## Shape\n\nA small Node CLI, `gf`, published to npm: `login`, `whoami`, `init`, `flags create|kill|get`, `doctor`, each with\n`--json`. The MCP connector stays read-only this epic; its gap is written down as a parity table, not built.\n\n## Acceptance criteria\n0. On a machine with only Node installed, one command installs `gf` and `gf --version` prints.\n1. `gf flags create <key> --kill-switch --all-envs` creates the flag enabled in every environment and the console shows it; a partial failure prints which environments succeeded and exits non-zero.\n2. `gf doctor` diagnoses each of: no credentials, expired credentials, wrong project, unreachable API, an out-of-date CLI.\n3. The CLI feels native to developers.\n4. `gf` ships a live terminal dashboard of flag evaluations.",
|
|
8510
|
+
"claims": {
|
|
8511
|
+
"c1": "An agent can create a kill-switch flag in every environment without a human clicking anything.",
|
|
8512
|
+
"c2": "The CLI runs on a machine that only has Node installed.",
|
|
8513
|
+
"c3": "The MCP connector gains write tools, so an agent can change flags through it.",
|
|
8514
|
+
"c4": "CLI usage is billed per seat."
|
|
8515
|
+
},
|
|
8516
|
+
"criteria": {
|
|
8517
|
+
"a1": "On a machine with only Node installed, one command installs `gf` and `gf --version` prints.",
|
|
8518
|
+
"a2": "`gf flags create <key> --kill-switch --all-envs` creates the flag enabled in every environment and the console shows it; a partial failure prints which environments succeeded and exits non-zero.",
|
|
8519
|
+
"a3": "`gf doctor` diagnoses each of: no credentials, expired credentials, wrong project, unreachable API, an out-of-date CLI.",
|
|
8520
|
+
"a4": "The CLI feels native to developers.",
|
|
8521
|
+
"a5": "`gf` ships a live terminal dashboard of flag evaluations."
|
|
8522
|
+
},
|
|
8523
|
+
"recorded": {
|
|
8524
|
+
"model": "jev-1.13.0",
|
|
8525
|
+
"answers": {
|
|
8526
|
+
"in_c3": {
|
|
8527
|
+
"type": "noul",
|
|
8528
|
+
"noul": 0.05
|
|
8529
|
+
}
|
|
8530
|
+
}
|
|
8531
|
+
},
|
|
8532
|
+
"decision": {
|
|
8533
|
+
"value": false,
|
|
8534
|
+
"p": 0.05,
|
|
8535
|
+
"decider": "jev"
|
|
8536
|
+
}
|
|
8537
|
+
},
|
|
8538
|
+
{
|
|
8539
|
+
"id": "cli-coverage_in-c4",
|
|
8540
|
+
"question": "coverage_in",
|
|
8541
|
+
"item": "c4",
|
|
8542
|
+
"label": false,
|
|
8543
|
+
"source": "golden-frijoles seed golden-frijoles-cli (trimmed: problem, shape, a subset of the acceptance list, one added)",
|
|
8544
|
+
"pitch": "# Seed: gf — a CLI so an agent can operate Golden Frijoles\n\n## Problem\n\nThe kill-switch story can't be completed by an agent. Every `risk: high` epic must ship behind a flag, and the story\nmandates \"create it in every env\" — but there is no command for that, so the step waits for a human to click in the\nconsole. The MCP connector is read-only and scoped to one project. Consumers hand-roll the gap: one project wrote a\n200-line admin-API wrapper because there was no CLI.\n\n## Shape\n\nA small Node CLI, `gf`, published to npm: `login`, `whoami`, `init`, `flags create|kill|get`, `doctor`, each with\n`--json`. The MCP connector stays read-only this epic; its gap is written down as a parity table, not built.\n\n## Acceptance criteria\n0. On a machine with only Node installed, one command installs `gf` and `gf --version` prints.\n1. `gf flags create <key> --kill-switch --all-envs` creates the flag enabled in every environment and the console shows it; a partial failure prints which environments succeeded and exits non-zero.\n2. `gf doctor` diagnoses each of: no credentials, expired credentials, wrong project, unreachable API, an out-of-date CLI.\n3. The CLI feels native to developers.\n4. `gf` ships a live terminal dashboard of flag evaluations.",
|
|
8545
|
+
"claims": {
|
|
8546
|
+
"c1": "An agent can create a kill-switch flag in every environment without a human clicking anything.",
|
|
8547
|
+
"c2": "The CLI runs on a machine that only has Node installed.",
|
|
8548
|
+
"c3": "The MCP connector gains write tools, so an agent can change flags through it.",
|
|
8549
|
+
"c4": "CLI usage is billed per seat."
|
|
8550
|
+
},
|
|
8551
|
+
"criteria": {
|
|
8552
|
+
"a1": "On a machine with only Node installed, one command installs `gf` and `gf --version` prints.",
|
|
8553
|
+
"a2": "`gf flags create <key> --kill-switch --all-envs` creates the flag enabled in every environment and the console shows it; a partial failure prints which environments succeeded and exits non-zero.",
|
|
8554
|
+
"a3": "`gf doctor` diagnoses each of: no credentials, expired credentials, wrong project, unreachable API, an out-of-date CLI.",
|
|
8555
|
+
"a4": "The CLI feels native to developers.",
|
|
8556
|
+
"a5": "`gf` ships a live terminal dashboard of flag evaluations."
|
|
8557
|
+
},
|
|
8558
|
+
"recorded": {
|
|
8559
|
+
"model": "jev-1.13.0",
|
|
8560
|
+
"answers": {
|
|
8561
|
+
"in_c4": {
|
|
8562
|
+
"type": "noul",
|
|
8563
|
+
"noul": 0.04
|
|
8564
|
+
}
|
|
8565
|
+
}
|
|
8566
|
+
},
|
|
8567
|
+
"decision": {
|
|
8568
|
+
"value": false,
|
|
8569
|
+
"p": 0.04,
|
|
8570
|
+
"decider": "jev"
|
|
8571
|
+
}
|
|
8572
|
+
},
|
|
8573
|
+
{
|
|
8574
|
+
"id": "cli-clarity-a2",
|
|
8575
|
+
"question": "clarity",
|
|
8576
|
+
"item": "a2",
|
|
8577
|
+
"label": true,
|
|
8578
|
+
"source": "golden-frijoles seed golden-frijoles-cli (trimmed: problem, shape, a subset of the acceptance list, one added)",
|
|
8579
|
+
"pitch": "# Seed: gf — a CLI so an agent can operate Golden Frijoles\n\n## Problem\n\nThe kill-switch story can't be completed by an agent. Every `risk: high` epic must ship behind a flag, and the story\nmandates \"create it in every env\" — but there is no command for that, so the step waits for a human to click in the\nconsole. The MCP connector is read-only and scoped to one project. Consumers hand-roll the gap: one project wrote a\n200-line admin-API wrapper because there was no CLI.\n\n## Shape\n\nA small Node CLI, `gf`, published to npm: `login`, `whoami`, `init`, `flags create|kill|get`, `doctor`, each with\n`--json`. The MCP connector stays read-only this epic; its gap is written down as a parity table, not built.\n\n## Acceptance criteria\n0. On a machine with only Node installed, one command installs `gf` and `gf --version` prints.\n1. `gf flags create <key> --kill-switch --all-envs` creates the flag enabled in every environment and the console shows it; a partial failure prints which environments succeeded and exits non-zero.\n2. `gf doctor` diagnoses each of: no credentials, expired credentials, wrong project, unreachable API, an out-of-date CLI.\n3. The CLI feels native to developers.\n4. `gf` ships a live terminal dashboard of flag evaluations.",
|
|
8580
|
+
"claims": {
|
|
8581
|
+
"c1": "An agent can create a kill-switch flag in every environment without a human clicking anything.",
|
|
8582
|
+
"c2": "The CLI runs on a machine that only has Node installed.",
|
|
8583
|
+
"c3": "The MCP connector gains write tools, so an agent can change flags through it.",
|
|
8584
|
+
"c4": "CLI usage is billed per seat."
|
|
8585
|
+
},
|
|
8586
|
+
"criteria": {
|
|
8587
|
+
"a1": "On a machine with only Node installed, one command installs `gf` and `gf --version` prints.",
|
|
8588
|
+
"a2": "`gf flags create <key> --kill-switch --all-envs` creates the flag enabled in every environment and the console shows it; a partial failure prints which environments succeeded and exits non-zero.",
|
|
8589
|
+
"a3": "`gf doctor` diagnoses each of: no credentials, expired credentials, wrong project, unreachable API, an out-of-date CLI.",
|
|
8590
|
+
"a4": "The CLI feels native to developers.",
|
|
8591
|
+
"a5": "`gf` ships a live terminal dashboard of flag evaluations."
|
|
8592
|
+
},
|
|
8593
|
+
"recorded": {
|
|
8594
|
+
"model": "jev-1.13.0",
|
|
8595
|
+
"answers": {
|
|
8596
|
+
"clar_a2": {
|
|
8597
|
+
"type": "score",
|
|
8598
|
+
"score": 2.4,
|
|
8599
|
+
"confidence": 0.6,
|
|
8600
|
+
"legend": {
|
|
8601
|
+
"0": "No: it states an aim or a quality (\"works well\", \"is clear\", \"feels fast\") with nothing anyone could observe.",
|
|
8602
|
+
"1": "Barely: it names what to look at, but not what counts as passing, so two testers would likely disagree.",
|
|
8603
|
+
"2": "Mostly: it names an action and an outcome but leaves one thing to judgement, such as a threshold, a wording or which case to try.",
|
|
8604
|
+
"3": "Yes: it names the action, where to do it and the exact result to observe, so two testers would agree."
|
|
8605
|
+
},
|
|
8606
|
+
"probabilities": {
|
|
8607
|
+
"0": 0,
|
|
8608
|
+
"1": 0,
|
|
8609
|
+
"2": 0.6,
|
|
8610
|
+
"3": 0.4
|
|
8611
|
+
}
|
|
8612
|
+
}
|
|
8613
|
+
}
|
|
8614
|
+
},
|
|
8615
|
+
"decision": {
|
|
8616
|
+
"value": true,
|
|
8617
|
+
"p": 0.8,
|
|
8618
|
+
"decider": "jev"
|
|
8619
|
+
}
|
|
8620
|
+
},
|
|
8621
|
+
{
|
|
8622
|
+
"id": "cli-clarity-a4",
|
|
8623
|
+
"question": "clarity",
|
|
8624
|
+
"item": "a4",
|
|
8625
|
+
"label": false,
|
|
8626
|
+
"source": "golden-frijoles seed golden-frijoles-cli (trimmed: problem, shape, a subset of the acceptance list, one added)",
|
|
8627
|
+
"pitch": "# Seed: gf — a CLI so an agent can operate Golden Frijoles\n\n## Problem\n\nThe kill-switch story can't be completed by an agent. Every `risk: high` epic must ship behind a flag, and the story\nmandates \"create it in every env\" — but there is no command for that, so the step waits for a human to click in the\nconsole. The MCP connector is read-only and scoped to one project. Consumers hand-roll the gap: one project wrote a\n200-line admin-API wrapper because there was no CLI.\n\n## Shape\n\nA small Node CLI, `gf`, published to npm: `login`, `whoami`, `init`, `flags create|kill|get`, `doctor`, each with\n`--json`. The MCP connector stays read-only this epic; its gap is written down as a parity table, not built.\n\n## Acceptance criteria\n0. On a machine with only Node installed, one command installs `gf` and `gf --version` prints.\n1. `gf flags create <key> --kill-switch --all-envs` creates the flag enabled in every environment and the console shows it; a partial failure prints which environments succeeded and exits non-zero.\n2. `gf doctor` diagnoses each of: no credentials, expired credentials, wrong project, unreachable API, an out-of-date CLI.\n3. The CLI feels native to developers.\n4. `gf` ships a live terminal dashboard of flag evaluations.",
|
|
8628
|
+
"claims": {
|
|
8629
|
+
"c1": "An agent can create a kill-switch flag in every environment without a human clicking anything.",
|
|
8630
|
+
"c2": "The CLI runs on a machine that only has Node installed.",
|
|
8631
|
+
"c3": "The MCP connector gains write tools, so an agent can change flags through it.",
|
|
8632
|
+
"c4": "CLI usage is billed per seat."
|
|
8633
|
+
},
|
|
8634
|
+
"criteria": {
|
|
8635
|
+
"a1": "On a machine with only Node installed, one command installs `gf` and `gf --version` prints.",
|
|
8636
|
+
"a2": "`gf flags create <key> --kill-switch --all-envs` creates the flag enabled in every environment and the console shows it; a partial failure prints which environments succeeded and exits non-zero.",
|
|
8637
|
+
"a3": "`gf doctor` diagnoses each of: no credentials, expired credentials, wrong project, unreachable API, an out-of-date CLI.",
|
|
8638
|
+
"a4": "The CLI feels native to developers.",
|
|
8639
|
+
"a5": "`gf` ships a live terminal dashboard of flag evaluations."
|
|
8640
|
+
},
|
|
8641
|
+
"recorded": {
|
|
8642
|
+
"model": "jev-1.13.0",
|
|
8643
|
+
"answers": {
|
|
8644
|
+
"clar_a4": {
|
|
8645
|
+
"type": "score",
|
|
8646
|
+
"score": 0.09,
|
|
8647
|
+
"confidence": 0.91,
|
|
8648
|
+
"legend": {
|
|
8649
|
+
"0": "No: it states an aim or a quality (\"works well\", \"is clear\", \"feels fast\") with nothing anyone could observe.",
|
|
8650
|
+
"1": "Barely: it names what to look at, but not what counts as passing, so two testers would likely disagree.",
|
|
8651
|
+
"2": "Mostly: it names an action and an outcome but leaves one thing to judgement, such as a threshold, a wording or which case to try.",
|
|
8652
|
+
"3": "Yes: it names the action, where to do it and the exact result to observe, so two testers would agree."
|
|
8653
|
+
},
|
|
8654
|
+
"probabilities": {
|
|
8655
|
+
"0": 0.91,
|
|
8656
|
+
"1": 0.09,
|
|
8657
|
+
"2": 0,
|
|
8658
|
+
"3": 0
|
|
8659
|
+
}
|
|
8660
|
+
}
|
|
8661
|
+
}
|
|
8662
|
+
},
|
|
8663
|
+
"decision": {
|
|
8664
|
+
"value": false,
|
|
8665
|
+
"p": 0.03,
|
|
8666
|
+
"decider": "jev"
|
|
8667
|
+
}
|
|
8668
|
+
},
|
|
8669
|
+
{
|
|
8670
|
+
"id": "cli-coverage_out-a2",
|
|
8671
|
+
"question": "coverage_out",
|
|
8672
|
+
"item": "a2",
|
|
8673
|
+
"label": true,
|
|
8674
|
+
"source": "golden-frijoles seed golden-frijoles-cli (trimmed: problem, shape, a subset of the acceptance list, one added)",
|
|
8675
|
+
"pitch": "# Seed: gf — a CLI so an agent can operate Golden Frijoles\n\n## Problem\n\nThe kill-switch story can't be completed by an agent. Every `risk: high` epic must ship behind a flag, and the story\nmandates \"create it in every env\" — but there is no command for that, so the step waits for a human to click in the\nconsole. The MCP connector is read-only and scoped to one project. Consumers hand-roll the gap: one project wrote a\n200-line admin-API wrapper because there was no CLI.\n\n## Shape\n\nA small Node CLI, `gf`, published to npm: `login`, `whoami`, `init`, `flags create|kill|get`, `doctor`, each with\n`--json`. The MCP connector stays read-only this epic; its gap is written down as a parity table, not built.\n\n## Acceptance criteria\n0. On a machine with only Node installed, one command installs `gf` and `gf --version` prints.\n1. `gf flags create <key> --kill-switch --all-envs` creates the flag enabled in every environment and the console shows it; a partial failure prints which environments succeeded and exits non-zero.\n2. `gf doctor` diagnoses each of: no credentials, expired credentials, wrong project, unreachable API, an out-of-date CLI.\n3. The CLI feels native to developers.\n4. `gf` ships a live terminal dashboard of flag evaluations.",
|
|
8676
|
+
"claims": {
|
|
8677
|
+
"c1": "An agent can create a kill-switch flag in every environment without a human clicking anything.",
|
|
8678
|
+
"c2": "The CLI runs on a machine that only has Node installed.",
|
|
8679
|
+
"c3": "The MCP connector gains write tools, so an agent can change flags through it.",
|
|
8680
|
+
"c4": "CLI usage is billed per seat."
|
|
8681
|
+
},
|
|
8682
|
+
"criteria": {
|
|
8683
|
+
"a1": "On a machine with only Node installed, one command installs `gf` and `gf --version` prints.",
|
|
8684
|
+
"a2": "`gf flags create <key> --kill-switch --all-envs` creates the flag enabled in every environment and the console shows it; a partial failure prints which environments succeeded and exits non-zero.",
|
|
8685
|
+
"a3": "`gf doctor` diagnoses each of: no credentials, expired credentials, wrong project, unreachable API, an out-of-date CLI.",
|
|
8686
|
+
"a4": "The CLI feels native to developers.",
|
|
8687
|
+
"a5": "`gf` ships a live terminal dashboard of flag evaluations."
|
|
8688
|
+
},
|
|
8689
|
+
"recorded": {
|
|
8690
|
+
"model": "jev-1.13.0",
|
|
8691
|
+
"answers": {
|
|
8692
|
+
"out_a2": {
|
|
8693
|
+
"type": "noul",
|
|
8694
|
+
"noul": 0.9
|
|
8695
|
+
}
|
|
8696
|
+
}
|
|
8697
|
+
},
|
|
8698
|
+
"decision": {
|
|
8699
|
+
"value": true,
|
|
8700
|
+
"p": 0.9,
|
|
8701
|
+
"decider": "jev"
|
|
8702
|
+
}
|
|
8703
|
+
},
|
|
8704
|
+
{
|
|
8705
|
+
"id": "cli-coverage_out-a5",
|
|
8706
|
+
"question": "coverage_out",
|
|
8707
|
+
"item": "a5",
|
|
8708
|
+
"label": false,
|
|
8709
|
+
"source": "golden-frijoles seed golden-frijoles-cli (trimmed: problem, shape, a subset of the acceptance list, one added)",
|
|
8710
|
+
"pitch": "# Seed: gf — a CLI so an agent can operate Golden Frijoles\n\n## Problem\n\nThe kill-switch story can't be completed by an agent. Every `risk: high` epic must ship behind a flag, and the story\nmandates \"create it in every env\" — but there is no command for that, so the step waits for a human to click in the\nconsole. The MCP connector is read-only and scoped to one project. Consumers hand-roll the gap: one project wrote a\n200-line admin-API wrapper because there was no CLI.\n\n## Shape\n\nA small Node CLI, `gf`, published to npm: `login`, `whoami`, `init`, `flags create|kill|get`, `doctor`, each with\n`--json`. The MCP connector stays read-only this epic; its gap is written down as a parity table, not built.\n\n## Acceptance criteria\n0. On a machine with only Node installed, one command installs `gf` and `gf --version` prints.\n1. `gf flags create <key> --kill-switch --all-envs` creates the flag enabled in every environment and the console shows it; a partial failure prints which environments succeeded and exits non-zero.\n2. `gf doctor` diagnoses each of: no credentials, expired credentials, wrong project, unreachable API, an out-of-date CLI.\n3. The CLI feels native to developers.\n4. `gf` ships a live terminal dashboard of flag evaluations.",
|
|
8711
|
+
"claims": {
|
|
8712
|
+
"c1": "An agent can create a kill-switch flag in every environment without a human clicking anything.",
|
|
8713
|
+
"c2": "The CLI runs on a machine that only has Node installed.",
|
|
8714
|
+
"c3": "The MCP connector gains write tools, so an agent can change flags through it.",
|
|
8715
|
+
"c4": "CLI usage is billed per seat."
|
|
8716
|
+
},
|
|
8717
|
+
"criteria": {
|
|
8718
|
+
"a1": "On a machine with only Node installed, one command installs `gf` and `gf --version` prints.",
|
|
8719
|
+
"a2": "`gf flags create <key> --kill-switch --all-envs` creates the flag enabled in every environment and the console shows it; a partial failure prints which environments succeeded and exits non-zero.",
|
|
8720
|
+
"a3": "`gf doctor` diagnoses each of: no credentials, expired credentials, wrong project, unreachable API, an out-of-date CLI.",
|
|
8721
|
+
"a4": "The CLI feels native to developers.",
|
|
8722
|
+
"a5": "`gf` ships a live terminal dashboard of flag evaluations."
|
|
8723
|
+
},
|
|
8724
|
+
"recorded": {
|
|
8725
|
+
"model": "jev-1.13.0",
|
|
8726
|
+
"answers": {
|
|
8727
|
+
"out_a5": {
|
|
8728
|
+
"type": "noul",
|
|
8729
|
+
"noul": 0.24
|
|
8730
|
+
}
|
|
8731
|
+
}
|
|
8732
|
+
},
|
|
8733
|
+
"decision": {
|
|
8734
|
+
"value": false,
|
|
8735
|
+
"p": 0.24,
|
|
8736
|
+
"decider": "jev"
|
|
8737
|
+
}
|
|
8738
|
+
},
|
|
8739
|
+
{
|
|
8740
|
+
"id": "low-stock-coverage_in-c1",
|
|
8741
|
+
"question": "coverage_in",
|
|
8742
|
+
"item": "c1",
|
|
8743
|
+
"label": true,
|
|
8744
|
+
"source": "consuming project A — a seed paraphrased and anonymised (C7)",
|
|
8745
|
+
"pitch": "# Pitch — low-stock alerts for sellers\n\n## Problem\n\nSellers find out a product has sold out when a buyer complains. They want warning before it happens.\n\n## Bill of materials (What / Why)\n| What | Why |\n|---|---|\n| A per-product stock threshold on the product edit page | each product sells at its own pace |\n| A nightly job that finds variants below their threshold and emails the seller one digest | one message a day, not a flood |\n\n## Scope\n**In v1:** email only. **Out of v1 (no-gos):** WhatsApp or SMS alerts; hiding sold-out items automatically.\n\n## Acceptance criteria\n- When a variant's stock drops below its threshold, the next nightly run emails the seller one message listing that variant and its current count.\n- The threshold field accepts whole numbers from 0 to 999 and rejects anything else with an inline error under the field.\n- Alerts are timely.\n- The shop admin receives a weekly revenue digest by email.",
|
|
8746
|
+
"claims": {
|
|
8747
|
+
"c1": "A seller hears about a product before it runs out.",
|
|
8748
|
+
"c2": "The seller sets how low is \"low\" separately for each product.",
|
|
8749
|
+
"c3": "Alerts arrive on WhatsApp.",
|
|
8750
|
+
"c4": "Sold-out products disappear from the shop on their own."
|
|
8751
|
+
},
|
|
8752
|
+
"criteria": {
|
|
8753
|
+
"a1": "When a variant's stock drops below its threshold, the next nightly run emails the seller one message listing that variant and its current count.",
|
|
8754
|
+
"a2": "The threshold field accepts whole numbers from 0 to 999 and rejects anything else with an inline error under the field.",
|
|
8755
|
+
"a3": "Alerts are timely.",
|
|
8756
|
+
"a4": "The shop admin receives a weekly revenue digest by email."
|
|
8757
|
+
},
|
|
8758
|
+
"recorded": {
|
|
8759
|
+
"model": "jev-1.13.0",
|
|
8760
|
+
"answers": {
|
|
8761
|
+
"in_c1": {
|
|
8762
|
+
"type": "noul",
|
|
8763
|
+
"noul": 0.95
|
|
8764
|
+
}
|
|
8765
|
+
}
|
|
8766
|
+
},
|
|
8767
|
+
"decision": {
|
|
8768
|
+
"value": true,
|
|
8769
|
+
"p": 0.95,
|
|
8770
|
+
"decider": "jev"
|
|
8771
|
+
}
|
|
8772
|
+
},
|
|
8773
|
+
{
|
|
8774
|
+
"id": "low-stock-coverage_in-c2",
|
|
8775
|
+
"question": "coverage_in",
|
|
8776
|
+
"item": "c2",
|
|
8777
|
+
"label": true,
|
|
8778
|
+
"source": "consuming project A — a seed paraphrased and anonymised (C7)",
|
|
8779
|
+
"pitch": "# Pitch — low-stock alerts for sellers\n\n## Problem\n\nSellers find out a product has sold out when a buyer complains. They want warning before it happens.\n\n## Bill of materials (What / Why)\n| What | Why |\n|---|---|\n| A per-product stock threshold on the product edit page | each product sells at its own pace |\n| A nightly job that finds variants below their threshold and emails the seller one digest | one message a day, not a flood |\n\n## Scope\n**In v1:** email only. **Out of v1 (no-gos):** WhatsApp or SMS alerts; hiding sold-out items automatically.\n\n## Acceptance criteria\n- When a variant's stock drops below its threshold, the next nightly run emails the seller one message listing that variant and its current count.\n- The threshold field accepts whole numbers from 0 to 999 and rejects anything else with an inline error under the field.\n- Alerts are timely.\n- The shop admin receives a weekly revenue digest by email.",
|
|
8780
|
+
"claims": {
|
|
8781
|
+
"c1": "A seller hears about a product before it runs out.",
|
|
8782
|
+
"c2": "The seller sets how low is \"low\" separately for each product.",
|
|
8783
|
+
"c3": "Alerts arrive on WhatsApp.",
|
|
8784
|
+
"c4": "Sold-out products disappear from the shop on their own."
|
|
8785
|
+
},
|
|
8786
|
+
"criteria": {
|
|
8787
|
+
"a1": "When a variant's stock drops below its threshold, the next nightly run emails the seller one message listing that variant and its current count.",
|
|
8788
|
+
"a2": "The threshold field accepts whole numbers from 0 to 999 and rejects anything else with an inline error under the field.",
|
|
8789
|
+
"a3": "Alerts are timely.",
|
|
8790
|
+
"a4": "The shop admin receives a weekly revenue digest by email."
|
|
8791
|
+
},
|
|
8792
|
+
"recorded": {
|
|
8793
|
+
"model": "jev-1.13.0",
|
|
8794
|
+
"answers": {
|
|
8795
|
+
"in_c2": {
|
|
8796
|
+
"type": "noul",
|
|
8797
|
+
"noul": 0.97
|
|
8798
|
+
}
|
|
8799
|
+
}
|
|
8800
|
+
},
|
|
8801
|
+
"decision": {
|
|
8802
|
+
"value": true,
|
|
8803
|
+
"p": 0.97,
|
|
8804
|
+
"decider": "jev"
|
|
8805
|
+
}
|
|
8806
|
+
},
|
|
8807
|
+
{
|
|
8808
|
+
"id": "low-stock-coverage_in-c3",
|
|
8809
|
+
"question": "coverage_in",
|
|
8810
|
+
"item": "c3",
|
|
8811
|
+
"label": false,
|
|
8812
|
+
"source": "consuming project A — a seed paraphrased and anonymised (C7)",
|
|
8813
|
+
"pitch": "# Pitch — low-stock alerts for sellers\n\n## Problem\n\nSellers find out a product has sold out when a buyer complains. They want warning before it happens.\n\n## Bill of materials (What / Why)\n| What | Why |\n|---|---|\n| A per-product stock threshold on the product edit page | each product sells at its own pace |\n| A nightly job that finds variants below their threshold and emails the seller one digest | one message a day, not a flood |\n\n## Scope\n**In v1:** email only. **Out of v1 (no-gos):** WhatsApp or SMS alerts; hiding sold-out items automatically.\n\n## Acceptance criteria\n- When a variant's stock drops below its threshold, the next nightly run emails the seller one message listing that variant and its current count.\n- The threshold field accepts whole numbers from 0 to 999 and rejects anything else with an inline error under the field.\n- Alerts are timely.\n- The shop admin receives a weekly revenue digest by email.",
|
|
8814
|
+
"claims": {
|
|
8815
|
+
"c1": "A seller hears about a product before it runs out.",
|
|
8816
|
+
"c2": "The seller sets how low is \"low\" separately for each product.",
|
|
8817
|
+
"c3": "Alerts arrive on WhatsApp.",
|
|
8818
|
+
"c4": "Sold-out products disappear from the shop on their own."
|
|
8819
|
+
},
|
|
8820
|
+
"criteria": {
|
|
8821
|
+
"a1": "When a variant's stock drops below its threshold, the next nightly run emails the seller one message listing that variant and its current count.",
|
|
8822
|
+
"a2": "The threshold field accepts whole numbers from 0 to 999 and rejects anything else with an inline error under the field.",
|
|
8823
|
+
"a3": "Alerts are timely.",
|
|
8824
|
+
"a4": "The shop admin receives a weekly revenue digest by email."
|
|
8825
|
+
},
|
|
8826
|
+
"recorded": {
|
|
8827
|
+
"model": "jev-1.13.0",
|
|
8828
|
+
"answers": {
|
|
8829
|
+
"in_c3": {
|
|
8830
|
+
"type": "noul",
|
|
8831
|
+
"noul": 0.05
|
|
8832
|
+
}
|
|
8833
|
+
}
|
|
8834
|
+
},
|
|
8835
|
+
"decision": {
|
|
8836
|
+
"value": false,
|
|
8837
|
+
"p": 0.05,
|
|
8838
|
+
"decider": "jev"
|
|
8839
|
+
}
|
|
8840
|
+
},
|
|
8841
|
+
{
|
|
8842
|
+
"id": "low-stock-coverage_in-c4",
|
|
8843
|
+
"question": "coverage_in",
|
|
8844
|
+
"item": "c4",
|
|
8845
|
+
"label": false,
|
|
8846
|
+
"source": "consuming project A — a seed paraphrased and anonymised (C7)",
|
|
8847
|
+
"pitch": "# Pitch — low-stock alerts for sellers\n\n## Problem\n\nSellers find out a product has sold out when a buyer complains. They want warning before it happens.\n\n## Bill of materials (What / Why)\n| What | Why |\n|---|---|\n| A per-product stock threshold on the product edit page | each product sells at its own pace |\n| A nightly job that finds variants below their threshold and emails the seller one digest | one message a day, not a flood |\n\n## Scope\n**In v1:** email only. **Out of v1 (no-gos):** WhatsApp or SMS alerts; hiding sold-out items automatically.\n\n## Acceptance criteria\n- When a variant's stock drops below its threshold, the next nightly run emails the seller one message listing that variant and its current count.\n- The threshold field accepts whole numbers from 0 to 999 and rejects anything else with an inline error under the field.\n- Alerts are timely.\n- The shop admin receives a weekly revenue digest by email.",
|
|
8848
|
+
"claims": {
|
|
8849
|
+
"c1": "A seller hears about a product before it runs out.",
|
|
8850
|
+
"c2": "The seller sets how low is \"low\" separately for each product.",
|
|
8851
|
+
"c3": "Alerts arrive on WhatsApp.",
|
|
8852
|
+
"c4": "Sold-out products disappear from the shop on their own."
|
|
8853
|
+
},
|
|
8854
|
+
"criteria": {
|
|
8855
|
+
"a1": "When a variant's stock drops below its threshold, the next nightly run emails the seller one message listing that variant and its current count.",
|
|
8856
|
+
"a2": "The threshold field accepts whole numbers from 0 to 999 and rejects anything else with an inline error under the field.",
|
|
8857
|
+
"a3": "Alerts are timely.",
|
|
8858
|
+
"a4": "The shop admin receives a weekly revenue digest by email."
|
|
8859
|
+
},
|
|
8860
|
+
"recorded": {
|
|
8861
|
+
"model": "jev-1.13.0",
|
|
8862
|
+
"answers": {
|
|
8863
|
+
"in_c4": {
|
|
8864
|
+
"type": "noul",
|
|
8865
|
+
"noul": 0.06
|
|
8866
|
+
}
|
|
8867
|
+
}
|
|
8868
|
+
},
|
|
8869
|
+
"decision": {
|
|
8870
|
+
"value": false,
|
|
8871
|
+
"p": 0.06,
|
|
8872
|
+
"decider": "jev"
|
|
8873
|
+
}
|
|
8874
|
+
},
|
|
8875
|
+
{
|
|
8876
|
+
"id": "low-stock-clarity-a1",
|
|
8877
|
+
"question": "clarity",
|
|
8878
|
+
"item": "a1",
|
|
8879
|
+
"label": true,
|
|
8880
|
+
"source": "consuming project A — a seed paraphrased and anonymised (C7)",
|
|
8881
|
+
"pitch": "# Pitch — low-stock alerts for sellers\n\n## Problem\n\nSellers find out a product has sold out when a buyer complains. They want warning before it happens.\n\n## Bill of materials (What / Why)\n| What | Why |\n|---|---|\n| A per-product stock threshold on the product edit page | each product sells at its own pace |\n| A nightly job that finds variants below their threshold and emails the seller one digest | one message a day, not a flood |\n\n## Scope\n**In v1:** email only. **Out of v1 (no-gos):** WhatsApp or SMS alerts; hiding sold-out items automatically.\n\n## Acceptance criteria\n- When a variant's stock drops below its threshold, the next nightly run emails the seller one message listing that variant and its current count.\n- The threshold field accepts whole numbers from 0 to 999 and rejects anything else with an inline error under the field.\n- Alerts are timely.\n- The shop admin receives a weekly revenue digest by email.",
|
|
8882
|
+
"claims": {
|
|
8883
|
+
"c1": "A seller hears about a product before it runs out.",
|
|
8884
|
+
"c2": "The seller sets how low is \"low\" separately for each product.",
|
|
8885
|
+
"c3": "Alerts arrive on WhatsApp.",
|
|
8886
|
+
"c4": "Sold-out products disappear from the shop on their own."
|
|
8887
|
+
},
|
|
8888
|
+
"criteria": {
|
|
8889
|
+
"a1": "When a variant's stock drops below its threshold, the next nightly run emails the seller one message listing that variant and its current count.",
|
|
8890
|
+
"a2": "The threshold field accepts whole numbers from 0 to 999 and rejects anything else with an inline error under the field.",
|
|
8891
|
+
"a3": "Alerts are timely.",
|
|
8892
|
+
"a4": "The shop admin receives a weekly revenue digest by email."
|
|
8893
|
+
},
|
|
8894
|
+
"recorded": {
|
|
8895
|
+
"model": "jev-1.13.0",
|
|
8896
|
+
"answers": {
|
|
8897
|
+
"clar_a1": {
|
|
8898
|
+
"type": "score",
|
|
8899
|
+
"score": 2.63,
|
|
8900
|
+
"confidence": 0.63,
|
|
8901
|
+
"legend": {
|
|
8902
|
+
"0": "No: it states an aim or a quality (\"works well\", \"is clear\", \"feels fast\") with nothing anyone could observe.",
|
|
8903
|
+
"1": "Barely: it names what to look at, but not what counts as passing, so two testers would likely disagree.",
|
|
8904
|
+
"2": "Mostly: it names an action and an outcome but leaves one thing to judgement, such as a threshold, a wording or which case to try.",
|
|
8905
|
+
"3": "Yes: it names the action, where to do it and the exact result to observe, so two testers would agree."
|
|
8906
|
+
},
|
|
8907
|
+
"probabilities": {
|
|
8908
|
+
"0": 0,
|
|
8909
|
+
"1": 0,
|
|
8910
|
+
"2": 0.36,
|
|
8911
|
+
"3": 0.64
|
|
8912
|
+
}
|
|
8913
|
+
}
|
|
8914
|
+
}
|
|
8915
|
+
},
|
|
8916
|
+
"decision": {
|
|
8917
|
+
"value": true,
|
|
8918
|
+
"p": 0.877,
|
|
8919
|
+
"decider": "jev"
|
|
8920
|
+
}
|
|
8921
|
+
},
|
|
8922
|
+
{
|
|
8923
|
+
"id": "low-stock-clarity-a2",
|
|
8924
|
+
"question": "clarity",
|
|
8925
|
+
"item": "a2",
|
|
8926
|
+
"label": true,
|
|
8927
|
+
"source": "consuming project A — a seed paraphrased and anonymised (C7)",
|
|
8928
|
+
"pitch": "# Pitch — low-stock alerts for sellers\n\n## Problem\n\nSellers find out a product has sold out when a buyer complains. They want warning before it happens.\n\n## Bill of materials (What / Why)\n| What | Why |\n|---|---|\n| A per-product stock threshold on the product edit page | each product sells at its own pace |\n| A nightly job that finds variants below their threshold and emails the seller one digest | one message a day, not a flood |\n\n## Scope\n**In v1:** email only. **Out of v1 (no-gos):** WhatsApp or SMS alerts; hiding sold-out items automatically.\n\n## Acceptance criteria\n- When a variant's stock drops below its threshold, the next nightly run emails the seller one message listing that variant and its current count.\n- The threshold field accepts whole numbers from 0 to 999 and rejects anything else with an inline error under the field.\n- Alerts are timely.\n- The shop admin receives a weekly revenue digest by email.",
|
|
8929
|
+
"claims": {
|
|
8930
|
+
"c1": "A seller hears about a product before it runs out.",
|
|
8931
|
+
"c2": "The seller sets how low is \"low\" separately for each product.",
|
|
8932
|
+
"c3": "Alerts arrive on WhatsApp.",
|
|
8933
|
+
"c4": "Sold-out products disappear from the shop on their own."
|
|
8934
|
+
},
|
|
8935
|
+
"criteria": {
|
|
8936
|
+
"a1": "When a variant's stock drops below its threshold, the next nightly run emails the seller one message listing that variant and its current count.",
|
|
8937
|
+
"a2": "The threshold field accepts whole numbers from 0 to 999 and rejects anything else with an inline error under the field.",
|
|
8938
|
+
"a3": "Alerts are timely.",
|
|
8939
|
+
"a4": "The shop admin receives a weekly revenue digest by email."
|
|
8940
|
+
},
|
|
8941
|
+
"recorded": {
|
|
8942
|
+
"model": "jev-1.13.0",
|
|
8943
|
+
"answers": {
|
|
8944
|
+
"clar_a2": {
|
|
8945
|
+
"type": "score",
|
|
8946
|
+
"score": 2.76,
|
|
8947
|
+
"confidence": 0.76,
|
|
8948
|
+
"legend": {
|
|
8949
|
+
"0": "No: it states an aim or a quality (\"works well\", \"is clear\", \"feels fast\") with nothing anyone could observe.",
|
|
8950
|
+
"1": "Barely: it names what to look at, but not what counts as passing, so two testers would likely disagree.",
|
|
8951
|
+
"2": "Mostly: it names an action and an outcome but leaves one thing to judgement, such as a threshold, a wording or which case to try.",
|
|
8952
|
+
"3": "Yes: it names the action, where to do it and the exact result to observe, so two testers would agree."
|
|
8953
|
+
},
|
|
8954
|
+
"probabilities": {
|
|
8955
|
+
"0": 0,
|
|
8956
|
+
"1": 0,
|
|
8957
|
+
"2": 0.24,
|
|
8958
|
+
"3": 0.76
|
|
8959
|
+
}
|
|
8960
|
+
}
|
|
8961
|
+
}
|
|
8962
|
+
},
|
|
8963
|
+
"decision": {
|
|
8964
|
+
"value": true,
|
|
8965
|
+
"p": 0.92,
|
|
8966
|
+
"decider": "jev"
|
|
8967
|
+
}
|
|
8968
|
+
},
|
|
8969
|
+
{
|
|
8970
|
+
"id": "low-stock-clarity-a3",
|
|
8971
|
+
"question": "clarity",
|
|
8972
|
+
"item": "a3",
|
|
8973
|
+
"label": false,
|
|
8974
|
+
"source": "consuming project A — a seed paraphrased and anonymised (C7)",
|
|
8975
|
+
"pitch": "# Pitch — low-stock alerts for sellers\n\n## Problem\n\nSellers find out a product has sold out when a buyer complains. They want warning before it happens.\n\n## Bill of materials (What / Why)\n| What | Why |\n|---|---|\n| A per-product stock threshold on the product edit page | each product sells at its own pace |\n| A nightly job that finds variants below their threshold and emails the seller one digest | one message a day, not a flood |\n\n## Scope\n**In v1:** email only. **Out of v1 (no-gos):** WhatsApp or SMS alerts; hiding sold-out items automatically.\n\n## Acceptance criteria\n- When a variant's stock drops below its threshold, the next nightly run emails the seller one message listing that variant and its current count.\n- The threshold field accepts whole numbers from 0 to 999 and rejects anything else with an inline error under the field.\n- Alerts are timely.\n- The shop admin receives a weekly revenue digest by email.",
|
|
8976
|
+
"claims": {
|
|
8977
|
+
"c1": "A seller hears about a product before it runs out.",
|
|
8978
|
+
"c2": "The seller sets how low is \"low\" separately for each product.",
|
|
8979
|
+
"c3": "Alerts arrive on WhatsApp.",
|
|
8980
|
+
"c4": "Sold-out products disappear from the shop on their own."
|
|
8981
|
+
},
|
|
8982
|
+
"criteria": {
|
|
8983
|
+
"a1": "When a variant's stock drops below its threshold, the next nightly run emails the seller one message listing that variant and its current count.",
|
|
8984
|
+
"a2": "The threshold field accepts whole numbers from 0 to 999 and rejects anything else with an inline error under the field.",
|
|
8985
|
+
"a3": "Alerts are timely.",
|
|
8986
|
+
"a4": "The shop admin receives a weekly revenue digest by email."
|
|
8987
|
+
},
|
|
8988
|
+
"recorded": {
|
|
8989
|
+
"model": "jev-1.13.0",
|
|
8990
|
+
"answers": {
|
|
8991
|
+
"clar_a3": {
|
|
8992
|
+
"type": "score",
|
|
8993
|
+
"score": 0.55,
|
|
8994
|
+
"confidence": 0.45,
|
|
8995
|
+
"legend": {
|
|
8996
|
+
"0": "No: it states an aim or a quality (\"works well\", \"is clear\", \"feels fast\") with nothing anyone could observe.",
|
|
8997
|
+
"1": "Barely: it names what to look at, but not what counts as passing, so two testers would likely disagree.",
|
|
8998
|
+
"2": "Mostly: it names an action and an outcome but leaves one thing to judgement, such as a threshold, a wording or which case to try.",
|
|
8999
|
+
"3": "Yes: it names the action, where to do it and the exact result to observe, so two testers would agree."
|
|
9000
|
+
},
|
|
9001
|
+
"probabilities": {
|
|
9002
|
+
"0": 0.54,
|
|
9003
|
+
"1": 0.36,
|
|
9004
|
+
"2": 0.1,
|
|
9005
|
+
"3": 0
|
|
9006
|
+
}
|
|
9007
|
+
}
|
|
9008
|
+
}
|
|
9009
|
+
},
|
|
9010
|
+
"decision": {
|
|
9011
|
+
"value": false,
|
|
9012
|
+
"p": 0.183,
|
|
9013
|
+
"decider": "jev"
|
|
9014
|
+
}
|
|
9015
|
+
},
|
|
9016
|
+
{
|
|
9017
|
+
"id": "low-stock-coverage_out-a2",
|
|
9018
|
+
"question": "coverage_out",
|
|
9019
|
+
"item": "a2",
|
|
9020
|
+
"label": true,
|
|
9021
|
+
"source": "consuming project A — a seed paraphrased and anonymised (C7)",
|
|
9022
|
+
"pitch": "# Pitch — low-stock alerts for sellers\n\n## Problem\n\nSellers find out a product has sold out when a buyer complains. They want warning before it happens.\n\n## Bill of materials (What / Why)\n| What | Why |\n|---|---|\n| A per-product stock threshold on the product edit page | each product sells at its own pace |\n| A nightly job that finds variants below their threshold and emails the seller one digest | one message a day, not a flood |\n\n## Scope\n**In v1:** email only. **Out of v1 (no-gos):** WhatsApp or SMS alerts; hiding sold-out items automatically.\n\n## Acceptance criteria\n- When a variant's stock drops below its threshold, the next nightly run emails the seller one message listing that variant and its current count.\n- The threshold field accepts whole numbers from 0 to 999 and rejects anything else with an inline error under the field.\n- Alerts are timely.\n- The shop admin receives a weekly revenue digest by email.",
|
|
9023
|
+
"claims": {
|
|
9024
|
+
"c1": "A seller hears about a product before it runs out.",
|
|
9025
|
+
"c2": "The seller sets how low is \"low\" separately for each product.",
|
|
9026
|
+
"c3": "Alerts arrive on WhatsApp.",
|
|
9027
|
+
"c4": "Sold-out products disappear from the shop on their own."
|
|
9028
|
+
},
|
|
9029
|
+
"criteria": {
|
|
9030
|
+
"a1": "When a variant's stock drops below its threshold, the next nightly run emails the seller one message listing that variant and its current count.",
|
|
9031
|
+
"a2": "The threshold field accepts whole numbers from 0 to 999 and rejects anything else with an inline error under the field.",
|
|
9032
|
+
"a3": "Alerts are timely.",
|
|
9033
|
+
"a4": "The shop admin receives a weekly revenue digest by email."
|
|
9034
|
+
},
|
|
9035
|
+
"recorded": {
|
|
9036
|
+
"model": "jev-1.13.0",
|
|
9037
|
+
"answers": {
|
|
9038
|
+
"out_a2": {
|
|
9039
|
+
"type": "noul",
|
|
9040
|
+
"noul": 0.76
|
|
9041
|
+
}
|
|
9042
|
+
}
|
|
9043
|
+
},
|
|
9044
|
+
"decision": {
|
|
9045
|
+
"value": true,
|
|
9046
|
+
"p": 0.76,
|
|
9047
|
+
"decider": "jev"
|
|
9048
|
+
}
|
|
9049
|
+
},
|
|
9050
|
+
{
|
|
9051
|
+
"id": "low-stock-coverage_out-a4",
|
|
9052
|
+
"question": "coverage_out",
|
|
9053
|
+
"item": "a4",
|
|
9054
|
+
"label": false,
|
|
9055
|
+
"source": "consuming project A — a seed paraphrased and anonymised (C7)",
|
|
9056
|
+
"pitch": "# Pitch — low-stock alerts for sellers\n\n## Problem\n\nSellers find out a product has sold out when a buyer complains. They want warning before it happens.\n\n## Bill of materials (What / Why)\n| What | Why |\n|---|---|\n| A per-product stock threshold on the product edit page | each product sells at its own pace |\n| A nightly job that finds variants below their threshold and emails the seller one digest | one message a day, not a flood |\n\n## Scope\n**In v1:** email only. **Out of v1 (no-gos):** WhatsApp or SMS alerts; hiding sold-out items automatically.\n\n## Acceptance criteria\n- When a variant's stock drops below its threshold, the next nightly run emails the seller one message listing that variant and its current count.\n- The threshold field accepts whole numbers from 0 to 999 and rejects anything else with an inline error under the field.\n- Alerts are timely.\n- The shop admin receives a weekly revenue digest by email.",
|
|
9057
|
+
"claims": {
|
|
9058
|
+
"c1": "A seller hears about a product before it runs out.",
|
|
9059
|
+
"c2": "The seller sets how low is \"low\" separately for each product.",
|
|
9060
|
+
"c3": "Alerts arrive on WhatsApp.",
|
|
9061
|
+
"c4": "Sold-out products disappear from the shop on their own."
|
|
9062
|
+
},
|
|
9063
|
+
"criteria": {
|
|
9064
|
+
"a1": "When a variant's stock drops below its threshold, the next nightly run emails the seller one message listing that variant and its current count.",
|
|
9065
|
+
"a2": "The threshold field accepts whole numbers from 0 to 999 and rejects anything else with an inline error under the field.",
|
|
9066
|
+
"a3": "Alerts are timely.",
|
|
9067
|
+
"a4": "The shop admin receives a weekly revenue digest by email."
|
|
9068
|
+
},
|
|
9069
|
+
"recorded": {
|
|
9070
|
+
"model": "jev-1.13.0",
|
|
9071
|
+
"answers": {
|
|
9072
|
+
"out_a4": {
|
|
9073
|
+
"type": "noul",
|
|
9074
|
+
"noul": 0.16
|
|
9075
|
+
}
|
|
9076
|
+
}
|
|
9077
|
+
},
|
|
9078
|
+
"decision": {
|
|
9079
|
+
"value": false,
|
|
9080
|
+
"p": 0.16,
|
|
9081
|
+
"decider": "jev"
|
|
9082
|
+
}
|
|
9083
|
+
},
|
|
9084
|
+
{
|
|
9085
|
+
"id": "gift-cards-coverage_in-c1",
|
|
9086
|
+
"question": "coverage_in",
|
|
9087
|
+
"item": "c1",
|
|
9088
|
+
"label": true,
|
|
9089
|
+
"source": "consuming project A — a seed paraphrased and anonymised (C7)",
|
|
9090
|
+
"pitch": "# Pitch — pay with a gift card\n\n## Problem\n\nBuyers holding a gift card can't use it online; support redeems them by hand.\n\n## Shape\n\nA \"Gift card\" field at checkout. The code is checked, its balance applied to the order, and any remainder is paid the\nusual way. Gift cards are still issued by the shop admin in the back office; selling them as a product is out of v1.\n\n## Acceptance criteria\n- Paying a 500 MXN order with a card worth 200 MXN applies 200 and asks for 300 by the usual payment method; the card's balance becomes 0.\n- Checkout is intuitive.",
|
|
9091
|
+
"claims": {
|
|
9092
|
+
"c1": "A buyer can pay part of an order with a gift card.",
|
|
9093
|
+
"c2": "Shoppers can buy gift cards in the shop as a product."
|
|
9094
|
+
},
|
|
9095
|
+
"criteria": {
|
|
9096
|
+
"a1": "Paying a 500 MXN order with a card worth 200 MXN applies 200 and asks for 300 by the usual payment method; the card's balance becomes 0.",
|
|
9097
|
+
"a2": "Checkout is intuitive."
|
|
9098
|
+
},
|
|
9099
|
+
"recorded": {
|
|
9100
|
+
"model": "jev-1.13.0",
|
|
9101
|
+
"answers": {
|
|
9102
|
+
"in_c1": {
|
|
9103
|
+
"type": "noul",
|
|
9104
|
+
"noul": 0.97
|
|
9105
|
+
}
|
|
9106
|
+
}
|
|
9107
|
+
},
|
|
9108
|
+
"decision": {
|
|
9109
|
+
"value": true,
|
|
9110
|
+
"p": 0.97,
|
|
9111
|
+
"decider": "jev"
|
|
9112
|
+
}
|
|
9113
|
+
},
|
|
9114
|
+
{
|
|
9115
|
+
"id": "gift-cards-coverage_in-c2",
|
|
9116
|
+
"question": "coverage_in",
|
|
9117
|
+
"item": "c2",
|
|
9118
|
+
"label": false,
|
|
9119
|
+
"source": "consuming project A — a seed paraphrased and anonymised (C7)",
|
|
9120
|
+
"pitch": "# Pitch — pay with a gift card\n\n## Problem\n\nBuyers holding a gift card can't use it online; support redeems them by hand.\n\n## Shape\n\nA \"Gift card\" field at checkout. The code is checked, its balance applied to the order, and any remainder is paid the\nusual way. Gift cards are still issued by the shop admin in the back office; selling them as a product is out of v1.\n\n## Acceptance criteria\n- Paying a 500 MXN order with a card worth 200 MXN applies 200 and asks for 300 by the usual payment method; the card's balance becomes 0.\n- Checkout is intuitive.",
|
|
9121
|
+
"claims": {
|
|
9122
|
+
"c1": "A buyer can pay part of an order with a gift card.",
|
|
9123
|
+
"c2": "Shoppers can buy gift cards in the shop as a product."
|
|
9124
|
+
},
|
|
9125
|
+
"criteria": {
|
|
9126
|
+
"a1": "Paying a 500 MXN order with a card worth 200 MXN applies 200 and asks for 300 by the usual payment method; the card's balance becomes 0.",
|
|
9127
|
+
"a2": "Checkout is intuitive."
|
|
9128
|
+
},
|
|
9129
|
+
"recorded": {
|
|
9130
|
+
"model": "jev-1.13.0",
|
|
9131
|
+
"answers": {
|
|
9132
|
+
"in_c2": {
|
|
9133
|
+
"type": "noul",
|
|
9134
|
+
"noul": 0.04
|
|
9135
|
+
}
|
|
9136
|
+
}
|
|
9137
|
+
},
|
|
9138
|
+
"decision": {
|
|
9139
|
+
"value": false,
|
|
9140
|
+
"p": 0.04,
|
|
9141
|
+
"decider": "jev"
|
|
9142
|
+
}
|
|
9143
|
+
},
|
|
9144
|
+
{
|
|
9145
|
+
"id": "gift-cards-clarity-a1",
|
|
9146
|
+
"question": "clarity",
|
|
9147
|
+
"item": "a1",
|
|
9148
|
+
"label": true,
|
|
9149
|
+
"source": "consuming project A — a seed paraphrased and anonymised (C7)",
|
|
9150
|
+
"pitch": "# Pitch — pay with a gift card\n\n## Problem\n\nBuyers holding a gift card can't use it online; support redeems them by hand.\n\n## Shape\n\nA \"Gift card\" field at checkout. The code is checked, its balance applied to the order, and any remainder is paid the\nusual way. Gift cards are still issued by the shop admin in the back office; selling them as a product is out of v1.\n\n## Acceptance criteria\n- Paying a 500 MXN order with a card worth 200 MXN applies 200 and asks for 300 by the usual payment method; the card's balance becomes 0.\n- Checkout is intuitive.",
|
|
9151
|
+
"claims": {
|
|
9152
|
+
"c1": "A buyer can pay part of an order with a gift card.",
|
|
9153
|
+
"c2": "Shoppers can buy gift cards in the shop as a product."
|
|
9154
|
+
},
|
|
9155
|
+
"criteria": {
|
|
9156
|
+
"a1": "Paying a 500 MXN order with a card worth 200 MXN applies 200 and asks for 300 by the usual payment method; the card's balance becomes 0.",
|
|
9157
|
+
"a2": "Checkout is intuitive."
|
|
9158
|
+
},
|
|
9159
|
+
"recorded": {
|
|
9160
|
+
"model": "jev-1.13.0",
|
|
9161
|
+
"answers": {
|
|
9162
|
+
"clar_a1": {
|
|
9163
|
+
"type": "score",
|
|
9164
|
+
"score": 2.93,
|
|
9165
|
+
"confidence": 0.93,
|
|
9166
|
+
"legend": {
|
|
9167
|
+
"0": "No: it states an aim or a quality (\"works well\", \"is clear\", \"feels fast\") with nothing anyone could observe.",
|
|
9168
|
+
"1": "Barely: it names what to look at, but not what counts as passing, so two testers would likely disagree.",
|
|
9169
|
+
"2": "Mostly: it names an action and an outcome but leaves one thing to judgement, such as a threshold, a wording or which case to try.",
|
|
9170
|
+
"3": "Yes: it names the action, where to do it and the exact result to observe, so two testers would agree."
|
|
9171
|
+
},
|
|
9172
|
+
"probabilities": {
|
|
9173
|
+
"0": 0,
|
|
9174
|
+
"1": 0,
|
|
9175
|
+
"2": 0.07,
|
|
9176
|
+
"3": 0.93
|
|
9177
|
+
}
|
|
9178
|
+
}
|
|
9179
|
+
}
|
|
9180
|
+
},
|
|
9181
|
+
"decision": {
|
|
9182
|
+
"value": true,
|
|
9183
|
+
"p": 0.977,
|
|
9184
|
+
"decider": "jev"
|
|
9185
|
+
}
|
|
9186
|
+
},
|
|
9187
|
+
{
|
|
9188
|
+
"id": "gift-cards-clarity-a2",
|
|
9189
|
+
"question": "clarity",
|
|
9190
|
+
"item": "a2",
|
|
9191
|
+
"label": false,
|
|
9192
|
+
"source": "consuming project A — a seed paraphrased and anonymised (C7)",
|
|
9193
|
+
"pitch": "# Pitch — pay with a gift card\n\n## Problem\n\nBuyers holding a gift card can't use it online; support redeems them by hand.\n\n## Shape\n\nA \"Gift card\" field at checkout. The code is checked, its balance applied to the order, and any remainder is paid the\nusual way. Gift cards are still issued by the shop admin in the back office; selling them as a product is out of v1.\n\n## Acceptance criteria\n- Paying a 500 MXN order with a card worth 200 MXN applies 200 and asks for 300 by the usual payment method; the card's balance becomes 0.\n- Checkout is intuitive.",
|
|
9194
|
+
"claims": {
|
|
9195
|
+
"c1": "A buyer can pay part of an order with a gift card.",
|
|
9196
|
+
"c2": "Shoppers can buy gift cards in the shop as a product."
|
|
9197
|
+
},
|
|
9198
|
+
"criteria": {
|
|
9199
|
+
"a1": "Paying a 500 MXN order with a card worth 200 MXN applies 200 and asks for 300 by the usual payment method; the card's balance becomes 0.",
|
|
9200
|
+
"a2": "Checkout is intuitive."
|
|
9201
|
+
},
|
|
9202
|
+
"recorded": {
|
|
9203
|
+
"model": "jev-1.13.0",
|
|
9204
|
+
"answers": {
|
|
9205
|
+
"clar_a2": {
|
|
9206
|
+
"type": "score",
|
|
9207
|
+
"score": 0.23,
|
|
9208
|
+
"confidence": 0.77,
|
|
9209
|
+
"legend": {
|
|
9210
|
+
"0": "No: it states an aim or a quality (\"works well\", \"is clear\", \"feels fast\") with nothing anyone could observe.",
|
|
9211
|
+
"1": "Barely: it names what to look at, but not what counts as passing, so two testers would likely disagree.",
|
|
9212
|
+
"2": "Mostly: it names an action and an outcome but leaves one thing to judgement, such as a threshold, a wording or which case to try.",
|
|
9213
|
+
"3": "Yes: it names the action, where to do it and the exact result to observe, so two testers would agree."
|
|
9214
|
+
},
|
|
9215
|
+
"probabilities": {
|
|
9216
|
+
"0": 0.78,
|
|
9217
|
+
"1": 0.22,
|
|
9218
|
+
"2": 0,
|
|
9219
|
+
"3": 0
|
|
9220
|
+
}
|
|
9221
|
+
}
|
|
9222
|
+
}
|
|
9223
|
+
},
|
|
9224
|
+
"decision": {
|
|
9225
|
+
"value": false,
|
|
9226
|
+
"p": 0.077,
|
|
9227
|
+
"decider": "jev"
|
|
9228
|
+
}
|
|
9229
|
+
},
|
|
9230
|
+
{
|
|
9231
|
+
"id": "gift-cards-coverage_out-a1",
|
|
9232
|
+
"question": "coverage_out",
|
|
9233
|
+
"item": "a1",
|
|
9234
|
+
"label": true,
|
|
9235
|
+
"source": "consuming project A — a seed paraphrased and anonymised (C7)",
|
|
9236
|
+
"pitch": "# Pitch — pay with a gift card\n\n## Problem\n\nBuyers holding a gift card can't use it online; support redeems them by hand.\n\n## Shape\n\nA \"Gift card\" field at checkout. The code is checked, its balance applied to the order, and any remainder is paid the\nusual way. Gift cards are still issued by the shop admin in the back office; selling them as a product is out of v1.\n\n## Acceptance criteria\n- Paying a 500 MXN order with a card worth 200 MXN applies 200 and asks for 300 by the usual payment method; the card's balance becomes 0.\n- Checkout is intuitive.",
|
|
9237
|
+
"claims": {
|
|
9238
|
+
"c1": "A buyer can pay part of an order with a gift card.",
|
|
9239
|
+
"c2": "Shoppers can buy gift cards in the shop as a product."
|
|
9240
|
+
},
|
|
9241
|
+
"criteria": {
|
|
9242
|
+
"a1": "Paying a 500 MXN order with a card worth 200 MXN applies 200 and asks for 300 by the usual payment method; the card's balance becomes 0.",
|
|
9243
|
+
"a2": "Checkout is intuitive."
|
|
9244
|
+
},
|
|
9245
|
+
"recorded": {
|
|
9246
|
+
"model": "jev-1.13.0",
|
|
9247
|
+
"answers": {
|
|
9248
|
+
"out_a1": {
|
|
9249
|
+
"type": "noul",
|
|
9250
|
+
"noul": 0.86
|
|
9251
|
+
}
|
|
9252
|
+
}
|
|
9253
|
+
},
|
|
9254
|
+
"decision": {
|
|
9255
|
+
"value": true,
|
|
9256
|
+
"p": 0.86,
|
|
9257
|
+
"decider": "jev"
|
|
9258
|
+
}
|
|
9259
|
+
}
|
|
7870
9260
|
]
|
|
7871
9261
|
}
|