@agent-relay/factory 0.1.1 → 0.1.2

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 (132) hide show
  1. package/README.md +146 -205
  2. package/dist/cli/fleet.d.ts +5 -1
  3. package/dist/cli/fleet.d.ts.map +1 -1
  4. package/dist/cli/fleet.js +86 -15
  5. package/dist/cli/fleet.js.map +1 -1
  6. package/dist/config/schema.d.ts +4 -4
  7. package/dist/config/schema.d.ts.map +1 -1
  8. package/dist/config/schema.js +13 -2
  9. package/dist/config/schema.js.map +1 -1
  10. package/dist/constants/linear.d.ts +2 -0
  11. package/dist/constants/linear.d.ts.map +1 -1
  12. package/dist/constants/linear.js +6 -0
  13. package/dist/constants/linear.js.map +1 -1
  14. package/dist/dispatch/templates.d.ts +18 -2
  15. package/dist/dispatch/templates.d.ts.map +1 -1
  16. package/dist/dispatch/templates.js +18 -10
  17. package/dist/dispatch/templates.js.map +1 -1
  18. package/dist/fleet/create-fleet.d.ts +3 -2
  19. package/dist/fleet/create-fleet.d.ts.map +1 -1
  20. package/dist/fleet/create-fleet.js +3 -2
  21. package/dist/fleet/create-fleet.js.map +1 -1
  22. package/dist/fleet/ensure-relay-broker.d.ts +24 -0
  23. package/dist/fleet/ensure-relay-broker.d.ts.map +1 -0
  24. package/dist/fleet/ensure-relay-broker.js +56 -0
  25. package/dist/fleet/ensure-relay-broker.js.map +1 -0
  26. package/dist/fleet/internal-fleet-client.d.ts +8 -3
  27. package/dist/fleet/internal-fleet-client.d.ts.map +1 -1
  28. package/dist/fleet/internal-fleet-client.js +32 -5
  29. package/dist/fleet/internal-fleet-client.js.map +1 -1
  30. package/dist/fleet/relay-fleet-client.d.ts +90 -13
  31. package/dist/fleet/relay-fleet-client.d.ts.map +1 -1
  32. package/dist/fleet/relay-fleet-client.js +496 -20
  33. package/dist/fleet/relay-fleet-client.js.map +1 -1
  34. package/dist/github/index.d.ts +4 -4
  35. package/dist/github/index.js +2 -2
  36. package/dist/github/probe-closer.d.ts +1 -1
  37. package/dist/github/probe-closer.js +1 -1
  38. package/dist/index.d.ts +33 -29
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +17 -15
  41. package/dist/index.js.map +1 -1
  42. package/dist/linear/state-resolver.d.ts +3 -2
  43. package/dist/linear/state-resolver.d.ts.map +1 -1
  44. package/dist/linear/state-resolver.js +74 -10
  45. package/dist/linear/state-resolver.js.map +1 -1
  46. package/dist/mount/local-mount-preflight.d.ts +1 -0
  47. package/dist/mount/local-mount-preflight.d.ts.map +1 -1
  48. package/dist/mount/local-mount-preflight.js +64 -12
  49. package/dist/mount/local-mount-preflight.js.map +1 -1
  50. package/dist/mount/relayfile-binary.d.ts +2 -0
  51. package/dist/mount/relayfile-binary.d.ts.map +1 -1
  52. package/dist/mount/relayfile-binary.js +39 -5
  53. package/dist/mount/relayfile-binary.js.map +1 -1
  54. package/dist/mount/relayfile-cloud-mount-client.d.ts +2 -2
  55. package/dist/mount/relayfile-cloud-mount-client.js +1 -1
  56. package/dist/node/factory-node.d.ts +59 -0
  57. package/dist/node/factory-node.d.ts.map +1 -0
  58. package/dist/node/factory-node.js +351 -0
  59. package/dist/node/factory-node.js.map +1 -0
  60. package/dist/node/factory.node.d.ts +3 -0
  61. package/dist/node/factory.node.d.ts.map +1 -0
  62. package/dist/node/factory.node.js +5 -0
  63. package/dist/node/factory.node.js.map +1 -0
  64. package/dist/orchestrator/batch-tracker.d.ts +2 -2
  65. package/dist/orchestrator/factory.d.ts +5 -2
  66. package/dist/orchestrator/factory.d.ts.map +1 -1
  67. package/dist/orchestrator/factory.js +413 -59
  68. package/dist/orchestrator/factory.js.map +1 -1
  69. package/dist/orchestrator/index.d.ts +4 -4
  70. package/dist/orchestrator/index.d.ts.map +1 -1
  71. package/dist/orchestrator/index.js +3 -3
  72. package/dist/orchestrator/index.js.map +1 -1
  73. package/dist/orchestrator/process-identity.d.ts +1 -1
  74. package/dist/orchestrator/reaper.d.ts +3 -3
  75. package/dist/orchestrator/reaper.js +3 -3
  76. package/dist/ports/fleet.d.ts +8 -2
  77. package/dist/ports/fleet.d.ts.map +1 -1
  78. package/dist/ports/index.d.ts +4 -4
  79. package/dist/ports/state.d.ts +3 -3
  80. package/dist/ports/writeback.d.ts +1 -1
  81. package/dist/safety/factory-scope.d.ts +2 -2
  82. package/dist/state/in-memory-state-store.d.ts +1 -1
  83. package/dist/state/in-memory-state-store.js +1 -1
  84. package/dist/subscriptions/event-client.d.ts +1 -1
  85. package/dist/subscriptions/event-client.js +2 -2
  86. package/dist/subscriptions/globs.js +1 -1
  87. package/dist/subscriptions/index.d.ts +7 -7
  88. package/dist/subscriptions/index.js +4 -4
  89. package/dist/subscriptions/linear-filter.d.ts +1 -1
  90. package/dist/subscriptions/linear-filter.js +1 -1
  91. package/dist/subscriptions/specs.d.ts +1 -1
  92. package/dist/subscriptions/specs.js +2 -2
  93. package/dist/testing/fakes.d.ts +1 -1
  94. package/dist/testing/fakes.js +1 -1
  95. package/dist/testing/fakes.js.map +1 -1
  96. package/dist/testing/index.d.ts +1 -1
  97. package/dist/testing/index.js +1 -1
  98. package/dist/triage/heuristic.d.ts +8 -4
  99. package/dist/triage/heuristic.d.ts.map +1 -1
  100. package/dist/triage/heuristic.js +70 -6
  101. package/dist/triage/heuristic.js.map +1 -1
  102. package/dist/triage/index.d.ts +6 -6
  103. package/dist/triage/index.d.ts.map +1 -1
  104. package/dist/triage/index.js +4 -4
  105. package/dist/triage/index.js.map +1 -1
  106. package/dist/triage/llm.d.ts +1 -1
  107. package/dist/triage/llm.d.ts.map +1 -1
  108. package/dist/triage/llm.js +5 -3
  109. package/dist/triage/llm.js.map +1 -1
  110. package/dist/triage/schema.d.ts +133 -29
  111. package/dist/triage/schema.d.ts.map +1 -1
  112. package/dist/triage/schema.js +6 -3
  113. package/dist/triage/schema.js.map +1 -1
  114. package/dist/triage/tiered.d.ts +1 -1
  115. package/dist/triage/tiered.d.ts.map +1 -1
  116. package/dist/triage/tiered.js +9 -2
  117. package/dist/triage/tiered.js.map +1 -1
  118. package/dist/types.d.ts +10 -9
  119. package/dist/types.d.ts.map +1 -1
  120. package/dist/writeback/github.d.ts +2 -2
  121. package/dist/writeback/github.js +1 -1
  122. package/dist/writeback/index.d.ts +5 -5
  123. package/dist/writeback/index.js +3 -3
  124. package/dist/writeback/linear.d.ts +3 -3
  125. package/dist/writeback/linear.d.ts.map +1 -1
  126. package/dist/writeback/linear.js +57 -14
  127. package/dist/writeback/linear.js.map +1 -1
  128. package/dist/writeback/slack.d.ts +1 -1
  129. package/dist/writeback/slack.js +2 -2
  130. package/package.json +10 -2
  131. package/scripts/com.agentrelay.factory-canary.plist.example +53 -0
  132. package/scripts/factory-canary.sh +89 -0
