[object Object]

← back to Filemaker Mcp

document invoice monitor launchd recovery proof

84dbe50fa023e3d4dd5093d6fd507261167fb02d · 2026-08-31 01:34:45 -0700 · Steve Abrams

Files touched

Diff

commit 84dbe50fa023e3d4dd5093d6fd507261167fb02d
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Mon Aug 31 01:34:45 2026 -0700

    document invoice monitor launchd recovery proof
---
 verification/e2e-proof.json | 58 +++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 58 insertions(+)

diff --git a/verification/e2e-proof.json b/verification/e2e-proof.json
new file mode 100644
index 0000000..d7529fd
--- /dev/null
+++ b/verification/e2e-proof.json
@@ -0,0 +1,58 @@
+{
+  "ticket": "TK-10953",
+  "intent": "Prove the com.steve.new-invoice-monitor launchd job reaches the FileMaker 401 empty-result branch and exits successfully after restoring locked dependencies.",
+  "risk_tier": "R3",
+  "environment": "Mac2 local launchd gui/501; FileMaker read-only dry-run; no Slack/email send and no cursor write",
+  "build_identity": "cd8f9737bd0d8a650d868f139411161dd9d5d885",
+  "timestamp": "2026-08-31T08:34:00Z",
+  "baseline": {
+    "scheduler_runs": 6450,
+    "scheduler_last_exit": 1,
+    "observed_error": "ERR_MODULE_NOT_FOUND: amazon-cognito-identity-js",
+    "dependency_directory": "absent"
+  },
+  "actions": [
+    {
+      "command": "npm ci --ignore-scripts --no-audit --no-fund",
+      "result": "PASS: restored 115 packages from package-lock.json"
+    },
+    {
+      "command": "npm ls --depth=0",
+      "result": "PASS: @modelcontextprotocol/sdk 1.29.0, amazon-cognito-identity-js 6.3.18, zod 3.25.76"
+    },
+    {
+      "command": "/opt/homebrew/bin/node scripts/new-invoice-monitor.mjs --dry-run",
+      "result": "PASS: exit 0; FileMaker 401 reported as zero invoices and nothing to post"
+    },
+    {
+      "command": "launchctl print gui/501/com.steve.new-invoice-monitor",
+      "result": "PASS: natural scheduled run advanced to 6454 and last exit code became 0"
+    },
+    {
+      "command": "bash ~/.agents/skills/cron-fire-canary/run.sh",
+      "result": "PASS for com.steve.new-invoice-monitor: state=ok, NOT-firing=0 fleet-wide"
+    }
+  ],
+  "assertions": {
+    "file_boundary": "PASS: dependencies resolve from the committed lockfile; tracked source and lockfile unchanged",
+    "auth_negative_boundary": "PASS: blank FileMaker credentials exit 1 with the explicit missing-credentials error",
+    "filemaker_boundary": "PASS: authenticated dry-run reached the live FileMaker Data API and handled fmCode 401 as an empty result",
+    "scheduler_boundary": "PASS: launchd executed the configured Node command naturally and recorded exit 0",
+    "artifact_boundary": "PASS: /tmp/new-invoice-monitor.log was refreshed at 2026-08-31 01:32:57 PDT with the empty-result success message",
+    "state_boundary": "PASS: data/.last-invoice mtime, size, and SHA-256 were identical before and after the dry-run",
+    "side_effect_boundary": "PASS: DRY_RUN prevented Slack posting; FM401 returned before the post loop; no email route exists in this flow",
+    "retry_boundary": "PASS: the recurring launchd execution succeeded after earlier dependency-resolution failures without duplicate cursor movement"
+  },
+  "evidence": {
+    "launchd_label": "com.steve.new-invoice-monitor",
+    "launchd_runs_after": 6454,
+    "launchd_last_exit_after": 0,
+    "artifact": "/tmp/new-invoice-monitor.log",
+    "artifact_mtime": "2026-08-31T01:32:57-07:00",
+    "cursor_sha256_before": "096d74ce9cec29425c3eabd13897d930958fe87f93fa1a00146722b8b9423a83",
+    "cursor_sha256_after": "096d74ce9cec29425c3eabd13897d930958fe87f93fa1a00146722b8b9423a83",
+    "canary_state": "ok"
+  },
+  "cleanup": "No temporary records or external messages were created. Installed node_modules is gitignored runtime state retained for the scheduler.",
+  "verdict": "PASS"
+}

← cd8f973 fix: handle FileMaker 401 no-records gracefully in new-invoi  ·  back to Filemaker Mcp  ·  push-dashboard-revenue: wait for network before Cognito auth a775694 →