docguard-cli 0.37.1 → 0.39.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/README.md +7 -5
- package/cli/commands/feedback.mjs +147 -6
- package/cli/commands/reconcile.mjs +42 -0
- package/cli/commands/retire.mjs +11 -15
- package/cli/commands/specs.mjs +198 -3
- package/cli/commands/sync.mjs +16 -44
- package/cli/docguard.mjs +51 -6
- package/cli/feedback-fixture.mjs +188 -0
- package/cli/scanners/document-lifecycle.mjs +19 -43
- package/cli/scanners/lifecycle-context.mjs +50 -0
- package/cli/scanners/reconciliation.mjs +141 -0
- package/cli/scanners/requirement-evidence.mjs +41 -8
- package/cli/scanners/retirement-manifest.mjs +52 -0
- package/cli/scanners/spec-registry.mjs +36 -9
- package/cli/shared-sync-scope.mjs +35 -0
- package/cli/validators/security.mjs +5 -4
- package/cli/validators/traceability.mjs +2 -1
- package/cli/writers/file-transaction.mjs +85 -0
- package/cli/writers/spec-outcomes.mjs +27 -0
- package/extensions/spec-kit-docguard/README.md +6 -2
- package/extensions/spec-kit-docguard/commands/complete.md +38 -0
- package/extensions/spec-kit-docguard/extension.yml +20 -4
- package/extensions/spec-kit-docguard/skills/docguard-fix/SKILL.md +2 -2
- package/extensions/spec-kit-docguard/skills/docguard-guard/SKILL.md +2 -2
- package/extensions/spec-kit-docguard/skills/docguard-review/SKILL.md +2 -2
- package/extensions/spec-kit-docguard/skills/docguard-score/SKILL.md +2 -2
- package/extensions/spec-kit-docguard/skills/docguard-sync/SKILL.md +2 -2
- package/extensions/spec-kit-docguard/templates/extensions.yml +16 -0
- package/extensions/spec-kit-docguard/templates/github-workflows/docguard-guard.yml +1 -1
- package/package.json +2 -1
- package/schemas/docguard-benchmark.schema.json +84 -0
- package/schemas/docguard-feedback-fixture.schema.json +54 -0
- package/schemas/docguard-specs.schema.json +19 -2
- package/templates/ci/github-actions.yml +1 -1
- package/templates/feedback-fixture.json +18 -0
|
@@ -3,7 +3,7 @@ schema_version: "1.0"
|
|
|
3
3
|
extension:
|
|
4
4
|
id: "docguard"
|
|
5
5
|
name: "DocGuard — CDD Enforcement"
|
|
6
|
-
version: "0.
|
|
6
|
+
version: "0.39.0"
|
|
7
7
|
description: "Canonical-Driven Development enforcement as a true spec-kit extension. LLM-first design with automated validators, 5 AI behavior skills, spec-kit skill chaining, and workflow hooks. One pinned runtime dependency (@babel/parser); pure Node.js otherwise."
|
|
8
8
|
author: "Ricardo Accioly"
|
|
9
9
|
repository: "https://github.com/raccioly/docguard"
|
|
@@ -57,6 +57,10 @@ provides:
|
|
|
57
57
|
file: "commands/preflight.md"
|
|
58
58
|
description: "Gate a generated specification against registry integrity and prior intent"
|
|
59
59
|
|
|
60
|
+
- name: "speckit.docguard.complete"
|
|
61
|
+
file: "commands/complete.md"
|
|
62
|
+
description: "Plan the reviewed implemented-to-verified lifecycle transaction"
|
|
63
|
+
|
|
60
64
|
# GitHub Actions workflow starters — copyable templates users drop into
|
|
61
65
|
# .github/workflows/ for guard/fix/sync/score integration.
|
|
62
66
|
workflows:
|
|
@@ -88,9 +92,21 @@ hooks:
|
|
|
88
92
|
description: "Load current spec intent and block specification on stale lifecycle state"
|
|
89
93
|
|
|
90
94
|
after_implement:
|
|
91
|
-
command: "speckit.docguard.guard"
|
|
92
|
-
|
|
93
|
-
|
|
95
|
+
- command: "speckit.docguard.guard"
|
|
96
|
+
optional: false
|
|
97
|
+
priority: 5
|
|
98
|
+
description: "Quality gate — ensures docs stay in sync with code"
|
|
99
|
+
- command: "speckit.docguard.complete"
|
|
100
|
+
optional: true
|
|
101
|
+
priority: 10
|
|
102
|
+
prompt: "Review evidence and plan this spec's completion transaction?"
|
|
103
|
+
description: "Plan lifecycle verification after implementation"
|
|
104
|
+
|
|
105
|
+
after_converge:
|
|
106
|
+
command: "speckit.docguard.complete"
|
|
107
|
+
optional: true
|
|
108
|
+
prompt: "Review evidence and plan this converged spec's completion transaction?"
|
|
109
|
+
description: "Plan lifecycle verification after convergence"
|
|
94
110
|
|
|
95
111
|
before_tasks:
|
|
96
112
|
command: "speckit.docguard.preflight"
|
|
@@ -6,10 +6,10 @@ description: AI-driven documentation repair with structured research workflow, t
|
|
|
6
6
|
compatibility: Requires DocGuard CLI installed (npm i -g docguard-cli or npx docguard-cli)
|
|
7
7
|
metadata:
|
|
8
8
|
author: docguard
|
|
9
|
-
version: 0.
|
|
9
|
+
version: 0.39.0
|
|
10
10
|
source: extensions/spec-kit-docguard/skills/docguard-fix
|
|
11
11
|
---
|
|
12
|
-
<!-- docguard:version: 0.
|
|
12
|
+
<!-- docguard:version: 0.39.0 -->
|
|
13
13
|
|
|
14
14
|
# DocGuard Fix Skill
|
|
15
15
|
|
|
@@ -7,10 +7,10 @@ description: Run DocGuard guard validation against Canonical-Driven Development
|
|
|
7
7
|
compatibility: Requires DocGuard CLI installed (npm i -g docguard-cli or npx docguard-cli)
|
|
8
8
|
metadata:
|
|
9
9
|
author: docguard
|
|
10
|
-
version: 0.
|
|
10
|
+
version: 0.39.0
|
|
11
11
|
source: extensions/spec-kit-docguard/skills/docguard-guard
|
|
12
12
|
---
|
|
13
|
-
<!-- docguard:version: 0.
|
|
13
|
+
<!-- docguard:version: 0.39.0 -->
|
|
14
14
|
|
|
15
15
|
# DocGuard Guard Skill
|
|
16
16
|
|
|
@@ -6,10 +6,10 @@ description: Cross-document consistency analysis and quality assessment. Perform
|
|
|
6
6
|
compatibility: Requires DocGuard CLI installed (npm i -g docguard-cli or npx docguard-cli)
|
|
7
7
|
metadata:
|
|
8
8
|
author: docguard
|
|
9
|
-
version: 0.
|
|
9
|
+
version: 0.39.0
|
|
10
10
|
source: extensions/spec-kit-docguard/skills/docguard-review
|
|
11
11
|
---
|
|
12
|
-
<!-- docguard:version: 0.
|
|
12
|
+
<!-- docguard:version: 0.39.0 -->
|
|
13
13
|
|
|
14
14
|
# DocGuard Review Skill
|
|
15
15
|
|
|
@@ -6,10 +6,10 @@ description: CDD maturity assessment with category-aware improvement roadmap. Ru
|
|
|
6
6
|
compatibility: Requires DocGuard CLI installed (npm i -g docguard-cli or npx docguard-cli)
|
|
7
7
|
metadata:
|
|
8
8
|
author: docguard
|
|
9
|
-
version: 0.
|
|
9
|
+
version: 0.39.0
|
|
10
10
|
source: extensions/spec-kit-docguard/skills/docguard-score
|
|
11
11
|
---
|
|
12
|
-
<!-- docguard:version: 0.
|
|
12
|
+
<!-- docguard:version: 0.39.0 -->
|
|
13
13
|
|
|
14
14
|
# DocGuard Score Skill
|
|
15
15
|
|
|
@@ -4,10 +4,10 @@ description: Keep canonical documentation ALWAYS UP TO DATE. Refreshes code-trut
|
|
|
4
4
|
compatibility: Requires DocGuard CLI installed (npm i -g docguard-cli or npx docguard-cli)
|
|
5
5
|
metadata:
|
|
6
6
|
author: docguard
|
|
7
|
-
version: 0.
|
|
7
|
+
version: 0.39.0
|
|
8
8
|
source: extensions/spec-kit-docguard/skills/docguard-sync
|
|
9
9
|
---
|
|
10
|
-
<!-- docguard:version: 0.
|
|
10
|
+
<!-- docguard:version: 0.39.0 -->
|
|
11
11
|
|
|
12
12
|
# DocGuard Sync Skill
|
|
13
13
|
|
|
@@ -26,6 +26,22 @@ hooks:
|
|
|
26
26
|
description: "Validate documentation passes CDD standards after implementation"
|
|
27
27
|
enabled: true
|
|
28
28
|
optional: false
|
|
29
|
+
priority: 5
|
|
30
|
+
- extension: docguard
|
|
31
|
+
command: speckit.docguard.complete
|
|
32
|
+
description: "Plan reviewed lifecycle verification after implementation"
|
|
33
|
+
enabled: true
|
|
34
|
+
optional: true
|
|
35
|
+
priority: 10
|
|
36
|
+
prompt: "Review evidence and plan this spec's completion transaction?"
|
|
37
|
+
|
|
38
|
+
after_converge:
|
|
39
|
+
- extension: docguard
|
|
40
|
+
command: speckit.docguard.complete
|
|
41
|
+
description: "Plan reviewed lifecycle verification after convergence"
|
|
42
|
+
enabled: true
|
|
43
|
+
optional: true
|
|
44
|
+
prompt: "Review evidence and plan this converged spec's completion transaction?"
|
|
29
45
|
|
|
30
46
|
# Gate the generated spec before /speckit.tasks creates implementation work.
|
|
31
47
|
before_tasks:
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "docguard-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.39.0",
|
|
4
4
|
"description": "The enforcement tool for Canonical-Driven Development (CDD). Audit, generate, and guard your project documentation.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
"guard": "node cli/docguard.mjs guard",
|
|
13
13
|
"init": "node cli/docguard.mjs init",
|
|
14
14
|
"score": "node cli/docguard.mjs score",
|
|
15
|
+
"benchmark": "node benchmarks/run.mjs",
|
|
15
16
|
"diff": "node cli/docguard.mjs diff",
|
|
16
17
|
"generate": "node cli/docguard.mjs generate",
|
|
17
18
|
"hooks": "node cli/docguard.mjs hooks",
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://raccioly.github.io/docguard/schemas/docguard-benchmark.schema.json",
|
|
4
|
+
"title": "DocGuard benchmark corpus",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"additionalProperties": false,
|
|
7
|
+
"required": ["$schema", "schemaVersion", "cases"],
|
|
8
|
+
"properties": {
|
|
9
|
+
"$schema": { "const": "https://raccioly.github.io/docguard/schemas/docguard-benchmark.schema.json" },
|
|
10
|
+
"schemaVersion": { "const": 1 },
|
|
11
|
+
"cases": {
|
|
12
|
+
"type": "array",
|
|
13
|
+
"minItems": 1,
|
|
14
|
+
"items": { "$ref": "#/$defs/case" }
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"$defs": {
|
|
18
|
+
"identity": { "type": "string", "pattern": "^[A-Z]{3}[0-9]{3}@[^/\\\\][^\\\\]*$" },
|
|
19
|
+
"source": {
|
|
20
|
+
"oneOf": [
|
|
21
|
+
{
|
|
22
|
+
"type": "object",
|
|
23
|
+
"additionalProperties": false,
|
|
24
|
+
"required": ["kind", "path"],
|
|
25
|
+
"properties": {
|
|
26
|
+
"kind": { "const": "fixture" },
|
|
27
|
+
"path": { "type": "string", "pattern": "^fixtures/" }
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"type": "object",
|
|
32
|
+
"additionalProperties": false,
|
|
33
|
+
"required": ["kind", "url", "revision", "license"],
|
|
34
|
+
"properties": {
|
|
35
|
+
"kind": { "const": "git" },
|
|
36
|
+
"url": { "type": "string", "pattern": "^https://[^@]+\\.git$" },
|
|
37
|
+
"revision": { "type": "string", "pattern": "^[0-9a-f]{40}([0-9a-f]{24})?$" },
|
|
38
|
+
"license": { "type": "string", "minLength": 1, "maxLength": 128 }
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
]
|
|
42
|
+
},
|
|
43
|
+
"mutation": {
|
|
44
|
+
"type": "object",
|
|
45
|
+
"additionalProperties": false,
|
|
46
|
+
"required": ["path", "find", "replace", "expectedOccurrences"],
|
|
47
|
+
"properties": {
|
|
48
|
+
"path": { "type": "string", "minLength": 1 },
|
|
49
|
+
"find": { "type": "string", "minLength": 1, "maxLength": 20000 },
|
|
50
|
+
"replace": { "type": "string", "maxLength": 20000 },
|
|
51
|
+
"expectedOccurrences": { "type": "integer", "minimum": 1, "maximum": 20 }
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
"case": {
|
|
55
|
+
"type": "object",
|
|
56
|
+
"additionalProperties": false,
|
|
57
|
+
"required": ["id", "split", "repositoryGroup", "causalFamily", "parserTier", "classification", "source", "scope", "expected", "forbidden", "repairOutcome"],
|
|
58
|
+
"properties": {
|
|
59
|
+
"id": { "type": "string", "pattern": "^[a-z0-9][a-z0-9._-]{2,127}$" },
|
|
60
|
+
"split": { "enum": ["development", "evaluation"] },
|
|
61
|
+
"repositoryGroup": { "type": "string", "minLength": 1, "maxLength": 128 },
|
|
62
|
+
"causalFamily": { "type": "string", "minLength": 1, "maxLength": 128 },
|
|
63
|
+
"parserTier": { "enum": ["js-ast", "py-ast", "regex-fallback", "fallback-language", "mixed", "not-applicable"] },
|
|
64
|
+
"classification": { "enum": ["defect", "clean_control", "ambiguous", "unsupported_syntax", "policy_disagreement"] },
|
|
65
|
+
"repairOutcome": { "enum": ["accepted", "rejected", "not_evaluated"] },
|
|
66
|
+
"source": { "$ref": "#/$defs/source" },
|
|
67
|
+
"scope": {
|
|
68
|
+
"type": "object",
|
|
69
|
+
"additionalProperties": false,
|
|
70
|
+
"required": ["validatorKey", "codes"],
|
|
71
|
+
"properties": {
|
|
72
|
+
"validatorKey": { "type": "string", "minLength": 1, "maxLength": 64 },
|
|
73
|
+
"codes": { "type": "array", "minItems": 1, "uniqueItems": true, "items": { "type": "string", "pattern": "^[A-Z]{3}[0-9]{3}$" } }
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
"config": { "type": "object" },
|
|
77
|
+
"mutations": { "type": "array", "items": { "$ref": "#/$defs/mutation" } },
|
|
78
|
+
"expected": { "type": "array", "uniqueItems": true, "items": { "$ref": "#/$defs/identity" } },
|
|
79
|
+
"forbidden": { "type": "array", "uniqueItems": true, "items": { "$ref": "#/$defs/identity" } },
|
|
80
|
+
"oppositeControl": { "type": ["string", "null"], "pattern": "^[a-z0-9][a-z0-9._-]{2,127}$" }
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://raccioly.github.io/docguard/schemas/docguard-feedback-fixture.schema.json",
|
|
4
|
+
"title": "DocGuard synthetic feedback fixture",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"additionalProperties": false,
|
|
7
|
+
"required": ["$schema", "schemaVersion", "classification", "detector", "parserTier", "config", "expectedIdentity", "interestingness", "fixture", "oppositeControl", "provenance"],
|
|
8
|
+
"properties": {
|
|
9
|
+
"$schema": { "const": "https://raccioly.github.io/docguard/schemas/docguard-feedback-fixture.schema.json" },
|
|
10
|
+
"schemaVersion": { "const": 1 },
|
|
11
|
+
"classification": { "enum": ["false_positive", "false_negative", "unsupported_syntax", "ambiguous", "policy_disagreement"] },
|
|
12
|
+
"detector": {
|
|
13
|
+
"type": "object", "additionalProperties": false, "required": ["code", "validator"],
|
|
14
|
+
"properties": { "code": { "type": "string", "pattern": "^[A-Z]{3}[0-9]{3}$" }, "validator": { "type": "string", "pattern": "^[A-Za-z][A-Za-z0-9]{1,63}$" } }
|
|
15
|
+
},
|
|
16
|
+
"parserTier": { "enum": ["js-ast", "py-ast", "regex-fallback", "fallback-language", "mixed", "not-applicable"] },
|
|
17
|
+
"config": { "type": "object" },
|
|
18
|
+
"expectedIdentity": { "type": "string", "pattern": "^[A-Z]{3}[0-9]{3}@.+$" },
|
|
19
|
+
"interestingness": {
|
|
20
|
+
"type": "object", "additionalProperties": false, "required": ["predicate"],
|
|
21
|
+
"properties": { "predicate": { "enum": ["finding_present", "finding_absent", "validator_unsupported"] } }
|
|
22
|
+
},
|
|
23
|
+
"fixture": { "$ref": "#/$defs/fileSet" },
|
|
24
|
+
"oppositeControl": { "$ref": "#/$defs/fileSet" },
|
|
25
|
+
"provenance": {
|
|
26
|
+
"type": "object", "additionalProperties": false, "required": ["synthetic", "redactionAttested"],
|
|
27
|
+
"properties": { "synthetic": { "const": true }, "redactionAttested": { "const": true } }
|
|
28
|
+
},
|
|
29
|
+
"contribution": {
|
|
30
|
+
"type": "object", "additionalProperties": false, "required": ["testOnly", "scopeDocumented", "benchmarkDelta"],
|
|
31
|
+
"properties": {
|
|
32
|
+
"testOnly": { "const": true }, "scopeDocumented": { "const": true },
|
|
33
|
+
"benchmarkDelta": {
|
|
34
|
+
"type": "object", "additionalProperties": false,
|
|
35
|
+
"required": ["falsePositives", "falseNegatives", "unsupportedCases", "abstainedSupportedCases"],
|
|
36
|
+
"properties": {
|
|
37
|
+
"falsePositives": { "type": "integer", "minimum": 0 }, "falseNegatives": { "type": "integer", "minimum": 0 },
|
|
38
|
+
"unsupportedCases": { "type": "integer", "minimum": 0 }, "abstainedSupportedCases": { "type": "integer", "minimum": 0 }
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
"$defs": {
|
|
45
|
+
"fileSet": {
|
|
46
|
+
"type": "object", "additionalProperties": false, "required": ["files"],
|
|
47
|
+
"properties": { "files": { "type": "array", "minItems": 1, "maxItems": 16, "items": { "$ref": "#/$defs/file" } } }
|
|
48
|
+
},
|
|
49
|
+
"file": {
|
|
50
|
+
"type": "object", "additionalProperties": false, "required": ["path", "content"],
|
|
51
|
+
"properties": { "path": { "type": "string", "minLength": 1 }, "content": { "type": "string", "maxLength": 131072 } }
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"required": ["$schema", "schemaVersion", "specs", "tombstones"],
|
|
9
9
|
"properties": {
|
|
10
10
|
"$schema": { "const": "https://raccioly.github.io/docguard/schemas/docguard-specs.schema.json" },
|
|
11
|
-
"schemaVersion": { "const":
|
|
11
|
+
"schemaVersion": { "const": 2 },
|
|
12
12
|
"specs": {
|
|
13
13
|
"type": "array",
|
|
14
14
|
"items": { "$ref": "#/definitions/spec" }
|
|
@@ -75,13 +75,18 @@
|
|
|
75
75
|
"reconciliation": {
|
|
76
76
|
"type": "object",
|
|
77
77
|
"additionalProperties": false,
|
|
78
|
-
"required": ["lastReviewedRevision"],
|
|
78
|
+
"required": ["lastReviewedRevision", "outcomes"],
|
|
79
79
|
"properties": {
|
|
80
80
|
"lastReviewedRevision": {
|
|
81
81
|
"anyOf": [
|
|
82
82
|
{ "type": "null" },
|
|
83
83
|
{ "type": "string", "pattern": "^[0-9a-f]{40}([0-9a-f]{24})?$" }
|
|
84
84
|
]
|
|
85
|
+
},
|
|
86
|
+
"outcomes": {
|
|
87
|
+
"type": "array",
|
|
88
|
+
"maxItems": 20,
|
|
89
|
+
"items": { "$ref": "#/definitions/outcome" }
|
|
85
90
|
}
|
|
86
91
|
}
|
|
87
92
|
}
|
|
@@ -96,6 +101,18 @@
|
|
|
96
101
|
"digest": { "type": "string", "pattern": "^sha256:[0-9a-f]{64}$" }
|
|
97
102
|
}
|
|
98
103
|
},
|
|
104
|
+
"outcome": {
|
|
105
|
+
"type": "object",
|
|
106
|
+
"additionalProperties": false,
|
|
107
|
+
"required": ["revision", "reason", "evidence", "deviations", "successor"],
|
|
108
|
+
"properties": {
|
|
109
|
+
"revision": { "type": "string", "pattern": "^[0-9a-f]{40}([0-9a-f]{24})?$" },
|
|
110
|
+
"reason": { "type": "string", "minLength": 1, "maxLength": 500 },
|
|
111
|
+
"evidence": { "type": "array", "maxItems": 100, "items": { "type": "string", "minLength": 1 } },
|
|
112
|
+
"deviations": { "type": "array", "maxItems": 20, "items": { "type": "string", "minLength": 1, "maxLength": 500 } },
|
|
113
|
+
"successor": { "anyOf": [{ "type": "null" }, { "$ref": "#/definitions/specId" }] }
|
|
114
|
+
}
|
|
115
|
+
},
|
|
99
116
|
"testEvidence": {
|
|
100
117
|
"type": "object",
|
|
101
118
|
"additionalProperties": false,
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://raccioly.github.io/docguard/schemas/docguard-feedback-fixture.schema.json",
|
|
3
|
+
"schemaVersion": 1,
|
|
4
|
+
"classification": "false_positive",
|
|
5
|
+
"detector": { "code": "SEC001", "validator": "security" },
|
|
6
|
+
"parserTier": "js-ast",
|
|
7
|
+
"config": { "profile": "starter", "diskCache": false, "validators": { "security": true } },
|
|
8
|
+
"expectedIdentity": "SEC001@src/case.js",
|
|
9
|
+
"interestingness": { "predicate": "finding_present" },
|
|
10
|
+
"fixture": { "files": [{ "path": "src/case.js", "content": "const password = \"validation message with several words\";\n" }] },
|
|
11
|
+
"oppositeControl": { "files": [{ "path": "src/case.js", "content": "const password = \"real-looking-password\";\n" }] },
|
|
12
|
+
"provenance": { "synthetic": true, "redactionAttested": true },
|
|
13
|
+
"contribution": {
|
|
14
|
+
"testOnly": true,
|
|
15
|
+
"scopeDocumented": true,
|
|
16
|
+
"benchmarkDelta": { "falsePositives": 0, "falseNegatives": 0, "unsupportedCases": 0, "abstainedSupportedCases": 0 }
|
|
17
|
+
}
|
|
18
|
+
}
|