@gate-forge/core 0.9.1 → 0.10.1

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/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -156,8 +156,19 @@ export interface MappingSuggestion {
156
156
  missingEvidence: string;
157
157
  /** The plan §5.4 next action for the cause. */
158
158
  nextAction: string;
159
- /** True ONLY when no candidate exists after resolution. */
160
- newTestNeeded: boolean;
159
+ /**
160
+ * The REUSE verdict — a question with three honest answers, not a
161
+ * boolean:
162
+ * - `no`: the #1 candidate can be reused and the evidence says so (an
163
+ * explicit tag names this resource, or the row's file names the
164
+ * route);
165
+ * - `yes`: nothing can be reused — no candidate survived resolution,
166
+ * or every candidate mocks the system under test;
167
+ * - `unverified`: a candidate exists but ONE signal carries it, so
168
+ * reuse may well be right and nothing here proves it. The owner must
169
+ * confirm the request really is sent before marking.
170
+ */
171
+ newTestNeeded: 'no' | 'yes' | 'unverified';
161
172
  }
162
173
  /** Inputs of {@link mappingSuggestions}. */
163
174
  export interface MappingSuggestionsInput {
@@ -178,7 +189,8 @@ export interface MappingSuggestionsInput {
178
189
  * Produces per-obligation reuse suggestions ordered by reuse (plan
179
190
  * Phase 3 item 6). Obligations with a clean DECLARED mapping produce no
180
191
  * suggestion (their remaining gap is executed proof, not mapping).
181
- * `newTestNeeded` is true only when no candidate exists after resolution.
192
+ * `newTestNeeded` is a three-state REUSE verdict, not a boolean — see
193
+ * {@link MappingSuggestion.newTestNeeded}.
182
194
  *
183
195
  * Args:
184
196
  * input: catalog, scoped obligation ids, and the resolution.
@@ -1 +1 @@
1
- {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/mapping/resolve.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/mapping/resolve.ts"],"names":[],"mappings":"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"}
@@ -506,6 +506,59 @@ const ROUTE_FILLER_SEGMENTS = Object.freeze({
506
506
  gateway: true,
507
507
  service: true,
508
508
  });
509
+ /**
510
+ * Plane qualifiers qualify EVERY resource in the plane, so they identify
511
+ * no resource at all: `@crud(tenant.accounts:create)` must never rank a
512
+ * candidate for `tenant.http-get-api-v1-notifications-…`.
513
+ */
514
+ const PLANE_NAME_TOKENS = Object.freeze({
515
+ tenant: true,
516
+ master: true,
517
+ global: true,
518
+ });
519
+ /** HTTP verbs a generated `http-<method>-…` endpoint name spells out. */
520
+ const HTTP_METHOD_TOKENS = Object.freeze({
521
+ get: true,
522
+ post: true,
523
+ put: true,
524
+ patch: true,
525
+ delete: true,
526
+ head: true,
527
+ options: true,
528
+ });
529
+ /**
530
+ * Whether one resource-id token names the RESOURCE or only the structure
531
+ * around it: the plane, the transport, the method, route furniture, a
532
+ * version segment, the generated `param` marker that stands in for a
533
+ * `{route_param}`, or the generated id-hash suffix. Only real names may
534
+ * be matched against a test title or file.
535
+ */
536
+ function isStructuralResourceToken(token) {
537
+ if (PLANE_NAME_TOKENS[token] === true)
538
+ return true;
539
+ if (GENERATED_ID_TOKENS[token] === true)
540
+ return true;
541
+ if (HTTP_METHOD_TOKENS[token] === true)
542
+ return true;
543
+ if (ROUTE_FILLER_SEGMENTS[token] === true)
544
+ return true;
545
+ if (/^v\d+$/.test(token))
546
+ return true;
547
+ // A generated id suffix (`…-27cb390c`). At least one digit is required so
548
+ // real hex-looking words (`decade`, `facade`) stay resource names.
549
+ return /^[0-9a-f]{6,}$/.test(token) && /\d/.test(token);
550
+ }
551
+ /** The marker a generated id carries for each `{param}` in the route. */
552
+ const GENERATED_ID_TOKENS = Object.freeze({
553
+ param: true,
554
+ });
555
+ /** The matchable resource-name tokens of one resource id. */
556
+ function resourceTokens(resourceId) {
557
+ return resourceId
558
+ .split(/[.\-_]/)
559
+ .map((token) => token.toLowerCase())
560
+ .filter((token) => token.length > 2 && !isStructuralResourceToken(token) && OPERATION_WORDS[token] !== true);
561
+ }
509
562
  /**
510
563
  * The route segments of one obligation's hints worth matching against a
511
564
  * test's title/file: no path parameters, no version or filler segments.
@@ -542,22 +595,72 @@ function titleWords(titlePath) {
542
595
  .split(/[^a-z0-9]+/)
543
596
  .filter((word) => word.length > 2);
544
597
  }
545
- /** The resource token an explicit `@crud(<resource>)`/`@gateforge(<…>)` tag names. */
546
- function explicitTagTokens(titlePath) {
547
- const tokens = [];
598
+ /** A parenthesised `@tag(...)` in a title: declaration text, not prose. */
599
+ const TITLE_TAG_PATTERN = /@[A-Za-z][A-Za-z0-9_-]*\([^)]*\)/g;
600
+ /** The title path with every `@tag(...)` removed (used for word matching). */
601
+ function proseTitlePath(titlePath) {
602
+ return titlePath.map((segment) => segment.replace(TITLE_TAG_PATTERN, ' '));
603
+ }
604
+ /**
605
+ * The CRUD operation each HTTP method exercises, for the fit check an
606
+ * explicit tag must pass before it counts for a transport obligation.
607
+ */
608
+ const HTTP_METHOD_OPERATIONS = Object.freeze({
609
+ GET: 'read',
610
+ HEAD: 'read',
611
+ POST: 'create',
612
+ PUT: 'update',
613
+ PATCH: 'update',
614
+ DELETE: 'delete',
615
+ });
616
+ /**
617
+ * The operation an `http:*` obligation's own route method exercises, or
618
+ * null when the obligation is not transport-shaped or its route hint
619
+ * names no known method. A tag that DECLARES an operation is evidence
620
+ * for an obligation only when the two agree: `@crud(…:create)` says the
621
+ * test creates the resource, which is no evidence that it reads
622
+ * `GET /api/v2/accounts` — and answering `new test needed: no` from it
623
+ * sent an owner to mark a create test as the proof of a read. A
624
+ * non-transport obligation has no route method to fit, so its tags stay
625
+ * judged on the resource alone.
626
+ */
627
+ function transportOperationOf(obligationId, routes) {
628
+ if ((obligationId.split(':')[1] ?? '').toLowerCase() !== 'http')
629
+ return null;
630
+ const method = (routes[0] ?? '').split(/\s+/)[0]?.toUpperCase() ?? '';
631
+ return HTTP_METHOD_OPERATIONS[method] ?? null;
632
+ }
633
+ function explicitTags(titlePath) {
634
+ const tags = [];
548
635
  for (const segment of titlePath) {
549
- for (const match of segment.matchAll(/@(?:crud|gateforge|resource|op)\(([^)]*)\)/g)) {
550
- for (const token of (match[1] ?? '').split(/[^A-Za-z0-9]+/)) {
551
- if (token.length > 2)
552
- tokens.push(token.toLowerCase());
636
+ for (const match of segment.matchAll(/@(?:crud|gateforge|resource)\(([^)]*)\)/g)) {
637
+ const parts = (match[1] ?? '').split(':');
638
+ const tokens = [];
639
+ for (const token of (parts[0] ?? '').split(/[^A-Za-z0-9]+/)) {
640
+ const name = token.toLowerCase();
641
+ if (name.length > 2 && PLANE_NAME_TOKENS[name] !== true)
642
+ tokens.push(name);
553
643
  }
644
+ tags.push({ tokens, operation: (parts[1] ?? '').toLowerCase() || null });
554
645
  }
555
646
  }
556
- return tokens;
647
+ return tags;
648
+ }
649
+ /** Whether one catalog row's file path names the obligation's route. */
650
+ function fileNamesRoute(fileWords, routeSegments) {
651
+ const meaningful = routeSegments.filter((segment) => OPERATION_WORDS[segment] !== true);
652
+ if (meaningful.length === 0)
653
+ return false;
654
+ const needed = Math.min(2, meaningful.length);
655
+ const named = meaningful.filter((segment) => fileWords.includes(segment)).length;
656
+ return named >= needed;
557
657
  }
558
658
  /**
559
659
  * Scores ONE catalog row against one obligation by the evidence the row
560
- * carries, and explains every contributing signal in plain words.
660
+ * carries, and explains every contributing signal in plain words. Every
661
+ * match is WHOLE-WORD (title path words; file path segments split on
662
+ * `/ . _ -`), never a substring: a token hidden inside a longer word
663
+ * (`read` in `reference`) is not evidence about anything.
561
664
  *
562
665
  * Args:
563
666
  * obligationId: the obligation the row is a candidate for.
@@ -565,52 +668,92 @@ function explicitTagTokens(titlePath) {
565
668
  * routes: the obligation's route hints (e.g. `GET /api/v2/accounts`).
566
669
  *
567
670
  * Returns:
568
- * {score, why}: the additive evidence score and its human reasons.
671
+ * CandidateEvidence: the additive score, its human reasons, and the
672
+ * boolean inputs the reuse verdict reads.
569
673
  */
570
674
  function candidateEvidence(obligationId, row, routes) {
571
675
  const resourceId = obligationId.slice(0, Math.max(0, obligationId.indexOf(':')));
572
- const tokens = resourceId
573
- .split(/[.\-_]/)
574
- .map((token) => token.toLowerCase())
575
- .filter((token) => token.length > 2);
676
+ const tokens = resourceTokens(resourceId);
576
677
  const why = [];
577
678
  let score = 0;
578
- const file = row.file.toLowerCase();
579
- const title = row.titlePath.join('>').toLowerCase();
580
- const words = titleWords(row.titlePath);
581
- const tagTokens = explicitTagTokens(row.titlePath);
679
+ // Whole-word matching, never substrings: `read` is not inside
680
+ // `reference`, and `notifications` is not inside `notification`. A
681
+ // `@crud(...)` tag is a DECLARATION, so its text is stripped before the
682
+ // title is read as prose (tag matching stays a separate, explicit path).
683
+ const words = titleWords(proseTitlePath(row.titlePath));
684
+ const fileWords = row.file.toLowerCase().split(/[^a-z0-9]+/).filter((word) => word.length > 0);
685
+ const tags = explicitTags(row.titlePath);
686
+ // A tag that DECLARES an operation is evidence for a TRANSPORT
687
+ // obligation only when the operation fits the route's method; for
688
+ // every other obligation (and for a route hint naming no known
689
+ // method) the operation is null and the resource part stands on its
690
+ // own. A tag that declares NO operation names the resource and
691
+ // stops there — it is never contradicted by the method, so it keeps
692
+ // its full credit on a transport obligation too.
693
+ const requiredOperation = transportOperationOf(obligationId, routes);
582
694
  const operationWords = OPERATION_TITLE_WORDS[operationOf(obligationId)] ?? [];
583
695
  const routeSegments = routeSegmentsOf(routes);
696
+ // One word counts once: the first (strongest) signal for it is the only
697
+ // one, so a resource token that is also a route segment never scores
698
+ // twice, and an operation word is never mistaken for a resource name.
699
+ const counted = new Set();
700
+ let distinctive = false;
701
+ let explicitTag = false;
702
+ let resourceToken = false;
584
703
  for (const token of tokens) {
585
- if (tagTokens.includes(token)) {
704
+ if (counted.has(token))
705
+ continue;
706
+ if (tags.some((tag) => tag.tokens.includes(token) &&
707
+ (requiredOperation === null || tag.operation === null || tag.operation === requiredOperation))) {
708
+ counted.add(token);
709
+ distinctive = true;
710
+ explicitTag = true;
586
711
  score += CANDIDATE_SCORE['explicitTag'] ?? 0;
587
712
  why.push(`explicit tag names this obligation's resource '${token}'`);
588
713
  continue;
589
714
  }
590
- if (title.includes(token)) {
715
+ if (words.includes(token)) {
716
+ counted.add(token);
717
+ distinctive = true;
718
+ resourceToken = true;
591
719
  score += CANDIDATE_SCORE['titleResourceToken'] ?? 0;
592
720
  why.push(`resource token '${token}' matches the test title path`);
593
721
  }
594
- else if (file.includes(token)) {
722
+ else if (fileWords.includes(token)) {
723
+ counted.add(token);
724
+ distinctive = true;
725
+ resourceToken = true;
595
726
  score += CANDIDATE_SCORE['fileResourceToken'] ?? 0;
596
727
  why.push(`resource token '${token}' matches the test file '${row.file}'`);
597
728
  }
598
- else if (row.categorySignals.some((signal) => signal.label.toLowerCase().includes(token))) {
729
+ else if (row.categorySignals.some((signal) => signal.label.toLowerCase().split(/[^a-z0-9]+/).includes(token))) {
730
+ counted.add(token);
731
+ distinctive = true;
732
+ resourceToken = true;
599
733
  score += CANDIDATE_SCORE['categoryToken'] ?? 0;
600
734
  why.push(`resource token '${token}' matches a category label`);
601
735
  }
602
736
  }
603
737
  const operation = operationOf(obligationId);
604
738
  if (operation.length > 2 && operationWords.some((word) => words.includes(word))) {
739
+ counted.add(operation);
605
740
  score += CANDIDATE_SCORE['titleOperationToken'] ?? 0;
606
741
  why.push(`title names the obligation's operation '${operation}'`);
607
742
  }
608
743
  for (const segment of routeSegments) {
609
- if (title.includes(segment)) {
744
+ if (counted.has(segment))
745
+ continue;
746
+ if (words.includes(segment)) {
747
+ counted.add(segment);
748
+ if (OPERATION_WORDS[segment] !== true)
749
+ distinctive = true;
610
750
  score += CANDIDATE_SCORE['titleRouteSegment'] ?? 0;
611
751
  why.push(`title mentions the obligation's route segment '${segment}'`);
612
752
  }
613
- else if (file.includes(segment)) {
753
+ else if (fileWords.includes(segment)) {
754
+ counted.add(segment);
755
+ if (OPERATION_WORDS[segment] !== true)
756
+ distinctive = true;
614
757
  score += CANDIDATE_SCORE['fileRouteSegment'] ?? 0;
615
758
  why.push(`test file mentions the obligation's route segment '${segment}'`);
616
759
  }
@@ -623,19 +766,59 @@ function candidateEvidence(obligationId, row, routes) {
623
766
  score += CANDIDATE_SCORE['mockedSuppression'] ?? 0;
624
767
  why.push('mocks the system under test (weaker evidence)');
625
768
  }
626
- return { score, why };
769
+ // An unmocked folder, an operation word or a mock signal alone never makes
770
+ // a candidate: there must be at least one DISTINCTIVE match — a resource
771
+ // token or a route segment that is not an operation word.
772
+ const verdict = { explicitTag, resourceToken, fileNamesRoute: fileNamesRoute(fileWords, routeSegments) };
773
+ return distinctive ? { score, why, verdict } : { score: 0, why: [], verdict };
627
774
  }
628
775
  /**
629
- * Deterministic token inference (plan Phase 3 item 2): obligation
630
- * resource-id tokens (`tenant.accounts` → `tenant`, `accounts`) matched
631
- * against catalog rows' files, title paths, and category labels, plus the
632
- * obligation's operation and route hints. Candidates are ordered by
633
- * evidence score (strongest first), then by logical key for stability.
776
+ * Every word the operation table uses. These name an OPERATION, never a
777
+ * resource: `tenant.accounts:…:read` says what the obligation DOES, so a
778
+ * title that merely says "read tenant.accounts through UI" is evidence
779
+ * about no resource in particular. They are never resource tokens, and a
780
+ * row that matches nothing else is not a candidate at all.
781
+ */
782
+ const OPERATION_WORDS = Object.freeze(Object.fromEntries(Object.values(OPERATION_TITLE_WORDS)
783
+ .flat()
784
+ .map((word) => [word, true])));
785
+ /**
786
+ * Contract families whose proof is an OBSERVED-E2E suite test (the Observe
787
+ * channel): a `unit` suite drives no app and witnesses nothing, so such a
788
+ * row can never be the answer for them. Other families keep today's
789
+ * behaviour — the catalog kind is evidence about the CHANNEL, and mapping
790
+ * every contract onto it would be a second classification.
791
+ */
792
+ const OBSERVED_E2E_CONTRACT_FAMILIES = Object.freeze({
793
+ persistence: true,
794
+ crud: true,
795
+ http: true,
796
+ });
797
+ /**
798
+ * Deterministic token inference (plan Phase 3 item 2): the RESOURCE-NAME
799
+ * tokens of the obligation's resource id (`tenant.accounts` → `accounts`;
800
+ * the plane, transport, method, route furniture, and id hash are structure,
801
+ * not names) matched WHOLE-WORD against catalog rows' files, title paths,
802
+ * and category labels, plus the obligation's operation and route hints.
803
+ * Candidates are ordered by evidence score (strongest first), then by
804
+ * logical key for stability.
634
805
  * Signals feed SUGGESTIONS only — an inference never writes a mapping (§5.3).
635
806
  */
636
807
  function inferredCandidates(obligationId, catalog, routes) {
637
808
  const candidates = [];
809
+ const contractFamily = (obligationId.split(':')[1] ?? '').toLowerCase();
810
+ const observedE2e = OBSERVED_E2E_CONTRACT_FAMILIES[contractFamily] === true;
638
811
  for (const row of catalog.entries) {
812
+ // ELIGIBILITY before ranking: a `static-only` row is a test-shaped file
813
+ // no runner enumerated (a Vitest jsdom suite inside a
814
+ // Playwright-configured repository, say). It can never produce the
815
+ // witnessed evidence a mapping promises, so it is never offered.
816
+ if (row.reconciliation === 'static-only')
817
+ continue;
818
+ // A `unit` suite drives no app: for an observed-e2e contract it can
819
+ // never be the test that witnesses the claim.
820
+ if (observedE2e && row.inferredKind === 'unit')
821
+ continue;
639
822
  const evidence = candidateEvidence(obligationId, row, routes);
640
823
  if (evidence.why.length === 0)
641
824
  continue;
@@ -697,6 +880,70 @@ function reuseNextAction(obligationId, candidate) {
697
880
  `--obligation ${obligationId} --reason "existing suite-driven browser test"\`, ` +
698
881
  `then \`gateforge test-gates --changed\` to collect its witnessed evidence`);
699
882
  }
883
+ /**
884
+ * The next action when reuse is PLAUSIBLE but unproven: confirm the
885
+ * request first, and only then mark. This never prints a ready-to-run
886
+ * `tests mark` command — handing the owner a command to run is exactly
887
+ * the advice that was wrong when the single-signal candidate looked
888
+ * settled.
889
+ *
890
+ * Args:
891
+ * obligationId: the obligation the suggestion is about.
892
+ * candidate: the top-ranked candidate.
893
+ * route: the request the candidate must really send.
894
+ *
895
+ * Returns:
896
+ * string: the confirmation-first next action.
897
+ */
898
+ function unverifiedNextAction(obligationId, candidate, route) {
899
+ const where = candidate === undefined
900
+ ? ''
901
+ : ` Read ${candidate.file} and check that it really sends it.`;
902
+ return (`check that the candidate really sends ${route} before marking it — ` +
903
+ `run \`gateforge explain ${obligationId}\` to see the obligation.${where} ` +
904
+ 'A shared name is not proof; mark only once the request is in there.');
905
+ }
906
+ /**
907
+ * The REUSE verdict for one obligation's candidate list.
908
+ *
909
+ * `yes` when nothing can be reused: no candidate survived resolution, or
910
+ * every candidate mocks the system under test (a mock can never witness
911
+ * the claim, so it is not a reuse answer at all).
912
+ *
913
+ * `no` only when the #1 candidate is an unmocked e2e row AND the evidence
914
+ * is more than one signal — an explicit tag that NAMES this resource, or
915
+ * a resource-token match together with the file naming the route. One
916
+ * shared word is a coincidence; a file named `admin_login.spec.js` for
917
+ * `POST /admin/auth/login` is that route.
918
+ *
919
+ * Anything else is `unverified`: a candidate exists, reuse may well be
920
+ * right, and NOTHING HERE PROVES IT. That is the honest answer, and it
921
+ * is why it is a third state instead of a `false` that reads as "reuse
922
+ * is settled".
923
+ *
924
+ * Args:
925
+ * candidates: the ranked candidate list (empty when none survived).
926
+ * mockedKeys: logical keys whose rows mock the system under test.
927
+ * verdictOf: the evidence verdict for a candidate's logical key.
928
+ *
929
+ * Returns:
930
+ * 'yes' | 'no' | 'unverified': the reuse verdict.
931
+ */
932
+ function reuseVerdict(candidates, mockedKeys, verdictOf) {
933
+ if (candidates.length === 0)
934
+ return 'yes';
935
+ if (candidates.every((candidate) => mockedKeys.has(candidate.logicalKey)))
936
+ return 'yes';
937
+ const top = candidates[0];
938
+ if (top === undefined || mockedKeys.has(top.logicalKey))
939
+ return 'unverified';
940
+ const verdict = verdictOf(top.logicalKey);
941
+ if (verdict === undefined)
942
+ return 'unverified';
943
+ if (verdict.explicitTag)
944
+ return 'no';
945
+ return verdict.resourceToken && verdict.fileNamesRoute ? 'no' : 'unverified';
946
+ }
700
947
  /**
701
948
  * Scores, orders, and numbers one obligation's candidate rows: evidence
702
949
  * score first (strongest match ranks #1), logical key second for
@@ -712,7 +959,8 @@ function rankCandidates(candidates) {
712
959
  * Produces per-obligation reuse suggestions ordered by reuse (plan
713
960
  * Phase 3 item 6). Obligations with a clean DECLARED mapping produce no
714
961
  * suggestion (their remaining gap is executed proof, not mapping).
715
- * `newTestNeeded` is true only when no candidate exists after resolution.
962
+ * `newTestNeeded` is a three-state REUSE verdict, not a boolean — see
963
+ * {@link MappingSuggestion.newTestNeeded}.
716
964
  *
717
965
  * Args:
718
966
  * input: catalog, scoped obligation ids, and the resolution.
@@ -735,7 +983,9 @@ export function mappingSuggestions(input) {
735
983
  candidates: [],
736
984
  missingEvidence: 'a safe, unambiguous declaration (the current declaration conflicts with itself or the catalog)',
737
985
  nextAction: CAUSE_NEXT_ACTIONS['TEST_MAPPING_AMBIGUOUS'],
738
- newTestNeeded: false,
986
+ // A declaration exists and conflicts with itself: the gap is a
987
+ // repair, never a new test.
988
+ newTestNeeded: 'no',
739
989
  });
740
990
  continue;
741
991
  }
@@ -756,7 +1006,7 @@ export function mappingSuggestions(input) {
756
1006
  candidates,
757
1007
  missingEvidence: `an up-to-date declaration (the current one is stale: ${stale.detail})`,
758
1008
  nextAction: CAUSE_NEXT_ACTIONS['TEST_MAPPING_STALE'],
759
- newTestNeeded: candidates.length === 0,
1009
+ newTestNeeded: candidates.length === 0 ? 'yes' : 'no',
760
1010
  });
761
1011
  continue;
762
1012
  }
@@ -778,21 +1028,29 @@ export function mappingSuggestions(input) {
778
1028
  })),
779
1029
  missingEvidence: 'a declared kind for the connected test (code analysis could not classify it)',
780
1030
  nextAction: CAUSE_NEXT_ACTIONS['TEST_KIND_UNKNOWN'],
781
- newTestNeeded: false,
1031
+ // A test is already declared; only its kind is missing.
1032
+ newTestNeeded: 'no',
782
1033
  });
783
1034
  continue;
784
1035
  }
785
1036
  if (declared.length > 0)
786
1037
  continue; // declared + clean: the gap is execution, not mapping
1038
+ const mockedKeys = new Set();
1039
+ const verdicts = new Map();
787
1040
  const candidates = rankCandidates(bindings.map((binding) => {
788
1041
  const row = rowsByKey.get(binding.logicalKey);
789
1042
  const hint = observeHintForRow(row);
790
1043
  const base = binding.origin === 'inferred' || binding.origin === 'prior-run'
791
1044
  ? (binding.reason ?? binding.origin)
792
1045
  : `bound by native annotation (${binding.logicalKey})`;
1046
+ if (row?.suppressionSignals.some((signal) => signal.kind === 'mock') === true) {
1047
+ mockedKeys.add(binding.logicalKey);
1048
+ }
793
1049
  const evidence = row === undefined
794
- ? { score: 0, why: [] }
1050
+ ? { score: 0, why: [], verdict: undefined }
795
1051
  : candidateEvidence(obligationId, row, input.routeHints?.get(obligationId) ?? []);
1052
+ if (evidence.verdict !== undefined)
1053
+ verdicts.set(binding.logicalKey, evidence.verdict);
796
1054
  return {
797
1055
  logicalKey: binding.logicalKey,
798
1056
  file: binding.instances[0]?.file ?? '',
@@ -800,15 +1058,32 @@ export function mappingSuggestions(input) {
800
1058
  score: evidence.score,
801
1059
  };
802
1060
  }));
1061
+ // A mocked candidate can never witness the claim, so when every
1062
+ // candidate mocks the system under test the obligation is not
1063
+ // satisfiable by reuse: a NEW test is needed. The mocked rows stay
1064
+ // listed as context, and no `tests mark` is offered for them.
1065
+ const onlyMocked = candidates.length > 0 && candidates.every((candidate) => mockedKeys.has(candidate.logicalKey));
1066
+ const verdict = reuseVerdict(candidates, mockedKeys, (key) => verdicts.get(key));
1067
+ // The request the candidate must REALLY send before a mark is honest:
1068
+ // the obligation's own route hint, never a guess.
1069
+ const route = input.routeHints?.get(obligationId)?.[0] ?? 'the request this obligation describes';
803
1070
  suggestions.push({
804
1071
  obligationId,
805
1072
  cause: 'TEST_MAPPING_MISSING',
806
1073
  candidates,
807
- missingEvidence: candidates.length > 0
808
- ? 'a DECLARED mapping and witnessed evidence for this change (a mapping declares intent; it supplies no test result)'
809
- : 'a declared mapping to any existing test — no candidate survived resolution',
810
- nextAction: reuseNextAction(obligationId, candidates[0]),
811
- newTestNeeded: candidates.length === 0,
1074
+ missingEvidence: verdict === 'unverified'
1075
+ ? `CONFIRMATION that the candidate really sends ${route} — it matched on ONE signal, ` +
1076
+ 'and a name in common is not proof the test drives that route'
1077
+ : onlyMocked
1078
+ ? 'a new test — only mocked candidates: every existing candidate mocks the system under ' +
1079
+ 'test, so none can witness this claim (they are listed as context)'
1080
+ : candidates.length > 0
1081
+ ? 'a DECLARED mapping and witnessed evidence for this change (a mapping declares intent; it supplies no test result)'
1082
+ : 'a declared mapping to any existing test — no candidate survived resolution',
1083
+ nextAction: verdict === 'unverified'
1084
+ ? unverifiedNextAction(obligationId, candidates[0], route)
1085
+ : reuseNextAction(obligationId, onlyMocked ? undefined : candidates[0]),
1086
+ newTestNeeded: verdict,
812
1087
  });
813
1088
  }
814
1089
  return suggestions.sort((a, b) => SUGGESTION_RANK[a.cause] - SUGGESTION_RANK[b.cause] ||