Sample output from the Missed-Run Audit of Scheduled & Map/Reduce Processing prompt in the Sonar AI Prompt Library, run against a NetSuite test account. Every name and number here is test data. Back to the post · The library
Internal assurance review · Unattended processing

Missed-Run Audit
of Scheduled & Map/Reduce Processing

Account: Parent Company (NetSuite OneWorld, production)

Review period: 5 August – 3 September 2026 (30 complete days); baselines from 24 June 2026

Fieldwork completed: 4 September 2026, 19:56 EDT

Prepared for: Tim Dietrich, Administrator

Prepared by: Sonar AI (read-only engagement, v1.15.0)

Document control
Version2.0 (restructured)ClassificationInternal — process owners and administrator
Supersedes1.0, 4 Sep 2026 19:50Overall assessmentNeeds improvement
Evidence setS1–S10 · Q1–Q26 · R1–R6 (Appendix A)Next checkpoint13–14 Sep 2026 (monthly windows, obs. 4)

1. Executive summary

Objective. Determine whether the account's unattended processes ran when the business expected them to — not merely whether recorded executions succeeded — and whether a control exists to detect their absence.

Results. The account has 680 Scheduled or Map/Reduce deployments, 28 of them live on a schedule. Nine were tested as critical. Every daily critical deployment started on every one of the 30 days reviewed, and no instance failed or was cancelled. That clean record conceals two problems it cannot express: one scheduler completed daily but has produced no business output since 17 July after 85 unrecorded downstream failures, and one process ran six times a day against an empty input table. Two monthly deployments show no run in their August windows. Six deployments are dormant and can never fire. Outside the critical set, a workflow-context process is rewriting the same three subsidiary records 3,552 times a day.

Overall assessment: Needs improvement. Job scheduling is operating effectively for daily work. The detective control — knowing when a job did not run, or ran and did nothing — does not exist, and the account's own telemetry (4-day script log, 30-day instance table) cannot substitute for it.

Key observations
  1. High Benchmark 360 Job Scheduler: 150 successful instances, zero business writes since 17 July; its dispatched job failed 85 of 97 attempts in H1 2026 with no trace in any log now retained (obs. 1).
  2. High An unattended workflow is rewriting SUBSIDIARYNEXUSMAP.KNEXUS on three subsidiary records 3,552 times a day — 1.61 million system notes since January (obs. 7).
  3. Medium Cash 360 lead-time calculation left no trace for 29 days (25 June – 23 July); the cause is beyond every retention window (obs. 2).
  4. Medium Payment Batch Processing completes hourly with 0 payment schedules to process (obs. 3); two monthly deployments missed their August windows (obs. 4); six deployments are dormant (obs. 5, 6).
  5. Medium Observability is the root constraint: 4-day script log, 30-day instance table, no deployment column on the instance table in SuiteQL, 5 of 9 critical sources unreadable (obs. 10).
9critical processes tested
2missed runs (Aug windows)
0recorded failures in period
2no-output processes
6dormant deployments
30 drun-history horizon

Sources: R1, R2, R4, R6, Q17, Q19, S7z, Q3. Recorded failures outside the period: 85 dispatched-job FAILED transitions Jan–Jul (Q21); 4 FAILED instances Aug 2025 (Q18).

Priority actions

#ActionOwnerEffortObs.
1Open customrecord_b360_scheduled_job id 1; decide whether Benchmark 360 is in use. Fix the RESTlet-session error or set deployment pk 3644 to Not Scheduled.Finance analyticsHours1
2Identify the workflow behind the nexus rewrites (candidates 316, 216); suspend it.AdministratorHours7
3Create two saved searches as interim absence monitors (Cash 360 last-run stamp; B360 job status), email daily; then approve the heartbeat control design (§11).AdministratorMinutes → project2, 1, 10

2. Contents

3. Background, objectives & scope

Background. Error dashboards describe executions that exist. A disabled deployment, an expired schedule or a missed trigger produces no run to inspect, so a clean error log proves only that no recorded execution failed. For unattended work the first telemetry question is whether the job showed up when the business expected it (Appendix F, source 1).

Objectives. (1) Inventory every mechanism by which unattended work runs. (2) Establish what the business expects of each critical process. (3) Compare expected against observed runs. (4) Confirm that completed runs did their work. (5) Rate exceptions and propose a permanent absence-detection control.

Scope. All Scheduled Script and Map/Reduce deployments (680), workflows with a scheduled trigger (2), and — at count level only — RESTlet integration surface. Review period 5 Aug – 3 Sep 2026, bounded by instance-table retention. Nine processes tested in depth.

Criteria. COBIT 2019 DSS01 Managed Operations (scheduling and monitoring of batch processing); ITIL 4 Monitoring and event management; SOC 2 CC7.2 (monitoring of system components for anomalies). In this account no documented run expectations existed; they were set at Gate 1 (§5) and are the criteria against which results are measured.

Approach and independence. Read-only throughout. No record, field, script, deployment, workflow or saved search was created or changed. Two gates were held with the account owner (inventory; draft observations).

1 Inventory680 deployments banded by status; schedules read from each record
2 BaselineRun expectations per critical process (Gate 1)
3 RunsInstances joined to deployments; expected vs observed per day
4 WorkBusiness-object footprint from system notes and source
5 RateFMEA-style risk rating; 5C observations (Gate 2)

4. Methodology & definitions

Run-outcome taxonomy

Term usedDefinitionVisible to a conventional error dashboard?Brief's term
Recorded failureAn instance exists and ended FAILED or CANCELED, or the script log holds an ERROR entry.YesLoud failure
Missed runAn expected start window passed with no instance at all. Primary target.NoSilent failure
No-output runInstance completed, but zero (or anomalously few) business objects were produced or changed.NoZombie run
Degraded runCompleted with output, but duration or volume drifted beyond threshold from its own baseline.NoDegraded run
Dormant deploymentCan never fire again: undeployed, Not Scheduled, schedule end date passed, one-time schedule consumed, owner inactive, queue disabled.Only by inspectionStructural silence

Evidence grading

VERIFIED — observed live in this account and cited to a workpaper id (S, Q or R). DERIVED — computed from verified data; formula shown. ASSUMED — a judgement not confirmed by the account owner; listed in Appendix C with impact-if-wrong. Every figure in this report carries one of these grades, explicitly or by its workpaper citation.

Windows, baselines, thresholds

ElementDefinition / formulaBasis
Review period2026-08-05 → 2026-09-03 inclusive, 30 daysInstance table retains ≈ 30 days (Q19)
Baseline period2026-06-24 → 2026-08-04, 42 daysEarliest system-note history for two signals; 8 weeks not available
Expected instances / dayFrom recurringevent: 24 h ÷ repeatTimeInMinutes within the start-time window, else 1; map/reduce runs emit 5 instance rows (stages)S7; A6
Missed runExpected calendar day with 0 instancesR4 missingDays
Degraded runduration > max(3 × median, 5 min). The 5-minute floor prevents 0-minute medians flagging 1-minute runsR4
No-output windowobjects touched < 0.5 × baseline median, or 0 when median > 0R6 flaggedDays
Attributionsystemnote.context (SCH scheduled, MPR map/reduce, SWF workflow) × record type × field the process is known to writeQ12; indirect — A5
Risk ratingFMEA-style RPN = Severity (business criticality 1–3) × Detectability (3 = nothing surfaces it, 2 = surfaces in a record nobody reads, 1 = visible in UI) × Impact (3 = objects missing/wrong, 2 = data stale, 1 = none). High ≥ 12 · Medium 6–11 · Low < 6§8

Observability budget of this account

Telemetry sourceRetention observedRowsExposed to SuiteQL?ConsequenceRef.
scheduledscriptinstance≈ 30 days (4 FAILED rows kept from Aug 2025)4,965Yes, but no script / deployment columnAttribution needs N/search joinsQ4, Q19, S3b, S8b
scriptnote (script execution log)4 days684Partly — script, scriptdeployment columns errorCannot cross-reference 30 days of runsQ10, Q9
systemnote on deployments (type −418)Since 2026-01-081,255YesEnable/disable history before January unrecoverableQ8
systemnote on business recordsSince 2026-01-01 at least1.6 M+ (SWF alone)YesPrimary source for business-state verificationQ11, Q24
scriptdeployment.recurringeventCurrent state only—No (record field)33 record loadsS6, S7
Table 1. Retention and exposure of the account's run telemetry. VERIFIED

5. Run expectations (control baseline)

At Gate 1 the account owner replied verbatim: “Use your suggestions and/or decisions based on best practices.” Every row is therefore ASSUMED (A1–A4). Windows are anchored on the observed steady-state start time rather than the deployment's stored startTime, because the two differ by 0 or 4 hours depending on the deployment (A3).