@@ -1,6 +1,6 @@
1
- import { linearCommentPath, linearIssuePath } from '../constants/linear';
2
- import { assertInFactoryScope, isInFactoryScope } from '../safety/factory-scope';
3
- import { asRecord, safePathSegment, stableHash, wrappedPayload } from './shared';
1
+ import { linearByIdPath, linearByUuidPath, linearCommentPath, linearIssuePath } from '../constants/linear.js';
2
+ import { assertInFactoryScope, isInFactoryScope } from '../safety/factory-scope.js';
3
+ import { asRecord, safePathSegment, stableHash, wrappedPayload } from './shared.js';
4
4
  const issuePath = (issue) => issue.path || linearIssuePath(issue.key, issue.uuid);
5
5
  export const linearCommentName = (issue, body) => `${issue.key}__factory-${stableHash(body)}`;
6
6
  const linearCommentPayload = (issue, body) => ({
@@ -27,14 +27,40 @@ const safetyFromConfig = (configOrStateIds) => {
27
27
  const payloadInFactoryScope = (payload, safety) => {
28
28
  return isInFactoryScope(scopeIssueFromPayload(payload, 'createIssue payload'), safety);
29
29
  };
30
+ const hasGuardFields = (payload) => typeof payload.title === 'string' || Array.isArray(payload.labels) || asRecord(payload.team) !== undefined;
30
31
  const readIssuePayloadForGuard = async (mount, issue) => {
31
- const path = issuePath(issue);
32
- try {
33
- return wrappedPayload((await mount.readFile(path)).content);
32
+ // The primary <key>__<uuid>.json may be a change-event STUB (no title/labels/
33
+ // team — the sparse-sync case); fall back to the canonical by-id/by-uuid
34
+ // records so the factory-scope guard sees the real fields and doesn't refuse a
35
+ // legitimately-[factory] issue.
36
+ const candidates = [
37
+ issuePath(issue),
38
+ ...(issue.key ? [linearByIdPath(issue.key)] : []),
39
+ ...(issue.uuid ? [linearByUuidPath(issue.uuid)] : []),
40
+ ];
41
+ let primaryPayload;
42
+ let lastError;
43
+ for (const path of candidates) {
44
+ try {
45
+ const payload = wrappedPayload((await mount.readFile(path)).content);
46
+ if (primaryPayload === undefined) {
47
+ primaryPayload = payload;
48
+ }
49
+ if (hasGuardFields(payload)) {
50
+ return payload;
51
+ }
52
+ }
53
+ catch (error) {
54
+ lastError = error;
55
+ }
34
56
  }
35
- catch {
36
- throw new Error(`Refusing Linear writeback for ${issue.key}: unable to read guard fields from ${path}`);
57
+ // No record carried guard fields. Preserve prior behavior: return the primary
58
+ // payload (the scope guard then decides) rather than failing the read outright.
59
+ if (primaryPayload !== undefined) {
60
+ return primaryPayload;
37
61
  }
62
+ throw new Error(`Refusing Linear writeback for ${issue.key}: unable to read guard fields` +
63
+ (lastError instanceof Error ? ` (${lastError.message})` : ''));
38
64
  };
39
65
  const createIssuePath = (payload) => {
40
66
  const id = typeof payload.id === 'string' && payload.id ? payload.id : undefined;
@@ -47,16 +73,33 @@ const createIssuePath = (payload) => {
47
73
  throw new Error('Linear createIssue payload must include a non-provider id/clientId');
48
74
  };
49
75
  const looksLikeProviderIssueIdentifier = (value) => /^[A-Z][A-Z0-9]*-/u.test(value);
76
+ const READBACK_CONFIRM_ATTEMPTS = 3;
77
+ const READBACK_CONFIRM_DELAY_MS = 250;
78
+ const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
50
79
  const confirmWriteback = async (mount, path, verify, logger) => {
51
80
  await assertWritebackAcked(mount, path);
52
- try {
53
- if (!await verify()) {
54
- logger.warn?.(`[factory-sdk] Linear writeback read-back verification failed for ${path}; treating getOp ack as success`);
81
+ // getOp can return a FAKED success on a busy/wedged mount ("workspace write
82
+ // path is busy"), so the read-back is the source of truth. Retry to absorb
83
+ // eventual-consistency lag; if it never confirms, the write did NOT land
84
+ // throw instead of silently faking success (which previously left issues
85
+ // un-advanced while the factory believed they had advanced).
86
+ for (let attempt = 0; attempt < READBACK_CONFIRM_ATTEMPTS; attempt += 1) {
87
+ let confirmed = false;
88
+ try {
89
+ confirmed = await verify();
90
+ }
91
+ catch {
92
+ confirmed = false;
93
+ }
94
+ if (confirmed) {
95
+ return;
96
+ }
97
+ if (attempt < READBACK_CONFIRM_ATTEMPTS - 1) {
98
+ logger.warn?.(`[factory-sdk] Linear writeback read-back for ${path} not yet confirmed (attempt ${attempt + 1}/${READBACK_CONFIRM_ATTEMPTS}); retrying`);
99
+ await delay(READBACK_CONFIRM_DELAY_MS);
55
100
  }
56
101
  }
57
- catch (error) {
58
- logger.warn?.(`[factory-sdk] Linear writeback read-back verification errored for ${path}; treating getOp ack as success`, error);
59
- }
102
+ throw new Error(`[factory-sdk] Linear writeback for ${path} acked but the read-back never confirmed it landed; the write did not propagate`);
60
103
  };
61
104
  const assertWritebackAcked = async (mount, path) => {
62
105
  const confirmation = await mount.confirmWrite(path, { timeoutMs: 90_000 });
@@ -1 +1 @@
1
- {"version":3,"file":"linear.js","sourceRoot":"","sources":["../../src/writeback/linear.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"linear.js","sourceRoot":"","sources":["../../src/writeback/linear.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { MountClient } from '../ports';
1
+ import type { MountClient } from '../ports/index.js';
2
2
  export interface MountSlackWritebackConfig {
3
3
  channel?: string;
4
4
  channelDir?: string;
@@ -1,5 +1,5 @@
1
- import { slackMessagePath, slackReplyPath } from '../constants/slack';
2
- import { safePathSegment, stableHash, trimToLines, wrappedPayload } from './shared';
1
+ import { slackMessagePath, slackReplyPath } from '../constants/slack.js';
2
+ import { safePathSegment, stableHash, trimToLines, wrappedPayload } from './shared.js';
3
3
  const channelIdFromDir = (channelDir) => channelDir.split('__')[0] ?? channelDir;
4
4
  const channelSegment = (value) => {
5
5
  const trimmed = value.trim().replace(/^#/u, '');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-relay/factory",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "Agent factory — triage, dispatch, merge-gate for relayfile-driven workspaces",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -20,6 +20,8 @@
20
20
  "files": [
21
21
  "dist",
22
22
  "bin/factory.mjs",
23
+ "scripts/factory-canary.sh",
24
+ "scripts/com.agentrelay.factory-canary.plist.example",
23
25
  "package.json",
24
26
  "README.md"
25
27
  ],
@@ -38,19 +40,24 @@
38
40
  "./writeback": {
39
41
  "types": "./dist/writeback/index.d.ts",
40
42
  "import": "./dist/writeback/index.js"
43
+ },
44
+ "./node": {
45
+ "types": "./dist/node/factory.node.d.ts",
46
+ "import": "./dist/node/factory.node.js"
41
47
  }
42
48
  },
43
49
  "publishConfig": {
44
50
  "access": "public"
45
51
  },
46
52
  "scripts": {
47
- "build": "tsc -p tsconfig.build.json",
53
+ "build": "tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json",
48
54
  "test": "vitest run",
49
55
  "factory-build": "factory-build/run-factory-build.sh"
50
56
  },
51
57
  "dependencies": {
52
58
  "@agent-relay/cloud": "^8.7.2",
53
59
  "@agent-relay/harness-driver": "^8.3.7",
60
+ "@agent-relay/integration-prompts": "^8.8.3",
54
61
  "@relayfile/sdk": "^0.8.29",
55
62
  "agent-relay": "^8.8.1",
56
63
  "zod": "^3.25.76"
@@ -60,6 +67,7 @@
60
67
  "@relayflows/core": "^1.0.3",
61
68
  "@types/node": "^22.10.2",
62
69
  "esbuild": "^0.24.2",
70
+ "tsc-alias": "^1.8.17",
63
71
  "typescript": "^5.7.0",
64
72
  "vitest": "^4.1.8"
65
73
  }
@@ -0,0 +1,53 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!--
3
+ launchd template for the factory sync-fidelity canary (see factory-canary.sh).
4
+
5
+ Install (macOS):
6
+ 1. Replace __FACTORY_WORKDIR__ with your factory deployment dir (the one with
7
+ factory.config.json), and __FACTORY_BIN__ with the path to factory.mjs
8
+ (e.g. node_modules/@agent-relay/factory/bin/factory.mjs). Set the issue key
9
+ and, optionally, FACTORY_CANARY_SLACK_WEBHOOK.
10
+ 2. cp scripts/com.agentrelay.factory-canary.plist.example \
11
+ ~/Library/LaunchAgents/com.agentrelay.factory-canary.plist
12
+ 3. launchctl load ~/Library/LaunchAgents/com.agentrelay.factory-canary.plist
13
+ 4. launchctl start com.agentrelay.factory-canary # run once now to verify
14
+
15
+ Runs every 6h (StartInterval 21600). Logs to <workdir>/.factory-canary.log.
16
+ Run from the deployment dir so the canary reuses the running relay broker.
17
+ -->
18
+ <plist version="1.0">
19
+ <dict>
20
+ <key>Label</key>
21
+ <string>com.agentrelay.factory-canary</string>
22
+
23
+ <key>ProgramArguments</key>
24
+ <array>
25
+ <string>/bin/bash</string>
26
+ <string>__FACTORY_WORKDIR__/scripts/factory-canary.sh</string>
27
+ </array>
28
+
29
+ <key>WorkingDirectory</key>
30
+ <string>__FACTORY_WORKDIR__</string>
31
+
32
+ <key>EnvironmentVariables</key>
33
+ <dict>
34
+ <key>FACTORY_CANARY_ISSUE</key>
35
+ <string>AR-305</string>
36
+ <key>FACTORY_WORKDIR</key>
37
+ <string>__FACTORY_WORKDIR__</string>
38
+ <key>FACTORY_BIN</key>
39
+ <string>__FACTORY_BIN__</string>
40
+ <key>FACTORY_CANARY_SLACK_WEBHOOK</key>
41
+ <string></string>
42
+ </dict>
43
+
44
+ <key>StartInterval</key>
45
+ <integer>21600</integer>
46
+ <key>RunAtLoad</key>
47
+ <true/>
48
+ <key>StandardOutPath</key>
49
+ <string>__FACTORY_WORKDIR__/.factory-canary.log</string>
50
+ <key>StandardErrorPath</key>
51
+ <string>__FACTORY_WORKDIR__/.factory-canary.log</string>
52
+ </dict>
53
+ </plist>
@@ -0,0 +1,89 @@
1
+ #!/usr/bin/env bash
2
+ #
3
+ # factory-canary.sh — scheduled sync-fidelity regression detector.
4
+ #
5
+ # Runs `factory canary <issue>` against the LIVE relayfile mount and asserts a
6
+ # known "Ready for Agent" issue is still classified dispatch-ready by the real
7
+ # triage path. If it ever flips to "skipped" (e.g. the Linear sync regresses to
8
+ # sparse records with no state.id), this exits non-zero and alerts — catching the
9
+ # regression before it silently blocks every factory dispatch.
10
+ #
11
+ # Run it on a schedule (cron/launchd) from your factory deployment directory —
12
+ # the one holding factory.config.json, where the relayfile mount + relay broker
13
+ # already live (so the canary reuses the running broker rather than spawning one).
14
+ # See scripts/com.agentrelay.factory-canary.plist.example for a launchd template.
15
+ #
16
+ # Config (env vars):
17
+ # FACTORY_CANARY_ISSUE Linear issue key to check (default: the first arg)
18
+ # FACTORY_WORKDIR deployment dir with factory.config.json (default: cwd)
19
+ # FACTORY_CONFIG config path, relative to FACTORY_WORKDIR (default: factory.config.json)
20
+ # FACTORY_BIN path to factory.mjs (default: this repo's bin/factory.mjs)
21
+ # FACTORY_BACKEND --backend value (default: internal)
22
+ # FACTORY_CANARY_TIMEOUT seconds before the canary is considered hung (default: 180)
23
+ # FACTORY_CANARY_SLACK_WEBHOOK optional Slack incoming-webhook URL for failure alerts
24
+ #
25
+ # Exit codes: 0 = dispatch-ready (healthy); 1 = NOT ready / error / hung.
26
+
27
+ set -uo pipefail
28
+
29
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
30
+ ISSUE="${FACTORY_CANARY_ISSUE:-${1:-}}"
31
+ WORKDIR="${FACTORY_WORKDIR:-$PWD}"
32
+ CONFIG="${FACTORY_CONFIG:-factory.config.json}"
33
+ BIN="${FACTORY_BIN:-$SCRIPT_DIR/../bin/factory.mjs}"
34
+ BACKEND="${FACTORY_BACKEND:-internal}"
35
+ TIMEOUT="${FACTORY_CANARY_TIMEOUT:-180}"
36
+ TS="$(date -u +%Y-%m-%dT%H:%M:%SZ)"
37
+
38
+ if [[ -z "$ISSUE" ]]; then
39
+ echo "[$TS] factory-canary: no issue key (set FACTORY_CANARY_ISSUE or pass an arg)" >&2
40
+ exit 1
41
+ fi
42
+ if [[ ! -f "$BIN" ]]; then
43
+ echo "[$TS] factory-canary: factory bin not found at $BIN" >&2
44
+ exit 1
45
+ fi
46
+ cd "$WORKDIR" || { echo "[$TS] factory-canary: cannot cd to $WORKDIR" >&2; exit 1; }
47
+
48
+ # The canary runs the real dry-run triage path (no agents spawned) and prints a
49
+ # JSON verdict {ok,issue,status,reason}; exit code mirrors ok. A hung run
50
+ # (broker/mount wedge) is bounded by FACTORY_CANARY_TIMEOUT.
51
+ RUN=(node "$BIN" factory canary "$ISSUE" --config "$CONFIG" --backend "$BACKEND")
52
+ # A hung run (broker/mount wedge) MUST be bounded — an unbounded canary on a
53
+ # scheduler (launchd/cron) can wedge the slot forever and suppress later alerts.
54
+ # macOS has no `timeout` by default; coreutils ships it as `gtimeout`. If neither
55
+ # is present, fail closed rather than run without a deadline.
56
+ TIMEOUT_BIN=""
57
+ if command -v timeout >/dev/null 2>&1; then
58
+ TIMEOUT_BIN="timeout"
59
+ elif command -v gtimeout >/dev/null 2>&1; then
60
+ TIMEOUT_BIN="gtimeout"
61
+ fi
62
+ if [[ -z "$TIMEOUT_BIN" ]]; then
63
+ echo "[$TS] factory-canary: no timeout utility found (install coreutils for 'timeout'/'gtimeout'); refusing to run unbounded" >&2
64
+ exit 1
65
+ fi
66
+ OUT="$("$TIMEOUT_BIN" "$TIMEOUT" "${RUN[@]}" 2>/dev/null)"
67
+ CODE=$?
68
+ if [[ $CODE -eq 124 ]]; then
69
+ echo "[$TS] factory-canary: TIMED OUT after ${TIMEOUT}s (broker/mount may be wedged)" >&2
70
+ fi
71
+
72
+ # The CLI prints a pretty-printed (multi-line) JSON verdict, so parse the whole
73
+ # output — not just the last line (which is only the closing `}`).
74
+ echo "[$TS] factory-canary $ISSUE -> exit $CODE"
75
+ [[ $CODE -eq 0 ]] && exit 0
76
+
77
+ REASON="$(printf '%s' "$OUT" | node -e 'let s="";process.stdin.on("data",d=>s+=d).on("end",()=>{try{const v=JSON.parse(s);console.log(`${v.status||"error"}: ${v.reason||"unknown"}`)}catch{console.log("unparseable verdict")}})' 2>/dev/null)"
78
+ MSG=":rotating_light: factory canary FAILED for ${ISSUE} — ${REASON}. Sync fidelity may have regressed (issue no longer dispatch-ready)."
79
+ echo "[$TS] $MSG" >&2
80
+
81
+ if [[ -n "${FACTORY_CANARY_SLACK_WEBHOOK:-}" ]]; then
82
+ curl -sS -m 15 -X POST -H 'Content-type: application/json' \
83
+ --data "$(node -e 'process.stdout.write(JSON.stringify({text:process.argv[1]}))' "$MSG")" \
84
+ "$FACTORY_CANARY_SLACK_WEBHOOK" >/dev/null 2>&1 \
85
+ && echo "[$TS] factory-canary: posted Slack alert" >&2 \
86
+ || echo "[$TS] factory-canary: Slack alert post failed" >&2
87
+ fi
88
+
89
+ exit 1