@afokapu/atdd-bun 0.6.2 → 0.7.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.
Files changed (95) hide show
  1. package/README.md +13 -3
  2. package/conventions/coder.bun/coder.bun.telemetry-forbidden-properties.convention.yaml +51 -0
  3. package/conventions/coder.bun/coder.bun.telemetry-implementation-binding.convention.yaml +45 -0
  4. package/conventions/coder.bun/coder.bun.telemetry-raw-string-emit.convention.yaml +53 -0
  5. package/conventions/coder.bun/coder.bun.telemetry-source-binding.convention.yaml +48 -0
  6. package/conventions/coder.bun/coder.bun.telemetry-vendor-sdk.convention.yaml +51 -0
  7. package/conventions/planner.telemetry/planner.telemetry.acceptance-decision.convention.yaml +58 -0
  8. package/conventions/planner.telemetry/planner.telemetry.logical-ownership.convention.yaml +50 -0
  9. package/conventions/planner.telemetry/planner.telemetry.metric-cardinality.convention.yaml +47 -0
  10. package/conventions/planner.telemetry/planner.telemetry.tracking-plan-schema.convention.yaml +75 -0
  11. package/conventions/tester.bun/tester.bun.telemetry-captured-sink.convention.yaml +47 -0
  12. package/conventions/tester.bun/tester.bun.telemetry-identity-assertion.convention.yaml +44 -0
  13. package/conventions/tester.bun/tester.bun.telemetry-required-item-coverage.convention.yaml +44 -0
  14. package/conventions/tester.bun/tester.bun.telemetry-test-binding.convention.yaml +52 -0
  15. package/conventions/tester.bun/tester.bun.telemetry-timing-semantics.convention.yaml +53 -0
  16. package/detectors/bun_telemetry_code/atdd.implementation.yaml +24 -0
  17. package/detectors/bun_telemetry_code/calls.mjs +104 -0
  18. package/detectors/bun_telemetry_code/checks/t_forbidden_properties.mjs +46 -0
  19. package/detectors/bun_telemetry_code/checks/t_implementation_binding.mjs +41 -0
  20. package/detectors/bun_telemetry_code/checks/t_raw_string_emit.mjs +34 -0
  21. package/detectors/bun_telemetry_code/checks/t_source_binding.mjs +48 -0
  22. package/detectors/bun_telemetry_code/checks/t_vendor_sdk.mjs +38 -0
  23. package/detectors/bun_telemetry_code/detect.mjs +50 -0
  24. package/detectors/bun_telemetry_code/fixtures/clean/plan/commons/E001.yaml +10 -0
  25. package/detectors/bun_telemetry_code/fixtures/clean/plan/commons/E002.yaml +7 -0
  26. package/detectors/bun_telemetry_code/fixtures/clean/plan/commons/_commons.yaml +6 -0
  27. package/detectors/bun_telemetry_code/fixtures/clean/src/wagons/commons/features/ingress/domain/accept-response.ts +8 -0
  28. package/detectors/bun_telemetry_code/fixtures/clean/src/wagons/commons/features/ingress/infrastructure/otel-adapter.ts +8 -0
  29. package/detectors/bun_telemetry_code/fixtures/clean/telemetry/commons/response-invocation-accepted/event.be.json +16 -0
  30. package/detectors/bun_telemetry_code/fixtures/clean/telemetry/commons/response-invocation-accepted/metric.be.duration.json +19 -0
  31. package/detectors/bun_telemetry_code/fixtures/clean/tests/wagons/commons/features/ingress/unit/accept-response.telemetry.test.ts +13 -0
  32. package/detectors/bun_telemetry_code/fixtures/clean/tests/wagons/commons/features/ingress/unit/accept-response.test.ts +9 -0
  33. package/detectors/bun_telemetry_code/fixtures/dirty/plan/commons/E001.yaml +8 -0
  34. package/detectors/bun_telemetry_code/fixtures/dirty/plan/commons/_commons.yaml +6 -0
  35. package/detectors/bun_telemetry_code/fixtures/dirty/src/wagons/commons/features/ingress/domain/accept-response.ts +13 -0
  36. package/detectors/bun_telemetry_code/fixtures/dirty/src/wagons/commons/features/ingress/domain/tracing.ts +3 -0
  37. package/detectors/bun_telemetry_code/fixtures/dirty/telemetry/commons/response-invocation-accepted/event.be.json +16 -0
  38. package/detectors/bun_telemetry_code/fixtures/dirty/tests/wagons/commons/features/ingress/unit/probe.test.ts +7 -0
  39. package/detectors/bun_telemetry_code/registry.mjs +34 -0
  40. package/detectors/bun_telemetry_test/_shared.mjs +92 -0
  41. package/detectors/bun_telemetry_test/atdd.implementation.yaml +24 -0
  42. package/detectors/bun_telemetry_test/checks/t_captured_sink.mjs +35 -0
  43. package/detectors/bun_telemetry_test/checks/t_identity_assertion.mjs +45 -0
  44. package/detectors/bun_telemetry_test/checks/t_required_item_coverage.mjs +37 -0
  45. package/detectors/bun_telemetry_test/checks/t_test_binding.mjs +56 -0
  46. package/detectors/bun_telemetry_test/checks/t_timing_semantics.mjs +51 -0
  47. package/detectors/bun_telemetry_test/detect.mjs +50 -0
  48. package/detectors/bun_telemetry_test/fixtures/clean/plan/commons/E001.yaml +10 -0
  49. package/detectors/bun_telemetry_test/fixtures/clean/plan/commons/E002.yaml +7 -0
  50. package/detectors/bun_telemetry_test/fixtures/clean/plan/commons/_commons.yaml +6 -0
  51. package/detectors/bun_telemetry_test/fixtures/clean/src/wagons/commons/features/ingress/domain/accept-response.ts +8 -0
  52. package/detectors/bun_telemetry_test/fixtures/clean/telemetry/commons/response-invocation-accepted/event.be.json +16 -0
  53. package/detectors/bun_telemetry_test/fixtures/clean/telemetry/commons/response-invocation-accepted/metric.be.duration.json +19 -0
  54. package/detectors/bun_telemetry_test/fixtures/clean/tests/wagons/commons/features/ingress/unit/accept-response.telemetry.test.ts +13 -0
  55. package/detectors/bun_telemetry_test/fixtures/clean/tests/wagons/commons/features/ingress/unit/accept-response.test.ts +7 -0
  56. package/detectors/bun_telemetry_test/fixtures/dirty/plan/commons/E001.yaml +10 -0
  57. package/detectors/bun_telemetry_test/fixtures/dirty/plan/commons/E002.yaml +7 -0
  58. package/detectors/bun_telemetry_test/fixtures/dirty/plan/commons/_commons.yaml +6 -0
  59. package/detectors/bun_telemetry_test/fixtures/dirty/src/wagons/commons/features/ingress/domain/accept-response.ts +8 -0
  60. package/detectors/bun_telemetry_test/fixtures/dirty/telemetry/commons/response-invocation-accepted/event.be.json +16 -0
  61. package/detectors/bun_telemetry_test/fixtures/dirty/telemetry/commons/response-invocation-accepted/metric.be.duration.json +19 -0
  62. package/detectors/bun_telemetry_test/fixtures/dirty/tests/wagons/commons/features/ingress/unit/dangling.telemetry.test.ts +9 -0
  63. package/detectors/bun_telemetry_test/fixtures/dirty/tests/wagons/commons/features/ingress/unit/loose.telemetry.test.ts +11 -0
  64. package/detectors/bun_telemetry_test/fixtures/dirty/tests/wagons/commons/features/ingress/unit/unbound.telemetry.test.ts +10 -0
  65. package/detectors/planner_telemetry_plan/atdd.implementation.yaml +22 -0
  66. package/detectors/planner_telemetry_plan/detect.mjs +9 -0
  67. package/detectors/planner_telemetry_plan/fixtures/clean/plan/commons/E001.yaml +10 -0
  68. package/detectors/planner_telemetry_plan/fixtures/clean/plan/commons/E002.yaml +7 -0
  69. package/detectors/planner_telemetry_plan/fixtures/clean/plan/commons/_commons.yaml +6 -0
  70. package/detectors/planner_telemetry_plan/fixtures/clean/src/wagons/commons/features/ingress/domain/accept-response.ts +8 -0
  71. package/detectors/planner_telemetry_plan/fixtures/clean/telemetry/commons/response-invocation-accepted/event.be.json +16 -0
  72. package/detectors/planner_telemetry_plan/fixtures/clean/telemetry/commons/response-invocation-accepted/metric.be.duration.json +19 -0
  73. package/detectors/planner_telemetry_plan/fixtures/clean/tests/wagons/commons/features/ingress/unit/accept-response.telemetry.test.ts +13 -0
  74. package/detectors/planner_telemetry_plan/fixtures/dirty/plan/commons/E001.yaml +9 -0
  75. package/detectors/planner_telemetry_plan/fixtures/dirty/plan/commons/E002.yaml +4 -0
  76. package/detectors/planner_telemetry_plan/fixtures/dirty/plan/commons/E003.yaml +7 -0
  77. package/detectors/planner_telemetry_plan/fixtures/dirty/plan/commons/_commons.yaml +6 -0
  78. package/detectors/planner_telemetry_plan/fixtures/dirty/telemetry/commons/extra.json +1 -0
  79. package/detectors/planner_telemetry_plan/fixtures/dirty/telemetry/commons/orphan-artifact/event.be.json +14 -0
  80. package/detectors/planner_telemetry_plan/fixtures/dirty/telemetry/commons/response-invocation-accepted/event.be.json +16 -0
  81. package/detectors/planner_telemetry_plan/fixtures/dirty/telemetry/commons/response-invocation-accepted/metric.be.duration.json +22 -0
  82. package/detectors/planner_telemetry_plan/fixtures/dirty/telemetry/commons/response-invocation-accepted/notes.json +1 -0
  83. package/integrity.json +94 -11
  84. package/lib/scan.mjs +37 -0
  85. package/package.json +1 -1
  86. package/planner-schemas/acceptance.schema.json +70 -1
  87. package/planner-schemas/telemetry-plan.schema.json +133 -0
  88. package/relationships.yaml +174 -0
  89. package/src/enforce.ts +2 -1
  90. package/src/index.ts +2 -0
  91. package/src/integrity.ts +25 -9
  92. package/src/setup.ts +17 -1
  93. package/src/telemetry-plan.ts +223 -0
  94. package/src/topology.ts +3 -1
  95. package/templates/github/atdd-bun.yml +5 -0