idProcess (script id · deployment pk)Cadence & expected windowOwner (by function)Why critical
C1Payment Batch Processing (380 · 936)Hourly 18:00–23:00; ≥ 6 instances/dayAP leadMoves money
C2Cash 360 SO/PO Lead-Time Calc (3264 · 4959)Daily 00:00–01:00Supply-chain analystLocal script feeding planning
C3Item360 Item Alerts Count Update (1593 · 2482)Twice daily 00:00 and 12:00 ± 60 minMerchandisingLocal; drives item alerts
C4STE MR Automated Data Update (3260 · 4722)16:00 and 22:00 daily ± 60 minTax / ControllerTax-content currency
C5FAM Trigger Reset Process (3173 · 4010)Daily 01:00–02:00Fixed-assets accountantUnblocks FAM process queue
C6Benchmark 360 Job Scheduler (2687 · 3644)Daily 16:00–17:00Finance analyticsLocal orchestrator
C7AI Companion Role Sync Weekly (3903 · 5344)Weekly Monday 23:00–00:00Employee 3894 (creator)Access control; newest local job
C8Costed BOM Reports Purging (2887 · 3750)Monthly, 2nd Sunday 01:00 ± 24 hProductionCandidate missed run
C9FAM Diagnosis Scan monthly (3164 · 4001)Monthly, 2nd Monday 03:00 ± 24 hFixed-assets accountantCandidate missed run
Table 2. Run expectations. Calendar rule: weekends and holidays not excluded — NetSuite scheduled deployments run seven days and none of the 33 schedules carries business-day gating (S7). Phase 1c integration inventory: count level only. No-output threshold: default (< 50 % of median, or 0 when median > 0).

6. Results at a glance

680
All Scheduled + MR deployments
Deployed (isdeployed=T)
654
Live on a schedule
28
Tested as critical
9
Dormant (can never fire)
6
Figure 1. Population funnel. Bar length proportional to count. R1, Q3, S7z.
idProcessSchedule adherenceRecorded failuresBusiness-state checkStatusObs.
C1Payment Batch Processing30 / 30 days (182 inst.)0No input to process — 0 payment schedulesNo output3
C2Cash 360 lead-time calc30 / 30 (150)0Last-run stamp daily; 29-day gap Jun–Jul (historical)Watch2
C3Item360 alerts count30 / 30 (393)0119 items touched on 15 days; volume-drivenEffective8
C4STE Automated Data Update30 / 30 (300)0Downstream task ran 30 / 30Effective9
C5FAM Trigger Reset30 / 30 (31)0FAM process footprint each Sunday (indirect)Effective—
C6Benchmark 360 Job Scheduler30 / 30 (150)0 (85 downstream, Jan–Jul)0 writes since 17 JulNo output1
C7AI Companion Role Sync4 / 4 Mondays0Not confirmable — source restricted, idempotent by descriptionEffective*—
C8Costed BOM Reports Purging0 / 1 (9 Aug)——Missed run4
C9FAM Diagnosis Scan monthly0 / 1 (10 Aug)——Missed run4
Table 3. Scorecard of the nine critical processes. Adherence and failures from R4/R2b (VERIFIED); business-state from R6, Q15–Q17, Q20 (DERIVED). *Instance-level assurance only (A11).
5
10
15
20
25
30
1
3
C1 Payment Batch
C2 Cash 360
C3 Item360
C4 STE Auto Data Update
C5 FAM Trigger Reset
C6 Benchmark 360
C7 AI Companion Role Sync
C8 Costed BOM Purging
×
C9 FAM Diagnosis monthly
×
↳ STE Data Update (1986)
ran, output confirmed or not expected to be measurable ran, no business output ×missed run recorded failure (none in period) degraded (duration) not expected that day
Figure 2. Run-adherence heatmap, 5 Aug → 3 Sep 2026 (columns = calendar days; shaded headers = weekends). Instance data R4/R2b; no-output classification R6, Q17. The C1 row is amber because its input table is empty, not because runs were missing. Sub-row 1986 is the task dispatched by C4.
1 Jun25 Jun ─ 29 days without a stamp ─ 23 Jul4 Sep
Figure 3. Cash 360 native heartbeat — days on which customrecord_c360_global_config.custrecord_cash360_conf_last_mr_run was written, 1 Jun → 4 Sep 2026 (96 days). Blue = stamped; red outline = no stamp. Q20. VERIFIED

7. Inventory & dormant deployments

BandRuleCountRef.
D — livestatus='SCHEDULED' AND isdeployed='T'28R1
B — dormant, undeployedisdeployed='F' (5 still read SCHEDULED)26R1, Q3
C — not scheduled (on demand / task-triggered)status='NOTSCHEDULED', deployed626R1
A — script inactivescript.isinactive='T'0R1
Total Scheduled + Map/Reduce deployments — 255 SS, 425 MR; 643 bundle-owned across 15 bundles, 37 local680Q1, R1
Workflows with initonschedule='T'2Q2
Queue / priority differentiation among the 28 live deploymentsnone — all queue 1, priority 2Q1
Table 4. Population by status band. VERIFIED

The 28 live scheduled deployments

#Script (id) · dep pkProvenanceSchedule (recurringevent)30 d inst.Last completeBand
1Payment Batch Processing (380) · 936Bundle 533070Daily 18:00, every 60 min17809-04 03:01Live · C1
2Cash 360 SO/PO Lead Time Calc (3264) · 4959LocalDaily 00:0015009-04 04:03Live · C2
3Benchmark 360 Job Scheduler (2687) · 3644LocalDaily 16:0015009-04 20:01Live · C6
4Item360 Item Alerts Count Update (1593) · 2482LocalDaily 00:00, every 720 min39309-04 16:02Live · C3
5Costed BOM clean Up (2886) · 3749LocalWeekly Sun 14:302008-30 14:32Live
6Costed BOM Reports Purging (2887) · 3750LocalMonthly 2nd Sun 01:000none in retentionLive · C8 · obs. 4
7AI Companion Role Sync Weekly (3903) · 5344LocalWeekly Mon 23:00409-01 03:01Live · C7
8STR Job Manager Runner SS (1238) · 4774Bundle 237699Daily 16:00, every 15 min94809-04 20:31Live
9STE MR Automated Data Update (3260) · 4722Bundle 237702Daily 16:00, every 360 min30009-04 20:01Live · C4
10STE MR Lookup Process Delete (1188) · 1970Bundle 237702Daily 18:0014509-03 22:02Live
11FAM Clean Up Depreciation Files (3220) · 4057Bundle 508242Daily 00:0018909-04 04:03Live
12FAM Diagnosis Scan daily (3164) · 3999Bundle 508242Daily 03:003109-04 03:01Live
13FAM Diagnosis Scan weekly (3164) · 4000Bundle 508242Weekly Wed 03:00409-02 07:01Live
14FAM Diagnosis Scan monthly (3164) · 4001Bundle 508242Monthly 2nd Mon 03:000none in retentionLive · C9 · obs. 4
15FAM Trigger Pre-Compute (3167) · 4004Bundle 508242Weekly Sun 00:00408-30 04:02Live
16FAM Trigger Reports Cleanup (3162) · 3996Bundle 508242Daily 15:003009-04 19:01Live
17FAM Trigger Reset Process (3173) · 4010Bundle 508242Daily 01:003109-04 01:31Live · C5
18ECO MR Bulk Process (468) · 1199Bundle 47193Daily 00:0015009-04 04:02Live
19ECO Details MR Delete Orphans (467) · 1197Bundle 47193Weekly Sun 00:002008-30 00:02Live
20SCM Background Cleanup (459) · 1188Bundle 47193Daily 18:003009-03 18:02Live
21SCM CPN Cleaner (458) · 2543Bundle 47193Monthly day 3 18:00 — endDate 04/03/20160noneDormant obs. 5
22Org Browser Tree Generator (328) · 492Bundle 112469Daily 00:003009-04 04:01Live
23Request License SS (311) · 4103Bundle 116144Daily 04:303109-04 04:31Live
24Mobile – Remove Logs (1953) · 2673Bundle 534299Daily 00:003009-04 04:01Live
25Mobile – ELK Logging (1958) · 2679Bundle 534299Weekly Sun 17:30408-30 21:32Live
26Mobile – ELK Logs Cleanup (1952) · 2672Bundle 534299Every 3 months, 1st Sat 22:000none in retentionNot due (A8)
27PackShip ELK Metrics (2122) · 3139Bundle 534418Weekly Sun 18:30408-30 22:32Live
28Mfg Mobile Usage Metrics (3016) · 3793Bundle 534953Weekly Sun 05:30408-30 09:32Live
Table 5. Live scheduled deployments. Schedule from S7a–S7ab; counts from R2/R2b. Times are the deployment's stored startTime. VERIFIED

Dormant deployments

