* fix(#4656): expose coverage.unclassified and widen the zero-applicable guards * fix(#4656): regenerate golden coverage fixtures and update the rollup pin Emitted-Drift-Ack-Growth: spec-phase.md — #4656: guard widened to the all-unclassified case, doc claim corrected Emitted-Drift-Ack-Growth: ui-phase.md — #4656: guard widened identically * fix(#4656): sync edge-probe doc blocks and coverage pins with the new field * fix(#4656): key the mandatory confirmation on the widened guard * docs(#4656): backfill changeset PR number --------- Co-authored-by: sim <sim@local>
This commit is contained in:
@@ -1,7 +1,32 @@
|
||||
{
|
||||
"items": [
|
||||
{ "requirement_id": "R1", "category": "boundary", "status": "unresolved", "verification": null, "resolution": null, "reason": null, "probe": "What happens exactly at each min/max/threshold — and one step either side?" },
|
||||
{ "requirement_id": "R1", "category": "precision", "status": "unresolved", "verification": null, "resolution": null, "reason": null, "probe": "Where can precision loss, overflow, or rounding/tie-breaking occur — and what is the exact contract (e.g. half-up vs half-to-even, ceil/floor/truncate)?" }
|
||||
{
|
||||
"requirement_id": "R1",
|
||||
"category": "boundary",
|
||||
"status": "unresolved",
|
||||
"verification": null,
|
||||
"resolution": null,
|
||||
"reason": null,
|
||||
"probe": "What happens exactly at each min/max/threshold — and one step either side?"
|
||||
},
|
||||
{
|
||||
"requirement_id": "R1",
|
||||
"category": "precision",
|
||||
"status": "unresolved",
|
||||
"verification": null,
|
||||
"resolution": null,
|
||||
"reason": null,
|
||||
"probe": "Where can precision loss, overflow, or rounding/tie-breaking occur — and what is the exact contract (e.g. half-up vs half-to-even, ceil/floor/truncate)?"
|
||||
}
|
||||
],
|
||||
"coverage": { "applicable": 2, "resolved": 0, "unresolved": 2, "byVerification": { "explicit": 0, "backstop": 0 } }
|
||||
"coverage": {
|
||||
"applicable": 2,
|
||||
"resolved": 0,
|
||||
"unresolved": 2,
|
||||
"unclassified": 0,
|
||||
"byVerification": {
|
||||
"explicit": 0,
|
||||
"backstop": 0
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,41 @@
|
||||
{
|
||||
"items": [
|
||||
{ "requirement_id": "R1", "category": "adjacency", "status": "unresolved", "verification": null, "resolution": null, "reason": null, "probe": "When two things are exactly equal or just touch, do they merge, collide, or separate?" },
|
||||
{ "requirement_id": "R1", "category": "empty", "status": "unresolved", "verification": null, "resolution": null, "reason": null, "probe": "What is the result for empty, single-element, or null input?" },
|
||||
{ "requirement_id": "R1", "category": "ordering", "status": "unresolved", "verification": null, "resolution": null, "reason": null, "probe": "When elements compare equal, is output order specified and stable?" }
|
||||
{
|
||||
"requirement_id": "R1",
|
||||
"category": "adjacency",
|
||||
"status": "unresolved",
|
||||
"verification": null,
|
||||
"resolution": null,
|
||||
"reason": null,
|
||||
"probe": "When two things are exactly equal or just touch, do they merge, collide, or separate?"
|
||||
},
|
||||
{
|
||||
"requirement_id": "R1",
|
||||
"category": "empty",
|
||||
"status": "unresolved",
|
||||
"verification": null,
|
||||
"resolution": null,
|
||||
"reason": null,
|
||||
"probe": "What is the result for empty, single-element, or null input?"
|
||||
},
|
||||
{
|
||||
"requirement_id": "R1",
|
||||
"category": "ordering",
|
||||
"status": "unresolved",
|
||||
"verification": null,
|
||||
"resolution": null,
|
||||
"reason": null,
|
||||
"probe": "When elements compare equal, is output order specified and stable?"
|
||||
}
|
||||
],
|
||||
"coverage": { "applicable": 3, "resolved": 0, "unresolved": 3, "byVerification": { "explicit": 0, "backstop": 0 } }
|
||||
"coverage": {
|
||||
"applicable": 3,
|
||||
"resolved": 0,
|
||||
"unresolved": 3,
|
||||
"unclassified": 0,
|
||||
"byVerification": {
|
||||
"explicit": 0,
|
||||
"backstop": 0
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,32 @@
|
||||
{
|
||||
"items": [
|
||||
{ "requirement_id": "R1", "category": "empty", "status": "unresolved", "verification": null, "resolution": null, "reason": null, "probe": "What is the result for empty, single-element, or null input?" },
|
||||
{ "requirement_id": "R1", "category": "encoding", "status": "unresolved", "verification": null, "resolution": null, "reason": null, "probe": "Whose definition of length/equality applies — bytes, code points, grapheme clusters, or normalized form?" }
|
||||
{
|
||||
"requirement_id": "R1",
|
||||
"category": "empty",
|
||||
"status": "unresolved",
|
||||
"verification": null,
|
||||
"resolution": null,
|
||||
"reason": null,
|
||||
"probe": "What is the result for empty, single-element, or null input?"
|
||||
},
|
||||
{
|
||||
"requirement_id": "R1",
|
||||
"category": "encoding",
|
||||
"status": "unresolved",
|
||||
"verification": null,
|
||||
"resolution": null,
|
||||
"reason": null,
|
||||
"probe": "Whose definition of length/equality applies — bytes, code points, grapheme clusters, or normalized form?"
|
||||
}
|
||||
],
|
||||
"coverage": { "applicable": 2, "resolved": 0, "unresolved": 2, "byVerification": { "explicit": 0, "backstop": 0 } }
|
||||
"coverage": {
|
||||
"applicable": 2,
|
||||
"resolved": 0,
|
||||
"unresolved": 2,
|
||||
"unclassified": 0,
|
||||
"byVerification": {
|
||||
"explicit": 0,
|
||||
"backstop": 0
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,32 @@
|
||||
{
|
||||
"items": [
|
||||
{ "requirement_id": "R1", "category": "boundary", "status": "unresolved", "verification": null, "resolution": null, "reason": null, "probe": "What happens exactly at each min/max/threshold — and one step either side?" },
|
||||
{ "requirement_id": "R1", "category": "precision", "status": "unresolved", "verification": null, "resolution": null, "reason": null, "probe": "Where can precision loss, overflow, or rounding/tie-breaking occur — and what is the exact contract (e.g. half-up vs half-to-even, ceil/floor/truncate)?" }
|
||||
{
|
||||
"requirement_id": "R1",
|
||||
"category": "boundary",
|
||||
"status": "unresolved",
|
||||
"verification": null,
|
||||
"resolution": null,
|
||||
"reason": null,
|
||||
"probe": "What happens exactly at each min/max/threshold — and one step either side?"
|
||||
},
|
||||
{
|
||||
"requirement_id": "R1",
|
||||
"category": "precision",
|
||||
"status": "unresolved",
|
||||
"verification": null,
|
||||
"resolution": null,
|
||||
"reason": null,
|
||||
"probe": "Where can precision loss, overflow, or rounding/tie-breaking occur — and what is the exact contract (e.g. half-up vs half-to-even, ceil/floor/truncate)?"
|
||||
}
|
||||
],
|
||||
"coverage": { "applicable": 2, "resolved": 0, "unresolved": 2, "byVerification": { "explicit": 0, "backstop": 0 } }
|
||||
"coverage": {
|
||||
"applicable": 2,
|
||||
"resolved": 0,
|
||||
"unresolved": 2,
|
||||
"unclassified": 0,
|
||||
"byVerification": {
|
||||
"explicit": 0,
|
||||
"backstop": 0
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,41 @@
|
||||
{
|
||||
"items": [
|
||||
{ "requirement_id": "R1", "category": "adjacency", "status": "unresolved", "verification": null, "resolution": null, "reason": null, "probe": "When two things are exactly equal or just touch, do they merge, collide, or separate?" },
|
||||
{ "requirement_id": "R1", "category": "empty", "status": "unresolved", "verification": null, "resolution": null, "reason": null, "probe": "What is the result for empty, single-element, or null input?" },
|
||||
{ "requirement_id": "R1", "category": "ordering", "status": "unresolved", "verification": null, "resolution": null, "reason": null, "probe": "When elements compare equal, is output order specified and stable?" }
|
||||
{
|
||||
"requirement_id": "R1",
|
||||
"category": "adjacency",
|
||||
"status": "unresolved",
|
||||
"verification": null,
|
||||
"resolution": null,
|
||||
"reason": null,
|
||||
"probe": "When two things are exactly equal or just touch, do they merge, collide, or separate?"
|
||||
},
|
||||
{
|
||||
"requirement_id": "R1",
|
||||
"category": "empty",
|
||||
"status": "unresolved",
|
||||
"verification": null,
|
||||
"resolution": null,
|
||||
"reason": null,
|
||||
"probe": "What is the result for empty, single-element, or null input?"
|
||||
},
|
||||
{
|
||||
"requirement_id": "R1",
|
||||
"category": "ordering",
|
||||
"status": "unresolved",
|
||||
"verification": null,
|
||||
"resolution": null,
|
||||
"reason": null,
|
||||
"probe": "When elements compare equal, is output order specified and stable?"
|
||||
}
|
||||
],
|
||||
"coverage": { "applicable": 3, "resolved": 0, "unresolved": 3, "byVerification": { "explicit": 0, "backstop": 0 } }
|
||||
"coverage": {
|
||||
"applicable": 3,
|
||||
"resolved": 0,
|
||||
"unresolved": 3,
|
||||
"unclassified": 0,
|
||||
"byVerification": {
|
||||
"explicit": 0,
|
||||
"backstop": 0
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,41 @@
|
||||
{
|
||||
"items": [
|
||||
{ "requirement_id": "R1", "category": "adjacency", "status": "resolved", "verification": "explicit", "resolution": "AC#6: touching intervals merge", "reason": null, "probe": "When two things are exactly equal or just touch, do they merge, collide, or separate?" },
|
||||
{ "requirement_id": "R1", "category": "empty", "status": "unresolved", "verification": null, "resolution": null, "reason": null, "probe": "What is the result for empty, single-element, or null input?" },
|
||||
{ "requirement_id": "R1", "category": "ordering", "status": "dismissed", "verification": null, "resolution": null, "reason": "output is canonically sorted; no tie possible", "probe": "When elements compare equal, is output order specified and stable?" }
|
||||
{
|
||||
"requirement_id": "R1",
|
||||
"category": "adjacency",
|
||||
"status": "resolved",
|
||||
"verification": "explicit",
|
||||
"resolution": "AC#6: touching intervals merge",
|
||||
"reason": null,
|
||||
"probe": "When two things are exactly equal or just touch, do they merge, collide, or separate?"
|
||||
},
|
||||
{
|
||||
"requirement_id": "R1",
|
||||
"category": "empty",
|
||||
"status": "unresolved",
|
||||
"verification": null,
|
||||
"resolution": null,
|
||||
"reason": null,
|
||||
"probe": "What is the result for empty, single-element, or null input?"
|
||||
},
|
||||
{
|
||||
"requirement_id": "R1",
|
||||
"category": "ordering",
|
||||
"status": "dismissed",
|
||||
"verification": null,
|
||||
"resolution": null,
|
||||
"reason": "output is canonically sorted; no tie possible",
|
||||
"probe": "When elements compare equal, is output order specified and stable?"
|
||||
}
|
||||
],
|
||||
"coverage": { "applicable": 3, "resolved": 2, "unresolved": 1, "byVerification": { "explicit": 1, "backstop": 0 } }
|
||||
"coverage": {
|
||||
"applicable": 3,
|
||||
"resolved": 2,
|
||||
"unresolved": 1,
|
||||
"unclassified": 0,
|
||||
"byVerification": {
|
||||
"explicit": 1,
|
||||
"backstop": 0
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -169,11 +169,44 @@ resolutions supplied, every applicable edge is `unresolved`:
|
||||
```json edge-probe:02-merge-intervals/expected-coverage.json
|
||||
{
|
||||
"items": [
|
||||
{ "requirement_id": "R1", "category": "adjacency", "status": "unresolved", "verification": null, "resolution": null, "reason": null, "probe": "When two things are exactly equal or just touch, do they merge, collide, or separate?" },
|
||||
{ "requirement_id": "R1", "category": "empty", "status": "unresolved", "verification": null, "resolution": null, "reason": null, "probe": "What is the result for empty, single-element, or null input?" },
|
||||
{ "requirement_id": "R1", "category": "ordering", "status": "unresolved", "verification": null, "resolution": null, "reason": null, "probe": "When elements compare equal, is output order specified and stable?" }
|
||||
{
|
||||
"requirement_id": "R1",
|
||||
"category": "adjacency",
|
||||
"status": "unresolved",
|
||||
"verification": null,
|
||||
"resolution": null,
|
||||
"reason": null,
|
||||
"probe": "When two things are exactly equal or just touch, do they merge, collide, or separate?"
|
||||
},
|
||||
{
|
||||
"requirement_id": "R1",
|
||||
"category": "empty",
|
||||
"status": "unresolved",
|
||||
"verification": null,
|
||||
"resolution": null,
|
||||
"reason": null,
|
||||
"probe": "What is the result for empty, single-element, or null input?"
|
||||
},
|
||||
{
|
||||
"requirement_id": "R1",
|
||||
"category": "ordering",
|
||||
"status": "unresolved",
|
||||
"verification": null,
|
||||
"resolution": null,
|
||||
"reason": null,
|
||||
"probe": "When elements compare equal, is output order specified and stable?"
|
||||
}
|
||||
],
|
||||
"coverage": { "applicable": 3, "resolved": 0, "unresolved": 3, "byVerification": { "explicit": 0, "backstop": 0 } }
|
||||
"coverage": {
|
||||
"applicable": 3,
|
||||
"resolved": 0,
|
||||
"unresolved": 3,
|
||||
"unclassified": 0,
|
||||
"byVerification": {
|
||||
"explicit": 0,
|
||||
"backstop": 0
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
@@ -192,10 +225,35 @@ rule, the requirement classifies as `numeric-range`, which raises `boundary` and
|
||||
```json edge-probe:01-round-half-even/expected-coverage.json
|
||||
{
|
||||
"items": [
|
||||
{ "requirement_id": "R1", "category": "boundary", "status": "unresolved", "verification": null, "resolution": null, "reason": null, "probe": "What happens exactly at each min/max/threshold — and one step either side?" },
|
||||
{ "requirement_id": "R1", "category": "precision", "status": "unresolved", "verification": null, "resolution": null, "reason": null, "probe": "Where can precision loss, overflow, or rounding/tie-breaking occur — and what is the exact contract (e.g. half-up vs half-to-even, ceil/floor/truncate)?" }
|
||||
{
|
||||
"requirement_id": "R1",
|
||||
"category": "boundary",
|
||||
"status": "unresolved",
|
||||
"verification": null,
|
||||
"resolution": null,
|
||||
"reason": null,
|
||||
"probe": "What happens exactly at each min/max/threshold — and one step either side?"
|
||||
},
|
||||
{
|
||||
"requirement_id": "R1",
|
||||
"category": "precision",
|
||||
"status": "unresolved",
|
||||
"verification": null,
|
||||
"resolution": null,
|
||||
"reason": null,
|
||||
"probe": "Where can precision loss, overflow, or rounding/tie-breaking occur — and what is the exact contract (e.g. half-up vs half-to-even, ceil/floor/truncate)?"
|
||||
}
|
||||
],
|
||||
"coverage": { "applicable": 2, "resolved": 0, "unresolved": 2, "byVerification": { "explicit": 0, "backstop": 0 } }
|
||||
"coverage": {
|
||||
"applicable": 2,
|
||||
"resolved": 0,
|
||||
"unresolved": 2,
|
||||
"unclassified": 0,
|
||||
"byVerification": {
|
||||
"explicit": 0,
|
||||
"backstop": 0
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
@@ -211,10 +269,35 @@ the requirement classifies as `text`, which raises `empty` and `encoding`:
|
||||
```json edge-probe:03-truncate-graphemes/expected-coverage.json
|
||||
{
|
||||
"items": [
|
||||
{ "requirement_id": "R1", "category": "empty", "status": "unresolved", "verification": null, "resolution": null, "reason": null, "probe": "What is the result for empty, single-element, or null input?" },
|
||||
{ "requirement_id": "R1", "category": "encoding", "status": "unresolved", "verification": null, "resolution": null, "reason": null, "probe": "Whose definition of length/equality applies — bytes, code points, grapheme clusters, or normalized form?" }
|
||||
{
|
||||
"requirement_id": "R1",
|
||||
"category": "empty",
|
||||
"status": "unresolved",
|
||||
"verification": null,
|
||||
"resolution": null,
|
||||
"reason": null,
|
||||
"probe": "What is the result for empty, single-element, or null input?"
|
||||
},
|
||||
{
|
||||
"requirement_id": "R1",
|
||||
"category": "encoding",
|
||||
"status": "unresolved",
|
||||
"verification": null,
|
||||
"resolution": null,
|
||||
"reason": null,
|
||||
"probe": "Whose definition of length/equality applies — bytes, code points, grapheme clusters, or normalized form?"
|
||||
}
|
||||
],
|
||||
"coverage": { "applicable": 2, "resolved": 0, "unresolved": 2, "byVerification": { "explicit": 0, "backstop": 0 } }
|
||||
"coverage": {
|
||||
"applicable": 2,
|
||||
"resolved": 0,
|
||||
"unresolved": 2,
|
||||
"unclassified": 0,
|
||||
"byVerification": {
|
||||
"explicit": 0,
|
||||
"backstop": 0
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
@@ -231,10 +314,35 @@ classifies as `numeric-range`, which raises `boundary` and `precision`:
|
||||
```json edge-probe:04-money-rounding/expected-coverage.json
|
||||
{
|
||||
"items": [
|
||||
{ "requirement_id": "R1", "category": "boundary", "status": "unresolved", "verification": null, "resolution": null, "reason": null, "probe": "What happens exactly at each min/max/threshold — and one step either side?" },
|
||||
{ "requirement_id": "R1", "category": "precision", "status": "unresolved", "verification": null, "resolution": null, "reason": null, "probe": "Where can precision loss, overflow, or rounding/tie-breaking occur — and what is the exact contract (e.g. half-up vs half-to-even, ceil/floor/truncate)?" }
|
||||
{
|
||||
"requirement_id": "R1",
|
||||
"category": "boundary",
|
||||
"status": "unresolved",
|
||||
"verification": null,
|
||||
"resolution": null,
|
||||
"reason": null,
|
||||
"probe": "What happens exactly at each min/max/threshold — and one step either side?"
|
||||
},
|
||||
{
|
||||
"requirement_id": "R1",
|
||||
"category": "precision",
|
||||
"status": "unresolved",
|
||||
"verification": null,
|
||||
"resolution": null,
|
||||
"reason": null,
|
||||
"probe": "Where can precision loss, overflow, or rounding/tie-breaking occur — and what is the exact contract (e.g. half-up vs half-to-even, ceil/floor/truncate)?"
|
||||
}
|
||||
],
|
||||
"coverage": { "applicable": 2, "resolved": 0, "unresolved": 2, "byVerification": { "explicit": 0, "backstop": 0 } }
|
||||
"coverage": {
|
||||
"applicable": 2,
|
||||
"resolved": 0,
|
||||
"unresolved": 2,
|
||||
"unclassified": 0,
|
||||
"byVerification": {
|
||||
"explicit": 0,
|
||||
"backstop": 0
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
@@ -250,11 +358,44 @@ Given a requirement to deduplicate a list of items, the requirement classifies a
|
||||
```json edge-probe:05-list-dedupe/expected-coverage.json
|
||||
{
|
||||
"items": [
|
||||
{ "requirement_id": "R1", "category": "adjacency", "status": "unresolved", "verification": null, "resolution": null, "reason": null, "probe": "When two things are exactly equal or just touch, do they merge, collide, or separate?" },
|
||||
{ "requirement_id": "R1", "category": "empty", "status": "unresolved", "verification": null, "resolution": null, "reason": null, "probe": "What is the result for empty, single-element, or null input?" },
|
||||
{ "requirement_id": "R1", "category": "ordering", "status": "unresolved", "verification": null, "resolution": null, "reason": null, "probe": "When elements compare equal, is output order specified and stable?" }
|
||||
{
|
||||
"requirement_id": "R1",
|
||||
"category": "adjacency",
|
||||
"status": "unresolved",
|
||||
"verification": null,
|
||||
"resolution": null,
|
||||
"reason": null,
|
||||
"probe": "When two things are exactly equal or just touch, do they merge, collide, or separate?"
|
||||
},
|
||||
{
|
||||
"requirement_id": "R1",
|
||||
"category": "empty",
|
||||
"status": "unresolved",
|
||||
"verification": null,
|
||||
"resolution": null,
|
||||
"reason": null,
|
||||
"probe": "What is the result for empty, single-element, or null input?"
|
||||
},
|
||||
{
|
||||
"requirement_id": "R1",
|
||||
"category": "ordering",
|
||||
"status": "unresolved",
|
||||
"verification": null,
|
||||
"resolution": null,
|
||||
"reason": null,
|
||||
"probe": "When elements compare equal, is output order specified and stable?"
|
||||
}
|
||||
],
|
||||
"coverage": { "applicable": 3, "resolved": 0, "unresolved": 3, "byVerification": { "explicit": 0, "backstop": 0 } }
|
||||
"coverage": {
|
||||
"applicable": 3,
|
||||
"resolved": 0,
|
||||
"unresolved": 3,
|
||||
"unclassified": 0,
|
||||
"byVerification": {
|
||||
"explicit": 0,
|
||||
"backstop": 0
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
@@ -270,11 +411,44 @@ left unresolved:
|
||||
```json edge-probe:06-resolved-mixed/expected-coverage.json
|
||||
{
|
||||
"items": [
|
||||
{ "requirement_id": "R1", "category": "adjacency", "status": "resolved", "verification": "explicit", "resolution": "AC#6: touching intervals merge", "reason": null, "probe": "When two things are exactly equal or just touch, do they merge, collide, or separate?" },
|
||||
{ "requirement_id": "R1", "category": "empty", "status": "unresolved", "verification": null, "resolution": null, "reason": null, "probe": "What is the result for empty, single-element, or null input?" },
|
||||
{ "requirement_id": "R1", "category": "ordering", "status": "dismissed", "verification": null, "resolution": null, "reason": "output is canonically sorted; no tie possible", "probe": "When elements compare equal, is output order specified and stable?" }
|
||||
{
|
||||
"requirement_id": "R1",
|
||||
"category": "adjacency",
|
||||
"status": "resolved",
|
||||
"verification": "explicit",
|
||||
"resolution": "AC#6: touching intervals merge",
|
||||
"reason": null,
|
||||
"probe": "When two things are exactly equal or just touch, do they merge, collide, or separate?"
|
||||
},
|
||||
{
|
||||
"requirement_id": "R1",
|
||||
"category": "empty",
|
||||
"status": "unresolved",
|
||||
"verification": null,
|
||||
"resolution": null,
|
||||
"reason": null,
|
||||
"probe": "What is the result for empty, single-element, or null input?"
|
||||
},
|
||||
{
|
||||
"requirement_id": "R1",
|
||||
"category": "ordering",
|
||||
"status": "dismissed",
|
||||
"verification": null,
|
||||
"resolution": null,
|
||||
"reason": "output is canonically sorted; no tie possible",
|
||||
"probe": "When elements compare equal, is output order specified and stable?"
|
||||
}
|
||||
],
|
||||
"coverage": { "applicable": 3, "resolved": 2, "unresolved": 1, "byVerification": { "explicit": 1, "backstop": 0 } }
|
||||
"coverage": {
|
||||
"applicable": 3,
|
||||
"resolved": 2,
|
||||
"unresolved": 1,
|
||||
"unclassified": 0,
|
||||
"byVerification": {
|
||||
"explicit": 1,
|
||||
"backstop": 0
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
@@ -206,7 +206,10 @@ The SPEC keeps the original language — only `text_en` is translated, and requi
|
||||
Criteria you write from the resolved edges go into the SPEC in `response_language`). Populate
|
||||
`text_en` for **every** requirement, not only the ones that look edge-relevant: the
|
||||
`$APPLICABLE = 0` warning below fires only when *all* requirements are unclassified, so a
|
||||
partly-classified spec slips through with no signal at all. When `response_language` is unset
|
||||
partly-classified spec slips through with no signal at all. (#4656) The warning now ALSO
|
||||
fires on the all-unclassified case itself: `coverage.unclassified` counts the soft-signal
|
||||
rows, and the guard below fires when `$UNCLASSIFIED = $APPLICABLE` — the case where the
|
||||
classifier learned nothing about ANY requirement. When `response_language` is unset
|
||||
(an English-language project), omit `text_en` — `text` is already English and the engine
|
||||
falls back to it automatically (`text_en ?? text`).
|
||||
If a requirement still classifies to zero shapes with `text_en` populated, it carries no cue in
|
||||
@@ -315,12 +318,15 @@ echo "### (end edge-probe coverage report)"
|
||||
# applicable:0. Surface it loudly; the author must explicitly confirm "no applicable edges"
|
||||
# below rather than silently emitting a green empty ## Edge Coverage section.
|
||||
APPLICABLE=$(printf '%s' "$COVERAGE" | node -e 'let s="";process.stdin.on("data",d=>s+=d).on("end",()=>{let n=0;try{n=JSON.parse(s).coverage.applicable}catch{n=0}process.stdout.write(String(n))})')
|
||||
if [ "$APPLICABLE" = "0" ]; then
|
||||
UNCLASSIFIED=$(printf '%s' "$COVERAGE" | node -e 'let s="";process.stdin.on("data",d=>s+=d).on("end",()=>{let n=0;try{n=JSON.parse(s).coverage.unclassified}catch{n=0}process.stdout.write(String(n))})')
|
||||
# #4656: all-unclassified is the accidental-miss case the applicable:0 guard could never
|
||||
# reach — #1110's soft-signal rows make applicable non-zero by construction there.
|
||||
if [ "$APPLICABLE" = "0" ] || [ "$UNCLASSIFIED" = "$APPLICABLE" ]; then
|
||||
echo "WARNING: edge-probe proposed ZERO applicable edges across all requirements — likely a classification miss or malformed requirements, not a genuinely edge-free spec. Do NOT silently write an empty Edge Coverage section." >&2
|
||||
fi
|
||||
```
|
||||
|
||||
If `$APPLICABLE` is `0`, do NOT proceed silently: ask the author to confirm via AskUserQuestion
|
||||
If the guard above fired (`$APPLICABLE` is `0`, or every requirement is unclassified — `$UNCLASSIFIED = $APPLICABLE`, #4656), do NOT proceed silently: ask the author to confirm via AskUserQuestion
|
||||
("The edge probe found no applicable edges for any requirement — is this genuinely an
|
||||
edge-free spec, or should we revisit the requirement wording / authored shapes?"). Only write
|
||||
an empty `## Edge Coverage` section after explicit confirmation.
|
||||
|
||||
@@ -385,12 +385,14 @@ fi
|
||||
# Zero-applicable guard: a report where NO category applied across ANY element is far more likely a
|
||||
# classification miss (or malformed elements) than a genuinely state-free UI. Surface it loudly.
|
||||
APPLICABLE=$(printf '%s' "$COVERAGE" | node -e 'let s="";process.stdin.on("data",d=>s+=d).on("end",()=>{let n=0;try{n=JSON.parse(s).coverage.applicable}catch{n=0}process.stdout.write(String(n))})')
|
||||
if [ "$APPLICABLE" = "0" ]; then
|
||||
UNCLASSIFIED=$(printf '%s' "$COVERAGE" | node -e 'let s="";process.stdin.on("data",d=>s+=d).on("end",()=>{let n=0;try{n=JSON.parse(s).coverage.unclassified}catch{n=0}process.stdout.write(String(n))})')
|
||||
# #4656: all-unclassified reads as a non-zero applicable — widen the guard to fire there too.
|
||||
if [ "$APPLICABLE" = "0" ] || [ "$UNCLASSIFIED" = "$APPLICABLE" ]; then
|
||||
echo "WARNING: ui-consideration-probe proposed ZERO applicable categories across all elements — likely a classification miss or malformed elements, not a genuinely state-free UI. Do NOT silently write an empty UI Considerations section." >&2
|
||||
fi
|
||||
```
|
||||
|
||||
If `$APPLICABLE` is `0`, do NOT proceed silently: ask via AskUserQuestion ("The UI probe found no
|
||||
If the guard above fired (`$APPLICABLE` is `0`, or every element is unclassified — `$UNCLASSIFIED = $APPLICABLE`, #4656), do NOT proceed silently: ask via AskUserQuestion ("The UI probe found no
|
||||
applicable state considerations — is this genuinely a state-free surface, or should we revisit the
|
||||
element descriptions?"). Only write an empty section after explicit confirmation.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user