@@ -0,0 +1,9 @@
1
+ // URN: test:commons:ingress:E001-UNIT-001
2
+ // Acceptance: acc:commons:E001-UNIT-001
3
+ // Telemetry: telemetry:event:be:commons:unknown-item
4
+ import { expect, mock, test } from "bun:test";
5
+
6
+ test("proves nothing yet", () => {
7
+ const emit = mock(() => {});
8
+ expect(emit).not.toHaveBeenCalled();
9
+ });
@@ -0,0 +1,11 @@
1
+ // URN: test:commons:ingress:E001-UNIT-001
2
+ // Acceptance: acc:commons:E001-UNIT-001
3
+ // Telemetry: telemetry:event:be:commons:response-invocation-accepted
4
+ import { expect, test } from "bun:test";
5
+ import { acceptResponse } from "../../../../../src/wagons/commons/features/ingress/domain/accept-response";
6
+
7
+ test("accepts the response", () => {
8
+ const done: string[] = [];
9
+ acceptResponse({ id: "r-1" }, { emit: (id) => done.push(id) });
10
+ expect(done.length).toBeGreaterThan(0);
11
+ });
@@ -0,0 +1,10 @@
1
+ // URN: test:commons:ingress:E001-UNIT-001
2
+ // Telemetry: telemetry:event:be:commons:response-invocation-accepted
3
+ import { expect, mock, test } from "bun:test";
4
+ import { acceptResponse } from "../../../../../src/wagons/commons/features/ingress/domain/accept-response";
5
+
6
+ test("emits the planned event", () => {
7
+ const emit = mock(() => {});
8
+ acceptResponse({ id: "r-1" }, { emit });
9
+ expect(emit).toHaveBeenCalledWith("telemetry:event:be:commons:response-invocation-accepted", { response_id: "r-1", outcome: "accepted" });
10
+ });
@@ -0,0 +1,22 @@
1
+ schema_version: "1.0.0"
2
+ kind: implementation
3
+ subtype: validator
4
+ implementation_id: planner.telemetry.impl
5
+ targets_workspace: atdd.workspace.bun
6
+ contract_version: "1.0.0"
7
+ # The telemetry tracking plan: the versioned telemetry/ registry, wagon ownership of logical
8
+ # artifacts, and the explicit per-acceptance telemetry decision. Runs only under the telemetry
9
+ # profile and is inert until the repository adopts the capability (telemetry root present, or
10
+ # any acceptance declaring a telemetry decision).
11
+ emits_rule_ids:
12
+ - planner.telemetry.tracking-plan-schema
13
+ - planner.telemetry.logical-ownership
14
+ - planner.telemetry.acceptance-decision
15
+ - planner.telemetry.metric-cardinality
16
+ realizes_convention:
17
+ - planner.telemetry.tracking-plan-schema
18
+ - planner.telemetry.logical-ownership
19
+ - planner.telemetry.acceptance-decision
20
+ - planner.telemetry.metric-cardinality
21
+ entrypoint: detect.mjs
22
+ report: detect.mjs
@@ -0,0 +1,9 @@
1
+ import { mkdir, writeFile } from "node:fs/promises";
2
+ import { dirname } from "node:path";
3
+ import { validateTelemetryPlan } from "../../src/telemetry-plan.ts";
4
+
5
+ const roots = JSON.parse(process.env.ATDD_SCAN_ROOTS ?? "[]"), report = process.env.ATDD_VIOLATIONS_REPORT;
6
+ if (!report) throw new Error("ATDD_VIOLATIONS_REPORT is required");
7
+ const violations = (await Promise.all(roots.map(validateTelemetryPlan))).flat().map(item => ({ ...item, line: 1, col: 1, source_line: "" }));
8
+ await mkdir(dirname(report), { recursive: true });
9
+ await writeFile(report, JSON.stringify({ violations }, null, 2));
@@ -0,0 +1,10 @@
1
+ urn: wmbt:commons:E001
2
+ acceptances:
3
+ - identity:
4
+ urn: acc:commons:E001-UNIT-001
5
+ telemetry:
6
+ disposition: required
7
+ events:
8
+ - telemetry:event:be:commons:response-invocation-accepted
9
+ metrics:
10
+ - telemetry:metric:be:commons:response-invocation-accepted:duration
@@ -0,0 +1,7 @@
1
+ urn: wmbt:commons:E002
2
+ acceptances:
3
+ - identity:
4
+ urn: acc:commons:E002-UNIT-001
5
+ telemetry:
6
+ disposition: not-applicable
7
+ rationale: No externally useful observable outcome beyond the tested return value.
@@ -0,0 +1,6 @@
1
+ urn: wagon:commons
2
+ wagon: commons
3
+ produce:
4
+ - name: commons:response-invocation
5
+ contract: null
6
+ telemetry: telemetry:commons:response-invocation-accepted
@@ -0,0 +1,8 @@
1
+ // Telemetry: telemetry:event:be:commons:response-invocation-accepted
2
+ // Telemetry: telemetry:metric:be:commons:response-invocation-accepted:duration
3
+ export type TelemetryPort = { emit(id: string, properties: Record<string, unknown>): void };
4
+
5
+ export function acceptResponse(response: { id: string }, telemetry: TelemetryPort): void {
6
+ telemetry.emit("telemetry:event:be:commons:response-invocation-accepted", { response_id: response.id, outcome: "accepted" });
7
+ telemetry.emit("telemetry:metric:be:commons:response-invocation-accepted:duration", { outcome: "accepted" });
8
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "id": "telemetry:event:be:commons:response-invocation-accepted",
3
+ "version": "1.0.0",
4
+ "logical_artifact": "telemetry:commons:response-invocation-accepted",
5
+ "kind": "event",
6
+ "plane": "be",
7
+ "owner": "commons",
8
+ "purpose": "Records that a response invocation passed acceptance so ingress health can be audited.",
9
+ "acceptances": ["acc:commons:E001-UNIT-001"],
10
+ "properties": {
11
+ "response_id": { "type": "string", "classification": "internal", "cardinality": "high" },
12
+ "outcome": { "type": "string", "allowed_values": ["accepted"] }
13
+ },
14
+ "required": ["response_id", "outcome"],
15
+ "forbidden_properties": ["raw_payload", "secret", "prompt"]
16
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "id": "telemetry:metric:be:commons:response-invocation-accepted:duration",
3
+ "version": "1.0.0",
4
+ "logical_artifact": "telemetry:commons:response-invocation-accepted",
5
+ "kind": "metric",
6
+ "plane": "be",
7
+ "measure": "duration",
8
+ "instrument": "histogram",
9
+ "unit": "ms",
10
+ "owner": "commons",
11
+ "purpose": "Bounds how long an accepted response invocation takes to complete end to end.",
12
+ "acceptances": ["acc:commons:E001-UNIT-001"],
13
+ "properties": {
14
+ "outcome": { "type": "string", "classification": "internal", "cardinality": "low" }
15
+ },
16
+ "required": ["outcome"],
17
+ "dimensions": [{ "name": "outcome", "cardinality": "low" }],
18
+ "timing": ["post-commit"]
19
+ }
@@ -0,0 +1,13 @@
1
+ // URN: test:commons:ingress:E001-UNIT-001
2
+ // Acceptance: acc:commons:E001-UNIT-001
3
+ // Telemetry: telemetry:event:be:commons:response-invocation-accepted
4
+ // Telemetry: telemetry:metric:be:commons:response-invocation-accepted:duration
5
+ import { expect, mock, test } from "bun:test";
6
+ import { acceptResponse } from "../../../../../src/wagons/commons/features/ingress/domain/accept-response";
7
+
8
+ test("emits the planned event once the invocation commits", () => {
9
+ const emit = mock(() => {});
10
+ acceptResponse({ id: "r-1" }, { emit });
11
+ expect(emit).toHaveBeenCalledWith("telemetry:event:be:commons:response-invocation-accepted", { response_id: "r-1", outcome: "accepted" });
12
+ expect(emit).toHaveBeenCalledWith("telemetry:metric:be:commons:response-invocation-accepted:duration", { outcome: "accepted" });
13
+ });
@@ -0,0 +1,9 @@
1
+ urn: wmbt:commons:E001
2
+ acceptances:
3
+ - identity:
4
+ urn: acc:commons:E001-UNIT-001
5
+ telemetry:
6
+ disposition: required
7
+ events:
8
+ - telemetry:event:be:commons:response-invocation-accepted
9
+ - telemetry:event:be:commons:response-never-planned
@@ -0,0 +1,4 @@
1
+ urn: wmbt:commons:E002
2
+ acceptances:
3
+ - identity:
4
+ urn: acc:commons:E002-UNIT-001
@@ -0,0 +1,7 @@
1
+ urn: wmbt:commons:E003
2
+ acceptances:
3
+ - identity:
4
+ urn: acc:commons:E003-UNIT-001
5
+ telemetry:
6
+ disposition: not-applicable
7
+ rationale: too short
@@ -0,0 +1,6 @@
1
+ urn: wagon:commons
2
+ wagon: commons
3
+ produce:
4
+ - name: commons:response-invocation
5
+ contract: null
6
+ telemetry: telemetry:commons:response-invocation-accepted
@@ -0,0 +1,14 @@
1
+ {
2
+ "id": "telemetry:event:be:commons:orphan-artifact",
3
+ "version": "1.0.0",
4
+ "logical_artifact": "telemetry:commons:orphan-artifact",
5
+ "kind": "event",
6
+ "plane": "be",
7
+ "owner": "commons",
8
+ "purpose": "Records an outcome no wagon has declared ownership of, to exercise the ownership rule.",
9
+ "acceptances": ["acc:commons:E001-UNIT-001"],
10
+ "properties": {
11
+ "outcome": { "type": "string" }
12
+ },
13
+ "required": ["outcome"]
14
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "id": "telemetry:event:be:commons:renamed-artifact",
3
+ "version": "1.0.0",
4
+ "logical_artifact": "telemetry:commons:response-invocation-accepted",
5
+ "kind": "event",
6
+ "plane": "be",
7
+ "owner": "commons",
8
+ "purpose": "Records that a response invocation passed acceptance so ingress health can be audited.",
9
+ "acceptances": ["acc:commons:E099-UNIT-001"],
10
+ "properties": {
11
+ "response_id": { "type": "string", "classification": "internal", "cardinality": "high" },
12
+ "outcome": { "type": "string", "allowed_values": ["accepted"] }
13
+ },
14
+ "required": ["response_id", "outcome"],
15
+ "forbidden_properties": ["raw_payload", "secret", "prompt"]
16
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "id": "telemetry:metric:be:commons:response-invocation-accepted:duration",
3
+ "version": "1.0.0",
4
+ "logical_artifact": "telemetry:commons:response-invocation-accepted",
5
+ "kind": "metric",
6
+ "plane": "be",
7
+ "measure": "duration",
8
+ "instrument": "histogram",
9
+ "unit": "ms",
10
+ "owner": "commons",
11
+ "purpose": "Bounds how long an accepted response invocation takes to complete end to end.",
12
+ "acceptances": ["acc:commons:E001-UNIT-001"],
13
+ "properties": {
14
+ "outcome": { "type": "string", "classification": "internal", "cardinality": "low" },
15
+ "response_id": { "type": "string", "classification": "internal", "cardinality": "high" }
16
+ },
17
+ "required": ["outcome"],
18
+ "dimensions": [
19
+ { "name": "response_id", "cardinality": "high" },
20
+ { "name": "outcome", "cardinality": "low" }
21
+ ]
22
+ }
package/integrity.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
- "version": "0.6.2",
2
+ "version": "0.7.1",
3
3
  "files": {
4
4
  "HOOK_AUDIT.md": "5329d840db37671b1918f688ead26865473b87db73dbc75f7c8b2a8bbe8d6d43",
5
5
  "PLANNER_PORT.md": "fb5935bac8b7ac18994de21e43ace3a5ef8cd55f85b0e3349fca261280054f11",
6
- "README.md": "2d2518482d9213dc3a6b3ad815b21dee889312ea2bcf22fbc767a5cfed6dc7b3",
6
+ "README.md": "4e612f6344fab29c38269ce0303b73c32f75911dfef16a3acefe382f068329a3",
7
7
  "bunfig.toml": "b9fc65eca9014c5179380259d70e76385a6a80788fa9a2df5fb3eaa5554fd2fe",
8
8
  "conventions/atdd-bun.planner/atdd-bun.planner.acceptance-identity.convention.yaml": "81c5c773d5ee15e8d99a2c237aa9846b110b2533df45ebf407d0e3ec6ed3dd03",
9
9
  "conventions/atdd-bun.planner/atdd-bun.planner.identity-required.convention.yaml": "e96d7c1455d0c221072d82e7f2b55da1c4f9ceb17718eb6ed96affdeef37675b",
@@ -78,6 +78,11 @@
78
78
  "conventions/coder.bun/coder.bun.security-sql-injection.convention.yaml": "b4cbc3a446bbbf874762fd13c873305eaf7417c45a6206133163509b97267faa",
79
79
  "conventions/coder.bun/coder.bun.station-master-interlocking-routing.convention.yaml": "b0b0572a79b4dd6f35db350980652afbdd797646d613c552b7c5595f72efdee8",
80
80
  "conventions/coder.bun/coder.bun.station-master-journey-routing.convention.yaml": "5f0c26b860c85ae5a22f3d63dd0a243b7cdda39812dc291591ecc5fe75a894a7",
81
+ "conventions/coder.bun/coder.bun.telemetry-forbidden-properties.convention.yaml": "7dd411af2180e70a84f4bad99c568060504bb5ff5e7ccb9fc1b6fd4b3aadcbcd",
82
+ "conventions/coder.bun/coder.bun.telemetry-implementation-binding.convention.yaml": "5eb854948cdb8a1510fe808e3e5be13840d02b6bf07b4aa6d6ca94739128e7a7",
83
+ "conventions/coder.bun/coder.bun.telemetry-raw-string-emit.convention.yaml": "7fb7c83a916078184862c89edf1bf3bc6332ffd6bc8e2f17d96a221af1a40007",
84
+ "conventions/coder.bun/coder.bun.telemetry-source-binding.convention.yaml": "60a4eaa9c625be88d4aee642ef6f615113e8bafd4652b232eee86fcc1abd610e",
85
+ "conventions/coder.bun/coder.bun.telemetry-vendor-sdk.convention.yaml": "8ed29a99c1c46deaeedd29cc656f62ca472fad44115c226c057c51270bef0257",
81
86
  "conventions/coder.bun/coder.bun.wagon-honours-its-contract.convention.yaml": "712e8c8f3f3b1c0d7bb61c4b54a19823ff1c125a109b64db9cb48addd620581a",
82
87
  "conventions/coder.htmx/coder.htmx.fragment-escapes-interpolation.convention.yaml": "3f1fbb316074d0b79f5a209cd1a9afbf1b8f5235bb5a13f646b2fe8d89a1a893",
83
88
  "conventions/coder.htmx/coder.htmx.swap-no-inline-handler.convention.yaml": "17510aff81e41085dfa22f3d56d1d6a1d3c9d5ba5de887b66015525e491c51b7",
@@ -96,6 +101,10 @@
96
101
  "conventions/planner.docs/planner.docs.journey-view-current.convention.yaml": "5892d4213d72342dc568c37f13942139bbdce4c0d5716075de579dc8060fc969",
97
102
  "conventions/planner.docs/planner.docs.reference-integrity.convention.yaml": "34310088114ac7cc58bc74443a76366e3e644121aaa3ff39b6602a0d15e03293",
98
103
  "conventions/planner.docs/planner.docs.undeclared-change.convention.yaml": "102a0706b00e074a74dbe38a6a389075929aa12bc38dcfb155d7a5d52afe6abc",
104
+ "conventions/planner.telemetry/planner.telemetry.acceptance-decision.convention.yaml": "67dc840e0993c6940a431403b47439484ed557855a7dee82d75abd1479f3151e",
105
+ "conventions/planner.telemetry/planner.telemetry.logical-ownership.convention.yaml": "6dd666a22fd7fd0cb6e5fe5505665c8889a504ee929fdebf3aee019df4aac2b4",
106
+ "conventions/planner.telemetry/planner.telemetry.metric-cardinality.convention.yaml": "e61831f207ad4f09be983b300cbedc40f6ad08a4b2483612fc195e2343be93f6",
107
+ "conventions/planner.telemetry/planner.telemetry.tracking-plan-schema.convention.yaml": "5453cdf438dc5bdc72bbe5828b089e4090b865112f6a1550bb70e2c7c72a0cdf",
99
108
  "conventions/tester.bun/tester.bun.acceptance-binding-declared.convention.yaml": "46b9db88cdb978bc75b85b17d19a627233263da5b4fc6456a21fa870646ae1d0",
100
109
  "conventions/tester.bun/tester.bun.acceptance-covers-tag-well-formed.convention.yaml": "8dd55d2dc36d255ab553fba8cf6f5cd7de1ba286e687d290458d3b5681fbb40f",
101
110
  "conventions/tester.bun/tester.bun.acceptance-resolves-to-declared.convention.yaml": "6c5cc0719749dbcdd3eb02877799a40998e77b433b2f17d27ac1dbca44292610",
@@ -111,7 +120,12 @@
111
120
  "conventions/tester.bun/tester.bun.security-input.convention.yaml": "3118299e1e6a71b21be730f26377baab922b1c3d8b175b9b35f10d38d9ebaeb0",
112
121
  "conventions/tester.bun/tester.bun.smoke-no-collaborator-substitution.convention.yaml": "76187d91e6298ae9b89a39c2ebf9cb6f769e1d3ce08d7a9ea21727aadc6a019a",
113
122
  "conventions/tester.bun/tester.bun.smoke-observable-assertion.convention.yaml": "1d35f17221b7de3f9ad6bb3c1ced486bec401e1d024e2476147f4f9e52f05674",
123
+ "conventions/tester.bun/tester.bun.telemetry-captured-sink.convention.yaml": "7f1156dc041fc44d4becd18f379cd1fb68b99cd1e888b9a8f6dee4201ad5337b",
114
124
  "conventions/tester.bun/tester.bun.telemetry-emit.convention.yaml": "440ba54de6c23e25786d363d80a9c337f29aa2eaf59bc8b5c24d391cc1c3d3b7",
125
+ "conventions/tester.bun/tester.bun.telemetry-identity-assertion.convention.yaml": "25f7cc3dcb21e70a183638be9416802ef081323482a98eba604223fabf389b55",
126
+ "conventions/tester.bun/tester.bun.telemetry-required-item-coverage.convention.yaml": "1cf7430a496c0f6760e46b8ceac629e753cd91ec08018bfc5f16b52a50b61459",
127
+ "conventions/tester.bun/tester.bun.telemetry-test-binding.convention.yaml": "4566199fd401cd8666e08466cd3a5236f23ef356364e673b36a2e3c5ec78638d",
128
+ "conventions/tester.bun/tester.bun.telemetry-timing-semantics.convention.yaml": "5494744872deb34c175d741dfc79e9cfa720808dd7efaf118f709af417a1dd39",
115
129
  "conventions/tester.bun/tester.bun.test-carries-urn-identity.convention.yaml": "4c5846bae7f9671eabf808f43ee3f134a67214113f0e15e9a60705dbdcbe8d10",
116
130
  "conventions/tester.bun/tester.bun.test-imports-bun-test.convention.yaml": "b447312046391cdac30f76d35624b23dc1a72cb87225d0f2a4610fb3188425dc",
117
131
  "conventions/tester.bun/tester.bun.test-isolation-no-live-state.convention.yaml": "3488af16431ea461e9128d15dbb0ad86324f4446bf36d5a662fab73687e8860e",
@@ -506,6 +520,55 @@
506
520
  "detectors/bun_security_hygiene_detector/fixtures/dirty/logging.ts": "0ea2ba99eb5c0c123b0ca0863dfc6899fdf86dc0b867e59ae9be760bfe7d0978",
507
521
  "detectors/bun_security_hygiene_detector/fixtures/dirty/routes.ts": "6f57048a821675e0424205986195c678701a015c1c3b195b17a1898d95147266",
508
522
  "detectors/bun_security_hygiene_detector/fixtures/dirty/secrets.ts": "2341490d46aafccce99a12381cf0ee806b66588deb244c0bca154f5e8cb25cba",
523
+ "detectors/bun_telemetry_code/atdd.implementation.yaml": "d7fd2e3e4a564458b13abdc29f109b385686dfdd2f76163c9b53ee401a274b38",
524
+ "detectors/bun_telemetry_code/calls.mjs": "9bb40a5d721d1f251c4c58c501a6fd14e36db23a7cc9fe6194963941783c2862",
525
+ "detectors/bun_telemetry_code/checks/t_forbidden_properties.mjs": "9a73e096371b5e9f3fd7cbaaa7776d6e535fa1549b9f64c3bb91a7cedee2fc55",
526
+ "detectors/bun_telemetry_code/checks/t_implementation_binding.mjs": "8ac2074b3d95a148b1a9b8cb6fa0a1f7f129fb403b21eade3e91c2964e0bb223",
527
+ "detectors/bun_telemetry_code/checks/t_raw_string_emit.mjs": "6532e22a362d9f990b1e3444c65118b554a616eb4cdcb97132f2b9f3ae0867d9",
528
+ "detectors/bun_telemetry_code/checks/t_source_binding.mjs": "917809194779f60c7e4a0c8a58bc6b2eca39540aa331dfb82cd0c2ab530cf792",
529
+ "detectors/bun_telemetry_code/checks/t_vendor_sdk.mjs": "41efc80ac2e6c8aefcf22a0ed7c020836193f1f909c51885a998f73af35fa0a3",
530
+ "detectors/bun_telemetry_code/detect.mjs": "f35662fc4e53eb6db55a9850a2851ba8048e831434977b05446bc6ba89c8e7af",
531
+ "detectors/bun_telemetry_code/fixtures/clean/plan/commons/E001.yaml": "f7f28a3eceb175ed53e32da5c98e3bea98ac7b892a487406ede0e48d699fa3e3",
532
+ "detectors/bun_telemetry_code/fixtures/clean/plan/commons/E002.yaml": "fcd06986619212291e88d6d68954ef77d50e5b6870728b6e8040bb160007112f",
533
+ "detectors/bun_telemetry_code/fixtures/clean/plan/commons/_commons.yaml": "2d047360373c4faec6efb9a1c14222478d65fdc5de8af16a38ad04fd3d854a04",
534
+ "detectors/bun_telemetry_code/fixtures/clean/src/wagons/commons/features/ingress/domain/accept-response.ts": "4933c935805bb4a371024a91cbaeb3f5376486cc93d274db0691aec4a5496a3a",
535
+ "detectors/bun_telemetry_code/fixtures/clean/src/wagons/commons/features/ingress/infrastructure/otel-adapter.ts": "bd45a7ac1260bc763222b885c9730781123452f9c65773aa255e9bb017e098f9",
536
+ "detectors/bun_telemetry_code/fixtures/clean/telemetry/commons/response-invocation-accepted/event.be.json": "cbf0ca07f717745edd88876a1c75880d7ae5755292cae4af10e1f9a2b8fccc9a",
537
+ "detectors/bun_telemetry_code/fixtures/clean/telemetry/commons/response-invocation-accepted/metric.be.duration.json": "9a132102d4bf2b1c0bd9f62449e48c61cd34cf09f45481ffd3ef73c190e16cc3",
538
+ "detectors/bun_telemetry_code/fixtures/clean/tests/wagons/commons/features/ingress/unit/accept-response.telemetry.test.ts": "ee953cd9f899127180a08dbfcb8eb3254dc3d751454a0af3d9a6784693d2071a",
539
+ "detectors/bun_telemetry_code/fixtures/clean/tests/wagons/commons/features/ingress/unit/accept-response.test.ts": "97a33e0df211711a4f330e72c4c69171c098dfa640c8e3f43f0bab536397ec14",
540
+ "detectors/bun_telemetry_code/fixtures/dirty/plan/commons/E001.yaml": "09d20ca9748af660908c3829a2a494825a3d1f5b24fd9aa03a1dbcb1a0b462d7",
541
+ "detectors/bun_telemetry_code/fixtures/dirty/plan/commons/_commons.yaml": "2d047360373c4faec6efb9a1c14222478d65fdc5de8af16a38ad04fd3d854a04",
542
+ "detectors/bun_telemetry_code/fixtures/dirty/src/wagons/commons/features/ingress/domain/accept-response.ts": "411e7208f920eea69f6c049a3f90db3110b5edd1834b85de7682a04149c919c7",
543
+ "detectors/bun_telemetry_code/fixtures/dirty/src/wagons/commons/features/ingress/domain/tracing.ts": "1280062d3acbaaf58c7fe61b499f080848bbc00c7e48fdfab770d7958301f181",
544
+ "detectors/bun_telemetry_code/fixtures/dirty/telemetry/commons/response-invocation-accepted/event.be.json": "cbf0ca07f717745edd88876a1c75880d7ae5755292cae4af10e1f9a2b8fccc9a",
545
+ "detectors/bun_telemetry_code/fixtures/dirty/tests/wagons/commons/features/ingress/unit/probe.test.ts": "4dca357fbeb14c6423975e422a047b6bec3e352b2b687a809fb6d59b8f66ee0c",
546
+ "detectors/bun_telemetry_code/registry.mjs": "ccb169a31f02d7a6af379a8c1d6a548ef688a7885e925826a43c1e0bcf670097",
547
+ "detectors/bun_telemetry_test/_shared.mjs": "425340b41f958c4164f4e808633d8f5b27533280f516b7b176f58f1531da9e6c",
548
+ "detectors/bun_telemetry_test/atdd.implementation.yaml": "0bbe065a0cdebdf581b4a9a17b258421cb3619070d21fe44f0dbc7e765f47681",
549
+ "detectors/bun_telemetry_test/checks/t_captured_sink.mjs": "bc616b5fbf76cde18dc6a70256a8293a2cfad98bd6a656b11608ebb1befe0d0f",
550
+ "detectors/bun_telemetry_test/checks/t_identity_assertion.mjs": "10f089ac696cc1bb6024c6dea831d928843037395458f5a6882ecd72041b7f2d",
551
+ "detectors/bun_telemetry_test/checks/t_required_item_coverage.mjs": "975d229aedfad2af1002c6e314d480c7becd9e21bc5dad240cca848ea5dbe9ee",
552
+ "detectors/bun_telemetry_test/checks/t_test_binding.mjs": "401a8050568c8012a1a3a202180f2fa9ed57aac6e9147aa3852ce167a7238bdf",
553
+ "detectors/bun_telemetry_test/checks/t_timing_semantics.mjs": "80a29900674eb911261189e0318454aeec7535be199293c869cd760d3afc72f1",
554
+ "detectors/bun_telemetry_test/detect.mjs": "4de9f33be5eeb1b16dff8f4e54d377c380698e31cfc2c7d4a26ca93f5bc2ce47",
555
+ "detectors/bun_telemetry_test/fixtures/clean/plan/commons/E001.yaml": "f7f28a3eceb175ed53e32da5c98e3bea98ac7b892a487406ede0e48d699fa3e3",
556
+ "detectors/bun_telemetry_test/fixtures/clean/plan/commons/E002.yaml": "fcd06986619212291e88d6d68954ef77d50e5b6870728b6e8040bb160007112f",
557
+ "detectors/bun_telemetry_test/fixtures/clean/plan/commons/_commons.yaml": "2d047360373c4faec6efb9a1c14222478d65fdc5de8af16a38ad04fd3d854a04",
558
+ "detectors/bun_telemetry_test/fixtures/clean/src/wagons/commons/features/ingress/domain/accept-response.ts": "4933c935805bb4a371024a91cbaeb3f5376486cc93d274db0691aec4a5496a3a",
559
+ "detectors/bun_telemetry_test/fixtures/clean/telemetry/commons/response-invocation-accepted/event.be.json": "cbf0ca07f717745edd88876a1c75880d7ae5755292cae4af10e1f9a2b8fccc9a",
560
+ "detectors/bun_telemetry_test/fixtures/clean/telemetry/commons/response-invocation-accepted/metric.be.duration.json": "9a132102d4bf2b1c0bd9f62449e48c61cd34cf09f45481ffd3ef73c190e16cc3",
561
+ "detectors/bun_telemetry_test/fixtures/clean/tests/wagons/commons/features/ingress/unit/accept-response.telemetry.test.ts": "ee953cd9f899127180a08dbfcb8eb3254dc3d751454a0af3d9a6784693d2071a",
562
+ "detectors/bun_telemetry_test/fixtures/clean/tests/wagons/commons/features/ingress/unit/accept-response.test.ts": "78f1ce1b38aeeeaa29446dd03db9a5678b0f5f1f06eee8b4491161a65253fa91",
563
+ "detectors/bun_telemetry_test/fixtures/dirty/plan/commons/E001.yaml": "f7f28a3eceb175ed53e32da5c98e3bea98ac7b892a487406ede0e48d699fa3e3",
564
+ "detectors/bun_telemetry_test/fixtures/dirty/plan/commons/E002.yaml": "fcd06986619212291e88d6d68954ef77d50e5b6870728b6e8040bb160007112f",
565
+ "detectors/bun_telemetry_test/fixtures/dirty/plan/commons/_commons.yaml": "2d047360373c4faec6efb9a1c14222478d65fdc5de8af16a38ad04fd3d854a04",
566
+ "detectors/bun_telemetry_test/fixtures/dirty/src/wagons/commons/features/ingress/domain/accept-response.ts": "4933c935805bb4a371024a91cbaeb3f5376486cc93d274db0691aec4a5496a3a",
567
+ "detectors/bun_telemetry_test/fixtures/dirty/telemetry/commons/response-invocation-accepted/event.be.json": "cbf0ca07f717745edd88876a1c75880d7ae5755292cae4af10e1f9a2b8fccc9a",
568
+ "detectors/bun_telemetry_test/fixtures/dirty/telemetry/commons/response-invocation-accepted/metric.be.duration.json": "9a132102d4bf2b1c0bd9f62449e48c61cd34cf09f45481ffd3ef73c190e16cc3",
569
+ "detectors/bun_telemetry_test/fixtures/dirty/tests/wagons/commons/features/ingress/unit/dangling.telemetry.test.ts": "74d71386d52ee470969462f85858afd1ab1dd91a8a2a8cc9b77e29838efcff80",
570
+ "detectors/bun_telemetry_test/fixtures/dirty/tests/wagons/commons/features/ingress/unit/loose.telemetry.test.ts": "edc391e4932db7a0c0aaeab8e4dd357231c5d30fa05e69c8b43d52a06ce69fef",
571
+ "detectors/bun_telemetry_test/fixtures/dirty/tests/wagons/commons/features/ingress/unit/unbound.telemetry.test.ts": "f62e81465e3b0701c97ee31d18134cd169bf7f60480d1abbf8e9d6c9405b7f42",
509
572
  "detectors/bun_tester_discipline_detector/atdd.implementation.yaml": "bad18659c327b2165b5db7cf07530581b29d8ae8c41a42e730b82e56d23e771e",
510
573
  "detectors/bun_tester_discipline_detector/checks/_map.json": "d28273b975c4fbcda64026178b918dc9a84315d6312f29ae5221a0a9cb4c0b44",
511
574
  "detectors/bun_tester_discipline_detector/checks/t_acceptance_binding.mjs": "17861380275433ff79e191803456417454e2efa23801d9ac72bf6f8206337522",
@@ -864,9 +927,27 @@
864
927
  "detectors/planner_static_validators/fixtures/dirty/plan/dup/E001.yaml": "ba27e24435a55c9cf27c3603377666a0856f5394cf5ab1ce1c9af11b3a6d895d",
865
928
  "detectors/planner_static_validators/fixtures/dirty/plan/dup/_dup.yaml": "7dba1f53c3c45d9d3daff2637e38196984c0810d511c4e4db5162daa6599276b",
866
929
  "detectors/planner_static_validators/fixtures/dirty/plan/dup/features/bad.yaml": "2a78ee5d50e119e2b1ab400ac5606a6625c0ebab60391f51a7bc294d8649d3ec",
930
+ "detectors/planner_telemetry_plan/atdd.implementation.yaml": "897d1b4499d1b216b68e88dc7c20cd7d35f9ca8e457fd43aaf88e0c632dffbc9",
931
+ "detectors/planner_telemetry_plan/detect.mjs": "1ad009c9b1df5484c4ad3bd38c6255f3f36f87809f37a1e9445e81a32b406764",
932
+ "detectors/planner_telemetry_plan/fixtures/clean/plan/commons/E001.yaml": "f7f28a3eceb175ed53e32da5c98e3bea98ac7b892a487406ede0e48d699fa3e3",
933
+ "detectors/planner_telemetry_plan/fixtures/clean/plan/commons/E002.yaml": "fcd06986619212291e88d6d68954ef77d50e5b6870728b6e8040bb160007112f",
934
+ "detectors/planner_telemetry_plan/fixtures/clean/plan/commons/_commons.yaml": "2d047360373c4faec6efb9a1c14222478d65fdc5de8af16a38ad04fd3d854a04",
935
+ "detectors/planner_telemetry_plan/fixtures/clean/src/wagons/commons/features/ingress/domain/accept-response.ts": "4933c935805bb4a371024a91cbaeb3f5376486cc93d274db0691aec4a5496a3a",
936
+ "detectors/planner_telemetry_plan/fixtures/clean/telemetry/commons/response-invocation-accepted/event.be.json": "5d18430be2033ec41a6add2b21ddd6564e91ec824d2d76a0e3ddb1a4207e6ad6",
937
+ "detectors/planner_telemetry_plan/fixtures/clean/telemetry/commons/response-invocation-accepted/metric.be.duration.json": "9a132102d4bf2b1c0bd9f62449e48c61cd34cf09f45481ffd3ef73c190e16cc3",
938
+ "detectors/planner_telemetry_plan/fixtures/clean/tests/wagons/commons/features/ingress/unit/accept-response.telemetry.test.ts": "ee953cd9f899127180a08dbfcb8eb3254dc3d751454a0af3d9a6784693d2071a",
939
+ "detectors/planner_telemetry_plan/fixtures/dirty/plan/commons/E001.yaml": "94c9ebd2b449520df0fcde7cbd29b589d725062f38666cc3fc9384544ae07124",
940
+ "detectors/planner_telemetry_plan/fixtures/dirty/plan/commons/E002.yaml": "7240cf7e1212f8e352dbacc8049e1a2a5413f43ffa0e5b7f4e09b0a18435d5fe",
941
+ "detectors/planner_telemetry_plan/fixtures/dirty/plan/commons/E003.yaml": "acbfea8905f614fa6d2415deb490e1d1df24d9a181f62adafb89567af9f9c2f2",
942
+ "detectors/planner_telemetry_plan/fixtures/dirty/plan/commons/_commons.yaml": "2d047360373c4faec6efb9a1c14222478d65fdc5de8af16a38ad04fd3d854a04",
943
+ "detectors/planner_telemetry_plan/fixtures/dirty/telemetry/commons/extra.json": "ca3d163bab055381827226140568f3bef7eaac187cebd76878e0b63e9e442356",
944
+ "detectors/planner_telemetry_plan/fixtures/dirty/telemetry/commons/orphan-artifact/event.be.json": "044318a994420585e36851d1e661a26abf0093a63e4526b45aa9dd41d1cc12b1",
945
+ "detectors/planner_telemetry_plan/fixtures/dirty/telemetry/commons/response-invocation-accepted/event.be.json": "2086b0cc839b58930796ee01f979f0e0f507c8d6777b966dbc79d503ead95e84",
946
+ "detectors/planner_telemetry_plan/fixtures/dirty/telemetry/commons/response-invocation-accepted/metric.be.duration.json": "df1bf74716d5f7c4edcd04643b1ac7baab0aa4ac2454d92839a718238722b4be",
947
+ "detectors/planner_telemetry_plan/fixtures/dirty/telemetry/commons/response-invocation-accepted/notes.json": "ca3d163bab055381827226140568f3bef7eaac187cebd76878e0b63e9e442356",
867
948
  "lib/frontend.mjs": "d6d9b29c3d7f2d162cda03bb34b20a3224a82887b6be3db7cab375510913c9a3",
868
949
  "lib/imports.mjs": "3db4979269488fa26f6e7aefded6ece9c646be6587a10e249821a5a208109962",
869
- "lib/scan.mjs": "f232a6178f9b6d3d63ba4056709664b1700d4292c49bad1dec18e9560a7c0461",
950
+ "lib/scan.mjs": "8aa21e400ec415e23d49e0cc90fba2744822b8855261c85614e89c7cf35c4700",
870
951
  "planner-nodes/ENFORCEMENT_SCOPE.yaml": "d8ec7039c219857f3d77af5d4d84612b533b69c1a5fcef935fbf46470adafed4",
871
952
  "planner-nodes/nodes/planner.acceptance.abstract-fields-required.convention.yaml": "bd565693f0ae861f0561ad2f7a91a8c55f9a209c3acd59c5750cfcffd96a85d8",
872
953
  "planner-nodes/nodes/planner.acceptance.authoring-guidelines.convention.yaml": "16348dceed5868041b832bde766e9c8d4a950d4032f1f3066b357644081a3b17",
@@ -1064,7 +1145,7 @@
1064
1145
  "planner-nodes/nodes/planner.wmbt.statement-template.convention.yaml": "71e0c507577d6e71d36f8fc5d95f30f452b46d0e8b72e47fd6d6860533f905a2",
1065
1146
  "planner-nodes/nodes/planner.wmbt.step-code-vocabulary.convention.yaml": "848f7cc7573b64de080a3496ff097f6191eb54dfc1b9b8faf174456642c1c943",
1066
1147
  "planner-nodes/nodes/planner.wmbt.urn-naming.convention.yaml": "87a5fae8d5dc7beac5ddd5b5082ae6bc590f75fdb3667ab0738882289e2d896c",
1067
- "planner-schemas/acceptance.schema.json": "f77eb1d21347d218cf54074fe4293690ea867d002d8e80766832b4400e712382",
1148
+ "planner-schemas/acceptance.schema.json": "6d1f6cce37905470b8e8dde4249b79f5f7cf2f3aa20921c4e087895ba23697ac",
1068
1149
  "planner-schemas/appendix.schema.json": "68ca8a2301c0804a0ee3dbfc3bc8acc8fd52de84cd08211e217de036681edd36",
1069
1150
  "planner-schemas/author/convention-node.schema.json": "e776db0f79ffab175b5fc545512cec8e90a2b2d89dd8be462ae51d77296e7242",
1070
1151
  "planner-schemas/author/gate.schema.json": "3d451f9bf171b524e0155f73a27f151c4b6fa750fbd3a6cb27b9a6b0344aa05d",
@@ -1079,33 +1160,35 @@
1079
1160
  "planner-schemas/registry-index.schema.json": "ffd5643da662ced4052707eeb270eb02908f2e48365103ff0638ec7ba146f430",
1080
1161
  "planner-schemas/substrate-lock.schema.json": "9f15294314dbb9b9fbb8a4d6f2d19b273918a4ef44b72e48f6d4c6563b5ec938",
1081
1162
  "planner-schemas/substrate.schema.json": "ed4b899173e6a2fcdd63bb65e0f4129544179d0e71815e42a5b40b0729d916eb",
1163
+ "planner-schemas/telemetry-plan.schema.json": "5cade612a623a63f569d9e484e59ae9ebce512260cdac7aa5c2e8bccf1601184",
1082
1164
  "planner-schemas/theme-registry.schema.json": "a79b3d0a73c25d62a91c1b552c14731be3a1d96fa3445a7a39b51302dd060f76",
1083
1165
  "planner-schemas/train-interlocking-registry.schema.json": "fd741b5a3909d54cef225fffde80b04359416690a26aca5718b7d91027f3934b",
1084
1166
  "planner-schemas/train-interlocking.schema.json": "67914979977f23652298b5272adf3df298576ecafbff3e5084574848be8c33d8",
1085
1167
  "planner-schemas/train.schema.json": "d6fbac9067c1bffeb84eb79a71228441055af6e6e7ba141dd4e0bcb079345ec0",
1086
1168
  "planner-schemas/wagon.schema.json": "57b98f1ade998d745538eb3d72fb3014a50042006870f90bce47028eea336eb4",
1087
1169
  "planner-schemas/wmbt.schema.json": "7a3a5693bfcf01340667c2be4a3c48e74f34b1af7e8dc13372c0de06b7f4fe12",
1088
- "relationships.yaml": "3a3b4987dacbc6ae566e607183f60503c934bf8c60925943566e6887726d8bbf",
1170
+ "relationships.yaml": "5a183ce8e30df351d5e9d25cbc7a0468cd915daf47537ed6a3c8a0f27c1c1a1e",
1089
1171
  "src/agent.ts": "dfbd20cbd5958cc59aca94bd06d21ff5062f71820226230fac1c1d3ff34f29d5",
1090
1172
  "src/ci.ts": "899125ec76d14f7d0126a5db2249913e373e3a325cbc98d7f053e1351bdf47af",
1091
1173
  "src/cli.ts": "bb2047cee60f48bfe3eaee4c1b3dcd3538a0e1edc170cf58e87686117bea07a7",
1092
1174
  "src/docs-capability.ts": "0feae94b7697dd53d8a457b24765e81fcf804c774f0cc4b6035cb3da822e486a",
1093
- "src/enforce.ts": "1c884830937eb6a097a1dad6a979419b60472c39d928833e4414a020b82b1693",
1175
+ "src/enforce.ts": "d7232331c9f0fdd150f2ca4bbf1bd2e877de111c684d46b690fd7acdae59f39c",
1094
1176
  "src/hooks.ts": "adbb72f7a83f53d596fd217f01f4ce32c5a59a23ab81993fed226fb96fd1cbd1",
1095
- "src/index.ts": "2743b7969526d0aaf21179048e9896141e97d89c45c4a503b795f41fed57f6cc",
1096
- "src/integrity.ts": "009b5f23ec3240cdc2cb133f942995e48f494edaa0259053bca15283134be3ea",
1177
+ "src/index.ts": "b3cc97f9867bd605aefa95650a6b8b773e32e6e52e58792d0dbf6736dd3406be",
1178
+ "src/integrity.ts": "fddc8abd1ca039d31584d3288c061badd44c5f8300f62db5861ea6bb0ebf95d9",
1097
1179
  "src/journey-docs.ts": "994d229376244c84212cff951032823068a76565dd2fd427b9d44e341bd14853",
1098
1180
  "src/planner-kernel.ts": "5d3f5305fb59becb2cc97d8a03aca6b104f385805d91cc0410856e289dd6fbb1",
1099
1181
  "src/planner-schema-validator.ts": "ce529c0936171075e93c7539b3655fe895a98dd2973ebda5775958e6ebc316d9",
1100
1182
  "src/planner-validators.ts": "99adeb65f579af923c11f21a8f55cfb9993b007fd8df59c5f764696b55379cfc",
1101
1183
  "src/register.ts": "6a2f1c6b8df0dc9c8f45df8ec9fac2be29044e048b08c8ffe423410e94dadedd",
1102
1184
  "src/release.ts": "7b0fe444ee81f476f53b9c21b6c347ef588ee616c60211419cf984132be768ba",
1103
- "src/setup.ts": "0a6f1a9aeff31dcf17f6bd036168b909c1841c11bbbb452105d8debf64a6bc78",
1104
- "src/topology.ts": "ff86fc7923793c727196e6f8459db4f071fcaa6844268c2e3b232bb18801c43d",
1185
+ "src/setup.ts": "8e69ffc4f49ad7240243728db3c0c495d2c4d66f04652cd735a0a90c79ca4246",
1186
+ "src/telemetry-plan.ts": "cdb1e8bfff414f3ea81977388973da2cf6d89567d9e060dc9d5989a33600f153",
1187
+ "src/topology.ts": "9779ee48e1c453abb76363163d4ab363463fa14e359571139f6d1f1fcc51ae2c",
1105
1188
  "templates/agents/AGENTS.block.md": "c45d831e57976b874d2a6dc6e5e929b6e9ea3f928fe8c6683c2bab71676817c7",
1106
1189
  "templates/agents/atdd-bun.integrity.test.ts": "dec6f6e5f65a08d9512fc703b367c163f8c9da1f6aa7fd466835c1ec30348a41",
1107
1190
  "templates/agents/atdd/SKILL.md": "b621abe22851a75b30fc0e6c339a2c0a3ed6bbf78b8c17000a4ce301e05df96d",
1108
1191
  "templates/github/atdd-bun-release.yml": "d9547e9e6ef3ae010d53d55314f6a54567f88bd900f7e50d994cd308601d2684",
1109
- "templates/github/atdd-bun.yml": "12b2e23863b64197e0f2f6f2976fdb5cb06f79662122542bf8d2f7ad41337be9"
1192
+ "templates/github/atdd-bun.yml": "b54fe01661e7141ae70b6db881a4870c4a09c11b1be29ed8364ace35dc4e0564"
1110
1193
  }