Deployment (pk)ScriptRule triggeredChange historyRef.
customdeploy_scm_cpn_ss_cleaner (2543)SCM CPN Cleaner SS (458)End date 04/03/2016 passed; status still SCHEDULED; 0 instancesnoneS7z, R2b
customdeploy_print_delete_files_sheduler (2700)Print – Delete Print Files Scheduler (1969)isdeployed=F, status SCHEDULEDnoneQ3, S7ac
customdeploy_print_mr_fileaccess_cleanup (2742)Print – File Access Clean up (2011)isdeployed=F, status SCHEDULEDnoneQ3, S7ad
customdeploy_print_list_sync_sheduler (2692)Print – Print List Sync Scheduler (1966)isdeployed=F, status SCHEDULEDnoneQ3, S7ae
customdeploy_print_mr_statussync (2747)Print Status Sync (2016)isdeployed=F, status SCHEDULEDnoneQ3, S7af
customdeploy_shipcentral_pkgdtlcreation (3304)ShipCentral – Package Details Creation (2179)isdeployed=F, status SCHEDULEDnoneQ3, S7ag
Table 6. Dormant deployments. System notes for record type −418 exist only from 2026-01-08 (1,255 rows, Q8); only pk 4959 (created 27 Jan by system) and pk 5344 (created 20 Jun by employee 3894) have any history (Q6, Q7). Who disabled the six above, and when, cannot be established. VERIFIED

Scheduled workflows

VERIFIED Two workflows carry initonschedule='T', both on the Subsidiary record (−117), both runasadmin='T': customworkflow_atlas_finwb_translations (216, RELEASED, logging off) and customworkflow_atlas_prowb_translations (316, TESTING, logging on). Frequency is not exposed on the workflow table (Q2, Q26). See observation 7.

8. Detailed observations

Observations are rated with the FMEA-style RPN defined in §4 and written in Condition · Criteria · Cause · Effect · Recommendation form. Management response and target date are left for the process owner.

#ObservationRatingRPNClassProcessRef.
1Scheduler completes daily, downstream job silent since 17 Jul after 85 failuresHigh3×3×2 = 18No-output + hidden recorded failuresC6R4, R6, Q14, Q21, S9
7Workflow rewriting subsidiary nexus 3,552×/dayHigh2×3×2 = 12Runaway unattended processWorkflow 216/316Q22–Q26
229-day gap in Cash 360 last-run stamp (Jun–Jul)Medium3×3×1 = 9Missed runs (historical)C2Q20, R6
4Monthly deployments: no run in August windowsMedium3×3×1 = 9Missed run ×2C8, C9R2, R2b, S7d, S7n
10Telemetry retention too short to audit beyond 30 daysMedium3×3×1 = 9Control gapAccountQ10, Q19, S3c
3Payment Batch Processing runs hourly with 0 schedulesMedium3×2×1 = 6No-output by configurationC1Q15–Q17, R4
5SCM CPN Cleaner scheduled with 2016 end dateMedium1×3×2 = 6Dormantdep 2543S7z, R2b
8Item360 flagged 15/30 days by default thresholdLow3×1×1 = 3Threshold artefactC3R6
6Five undeployed deployments still read SCHEDULEDLow1×2×1 = 2Dormant ×5Print ×4, ShipCentralQ3, S7ac–ag, Q7
9One 52-minute run vs 0-minute median; 4 failures Aug 2025Low2×1×1 = 2Degraded ×1; recorded ×4 (stale)dep 1986R4, Q18
Table 7. Summary of observations, ranked by RPN.

Observation 1 — Benchmark 360 Job Scheduler High

Condition
VERIFIED Deployment customdeploy_b360_mr_jobscheduler (pk 3644) produced 150 COMPLETE instances in the review period, one run per day at 16:01, duration 0 min (R4). It wrote nothing to its job record customrecord_b360_scheduled_job in that period; the last write was 17 Jul 16:02 (R6, Q14). Retained system notes show the dispatched job customdeploy_b360_mr_schedbenchmarkdata transitioned to FAILED 85 times and COMPLETED 12 times between 1 Jan and 17 Jul, every failure carrying UNEXPECTED_ERROR … NLSession.getCompany() … getNLSession() is null (Q21, Q14). The record now reads frequency QUARTERLY, last run 17 Jul COMPLETED, next run 7 Oct 2026 (S9).
Criteria
A scheduled orchestrator should either perform work in each window or record that no work was due, and any failure of the work it dispatches should reach an owner (COBIT DSS01; SOC 2 CC7.2).
Cause
DERIVED The scheduler reports success for dispatching, not for the outcome of what it dispatched. The outcome is written only to a custom record nobody reads. The script execution log that would have shown 85 errors retains 4 days (Q10).
Effect
Benchmark data has not been refreshed since 17 Jul at the latest, and was refreshed on only 12 of 97 attempts in the first half of the year. Six and a half months of failures produced no alert.
Recommendation
Confirm whether Benchmark 360 is in use. If yes: raise the RESTlet-session error with the SuiteApp vendor, re-run the job, and add the job record to the heartbeat monitor (§11) with min_objects = 1. If no: set pk 3644 to Not Scheduled and document the decision. Effort: hours.
Management response / target date
To be completed by process owner.
FAILED transitions
85
COMPLETED transitions
12
Writes 5 Aug – 3 Sep
0
Figure 4. custrecord_b360_job_last_run_status transitions in retained system notes (1 Jan – 17 Jul 2026) and writes during the review period. Q21, R6.

Observation 7 — Workflow-context runaway on Subsidiary High

Condition
VERIFIED 1,613,940 system notes since 1 Jan 2026, all on field SUBSIDIARYNEXUSMAP.KNEXUS of Subsidiary records 1, 2 and 3, context SWF, user −4 (system), at a constant 3,552 per day (Q22–Q24). On 4 Sep the writes cycle 18 distinct US-state nexus values on subsidiaries 2 and 3 every ~7 minutes (Q25).
Criteria
Unattended processes should have an identified owner and a purpose; audit-trail volume should be proportionate to business change.
Cause
ASSUMED (A12) The only active workflows on Subsidiary are 216 customworkflow_atlas_finwb_translations (RELEASED) and 316 customworkflow_atlas_prowb_translations (TESTING, logging on); both are scheduled and run as administrator (Q26). A translation workflow touching the nexus map suggests a mis-set action or a bundle-installation artefact.
Effect
≈ 1.3 million audit rows per year from one process; subsidiary change history is unreadable; nexus state flaps across 18 values, with possible tax-determination side effects during the cycle.
Recommendation
Open workflow 316's execution log (logging is on) and identify the action writing the nexus map; if 316 is not the actor, enable logging on 216 for one hour and repeat. Suspend the offending workflow and set an owner. Effort: hours.
Management response / target date
To be completed by administrator.

Observation 2 — Cash 360 lead-time calc, 29-day gap Medium

Condition
VERIFIED custrecord_cash360_conf_last_mr_run was written daily 1–24 Jun, not at all 25 Jun – 23 Jul, then daily from 24 Jul through 4 Sep (Q20; Figure 3). In the review period the process ran 30/30 days (R4).
Criteria
Daily process per Table 2.
Cause
Unrecoverable: the instance table starts 5 Aug and the deployment has no system notes after its creation on 27 Jan (Q19, Q6).
Effect
Lead-time planning data was stale for a month with no alert. The field that would have revealed it is a ready-made heartbeat with no reader.
Recommendation
Saved search on customrecord_c360_global_config where custrecord_cash360_conf_last_mr_run is before yesterday, emailed daily to the supply-chain analyst. Effort: minutes.

Observation 3 — Payment Batch Processing, no input Medium

Condition
VERIFIED 182 COMPLETE instances, six per day (R4). Source (S10): the script selects due rows from customrecord_2663_payment_schedule and creates customrecord_2663_file_admin batches. The schedule table holds 0 rows (Q17). The batch table holds 7 rows, created 8 and 10 Sep 2026 — after the audit date — none from a scheduled context (Q15, Q16).
Criteria
A scheduled job should have work to do or be paused.
Cause
ASSUMED (A10) Electronic Bank Payments is installed but not configured for use; future-dated rows indicate demo data.
Effect
Six queue slots a day consumed for nothing; a green run history that means nothing.
Recommendation
AP confirms whether EBP is in use. If not, set pk 936 to Not Scheduled. If yes, populate payment schedules and add customrecord_2663_payment_schedule count to the business-state monitors. Effort: minutes.

Observation 4 — Monthly deployments, August windows Medium

Condition
VERIFIED Deployments 3750 (2nd Sunday 01:00 → 9 Aug) and 4001 (2nd Monday 03:00 → 10 Aug) appear nowhere among the 4,914 instances readable via search (R2, R2b; S7d, S7n).
Criteria
One run per month each (Table 2).
Cause
Undetermined. With a 30-day instance table, an August miss cannot be distinguished from a deployment that never fires (A8).
Effect
Costed BOM reports not purged; monthly FAM diagnosis not produced.
Recommendation
Check Setup → Scheduled Script Status on 14 and 15 Sep. If silent again, open each deployment, re-save the schedule, and register both in the heartbeat monitor. Effort: minutes.

Observations 5 and 6 — Dormant deployments Medium / Low

Condition
VERIFIED Table 6. One deployment has a schedule that ended in 2016 yet reads SCHEDULED; five read SCHEDULED while isdeployed=F. None has a system note (Q7).
Criteria
Deployment status should describe what will happen.
Effect
Misleading status; if the Print or ShipCentral features are used, their sync and cleanup jobs are absent.
Recommendation
For each: decide, then set status to Not Scheduled or clear the end date / re-deploy; record the decision in the deployment description. Effort: minutes.

Observation 8 — Item360 threshold artefact Low

