@mrciphersmith/keryx 0.2.105 → 0.2.107
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 +6 -1
- package/dist/cli.js +1391 -841
- package/dist/core.js +1090 -963
- package/package.json +1 -1
- package/src/gdskills/bundled/skills/review/review-layout/SKILL.md +1 -1
- package/src/gdskills/bundled/skills/review/review-orchestrator/SKILL.md +2 -2
- package/src/gdskills/bundled/skills/review/review-orchestrator/reviewer-finding.schema.json +8 -0
- package/src/gdskills/contracts/review-finding.schema.json +34 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mrciphersmith/keryx",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.107",
|
|
4
4
|
"description": "Version-controlled project context for AI coding agents: code graph, architecture wiki, project memory, relevant tests, quality signals, and task flows.",
|
|
5
5
|
"private": false,
|
|
6
6
|
"publishConfig": {
|
|
@@ -227,7 +227,7 @@ Report done only once all of these hold:
|
|
|
227
227
|
- The measurement was taken at the worst real case — the longest translation in
|
|
228
228
|
the catalog, the narrowest supported host, the state where the sibling is
|
|
229
229
|
absent — not at the convenient one.
|
|
230
|
-
- Every finding names `file
|
|
230
|
+
- Every finding names the `file` of the component that renders the box and `quote`s the code it is about; `line` is derived at ingest from that quote, never counted.
|
|
231
231
|
- Every `blocker` and `major` carries `class_scope` with `sites` and an
|
|
232
232
|
`enumeration_method` naming the search that derived the set of elements sharing
|
|
233
233
|
the sizing shape.
|
|
@@ -1350,10 +1350,10 @@ Each reviewer must return a `REVIEW_RESULT` object matching `.metaproject/skills
|
|
|
1350
1350
|
|
|
1351
1351
|
Before consolidation, validate every reviewer result:
|
|
1352
1352
|
- Required status: `DONE`, `DONE_WITH_CONCERNS`, `NEEDS_CONTEXT`, or `BLOCKED`.
|
|
1353
|
-
- Required finding fields: id, severity, file,
|
|
1353
|
+
- Required finding fields: id, severity, file, `quote`, problem, impact, suggested_fix, evidence, confidence, reviewer. **`quote`, not `line`:** copy the code the finding is about verbatim out of `file` and do not count lines — `keryx review ingest` locates the quote at the round's head and derives `line` from where it matched, so a number reported here is overwritten. A model is poor at counting lines and good at repeating text it has just read; this asks only for the second. Quote enough to be unambiguous: a snippet appearing twice in the file is recorded `unlocatable` rather than anchored to the first hit. A finding about the round rather than a site carries neither.
|
|
1354
1354
|
- Every blocker must include evidence and a concrete suggested fix.
|
|
1355
1355
|
- Findings without evidence are downgraded to `info` or returned to the reviewer for clarification.
|
|
1356
|
-
- Duplicate findings are merged by `dedupe_key` or by `(file,
|
|
1356
|
+
- Duplicate findings are merged by `dedupe_key` or by `(file, quote, problem)`.
|
|
1357
1357
|
- `NEEDS_CONTEXT` triggers one targeted context refill. If still unresolved, keep it as an explicit open question, not as a blocker.
|
|
1358
1358
|
- If a reviewer exceeds `max_findings`, keep blockers/majors first and summarize lower severity findings.
|
|
1359
1359
|
|
|
@@ -74,12 +74,20 @@
|
|
|
74
74
|
]
|
|
75
75
|
},
|
|
76
76
|
"line": {
|
|
77
|
+
"description": "Do not count lines. Quote the code in `quote` instead and leave this null: `keryx review ingest` finds the quote in `file` and writes the line the match started on, overwriting anything reported here. A model is poor at counting lines and good at repeating text it has just read, and this asks it only for the second. Kept in the contract because a finding with nothing to quote — one about the round rather than a site — still has nowhere else to point.",
|
|
77
78
|
"type": [
|
|
78
79
|
"integer",
|
|
79
80
|
"null"
|
|
80
81
|
],
|
|
81
82
|
"minimum": 1
|
|
82
83
|
},
|
|
84
|
+
"quote": {
|
|
85
|
+
"description": "The code this finding is about, copied verbatim out of `file`. A few lines is enough — it is matched against the file at the round's head, exactly first and then with whitespace collapsed. A quote that appears in more than one place is recorded as `unlocatable` rather than anchored to the first hit, so quote enough to be unambiguous.",
|
|
86
|
+
"type": [
|
|
87
|
+
"string",
|
|
88
|
+
"null"
|
|
89
|
+
]
|
|
90
|
+
},
|
|
83
91
|
"problem": {
|
|
84
92
|
"type": "string"
|
|
85
93
|
},
|
|
@@ -100,7 +100,40 @@
|
|
|
100
100
|
"description": "Which repository `file` and `line` are in. Null, the default, means the repository under review. A cross-repo claim names the producer here and pins the ref it was read at in `evidence`; without this field a finding about another service's behaviour could not say where its evidence lived, so the rule that such a claim is `info` unless it has a `file:line` at a pinned ref could not be checked by anything but the reviewer's word. Declared in BOTH this schema and skills/review/review-orchestrator/reviewer-finding.schema.json: this one is additionalProperties:false, so a finding carrying `repo` is rejected here if only the reviewer-side schema knows about it."
|
|
101
101
|
},
|
|
102
102
|
"file": { "type": ["string", "null"] },
|
|
103
|
-
"line": {
|
|
103
|
+
"line": {
|
|
104
|
+
"title": "Where the finding points — DERIVED when the finding quotes code",
|
|
105
|
+
"description": "Reported by the reviewer only when there is nothing to quote. When `quote` is present this field is OUTPUT: `review ingest` finds the quote in `file` at the round's head and writes the line the match started on, overwriting whatever the reviewer said and recording both in `locator`. The reason is the failure it replaces — nothing compared a reported line to anything, so a number that had drifted travelled into findings.json, into the report, and into the disposition recorded against it. On a fix round the file has moved under the finding by construction, which is when the reported number is least trustworthy and most acted upon.",
|
|
106
|
+
"type": ["integer", "null"],
|
|
107
|
+
"minimum": 1
|
|
108
|
+
},
|
|
109
|
+
"quote": {
|
|
110
|
+
"title": "The code this finding is about, copied verbatim out of `file`",
|
|
111
|
+
"description": "What replaces asking the model for a line number: a model is poor at counting lines and good at repeating text it has just read. The quote is matched against `file` at the round's head — exactly first, then with whitespace collapsed, then not at all. A quote that matches in more than one place is `unlocatable` rather than anchored to the first hit, because choosing among them would be a guess wearing a line number. Absent for a finding that is about the round rather than a site.",
|
|
112
|
+
"type": ["string", "null"]
|
|
113
|
+
},
|
|
114
|
+
"locator": {
|
|
115
|
+
"title": "How `line` was arrived at",
|
|
116
|
+
"description": "Present exactly when the finding carries a quote. `derived` means the quote was found and `line` is where; `unlocatable` means it was not, and then `line` is null rather than a number nobody checked. `reported_line` keeps what the reviewer said, so a round can measure how far the claims drifted from the code — which is the only way to know whether deriving them repaired anything or is insurance.",
|
|
117
|
+
"type": "object",
|
|
118
|
+
"additionalProperties": false,
|
|
119
|
+
"required": ["state"],
|
|
120
|
+
"properties": {
|
|
121
|
+
"state": { "type": "string", "enum": ["derived", "unlocatable"] },
|
|
122
|
+
"method": { "type": "string", "enum": ["exact", "whitespace-normalised"] },
|
|
123
|
+
"reason": { "type": ["string", "null"] },
|
|
124
|
+
"reported_line": { "type": ["integer", "null"], "minimum": 1 }
|
|
125
|
+
},
|
|
126
|
+
"allOf": [
|
|
127
|
+
{
|
|
128
|
+
"if": { "properties": { "state": { "const": "derived" } }, "required": ["state"] },
|
|
129
|
+
"then": { "required": ["method"] }
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
"if": { "properties": { "state": { "const": "unlocatable" } }, "required": ["state"] },
|
|
133
|
+
"then": { "required": ["reason"] }
|
|
134
|
+
}
|
|
135
|
+
]
|
|
136
|
+
},
|
|
104
137
|
"symbol": { "type": ["string", "null"] },
|
|
105
138
|
"problem": { "type": "string" },
|
|
106
139
|
"impact": { "type": "string" },
|