1111
1194
  }
package/lib/scan.mjs CHANGED
@@ -248,3 +248,40 @@ export function templateLiterals(text) {
248
248
  }
249
249
  return found;
250
250
  }
251
+
252
+ // Blank line comments and block comments with spaces, preserving every line and
253
+ // column offset — but KEEP string literals. maskLiteralsAndComments is for checks
254
+ // that must not fire on rule prose inside strings; this is for checks whose payload
255
+ // IS the string (telemetry identities passed to emit-like calls).
256
+ export function maskComments(text) {
257
+ const out = text.split("");
258
+ const blank = (from, to) => {
259
+ for (let k = from; k < to && k < text.length; k++) if (out[k] !== "\n") out[k] = " ";
260
+ };
261
+ let i = 0;
262
+ while (i < text.length) {
263
+ const ch = text[i], next = text[i + 1];
264
+ if (ch === "/" && next === "/") {
265
+ let j = i;
266
+ while (j < text.length && text[j] !== "\n") j++;
267
+ blank(i, j);
268
+ i = j;
269
+ } else if (ch === "/" && next === "*") {
270
+ let j = text.indexOf("*/", i + 2);
271
+ j = j === -1 ? text.length : j + 2;
272
+ blank(i, j);
273
+ i = j;
274
+ } else if (ch === '"' || ch === "'" || ch === "`") {
275
+ let j = i + 1;
276
+ while (j < text.length) {
277
+ if (text[j] === "\\") { j += 2; continue; }
278
+ if (text[j] === ch || text[j] === "\n") break;
279
+ j++;
280
+ }
281
+ i = text[j] === ch ? j + 1 : j;
282
+ } else {
283
+ i++;
284
+ }
285
+ }
286
+ return out.join("");
287
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@afokapu/atdd-bun",
3
- "version": "0.6.2",
3
+ "version": "0.7.1",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/afokapu/atdd-bun.git"
@@ -323,6 +323,57 @@
323
323
  }