VERIFIED 119 items updated on 15 of 30 days; baseline median 1 item/day with spikes of 35 (10 Aug) and 54 (1 Sep) (R6; Figure 5). The script's input is items whose alert counts changed (S10), so zero-write days are correct behaviour. The default no-output threshold is inappropriate for volume-driven signals; the heartbeat should carry an objects-processed count so that 0 is distinguishable from “no candidates”.

Observation 9 — STE Data Update duration anomaly Low

VERIFIED Deployment 1986 ran 52 minutes on 28 Aug against a 0-minute median (R4); four FAILED instances at Get Input Data on 10–13 Aug 2025 (Q18). No action beyond monitoring.

Observation 10 — Telemetry retention Medium

VERIFIED Table 1. The account cannot answer “did this job run in July?” from its own data. Recommendation: the heartbeat record in §11, which persists indefinitely and is owned by the account.

9. Business-state verification

Attribution method: systemnote rows with context SCH or MPR since 24 June, grouped by record type and field (Q12, R6). Source files for five of nine critical scripts are access-restricted (Appendix D), so purpose and target objects come from the system-note footprint and, where readable, source archaeology (S10).

baseline median 1
3554
5 Augitems updated per day (amber = flagged below threshold, i.e. zero)3 Sep
Figure 5. C3 Item360 — items with an MPR-context write to custitem_order_delay_count per day. Baseline (24 Jun – 4 Aug): median 1, IQR 0–2.75, 23/42 days active, 188 items. Observed: 119 items, 15/30 days active. R6. VERIFIED
ProcessSignal (record type · field · context)Baseline median / dayObserved active days / 30FlaggedReadingRef.
C6 Benchmark 360customrecord_b360_scheduled_job · custrecord_b360_job_last_run · MPR0 (12 writes, all 1–17 Jul)0—No output — obs. 1R6, Q14
C2 Cash 360customrecord_c360_global_config · custrecord_cash360_conf_last_mr_run · MPR0 (29-day gap in baseline)300Confirmed daily; plus 6 Entity (2171) updates on 3 daysR6, Q20
C1 Payment Batchcustomrecord_2663_file_admin created; input customrecord_2663_payment_schedule—0 scheduled-context creates—0 schedules; 7 future-dated batches — obs. 3Q15–Q17
C3 Item360item · custitem_order_delay_count · MPR11515Volume-driven — obs. 8R6
C4 STE Auto Data UpdateNo records; submits task customscript_ste_mr_data_update (file 75871 L13–18)—30 (downstream dep 1986)0Confirmed via downstream instancesS10, R4
C5 FAM Trigger Resetcustomrecord_fam_process (2117) · SCH+MPR0 (4 records each Sunday)40Footprint consistent with weekly FAM cycle (indirect)R6
FAM Diagnosis daily/weeklycustomrecord_fam_recent_diagnosis · custrecord_fam_diagnosis_scandate · SCH2 (5 on Wednesdays)300ConfirmedR6
Request Licensecustomrecord_8299_client_audit_trail · custrecord_8299_cat_details · SCH2300ConfirmedR6
C7 AI Companion Role SyncIdempotent CSV import per description; source restricted—0 SCH writes on any type—Consistent with “no new roles” (A11)S10, R6
Table 8. Business-state signals, baseline vs observed. Q13 resolves record type ids to scriptids.

Draft saved searches — independent business-state monitors (not created)

ProcessRecord typeFiltersColumnsSummaryHealthy resultCadence
C6customrecord_b360_scheduled_jobcustrecord_b360_job_last_run_status is FAILED, OR custrecord_b360_job_last_run before 2 days agoname, last run, status, next run, messagenone0 rowsDaily 08:00 email
C2customrecord_c360_global_configcustrecord_cash360_conf_last_mr_run on or before yesterdayid, last MR runnone0 rowsDaily 08:00 email
C1customrecord_2663_payment_schedulenoneidCount> 0 if EBP in use; otherwise pause the jobWeekly
C3ItemSystem Notes: Field = custitem_order_delay_count; Date within last 2 days; Context = Map/Reducename, note date, new valueCount≥ 0 (informational)Daily
C5 / C9customrecord_fam_recent_diagnosiscustrecord_fam_diagnosis_scandate = todayid, scan dateCount≥ 2Daily
Table 9. Saved-search definitions a human can create without code. Nothing has been created.

10. Management action plan

  1. Today — Benchmark 360. Open customrecord_b360_scheduled_job id 1. In use? Fix the RESTlet-session error behind 85 FAILED runs and re-run. Not in use? Set customdeploy_b360_mr_jobscheduler (pk 3644) to Not Scheduled. (Obs. 1)
  2. This week — nexus rewrites. Read workflow 316's log; identify the action writing SUBSIDIARYNEXUSMAP.KNEXUS; suspend it (or 216 if that is the actor). (Obs. 7)
  3. This week — two saved searches, no code. Table 9 rows C2 and C6, emailed daily to owners. Then approve §11. (Obs. 2, 1, 10)
#ActionRecord · field to changeOwnerEffortObs.Target dateStatus
1Decide B360 usage; fix or unschedulescriptdeployment 3644 · status; job record 1 · custrecord_b360_job_frequencyFinance analyticsHours1—Open
2Attribute and suspend nexus-rewrite workflowworkflow 316 / 216 · releasestatus or scheduleAdministratorHours7—Open
3Create interim saved-search monitorsTable 9 (C2, C6)AdministratorMinutes2, 1—Open
4Confirm EBP status; unschedule or configurescriptdeployment 936 · statusAP leadMinutes3—Open
5Watch 13/14 Sep; re-save schedules if silentscriptdeployment 3750, 4001 · recurringeventProduction; FA accountantMinutes415 SepOpen
6Resolve six dormant deploymentsscriptdeployment 2543 · end date; 2700, 2742, 2692, 2747, 3304 · isdeployed / statusAdministratorMinutes5, 6—Open
7Approve and build heartbeat control§11AdministratorProject10, all—Proposed
Table 10. Action plan. Target date and status columns are for management to maintain.

11. Recommended control design — heartbeat monitor

Design only. Nothing in this section has been built, created or deployed. The pattern is the dead-man's-switch (“cron monitoring”) model used by Cronitor, Healthchecks and similar services, implemented natively.

Design constraints

11.1 Custom record customrecord_sonar_heartbeat — one row per critical process

Field idTypePurpose
nameTextProcess label
custrecord_hb_deploymentTextDeployment scriptid, e.g. customdeploy_cash360_mr_so_po_calc
custrecord_hb_cadenceList: HOURLY / DAILY / WEEKLY / MONTHLYFrom Table 2
custrecord_hb_window_start / _window_endTime of dayExpected start window
custrecord_hb_days_maskText, 7 charsDays of week expected, e.g. 1111111
custrecord_hb_last_startDate/TimeSet by START heartbeat
custrecord_hb_last_completeDate/TimeSet by COMPLETE heartbeat
custrecord_hb_last_objectsIntegerObjects processed on last run — 0 is a valid, visible value
custrecord_hb_min_objectsIntegerNo-output threshold; blank = no volume expectation
custrecord_hb_owner / custrecord_hb_escalationEmployeeOwner of a missed run; escalation
custrecord_hb_muted_untilDatePlanned outage — suppress alerts
custrecord_hb_last_alertDate/TimeDebounce: one alert per missed window
Table 11. Heartbeat record schema (proposed).

11.2 Heartbeat contract — two calls per monitored script

// heartbeat.js — shared module, SuiteScript 2.1
define(['N/record','N/search','N/log'], (record, search, log) => {
  function find(depId) {            // 1 search, ~10 units
    let id = null;
    search.create({ type:'customrecord_sonar_heartbeat',
      filters:[['custrecord_hb_deployment','is',depId]], columns:['internalid'] })
      .run().each(r => { id = r.id; return false; });
    return id;
  }
  function stamp(depId, values) {   // submitFields, ~10 units
    try {
      const id = find(depId); if (!id) return;               // unregistered → silent no-op
      record.submitFields({ type:'customrecord_sonar_heartbeat', id, values,
        options:{ enableSourcing:false, ignoreMandatoryFields:true } });
    } catch (e) { log.error('heartbeat', e.message); }      // NEVER rethrow
  }
  return {
    start:    depId => stamp(depId, { custrecord_hb_last_start: new Date() }),
    complete: (depId, n) => stamp(depId, { custrecord_hb_last_complete: new Date(),
                                          custrecord_hb_last_objects: n })
  };
});

// in the monitored script
// getInputData / execute():  heartbeat.start(runtime.getCurrentScript().deploymentId);
// summarize / end:           heartbeat.complete(deploymentId, objectsProcessed);

Governance: ≈ 20 units per call, 40 per run — under 0.5 % of a 10,000-unit scheduled-script budget. Failure behaviour: every path is wrapped; an unregistered deployment is a no-op; a heartbeat exception is logged and swallowed. For bundle-owned scripts whose source cannot be edited, the monitor itself stamps START/COMPLETE by reading scheduledscriptinstance through N/search — the same join used in R2.

