@afokapu/atdd-bun 0.10.19 → 0.10.21

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.
@@ -287,8 +287,13 @@ export function tokenCovered(token, text) {
287
287
  return new RegExp("(?<![\\w-])" + esc + "(?![\\w-])").test(text);
288
288
  }
289
289
 
290
- export function isRouteCovered(route, e2eTexts) {
291
- return e2eTexts.some((t) => tokenCovered(route.routeId, t) || tokenCovered(route.trainId, t));
290
+ // A train id is unique, so naming it covers the route. A route id is not: `refuse` or `record` can be routes of several
291
+ // interlockings, and a test of one must not cover the others (FWS #liu3vKZYAPXD). A route id counts only in a test that
292
+ // also names its interlocking, by id or slug.
293
+ export function isRouteCovered(route, e2eTexts, interlockingId = null) {
294
+ const slug = interlockingId ? interlockingId.replace(/^interlocking:/, "") : null;
295
+ const ownInterlocking = (t) => !interlockingId || tokenCovered(interlockingId, t) || tokenCovered(slug, t);
296
+ return e2eTexts.some((t) => tokenCovered(route.trainId, t) || (tokenCovered(route.routeId, t) && ownInterlocking(t)));
292
297
  }
293
298
 
294
299
  export function interlockingTokenSet(records) {
@@ -34,7 +34,7 @@ for (const scanRoot of roots) {
34
34
 
35
35
  for (const { file, rec } of records) {
36
36
  for (const route of rec.routes) {
37
- if (isRouteCovered(route, e2eTexts)) continue;
37
+ if (isRouteCovered(route, e2eTexts, rec.interlockingId)) continue;
38
38
  if (unbuiltWagons(croot, route.trainId).length) continue; // pending: a wagon on its train has no source yet
39
39
  const cat =
40
40
  route.category !== null
@@ -29,10 +29,14 @@ const RULE = "tester.bun.interlocking-smoke-coverage-for-station-master";
29
29
  const roots = parseJsonEnv("ATDD_SCAN_ROOTS", []);
30
30
  const violations = [];
31
31
 
32
- function actionSmokeCovered(action, e2eTexts) {
33
- return e2eTexts.some(
34
- (t) =>
35
- tokenCovered(action, t) && STATION_MASTER.test(t) && t.includes(PROD_INTERLOCKING) && t.includes(PROD_TRAIN),
32
+ // Only a smoke test counts: one whose header declares `Phase: SMOKE` (tester.bun.test-phase-declared), which also puts
33
+ // it under the smoke rules (no substituted collaborators, observable outcome). A local E2E that names the action beside
34
+ // the runners is not a smoke and no longer clears the rule (FWS #TzSCGS5ajYhP).
35
+ const SMOKE_PHASE = /^\s*\/\/\s*Phase:\s*SMOKE\b/m;
36
+ function actionSmokeCovered(action, e2eFiles) {
37
+ return e2eFiles.some(
38
+ ({ raw, text: t }) =>
39
+ SMOKE_PHASE.test(raw) && tokenCovered(action, t) && STATION_MASTER.test(t) && t.includes(PROD_INTERLOCKING) && t.includes(PROD_TRAIN),
36
40
  );
37
41
  }
38
42
 
@@ -41,7 +45,7 @@ for (const scanRoot of roots) {
41
45
  const records = interlockingFiles(croot)
42
46
  .map((f) => ({ file: f, rec: parseInterlocking(readText(f)) }))
43
47
  .filter((x) => x.rec);
44
- const e2eTexts = e2eFiles(croot).map((f) => maskComments(readText(f)));
48
+ const e2eTexts = e2eFiles(croot).map((f) => { const raw = readText(f); return { raw, text: maskComments(raw) }; });
45
49
 
46
50
  for (const { file, rec } of records) {
47
51
  if (!rec.exposed) continue;
@@ -1,3 +1,4 @@
1
+ // Phase: SMOKE
1
2
  // Station Master smoke test for the exposed resolve_match action — drives the real entrypoint ->
2
3
  // Station Master -> InterlockingRunner -> TrainRunner path.
3
4
  import { StationMaster } from "../../convex/app";
@@ -1,3 +1,4 @@
1
+ // Phase: SMOKE
1
2
  // Station Master smoke test for the exposed resolve_match action — drives the real entrypoint ->
2
3
  // Station Master -> InterlockingRunner -> TrainRunner path.
3
4
  import { StationMaster } from "../../convex/app";
@@ -1,3 +1,4 @@
1
+ // Phase: SMOKE
1
2
  // Station Master smoke test for the exposed resolve_match action — drives the real entrypoint ->
2
3
  // Station Master -> InterlockingRunner -> TrainRunner path.
3
4
  import { StationMaster } from "../../convex/app";
@@ -1,3 +1,4 @@
1
+ // Phase: SMOKE
1
2
  // CLEAN fixture — the Station Master reached as a MODULE, not a class.
2
3
  //
3
4
  // The smoke check used to demand a symbol literally named StationMaster. The coder
@@ -1,3 +1,4 @@
1
+ // Phase: SMOKE
1
2
  // Station Master smoke test for the exposed resolve_match action — drives the real entrypoint ->
2
3
  // Station Master -> InterlockingRunner -> TrainRunner path.
3
4
  import { StationMaster } from "../../convex/app";
package/integrity.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.10.19",
2
+ "version": "0.10.21",
3
3
  "files": {
4
4
  "HOOK_AUDIT.md": "5329d840db37671b1918f688ead26865473b87db73dbc75f7c8b2a8bbe8d6d43",
5
5
  "PLANNER_PORT.md": "fb5935bac8b7ac18994de21e43ace3a5ef8cd55f85b0e3349fca261280054f11",
@@ -379,34 +379,34 @@
379
379
  "detectors/bun_interlocking_binding/fixtures/dirty_transcribed_runtime/server.ts": "d5bc34c5b1b2b0a511e0c4604ce6f9c77491dca9aee994be720540f3052babc1",
380
380
  "detectors/bun_interlocking_binding/fixtures/dirty_transcribed_runtime/src/trains/interlocking.ts": "9bcfdb4ecff6efd1f658b9fd587342615179924e25468c75daa07c2626d4d8ab",
381
381
  "detectors/bun_interlocking_binding/fixtures/dirty_transcribed_runtime/src/trains/runner.ts": "0e4b885e50f12cc2a8c8f6740bf83e7b2e7137a28e1e143586e9a8550ea5bd45",
382
- "detectors/bun_interlocking_coverage/_shared/interlocking.mjs": "ec40372ab47e30e18dfd14a69a9f63486defda0c1a9e95dd3a9a158c01b009fe",
382
+ "detectors/bun_interlocking_coverage/_shared/interlocking.mjs": "4946e582f1ddee7346a6d546bd8309f622ffeb383f9f8ac1a02de9d20a72723d",
383
383
  "detectors/bun_interlocking_coverage/atdd.implementation.yaml": "f160517a8138ba3ca05e3d130e6fbfb796e643376f25743fdef4fc210196525b",
384
384
  "detectors/bun_interlocking_coverage/checks/_map.json": "0a218ea319cc6258af7bd721c2154cb9561fe67e80d80ef32d08fc77bc9403c3",
385
385
  "detectors/bun_interlocking_coverage/checks/interlocking_production_runner.mjs": "136eb0955052f2485740adfb888f5ba6f1414dcdb53d505034b8db40420a611a",
386
- "detectors/bun_interlocking_coverage/checks/interlocking_route_coverage.mjs": "b91b7920064faa412056edb8a743dfab4fcf11778fc0af02ac6e1d5db1c88212",
387
- "detectors/bun_interlocking_coverage/checks/interlocking_smoke_coverage.mjs": "ea4b0155c4f151a36979d850aa2482901b37eacc0fe01cecc0a736089a3e15ce",
386
+ "detectors/bun_interlocking_coverage/checks/interlocking_route_coverage.mjs": "2d73c401adf77b3147e11271653c528d02dfc50f4eebde8be35795707023fb6d",
387
+ "detectors/bun_interlocking_coverage/checks/interlocking_smoke_coverage.mjs": "ad53b606c325f87b09ac89c848c75ba5618e7073223fe528cf048343147638ce",
388
388
  "detectors/bun_interlocking_coverage/checks/interlocking_trace_binds.mjs": "61dcb8a8d04e9764aab7920f346bd3684fc98e2c294aa5c58eefec555145a1d0",
389
389
  "detectors/bun_interlocking_coverage/checks/interlocking_train_sequence.mjs": "7a38ce0b8bd5b4342a7bae09776b9638dc3ed51635322055a4fb0f0e6940af77",
390
390
  "detectors/bun_interlocking_coverage/detect.mjs": "a124418dc29aaf8fda9cd09427230d25768206b3f563d516774667e8cf75b66e",
391
391
  "detectors/bun_interlocking_coverage/fixtures/clean/interlocking_production_runner/e2e/interlockings/match-resolution/routes.test.ts": "ba6ea85b3fbe15e3c49332da3ad2921a0ff3436a6fe3b5a5035fb35fdc874720",
392
392
  "detectors/bun_interlocking_coverage/fixtures/clean/interlocking_production_runner/e2e/interlockings/match-resolution/trace.test.ts": "aee4ea93ceb8636846344e915cd7e66f7e8f99ba08596f83266590fa2b9ff58e",
393
- "detectors/bun_interlocking_coverage/fixtures/clean/interlocking_production_runner/e2e/smoke/resolve-match.smoke.test.ts": "07398b0d33ef6b7139c1a2c762bb8cc7afc307b7dfad248d048e7f4bad81320d",
393
+ "detectors/bun_interlocking_coverage/fixtures/clean/interlocking_production_runner/e2e/smoke/resolve-match.smoke.test.ts": "8ac030da9817a8d584f188f237379dc89f69b2d4abd4cdc41ead66d838a88aa1",
394
394
  "detectors/bun_interlocking_coverage/fixtures/clean/interlocking_production_runner/plan/_trains/_interlockings/match-resolution.yaml": "a7d0fab140126717d0654d7275067ac7aef234c184dacf256341f80b42d3b9f8",
395
395
  "detectors/bun_interlocking_coverage/fixtures/clean/interlocking_route_coverage/e2e/interlockings/match-resolution/routes.test.ts": "ba6ea85b3fbe15e3c49332da3ad2921a0ff3436a6fe3b5a5035fb35fdc874720",
396
396
  "detectors/bun_interlocking_coverage/fixtures/clean/interlocking_route_coverage/e2e/interlockings/match-resolution/trace.test.ts": "aee4ea93ceb8636846344e915cd7e66f7e8f99ba08596f83266590fa2b9ff58e",
397
- "detectors/bun_interlocking_coverage/fixtures/clean/interlocking_route_coverage/e2e/smoke/resolve-match.smoke.test.ts": "07398b0d33ef6b7139c1a2c762bb8cc7afc307b7dfad248d048e7f4bad81320d",
397
+ "detectors/bun_interlocking_coverage/fixtures/clean/interlocking_route_coverage/e2e/smoke/resolve-match.smoke.test.ts": "8ac030da9817a8d584f188f237379dc89f69b2d4abd4cdc41ead66d838a88aa1",
398
398
  "detectors/bun_interlocking_coverage/fixtures/clean/interlocking_route_coverage/plan/_trains/_interlockings/match-resolution.yaml": "9e0f02cb0889826f2ac2fb88cd8c118c97d4321dcc5fccc0b767a511606841e6",
399
399
  "detectors/bun_interlocking_coverage/fixtures/clean/interlocking_smoke_coverage/e2e/interlockings/match-resolution/routes.test.ts": "ba6ea85b3fbe15e3c49332da3ad2921a0ff3436a6fe3b5a5035fb35fdc874720",
400
400
  "detectors/bun_interlocking_coverage/fixtures/clean/interlocking_smoke_coverage/e2e/interlockings/match-resolution/trace.test.ts": "aee4ea93ceb8636846344e915cd7e66f7e8f99ba08596f83266590fa2b9ff58e",
401
- "detectors/bun_interlocking_coverage/fixtures/clean/interlocking_smoke_coverage/e2e/smoke/resolve-match.smoke.test.ts": "07398b0d33ef6b7139c1a2c762bb8cc7afc307b7dfad248d048e7f4bad81320d",
401
+ "detectors/bun_interlocking_coverage/fixtures/clean/interlocking_smoke_coverage/e2e/smoke/resolve-match.smoke.test.ts": "8ac030da9817a8d584f188f237379dc89f69b2d4abd4cdc41ead66d838a88aa1",
402
402
  "detectors/bun_interlocking_coverage/fixtures/clean/interlocking_smoke_coverage/plan/_trains/_interlockings/match-resolution.yaml": "f9789174add20032c208d4e11f0733b2176bfa6725cf695ca601e4adbc5aa210",
403
403
  "detectors/bun_interlocking_coverage/fixtures/clean/interlocking_smoke_coverage_module/e2e/interlockings/match-resolution/routes.test.ts": "ba6ea85b3fbe15e3c49332da3ad2921a0ff3436a6fe3b5a5035fb35fdc874720",
404
404
  "detectors/bun_interlocking_coverage/fixtures/clean/interlocking_smoke_coverage_module/e2e/interlockings/match-resolution/trace.test.ts": "aee4ea93ceb8636846344e915cd7e66f7e8f99ba08596f83266590fa2b9ff58e",
405
- "detectors/bun_interlocking_coverage/fixtures/clean/interlocking_smoke_coverage_module/e2e/smoke/resolve-match.smoke.test.ts": "e02d6d50de63a30b4c70f33772a518d518cac381a948bc406d1c66b88cdd5c9c",
405
+ "detectors/bun_interlocking_coverage/fixtures/clean/interlocking_smoke_coverage_module/e2e/smoke/resolve-match.smoke.test.ts": "73a410fbafe087f110a8a00ba41633e1d8d6fdecbddcd7f19afb9909ad8fc77f",
406
406
  "detectors/bun_interlocking_coverage/fixtures/clean/interlocking_smoke_coverage_module/plan/_trains/_interlockings/match-resolution.yaml": "b4fcce9002f6f0c2ff0b840e817b0dfe83e0867ccb76b825c3c248cf50a93e6a",
407
407
  "detectors/bun_interlocking_coverage/fixtures/clean/interlocking_trace_binds/e2e/interlockings/match-resolution/routes.test.ts": "ba6ea85b3fbe15e3c49332da3ad2921a0ff3436a6fe3b5a5035fb35fdc874720",
408
408
  "detectors/bun_interlocking_coverage/fixtures/clean/interlocking_trace_binds/e2e/interlockings/match-resolution/trace.test.ts": "aee4ea93ceb8636846344e915cd7e66f7e8f99ba08596f83266590fa2b9ff58e",
409
- "detectors/bun_interlocking_coverage/fixtures/clean/interlocking_trace_binds/e2e/smoke/resolve-match.smoke.test.ts": "07398b0d33ef6b7139c1a2c762bb8cc7afc307b7dfad248d048e7f4bad81320d",
409
+ "detectors/bun_interlocking_coverage/fixtures/clean/interlocking_trace_binds/e2e/smoke/resolve-match.smoke.test.ts": "8ac030da9817a8d584f188f237379dc89f69b2d4abd4cdc41ead66d838a88aa1",
410
410
  "detectors/bun_interlocking_coverage/fixtures/clean/interlocking_trace_binds/plan/_trains/_interlockings/match-resolution.yaml": "1a964384ec443b08224c14f53073e165cf12c562a79e99e0d49abfee1b6cfe2a",
411
411
  "detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_production_runner/e2e/interlockings/match-resolution/routes.test.ts": "753da27c1c479836ca7234f28e47e6e4b36eea17cd5b5f9821efb57c8457b053",
412
412
  "detectors/bun_interlocking_coverage/fixtures/dirty/interlocking_production_runner/e2e/interlockings/match-resolution/trace.test.ts": "aee4ea93ceb8636846344e915cd7e66f7e8f99ba08596f83266590fa2b9ff58e",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@afokapu/atdd-bun",
3
- "version": "0.10.19",
3
+ "version": "0.10.21",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/afokapu/atdd-bun.git"