324
324
  },
325
325
 
326
+ "telemetry": {
327
+ "type": "object",
328
+ "description": "The acceptance's explicit telemetry decision. `required` names the concrete telemetry items whose emission this acceptance must observe; `not-applicable` records why nothing beyond the tested return value is externally useful. This block supersedes the DESCRIPTIVE half of `signal` (metrics/traces/logs/events); it does not touch the EXECUTABLE bar `signal.metric` + `signal.threshold`, which is a gate, not telemetry.",
329
+ "$comment": "Introduced with the telemetry tracking-plan profile. Every acceptance in an adopting repository carries exactly one of the two dispositions — the false choice between 'test every debug log' and 'have no observability requirement' is what this block removes. Items listed here must resolve to tracking-plan files under telemetry/ (planner.telemetry.acceptance-decision).",
330
+ "required": ["disposition"],
331
+ "additionalProperties": false,
332
+ "properties": {
333
+ "disposition": {
334
+ "type": "string",
335
+ "enum": ["required", "not-applicable"]
336
+ },
337
+ "rationale": {
338
+ "type": "string",
339
+ "minLength": 20,
340
+ "description": "Required with disposition: not-applicable — why no observable outcome beyond the tested return value is externally useful."
341
+ },
342
+ "events": {
343
+ "type": "array",
344
+ "minItems": 1,
345
+ "items": {"$ref": "#/definitions/telemetry_event_urn"}
346
+ },
347
+ "metrics": {
348
+ "type": "array",
349
+ "minItems": 1,
350
+ "items": {"$ref": "#/definitions/telemetry_metric_urn"}
351
+ },
352
+ "traces": {
353
+ "type": "array",
354
+ "minItems": 1,
355
+ "items": {"$ref": "#/definitions/telemetry_trace_urn"}
356
+ },
357
+ "logs": {
358
+ "type": "array",
359
+ "minItems": 1,
360
+ "items": {"$ref": "#/definitions/telemetry_log_urn"}
361
+ }
362
+ },
363
+ "allOf": [
364
+ {
365
+ "$comment": "not-applicable forbids item lists: an acceptance cannot simultaneously require nothing and require something.",
366
+ "if": {"properties": {"disposition": {"const": "not-applicable"}}, "required": ["disposition"]},
367
+ "then": {"not": {"anyOf": [{"required": ["events"]}, {"required": ["metrics"]}, {"required": ["traces"]}, {"required": ["logs"]}]}}
368
+ },
369
+ {
370
+ "$comment": "required declares at least one concrete item; resolution against the tracking plan is a cross-artifact validator concern.",
371
+ "if": {"properties": {"disposition": {"const": "required"}}, "required": ["disposition"]},
372
+ "then": {"anyOf": [{"required": ["events"]}, {"required": ["metrics"]}, {"required": ["traces"]}, {"required": ["logs"]}]}
373
+ }
374
+ ]
375
+ },
376
+
326
377
  "metadata": {
327
378
  "type": "object",
328
379
  "required": ["wagon"],
@@ -389,8 +440,26 @@
389
440
  "author": {"type": "string"},
390
441
  "created": {"type": "string"}
391
442
  }