11.3 Absence monitor customscript_sonar_hb_monitor — Scheduled Script, every 30 min

  1. Load heartbeat rows where custrecord_hb_muted_until is empty or past.
  2. Compute the most recent expected window from cadence, days mask and window start/end.
  3. Window end passed and last_start < window start → MISSED. last_start set, last_complete < last_start, now > window end + grace → HUNG. last_objects < min_objects → NO OUTPUT.
  4. Debounce on custrecord_hb_last_alert; email owner, cc escalation; log AUDIT.
  5. Who monitors the monitor: the monitor stamps its own row (custrecord_hb_deployment = customdeploy_sonar_hb_monitor, cadence HOURLY). A saved search “Heartbeat monitor stale” (last_start older than 90 min) is scheduled through NetSuite's native saved-search email — a mechanism independent of SuiteScript.

11.4 Second layer — business-state monitors

Table 9 saved searches, scheduled as shown. They confirm the work, not the run, and require no code.

11.5 Roll-out, test, rollback

12. Positive assurance & next checkpoints

VERIFIED The following were tested and found operating as expected for the review period:

DateWhat to checkExpectedObs.
13 Sep 2026 (2nd Sunday)Instance for dep 3750 Costed BOM Reports Purging1 COMPLETE around 01:004
14 Sep 2026 (2nd Monday)Instance for dep 4001 FAM Diagnosis Scan monthly1 COMPLETE around 03:004
7 Oct 2026customrecord_b360_scheduled_job id 1 next runStatus COMPLETED, message empty — if B360 retained1
Any daysystemnote SWF rows on type −1170 after the workflow is suspended7
Table 12. Next checkpoints.

Appendix A — Workpapers (evidence log)

All timestamps 2026-09-04, US Eastern. Row counts as returned. Schema probes S1–S5 were SELECT * … FETCH FIRST 1 ROWS ONLY.

A.1 Schema probes and record reads

idProbeResultSupports
S1SELECT * FROM scriptdeployment FETCH FIRST 1 ROWS ONLY (19:36)Columns incl. primarykey, script, scriptid, status, isdeployed, queueid, priority, loglevel, titleQ1, Q3
S1brecordsCatalog getRecordTypeDetail scriptdeploymentField list confirmedQ1
S2SELECT * FROM script …id, scriptid, name, scripttype, frombundle, owner, isinactive, scriptfileQ1
S3SELECT * FROM scheduledscriptinstance …taskid, startdate, enddate, datecreated, timestampcreated, status, percentcomplete, mapreducestage, queue, internalidQ4, Q5, Q18, Q19
S3brecordsCatalog getRecordTypeDetail scheduledscriptinstance10 fields; no script/deployment fieldTable 1
S3cSELECT ssi.script, ssi.scriptdeployment … FROM scheduledscriptinstanceError: unexpected SuiteScript errorTable 1
S4SELECT * FROM workflow …internalid, scriptid, name, releasestatus, isinactive, initonschedule, recordtype, frombundle, runasadmin, islogenabledQ2, Q26
S5SELECT * FROM systemnote …id, date, recordid, record, recordtypeid, field, oldvalue, newvalue, name, role, context, typeQ6–Q8, Q11–Q14, Q20–Q25, R6
S6recordTypeDescribe scriptdeployment sampleId 5344 match “recur”Field recurringevent (textarea, JSON)S7
S7a–agrecordLoad scriptdeployment × 33 (3644, 4959, 3749, 3750, 2482, 936, 4722, 4774, 1197, 1199, 4057, 3999, 4000, 4001, 4004, 3996, 4010, 3793, 2679, 2672, 2673, 492, 3139, 4103, 1188, 2543, 1970, 5344, 2700, 2742, 2692, 2747, 3304); fields scriptid, status, isdeployed, recurringeventSchedules in Table 5Inventory, obs. 5, 6
S8bN/search scheduledscriptinstance with joins script.internalid, scriptdeployment.internalid, scriptdeployment.scriptidJoins valid (unjoined column “script” invalid)R2–R4
S9recordLoad customrecord_b360_scheduled_job id 1, all fieldsfrequency QUARTERLY; last_run 2026-07-17T23:02:12Z COMPLETED; next_run 2026-10-07; job customscript_b360_mr_schedbenchmarkdataObs. 1
S10Three read-only research subagents, 102 tool callsReadable: 4063 + EBP DAO modules; 75871 L9–18 (task.create); 15770 L1–45, 15769 L65, L178–188 (Item360). Denied: 89907, 24931, 24958, 91219, 25732, 89906, 89908, 89900§9, Appendix D

A.2 Queries (verbatim)

-- Q1 (19:37) 680 rows — inventory of Scheduled/MR deployments
SELECT s.id AS script_id, s.scriptid AS script_scriptid, s.name AS script_name, s.scripttype,
       s.frombundle, s.owner, s.isinactive AS script_inactive, s.scriptfile,
       d.primarykey AS deployment_pk, d.id AS deployment_seq, d.scriptid AS deployment_scriptid,
       d.title, d.status, d.isdeployed, d.queueid, d.priority, d.loglevel, d.executioncontext
FROM scriptdeployment d
JOIN script s ON s.id = d.script
WHERE s.scripttype IN ('SCHEDULED','MAPREDUCE')
ORDER BY s.frombundle NULLS FIRST, s.name, d.primarykey

-- Q2 (19:37) 2 rows — scheduled workflows
SELECT w.internalid, w.scriptid, w.name, w.releasestatus, w.isinactive, w.initonschedule,
       w.initoncreate, w.initonvieworupdate, w.recordtype, w.frombundle, w.owner, w.datemodified
FROM workflow w WHERE w.initonschedule = 'T' ORDER BY w.name

-- Q3 (19:38) 33 rows — deployments with status SCHEDULED
SELECT s.id AS script_id, s.scriptid AS script_scriptid, s.name AS script_name, s.scripttype,
       s.frombundle, s.owner, s.scriptfile, d.primarykey AS deployment_pk,
       d.scriptid AS deployment_scriptid, d.status, d.isdeployed
FROM scriptdeployment d JOIN script s ON s.id = d.script
WHERE s.scripttype IN ('SCHEDULED','MAPREDUCE') AND d.status = 'SCHEDULED'
ORDER BY d.isdeployed DESC, s.frombundle NULLS FIRST, s.name

-- Q4 (19:39) 1 row — instance_rows 4965, oldest_start 2025-08-10, newest_start 2026-09-04
SELECT COUNT(*) AS instance_rows,
       TO_CHAR(MIN(ssi.datecreated),'YYYY-MM-DD') AS oldest_created,
       TO_CHAR(MAX(ssi.datecreated),'YYYY-MM-DD') AS newest_created,
       TO_CHAR(MIN(ssi.startdate),'YYYY-MM-DD') AS oldest_start,
       TO_CHAR(MAX(ssi.startdate),'YYYY-MM-DD') AS newest_start
FROM scheduledscriptinstance ssi

-- Q5 (19:39) 3 rows — COMPLETE 4910, CANCELED 51, FAILED 4
SELECT ssi.status, COUNT(*) AS n FROM scheduledscriptinstance ssi
GROUP BY ssi.status ORDER BY COUNT(*) DESC

-- Q6 (19:41) 23 rows — deployment field-change notes (2 deployments, both creations)
SELECT sn.id, TO_CHAR(sn.date,'YYYY-MM-DD HH24:MI') AS changed, sn.recordid, sn.record, sn.field,
       sn.oldvalue, sn.newvalue, sn.name AS changed_by, sn.role, sn.context, sn.recordtypeid
FROM systemnote sn
WHERE sn.recordid IN (5344,3644,4959,3749,3750,1197,1199,4057,3999,4001,4000,4004,3996,4010,2482,
                      3793,2679,2672,2673,492,3139,936,4103,1188,2543,4722,1970,4774,2700,2742,2692,2747,3304)
  AND (UPPER(sn.field) LIKE '%DEPLOY%' OR UPPER(sn.field) LIKE '%STATUS%'
       OR UPPER(sn.field) LIKE '%SCHEDUL%' OR UPPER(sn.field) LIKE '%RECURR%')
ORDER BY sn.date DESC FETCH FIRST 200 ROWS ONLY

-- Q7 (19:42) 2 rows — 5344 (9 notes 2026-06-20 by 3894), 4959 (13 notes 2026-01-27 by -5)
SELECT sn.recordid, sn.record, COUNT(*) AS notes, TO_CHAR(MIN(sn.date),'YYYY-MM-DD') AS first_note,
       TO_CHAR(MAX(sn.date),'YYYY-MM-DD') AS last_note, MAX(sn.name) AS last_by
FROM systemnote sn
WHERE sn.recordtypeid = -418 AND sn.recordid IN (…same 33 ids…)
GROUP BY sn.recordid, sn.record ORDER BY MAX(sn.date) DESC

-- Q8 (19:42) 1 row — n 1255, oldest 2026-01-08, newest 2026-09-03
SELECT COUNT(*) AS n, TO_CHAR(MIN(sn.date),'YYYY-MM-DD') AS oldest, TO_CHAR(MAX(sn.date),'YYYY-MM-DD') AS newest
FROM systemnote sn WHERE sn.recordtypeid = -418

