This is an automated email from the ASF dual-hosted git repository.

spmallette pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git

commit 4ae2341bd440900880f7715eba468f09ffd7f18a
Author: Stephen Mallette <[email protected]>
AuthorDate: Fri Oct 9 15:44:20 2026 -0400

    Scope the tinker-review confidence worklist to changed code
    
    listInferred --changedOnly returns only edges that touch code the PR 
changed,
    and the playbook's confidence loop starts there.
    
    Assisted-by: Claude Code:claude-opus-5-5
---
 .skills/tinker-review/playbooks/general.md                 |  7 ++++---
 .skills/tinker-review/references/enrichment-cli.md         |  7 +++++--
 .skills/tinker-review/scripts/enrichment/cli.js            |  4 ++--
 .skills/tinker-review/scripts/patterns/confidence-audit.js | 14 +++++++++++++-
 4 files changed, 24 insertions(+), 8 deletions(-)

diff --git a/.skills/tinker-review/playbooks/general.md 
b/.skills/tinker-review/playbooks/general.md
index f55d59b668..9d8cae833e 100644
--- a/.skills/tinker-review/playbooks/general.md
+++ b/.skills/tinker-review/playbooks/general.md
@@ -9,9 +9,10 @@ domain-specific playbook.
 The confidence pass runs on every review; it lives here and every playbook
 inherits it. Run in order:
 - `auditConfidence` — read the edge-confidence distribution and the 
`AMBIGUOUS` list.
-- `listInferred` — pull the verification worklist (`--relation implements_step`
-  first, then any `calls` edges your findings lean on); read each against the
-  worktree source.
+- `listInferred --changedOnly` — pull the verification worklist: the INFERRED
+  edges touching changed code (`--relation implements_step` first, then the
+  `calls` edges your findings lean on). Read each against the worktree source.
+  Edges between untouched code are not worth verifying.
 - `setEdgeConfidence` — re-grade what you verified: promote a confirmed edge to
   `EXTRACTED`, downgrade a wrong name-resolution to `AMBIGUOUS`.
 - `auditConfidence` again — anything still `AMBIGUOUS` goes to `openQuestions`,
diff --git a/.skills/tinker-review/references/enrichment-cli.md 
b/.skills/tinker-review/references/enrichment-cli.md
index 36cf4eaaf7..c23a4eaa42 100644
--- a/.skills/tinker-review/references/enrichment-cli.md
+++ b/.skills/tinker-review/references/enrichment-cli.md
@@ -87,8 +87,11 @@ in the report's `openQuestions`, not asserted as fact.
 ### listInferred
 Your **verification worklist**: the name-resolved / agent-mapped edges worth a
 source check, optionally narrowed with `--relation` (start with
-`implements_step`, then `calls`). After reading the source, promote or 
downgrade
-each with `setEdgeConfidence`. This is how INFERRED becomes EXTRACTED.
+`implements_step`, then `calls`). Pass `--changedOnly` to keep only edges with 
an
+endpoint the PR changed (behavior or signature): a large PR has tens of
+thousands of INFERRED edges, mostly calls between untouched code, and the
+default 100 of those is an arbitrary sample. After reading the source, promote
+or downgrade each with `setEdgeConfidence`. This is how INFERRED becomes 
EXTRACTED.
 
 ### listDeleted
 The files the PR deleted (graph stubs marked `deleted: true`), each paired with
diff --git a/.skills/tinker-review/scripts/enrichment/cli.js 
b/.skills/tinker-review/scripts/enrichment/cli.js
index f9fdfdfd92..38511f5862 100644
--- a/.skills/tinker-review/scripts/enrichment/cli.js
+++ b/.skills/tinker-review/scripts/enrichment/cli.js
@@ -99,7 +99,7 @@ async function main() {
     console.log("  getCallsFrom    --function <name> --file <path>");
     console.log("  getCanonicalSteps");
     console.log("  auditConfidence [--maxAmbiguous 50]");
-    console.log("  listInferred    [--relation implements_step|calls|...] 
[--limit 100]");
+    console.log("  listInferred    [--relation implements_step|calls|...] 
[--changedOnly] [--limit 100]");
     console.log("  listDeleted");
     console.log("  listExternalRefs");
     console.log("  listBeads       [--root <beadId>] [--type 
decision|task|record] [--status in_progress]");
@@ -169,7 +169,7 @@ async function main() {
         result = await fn(g, { maxAmbiguous: args.maxAmbiguous });
         break;
       case "listInferred":
-        result = await fn(g, { relation: args.relation, limit: args.limit });
+        result = await fn(g, { relation: args.relation, changedOnly: 
args.changedOnly, limit: args.limit });
         break;
       case "listDeleted":
         result = await fn(g);
diff --git a/.skills/tinker-review/scripts/patterns/confidence-audit.js 
b/.skills/tinker-review/scripts/patterns/confidence-audit.js
index 29d6cb326f..8d00415464 100644
--- a/.skills/tinker-review/scripts/patterns/confidence-audit.js
+++ b/.skills/tinker-review/scripts/patterns/confidence-audit.js
@@ -19,6 +19,7 @@
 
 import gremlin from "gremlin";
 import { CONFIDENCE } from "../graph/confidence.js";
+import { changedMeaningful } from "../graph/change-levels.js";
 
 const { process: { statics: __ } } = gremlin;
 
@@ -103,14 +104,17 @@ export async function confidenceAudit(g, params = {}) {
  * @param {object} [opts]
  * @param {string} [opts.confidence] - Filter to this confidence value
  * @param {string} [opts.relation] - Filter to this edge label (e.g. 
implements_step)
+ * @param {boolean} [opts.changedOnly] - Only edges with an endpoint whose 
behavior or
+ *   signature the PR changed (changeLevel BEHAVIORAL or STRUCTURAL)
  * @param {number} [opts.limit] - Cap the result count (default 100)
  * @returns {Promise<EdgeConfidenceRow[]>}
  */
 export async function listEdgesByConfidence(g, opts = {}) {
-  const { confidence, relation, limit = 100 } = opts;
+  const { confidence, relation, changedOnly, limit = 100 } = opts;
   let t = g.E();
   if (relation) t = t.hasLabel(relation);
   if (confidence) t = t.has("confidence", confidence);
+  if (changedOnly) t = t.where(__.bothV().has("changeLevel", 
changedMeaningful()));
 
   const rows = await t
     .limit(limit)
@@ -141,7 +145,14 @@ export async function listEdgesByConfidence(g, opts = {}) {
  *
  * @param {object} g - gremlin-js GraphTraversalSource (already connected)
  * @param {object} [params]
+ * A large PR carries tens of thousands of INFERRED edges, mostly name-resolved
+ * calls between code it did not touch, so `changedOnly` is the usable 
worklist:
+ * the edges with an endpoint the PR changed, which are the ones findings rest 
on.
+ *
+ * @param {object} g - gremlin-js GraphTraversalSource (already connected)
+ * @param {object} [params]
  * @param {string} [params.relation] - Narrow to one relation (e.g. 
implements_step)
+ * @param {boolean} [params.changedOnly] - Only edges touching changed code
  * @param {number} [params.limit] - Cap results (default 100)
  * @returns {Promise<EdgeConfidenceRow[]>}
  */
@@ -149,6 +160,7 @@ export async function listInferred(g, params = {}) {
   return listEdgesByConfidence(g, {
     confidence: CONFIDENCE.INFERRED,
     relation: params.relation,
+    changedOnly: params.changedOnly === true,
     limit: params.limit || 100,
   });
 }

Reply via email to