392
- }
443
+ },
444
+ "telemetry": {"$ref": "#/properties/telemetry"}
393
445
  }
446
+ },
447
+ "telemetry_event_urn": {
448
+ "$comment": "Concrete telemetry URNs accepted in an acceptance's telemetry decision. Same grammar as telemetry-plan.schema.json's id, where path and ownership coherence are additionally checked.",
449
+ "type": "string",
450
+ "pattern": "^telemetry:event:(ui|ux|be|nw|db|st|tm|sc|au|fn|if):[a-z][a-z0-9-]*:[a-z][a-z0-9-]*$"
451
+ },
452
+ "telemetry_trace_urn": {
453
+ "type": "string",
454
+ "pattern": "^telemetry:trace:(ui|ux|be|nw|db|st|tm|sc|au|fn|if):[a-z][a-z0-9-]*:[a-z][a-z0-9-]*$"
455
+ },
456
+ "telemetry_log_urn": {
457
+ "type": "string",
458
+ "pattern": "^telemetry:log:(ui|ux|be|nw|db|st|tm|sc|au|fn|if):[a-z][a-z0-9-]*:[a-z][a-z0-9-]*$"
459
+ },
460
+ "telemetry_metric_urn": {
461
+ "type": "string",
462
+ "pattern": "^telemetry:metric:(ui|ux|be|nw|db|st|tm|sc|au|fn|if):[a-z][a-z0-9-]*:[a-z][a-z0-9-]*:(latency|duration|throughput|error_rate|success_rate|count|size|age|staleness|freshness)$"
394
463
  }
395
464
  }
396
465
  }