-- Q9 (19:45–19:47) five variants grouping scriptnote by script / scriptdeployment:
--    all returned "An unexpected SuiteScript error has occurred". Replaced by R5.
-- Q9a (19:47) 3 rows — AUDIT 427, ERROR 161, DEBUG 100
SELECT sn.type, COUNT(*) AS entries FROM scriptnote sn GROUP BY sn.type ORDER BY COUNT(*) DESC

-- Q10 (19:45) 1 row — n 684, oldest 2026-09-01, newest 2026-09-04, errors 157
SELECT COUNT(*) AS n, TO_CHAR(MIN(sn.date),'YYYY-MM-DD') AS oldest, TO_CHAR(MAX(sn.date),'YYYY-MM-DD') AS newest,
       SUM(CASE WHEN sn.type = 'ERROR' THEN 1 ELSE 0 END) AS errors
FROM scriptnote sn

-- Q11 (19:49) 8 rows — SWF 233100, (null) 32430, UIF 1706, SCH 614, MPR 493, SLT 286, SDF 23, RST 1
SELECT sn.context, COUNT(*) AS notes, COUNT(DISTINCT sn.recordtypeid) AS record_types,
       TO_CHAR(MIN(sn.date),'YYYY-MM-DD') AS oldest, TO_CHAR(MAX(sn.date),'YYYY-MM-DD') AS newest
FROM systemnote sn WHERE sn.date >= TO_DATE('2026-07-01','YYYY-MM-DD')
GROUP BY sn.context ORDER BY COUNT(*) DESC

-- Q12 (19:49) 26 rows — record/field footprint of SCH and MPR contexts (Table 8)
SELECT sn.context, sn.recordtypeid, sn.field, COUNT(*) AS notes,
       COUNT(DISTINCT TO_CHAR(sn.date,'YYYY-MM-DD')) AS active_days, TO_CHAR(MAX(sn.date),'YYYY-MM-DD') AS last_day
FROM systemnote sn
WHERE sn.date >= TO_DATE('2026-07-01','YYYY-MM-DD') AND sn.context IN ('SCH','MPR','MAPREDUCE','SCHEDULED')
GROUP BY sn.context, sn.recordtypeid, sn.field ORDER BY COUNT(*) DESC FETCH FIRST 60 ROWS ONLY

-- Q13 (19:50) 7 rows — 159 CUSTOMRECORD_8299_CLIENT_AUDIT_TRAIL, 163 CUSTOMRECORD_OB_ORG_TREE,
--    1959 CUSTOMRECORD_B360_SCHEDULED_JOB, 2107 CUSTOMRECORD_FAM_RECENT_DIAGNOSIS, 2117 CUSTOMRECORD_FAM_PROCESS,
--    2170 CUSTOMRECORD_C360_GLOBAL_CONFIG, 2171 CUSTOMRECORD_CASH360_ENTITY_DATA
SELECT crt.internalid, crt.scriptid, crt.name FROM customrecordtype crt
WHERE crt.internalid IN (1959,2170,2171,2117,2107,159,163) ORDER BY crt.internalid

-- Q14 (19:50) 40 rows — B360 job record 1 transitions 13–17 Jul (FAILED→RUNNING→COMPLETED on 17 Jul)
SELECT sn.recordid, sn.record, sn.field, sn.oldvalue, sn.newvalue, TO_CHAR(sn.date,'YYYY-MM-DD HH24:MI') AS changed, sn.context
FROM systemnote sn WHERE sn.recordtypeid = 1959 AND sn.date >= TO_DATE('2026-07-10','YYYY-MM-DD')
ORDER BY sn.date DESC FETCH FIRST 40 ROWS ONLY

-- Q15 (19:51) 2 rows — 2026-09-08: 1, 2026-09-10: 6
SELECT TO_CHAR(fa.created,'YYYY-MM-DD') AS d, COUNT(*) AS batches
FROM customrecord_2663_file_admin fa WHERE fa.created >= TO_DATE('2026-06-24','YYYY-MM-DD')
GROUP BY TO_CHAR(fa.created,'YYYY-MM-DD') ORDER BY TO_CHAR(fa.created,'YYYY-MM-DD')

-- Q16 (19:51) 1 row — total 7, last_created 2026-09-10
SELECT COUNT(*) AS total, TO_CHAR(MAX(fa.created),'YYYY-MM-DD') AS last_created,
       TO_CHAR(MAX(fa.lastmodified),'YYYY-MM-DD') AS last_modified
FROM customrecord_2663_file_admin fa

-- Q17 (19:51) 1 row — due_schedules 0
SELECT COUNT(*) AS due_schedules FROM customrecord_2663_payment_schedule ps

-- Q18 (19:52) 5 rows — FAILED 2025-08-10..13 (1 each); CANCELED 51 with null date
SELECT TO_CHAR(ssi.startdate,'YYYY-MM-DD') AS d, ssi.status, COUNT(*) AS n
FROM scheduledscriptinstance ssi WHERE ssi.status <> 'COMPLETE'
GROUP BY TO_CHAR(ssi.startdate,'YYYY-MM-DD'), ssi.status ORDER BY 1

-- Q19 (19:52) 4 rows — 2025-08: 4, 2026-08: 4368, 2026-09: 544, null: 51
SELECT TO_CHAR(ssi.startdate,'YYYY-MM') AS m, COUNT(*) AS n
FROM scheduledscriptinstance ssi GROUP BY TO_CHAR(ssi.startdate,'YYYY-MM') ORDER BY 1

-- Q20 (19:52) 67 rows — daily 06-01..06-24, gap, daily 07-24..09-04
SELECT TO_CHAR(sn.date,'YYYY-MM-DD') AS d, COUNT(*) AS writes
FROM systemnote sn
WHERE sn.recordtypeid = 2170 AND sn.field = 'CUSTRECORD_CASH360_CONF_LAST_MR_RUN'
  AND sn.date >= TO_DATE('2026-06-01','YYYY-MM-DD')
GROUP BY TO_CHAR(sn.date,'YYYY-MM-DD') ORDER BY 1

-- Q21 (19:52) 3 rows — RUNNING 97, FAILED 85, COMPLETED 12 (2026-01-01..07-17)
SELECT sn.newvalue AS status, COUNT(*) AS n, TO_CHAR(MIN(sn.date),'YYYY-MM-DD') AS first_d, TO_CHAR(MAX(sn.date),'YYYY-MM-DD') AS last_d
FROM systemnote sn WHERE sn.recordtypeid = 1959 AND sn.field = 'CUSTRECORD_B360_JOB_LAST_RUN_STATUS'
GROUP BY sn.newvalue ORDER BY COUNT(*) DESC

-- Q22 (19:53) 1 row — -117 SUBSIDIARYNEXUSMAP.KNEXUS, 233100 notes, 3 records
SELECT sn.recordtypeid, sn.field, COUNT(*) AS notes, COUNT(DISTINCT sn.recordid) AS recs,
       TO_CHAR(MIN(sn.date),'YYYY-MM-DD') AS first_d, TO_CHAR(MAX(sn.date),'YYYY-MM-DD') AS last_d
FROM systemnote sn WHERE sn.context = 'SWF' AND sn.date >= TO_DATE('2026-07-01','YYYY-MM-DD')
GROUP BY sn.recordtypeid, sn.field ORDER BY COUNT(*) DESC FETCH FIRST 10 ROWS ONLY

-- Q23 (19:53) 16 rows — 3552/day 20 Aug..3 Sep (3478 on 21 Aug), 2368 on 4 Sep to 16:31; user -4
SELECT TO_CHAR(sn.date,'YYYY-MM-DD') AS d, COUNT(*) AS notes, COUNT(DISTINCT sn.recordid) AS recs,
       MIN(sn.name) AS by_min, MAX(sn.name) AS by_max
FROM systemnote sn WHERE sn.context = 'SWF' AND sn.recordtypeid = -117 AND sn.date >= TO_DATE('2026-08-20','YYYY-MM-DD')
GROUP BY TO_CHAR(sn.date,'YYYY-MM-DD') ORDER BY 1

-- Q24 (19:53) 1 row — n 1613940, first_d 2026-01-01
SELECT COUNT(*) AS n, TO_CHAR(MIN(sn.date),'YYYY-MM-DD') AS first_d
FROM systemnote sn WHERE sn.context = 'SWF' AND sn.recordtypeid = -117

-- Q25 (19:55) 3 rows — sub 1: 64 notes, 1 value; sub 2: 1152 notes, 18 values; sub 3: 1152 notes, 18 values
SELECT sn.recordid, sn.record, COUNT(*) AS notes, COUNT(DISTINCT sn.oldvalue) AS distinct_old,
       MIN(sn.oldvalue) AS sample_old, MIN(sn.newvalue) AS sample_new,
       TO_CHAR(MIN(sn.date),'YYYY-MM-DD HH24:MI') AS first_d, TO_CHAR(MAX(sn.date),'YYYY-MM-DD HH24:MI') AS last_d
FROM systemnote sn WHERE sn.context = 'SWF' AND sn.recordtypeid = -117 AND sn.date >= TO_DATE('2026-09-04','YYYY-MM-DD')
GROUP BY sn.recordid, sn.record ORDER BY sn.recordid

-- Q26 (19:55) 2 rows — 216 RELEASED runasadmin T; 316 TESTING runasadmin T islogenabled T
SELECT w.internalid, w.scriptid, w.name, w.releasestatus, w.recordtype, w.initonschedule, w.runasadmin, w.islogenabled
FROM workflow w WHERE w.recordtype = -117 AND w.isinactive = 'F' ORDER BY w.internalid

A.3 Reducers and searches

-- R1 (19:38) sqlReduce over Q1's SELECT (680 rows) — status banding
const r = rows.main;
const prov = x => x.frombundle ? ('bundle ' + x.frombundle) : 'local';
const band = x => {
  if (x.script_inactive === 'T') return 'A-script-inactive';
  if (x.isdeployed !== 'T') return 'B-undeployed';
  if (x.status === 'SCHEDULED') return 'D-scheduled-live';
  if (x.status === 'TESTING') return 'C-testing';
  return 'C-notscheduled';
};
const byBand = H.countBy(r, band);
const byStatus = H.countBy(r, x => (x.status||'NULL') + '|isdeployed=' + (x.isdeployed||'NULL'));
const byProv = H.countBy(r, prov);  const byType = H.countBy(r, 'scripttype');
const local = r.filter(x => !x.frombundle);
const live = r.filter(x => band(x) === 'D-scheduled-live').map(x => ({ /* script, dep, status, queue, pri, log, file */ }));
const bundles = H.countBy(r.filter(x=>x.frombundle), 'frombundle');
return { total:r.length, byBand, byStatus, byProv:{local:byProv.local||0, bundleOwned:r.length-(byProv.local||0),
         distinctBundles:Object.keys(bundles).length, bundles}, byType, liveCount:live.length, live, localCount:local.length };
-- Result: total 680; D-scheduled-live 28; B-undeployed 26; C-notscheduled 626; local 37; bundles 15.

-- R2 (19:41) scriptEval N/search scheduledscriptinstance, all rows (4,914), grouped per deployment:
--   n, complete, canceled, failed, first/last start, lastComplete(End), d30, d60, median/p90 duration (min).
--   Columns: scriptdeployment.internalid, scriptdeployment.scriptid, script.internalid, script.name, status,
--   startdate, enddate, datecreated, percentcomplete. runPaged pageSize 1000. Dates parsed from "M/D/YYYY h:mm am".
-- R2b (19:41) same search restricted to deployments 1188,4103,3749,3750,1197,2672,4001,2543,3164,3999,4010:
--   1188 n30; 1197 n20 (5×4 Sundays); 3749 n20; 3999 n31; 4010 n31; 4103 n31; 3750, 4001, 2672, 2543 absent.

-- R3 (19:45) scriptEval N/search, startdate onorafter 7/1/2026, per-day matrix for
--   936,4959,2482,4722,4010,3644,5344,3750,4001,2543,1986 — n, ok, fail, start hours, maxDur per day.

-- R4 (19:46) scriptEval N/search (full table), calendar 2026-08-05..2026-09-03:
var want={'936':1,'4959':1,'2482':1,'4722':1,'4010':1,'3644':1,'5344':1,'3750':1,'4001':1,'2543':1,'1986':1,'1984':1,'1988':1};
… per deployment: perDayCal (instances per expected day), missingDays, failed[], hours{}, medMin, p90Min, maxMin,
   degraded = durations > max(3*median, 5) …
-- Result: missingDays [] for 936, 4959, 2482, 4722, 4010, 3644, 1984, 1986, 1988; 5344 Mondays only (4/4);
--   3750, 4001, 2543 absent; degraded: 1986 on 2026-08-28 (52 m); failed: 1986 ×4 in Aug 2025.

-- R5 (19:47) scriptEval N/search scriptexecutionlog (692 rows, 1–4 Sep) grouped by deployment/script/level.
--   Sonar AI dep 5336 (359 Audit, 129 Error — the agent's own audit trail); PackShip UE 3097 (36 Error);
--   B360 3644 (32 Audit); FAM 4057 (15 Debug, 15 Audit); SCM 1188 (15 Debug); FAM 3999 (12); 2673 (6); 4000 (4); 4010 (3).

-- R6 (19:50) sqlReduce — business-object series
SELECT TO_CHAR(sn.date,'YYYY-MM-DD') AS d, sn.context, sn.recordtypeid, sn.field, COUNT(*) AS n, COUNT(DISTINCT sn.recordid) AS recs
FROM systemnote sn
WHERE sn.date >= TO_DATE('2026-06-24','YYYY-MM-DD') AND sn.context IN ('SCH','MPR')
GROUP BY TO_CHAR(sn.date,'YYYY-MM-DD'), sn.context, sn.recordtypeid, sn.field            -- 506 rows
const r = rows.main.map(x=>({d:String(x.d), c:String(x.context), t:String(x.recordtypeid), f:String(x.field), recs:H.num(x.recs)}));
const sig = {
  item360: x => x.c==='MPR' && x.t==='-10' && x.f==='CUSTITEM_ORDER_DELAY_COUNT',
  cash360: x => x.c==='MPR' && x.t==='2170',
  b360:    x => x.c==='MPR' && x.t==='1959' && x.f==='CUSTRECORD_B360_JOB_LAST_RUN',
  famDiag: x => x.c==='SCH' && x.t==='2107',
  famProc: x => x.t==='2117',
  license8299: x => x.c==='SCH' && x.t==='159' && x.f==='CUSTRECORD_8299_CAT_DETAILS',
  orgBrowser: x => x.t==='163',  c360: x => x.t==='2171' };
const days=[]; for(let t=new Date(Date.UTC(2026,5,24)); t<=new Date(Date.UTC(2026,8,4)); t.setUTCDate(t.getUTCDate()+1)) days.push(t.toISOString().slice(0,10));
for (const k in sig) { const m={}; r.filter(sig[k]).forEach(x=>{ m[x.d]=(m[x.d]||0)+x.recs; });
  const base = days.slice(0,42).map(d=>m[d]||0); const obsD = days.slice(42,72);
  const bs = H.stats(base); const med = bs.median;
  const flagged = obsD.filter(d=>{ const v=m[d]||0; return med>0 && v < 0.5*med; });
  out[k]={ baselineMedian:med, p25:bs.p25, p75:bs.p75, baseDaysActive, baseTotal, obsTotal, obsDaysActive, obsMedian, firstActive, lastActive, flaggedDays:flagged, obsSeries }; }
-- Result: item360 median 1 (IQR 0–2.75), obs 119 items / 15 active days, 15 flagged, series
--   0,0,0,0,2,35,1,3,0,0,0,0,4,0,2,2,1,2,0,1,4,3,0,0,0,3,0,54,2,0;
--   cash360 obs 30/30; b360 base 12 (to 17 Jul), obs 0/30; famDiag median 2, 30/30; famProc Sundays 4;
--   license8299 median 2, 30/30; orgBrowser 2 on 3 Sep; c360 6 on 3 days.
-- (A first R6 run compared recordtypeid as string vs number and returned all zeros; discarded as a coding error.)

Appendix B — Schema verification log

Every table, column, field id and record type referenced in this report, and how it was verified against the live account. Proposed identifiers in §11 are marked as such and do not exist.

IdentifierKindVerified by
scriptdeployment: primarykey, id, script, scriptid, title, status, isdeployed, queueid, priority, loglevel, executioncontexttable / columnsS1 probe; S1b catalog
scriptdeployment.recurringeventrecord fieldS6; S7 × 33
script: id, scriptid, name, scripttype, frombundle, owner, isinactive, scriptfiletable / columnsS2 probe
scheduledscriptinstance: taskid, startdate, enddate, datecreated, timestampcreated, status, percentcomplete, mapreducestage, queue, internalidtable / columnsS3 probe; S3b catalog
scheduledscriptinstance joins script.internalid / script.name / scriptdeployment.internalid / scriptdeployment.scriptidN/search joinsS8b
scriptexecutionlog (N/search type) with joins script, scriptdeployment; columns type, date, titlesearch typeR5
scriptnote: type, date (script, scriptdeployment exist but error under GROUP BY / ORDER BY)table / columnsQ9a, Q10; Q9 errors
workflow: internalid, scriptid, name, releasestatus, isinactive, initonschedule, initoncreate, initonvieworupdate, recordtype, frombundle, owner, datemodified, runasadmin, islogenabledtable / columnsS4 probe; Q2, Q26
systemnote: id, date, recordid, record, recordtypeid, field, oldvalue, newvalue, name, role, contexttable / columnsS5 probe; Q6–Q25
customrecordtype: internalid, scriptid, nametable / columnsQ13
customrecord_b360_scheduled_job; custrecord_b360_job_last_run, _last_run_status, _last_run_message, _next_run, _task_id, _frequency, _deployment_id, _job_idrecord type / fieldsS9; Q13, Q14, Q21
customrecord_c360_global_config; custrecord_cash360_conf_last_mr_runrecord type / fieldQ13; Q12, Q20
customrecord_cash360_entity_data (2171)record typeQ13
customrecord_fam_recent_diagnosis; custrecord_fam_diagnosis_scandaterecord type / fieldQ13; Q12
customrecord_fam_process; custrecord_fam_procstatus, _procstateval, _proccurrstagestatus, _procparamsrecord type / fieldsQ13; Q6, Q12
customrecord_8299_client_audit_trail; custrecord_8299_cat_detailsrecord type / fieldQ13; Q12
customrecord_ob_org_tree; custrecord_ob_org_tree_json, _listrecord type / fieldsQ13; Q12
customrecord_2663_file_admin: created, lastmodifiedtable / columnsQ15, Q16
customrecord_2663_payment_scheduletableQ17
item.custitem_order_delay_count (record type −10)fieldQ12; S10 source 15769
SUBSIDIARYNEXUSMAP.KNEXUS on record type −117 (Subsidiary)system-note fieldS5, Q22–Q25
Record type ids −418 (script deployment), −117 (subsidiary), −10 (item)recordtypeidQ6/Q8, Q22, Q12
Deployment / script internal ids and scriptids in Tables 5–6idsQ1, Q3
Workflow ids 216, 316 and scriptidsidsQ2, Q26
Employee 3894; system users −4, −5idsQ6, Q23
customscript_ste_mr_data_update (task target)scriptidS10 file 75871
customrecord_sonar_heartbeat; custrecord_hb_*; customscript_sonar_hb_monitorproposed — do not exist§11 design only

Appendix C — Assumptions

idAssumptionWhy necessaryImpact if wrongHow to verify
A1The nine C1–C9 processes are the critical setOwner delegated the choiceA truly critical process was not testedOwner reviews Table 2
A2Owners in Table 2 are placeholders by functionNo owner data exists in the accountAlerts go to nobodyFill custrecord_hb_owner at roll-out
A3Expected windows anchored on observed steady-state start, not startTimestartTime differs from observed by 0 or 4 h across deployments (S7 vs R4)A run shifting 4 h is flagged missed, or a late run is notConfirm server time zone and recurringevent zone semantics
A4Weekends and holidays not excludedNo schedule carries business-day gatingWeekend “misses” would be false positivesOwner confirms per process
A5System-note context SCH/MPR + record type identifies the writing processInstance table has no deployment column; sources restrictedWrites attributed to the wrong script when two scheduled scripts touch the same record typeHeartbeat object counts
A65 instance rows per map/reduce run = one runMR stages each produce an instance rowExpected/observed ratios off by 5×Compare taskid across rows
A7C4's “every 360 min from 16:00” producing only 16:01 and 22:01 instances is normalObserved on all 30 daysTwo missed windows per day for 30 daysSetup → Scheduled Script Status
A8A monthly/quarterly deployment with no instance in a 30-day table “missed” only if its window fell inside the tableRetentionObs. 4 over- or understatedRe-check 13/14 Sep
A9Integration inventory limited to countsOwner delegated; tokens not probedAn external caller that went quiet is not coveredrestletDiscover + token census
A10EBP data (7 future-dated batches, 0 schedules) is demo dataDates are after todayObs. 3 is a real production gapAP confirms EBP status
A11C7 writes nothing because no new roles arrivedSource restricted; described as idempotentC7 is a no-output processRead file 91219 with a role that has access
A12Workflow 216 or 316 drives the nexus rewritesOnly active scheduled workflows on Subsidiary; context SWF; run-as-adminAnother mechanism is the actorWorkflow 316 log; enable logging on 216 for one hour
A13CANCELED instances (51, no start date) are not attributableN/search omits them; SuiteQL shows null datesCancelled runs of a critical process uncountedScheduled Script Status UI

Appendix D — Scope limitations

Appendix E — Glossary

Dead-man's switch / heartbeat monitor
A monitor that expects a periodic signal and alerts when the signal does not arrive — detecting absence rather than error.
Dormant deployment
A script deployment that cannot fire again under its current configuration.
FMEA · RPN
Failure Mode and Effects Analysis; Risk Priority Number = Severity × Occurrence × Detection. Adapted here as Severity × Detectability × Impact.
Instance
A row in scheduledscriptinstance: one attempt to run a scheduled or map/reduce deployment (map/reduce runs produce one row per stage).
Missed run
An expected window with no instance. The essay's “silent failure”.
No-output run
A completed instance that changed no business objects. The brief's “zombie run”.
RAG
Red / Amber / Green status convention. In this report: red = High, amber = Medium or attention, blue (brand) = healthy.
Recorded failure
A failure that produced evidence — a FAILED/CANCELED instance or an ERROR log entry. The brief's “loud failure”.
System note
NetSuite's field-level audit trail (systemnote): who changed which field on which record, when, in which execution context.
5C
Condition · Criteria · Cause · Effect · Recommendation — the standard structure of an audit observation.

Appendix F — Source documents & design tokens

F.1 Source document 1 — the silence essay (verbatim)

Silence is a NetSuite failure mode: the scheduled script never started, so it logged no error.

Error dashboards can only describe executions that exist. A disabled deployment, broken schedule, expired credential, or missed trigger may produce no run to inspect. The absence of failures looks reassuring because the work never entered the measurement system.

Give every critical scheduled process a heartbeat. Record the expected start window, the last successful start, the last successful completion, the number of business objects processed, and the owner of a missed run.

Alert on absence, not only on exceptions. Then use a saved search to confirm that the expected invoices, fulfillments, allocations, or journals appeared in the business state.

A clean error log proves only that no recorded execution failed. It does not prove that the process ran. For unattended work, the first telemetry question is simple: did the job show up when the business expected it?

F.2 Source document 2 — Clarity Blue branding guidelines (verbatim)

Tone & Style: minimalist, modern, polished; avoid clutter; short sentences, precise wording, whitespace to guide attention.
Voice: neutral and professional, focused on clarity; present facts first, then insights.
Typography: Headlines Inter Bold or Helvetica Neue Bold 24–32pt; Subheads Inter SemiBold 18–22pt; Body Inter Regular or Helvetica Neue Regular 11–12pt, 1.6× line height; Callouts Inter Medium italic or small highlight block.
Layout & Spacing: heavy whitespace, generous margins (1.5–2 inches); single-column layout with clear section breaks; safe area for footer text (24px bottom/right).
Color Palette: Base White #FFFFFF; Text Charcoal #212121; Accent Electric Blue #007AFF used sparingly (charts, key metrics); Neutral Light Gray #EAEAEA for subtle dividers.
Charts & Graphs: simple line or bar charts with minimal gridlines; Electric Blue to highlight key trends or metrics; axes and labels Charcoal 9–10pt, no bold; avoid pie/donut charts.
Callouts & Transparency: key findings in a small highlight box (Light Gray border and background); risks/assumptions in italic text or a light-gray info box; disclaimer text 9pt Charcoal at bottom.
Branding: company name bottom-right, small (8–9pt); no logo or watermark unless requested.

F.3 Clarity Blue · Assurance extension (applied in this version)

The base palette, typography, spacing and chart rules above are unchanged. The following were added for audit communication; each is documented so the deviation is deliberate and reversible.

Token / ruleValueUsed forRationale
--ok= --accent #007AFFHealthy state in heatmap, scorecard chips, stripsKeeps “good” on brand; blue never means “decoration”
--warn#E69500 (amber)Medium rating chips; no-output cells; flagged barsRAG is the audit-reporting norm; a single accent cannot encode three states
--crit#C8102E (red)High rating chips; missed-run outlines; failure hatchAs above; used only in chips and chart cells, never text or headings
Glyph redundancy× for missed, hatch for failure, thick border for degradedHeatmap and legendColour is never the only channel (accessibility)
Figure / table captions9 pt, numberedAll figures and tablesFormal-report convention; enables cross-reference
Document control blockCoverVersion, classification, supersedes, next checkpointAssurance-report convention
Zebra rows#FAFAFATable bodiesReadability of wide tables; within the neutral family
print-color-adjust: exact—All elementsFills survive printing; charts remain legible on paper

F.4 Field notes relied upon (excerpt, verbatim)

- Script execution logs live in the `scriptnote` table (cols: script, scriptdeployment, type, date, title, detail).
- Scripts: SCRIPTLET 384, RESTLET 183, USEREVENT 181, MAPREDUCE 143, CLIENT 101, SCHEDULED 97 — mostly bundle-owned.
- Primary user Tim Dietrich (employee 158), role 3 Administrator, default subsidiary 2.
- Subsidiaries: 1 Parent Company, 2 Subsidiary 1, 3 Subsidiary 2, 4 xElim.

Disclaimer

This is a read-only, point-in-time review performed on 4 September 2026 under the Administrator role. No record, field, script, deployment, workflow or saved search was created, modified or deleted. Results are measured against the run expectations in §5, which in this engagement were delegated by the account owner and are therefore assumed. Retention limits of the instance table (about 30 days) and the script execution log (4 days) bound what could be observed. The control design in §11 is a proposal; nothing described in it has been implemented. Version 2.0 restructures and re-presents the same evidence as version 1.0; no figure has changed.