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 | |||
|---|---|---|---|
| Version | 2.0 (restructured) | Classification | Internal — process owners and administrator |
| Supersedes | 1.0, 4 Sep 2026 19:50 | Overall assessment | Needs improvement |
| Evidence set | S1–S10 · Q1–Q26 · R1–R6 (Appendix A) | Next checkpoint | 13–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.
- 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).
- High An unattended workflow is rewriting
SUBSIDIARYNEXUSMAP.KNEXUSon three subsidiary records 3,552 times a day — 1.61 million system notes since January (obs. 7). - 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).
- 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).
- 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).
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
| # | Action | Owner | Effort | Obs. |
|---|---|---|---|---|
| 1 | Open 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 analytics | Hours | 1 |
| 2 | Identify the workflow behind the nexus rewrites (candidates 316, 216); suspend it. | Administrator | Hours | 7 |
| 3 | Create two saved searches as interim absence monitors (Cash 360 last-run stamp; B360 job status), email daily; then approve the heartbeat control design (§11). | Administrator | Minutes → project | 2, 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).
4. Methodology & definitions
Run-outcome taxonomy
| Term used | Definition | Visible to a conventional error dashboard? | Brief's term |
|---|---|---|---|
| Recorded failure | An instance exists and ended FAILED or CANCELED, or the script log holds an ERROR entry. | Yes | Loud failure |
| Missed run | An expected start window passed with no instance at all. Primary target. | No | Silent failure |
| No-output run | Instance completed, but zero (or anomalously few) business objects were produced or changed. | No | Zombie run |
| Degraded run | Completed with output, but duration or volume drifted beyond threshold from its own baseline. | No | Degraded run |
| Dormant deployment | Can never fire again: undeployed, Not Scheduled, schedule end date passed, one-time schedule consumed, owner inactive, queue disabled. | Only by inspection | Structural 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
| Element | Definition / formula | Basis |
|---|---|---|
| Review period | 2026-08-05 → 2026-09-03 inclusive, 30 days | Instance table retains ≈ 30 days (Q19) |
| Baseline period | 2026-06-24 → 2026-08-04, 42 days | Earliest system-note history for two signals; 8 weeks not available |
| Expected instances / day | From recurringevent: 24 h ÷ repeatTimeInMinutes within the start-time window, else 1; map/reduce runs emit 5 instance rows (stages) | S7; A6 |
| Missed run | Expected calendar day with 0 instances | R4 missingDays |
| Degraded run | duration > max(3 × median, 5 min). The 5-minute floor prevents 0-minute medians flagging 1-minute runs | R4 |
| No-output window | objects touched < 0.5 × baseline median, or 0 when median > 0 | R6 flaggedDays |
| Attribution | systemnote.context (SCH scheduled, MPR map/reduce, SWF workflow) × record type × field the process is known to write | Q12; indirect — A5 |
| Risk rating | FMEA-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 source | Retention observed | Rows | Exposed to SuiteQL? | Consequence | Ref. |
|---|---|---|---|---|---|
scheduledscriptinstance | ≈ 30 days (4 FAILED rows kept from Aug 2025) | 4,965 | Yes, but no script / deployment column | Attribution needs N/search joins | Q4, Q19, S3b, S8b |
scriptnote (script execution log) | 4 days | 684 | Partly — script, scriptdeployment columns error | Cannot cross-reference 30 days of runs | Q10, Q9 |
systemnote on deployments (type −418) | Since 2026-01-08 | 1,255 | Yes | Enable/disable history before January unrecoverable | Q8 |
systemnote on business records | Since 2026-01-01 at least | 1.6 M+ (SWF alone) | Yes | Primary source for business-state verification | Q11, Q24 |
scriptdeployment.recurringevent | Current state only | — | No (record field) | 33 record loads | S6, S7 |
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).
| id | Process (script id · deployment pk) | Cadence & expected window | Owner (by function) | Why critical |
|---|---|---|---|---|
| C1 | Payment Batch Processing (380 · 936) | Hourly 18:00–23:00; ≥ 6 instances/day | AP lead | Moves money |
| C2 | Cash 360 SO/PO Lead-Time Calc (3264 · 4959) | Daily 00:00–01:00 | Supply-chain analyst | Local script feeding planning |
| C3 | Item360 Item Alerts Count Update (1593 · 2482) | Twice daily 00:00 and 12:00 ± 60 min | Merchandising | Local; drives item alerts |
| C4 | STE MR Automated Data Update (3260 · 4722) | 16:00 and 22:00 daily ± 60 min | Tax / Controller | Tax-content currency |
| C5 | FAM Trigger Reset Process (3173 · 4010) | Daily 01:00–02:00 | Fixed-assets accountant | Unblocks FAM process queue |
| C6 | Benchmark 360 Job Scheduler (2687 · 3644) | Daily 16:00–17:00 | Finance analytics | Local orchestrator |
| C7 | AI Companion Role Sync Weekly (3903 · 5344) | Weekly Monday 23:00–00:00 | Employee 3894 (creator) | Access control; newest local job |
| C8 | Costed BOM Reports Purging (2887 · 3750) | Monthly, 2nd Sunday 01:00 ± 24 h | Production | Candidate missed run |
| C9 | FAM Diagnosis Scan monthly (3164 · 4001) | Monthly, 2nd Monday 03:00 ± 24 h | Fixed-assets accountant | Candidate missed run |
6. Results at a glance
| id | Process | Schedule adherence | Recorded failures | Business-state check | Status | Obs. |
|---|---|---|---|---|---|---|
| C1 | Payment Batch Processing | 30 / 30 days (182 inst.) | 0 | No input to process — 0 payment schedules | No output | 3 |
| C2 | Cash 360 lead-time calc | 30 / 30 (150) | 0 | Last-run stamp daily; 29-day gap Jun–Jul (historical) | Watch | 2 |
| C3 | Item360 alerts count | 30 / 30 (393) | 0 | 119 items touched on 15 days; volume-driven | Effective | 8 |
| C4 | STE Automated Data Update | 30 / 30 (300) | 0 | Downstream task ran 30 / 30 | Effective | 9 |
| C5 | FAM Trigger Reset | 30 / 30 (31) | 0 | FAM process footprint each Sunday (indirect) | Effective | — |
| C6 | Benchmark 360 Job Scheduler | 30 / 30 (150) | 0 (85 downstream, Jan–Jul) | 0 writes since 17 Jul | No output | 1 |
| C7 | AI Companion Role Sync | 4 / 4 Mondays | 0 | Not confirmable — source restricted, idempotent by description | Effective* | — |
| C8 | Costed BOM Reports Purging | 0 / 1 (9 Aug) | — | — | Missed run | 4 |
| C9 | FAM Diagnosis Scan monthly | 0 / 1 (10 Aug) | — | — | Missed run | 4 |
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. VERIFIED7. Inventory & dormant deployments
| Band | Rule | Count | Ref. |
|---|---|---|---|
| D — live | status='SCHEDULED' AND isdeployed='T' | 28 | R1 |
| B — dormant, undeployed | isdeployed='F' (5 still read SCHEDULED) | 26 | R1, Q3 |
| C — not scheduled (on demand / task-triggered) | status='NOTSCHEDULED', deployed | 626 | R1 |
| A — script inactive | script.isinactive='T' | 0 | R1 |
| Total Scheduled + Map/Reduce deployments — 255 SS, 425 MR; 643 bundle-owned across 15 bundles, 37 local | 680 | Q1, R1 | |
Workflows with initonschedule='T' | 2 | Q2 | |
| Queue / priority differentiation among the 28 live deployments | none — all queue 1, priority 2 | Q1 | |
The 28 live scheduled deployments
| # | Script (id) · dep pk | Provenance | Schedule (recurringevent) | 30 d inst. | Last complete | Band |
|---|---|---|---|---|---|---|
| 1 | Payment Batch Processing (380) · 936 | Bundle 533070 | Daily 18:00, every 60 min | 178 | 09-04 03:01 | Live · C1 |
| 2 | Cash 360 SO/PO Lead Time Calc (3264) · 4959 | Local | Daily 00:00 | 150 | 09-04 04:03 | Live · C2 |
| 3 | Benchmark 360 Job Scheduler (2687) · 3644 | Local | Daily 16:00 | 150 | 09-04 20:01 | Live · C6 |
| 4 | Item360 Item Alerts Count Update (1593) · 2482 | Local | Daily 00:00, every 720 min | 393 | 09-04 16:02 | Live · C3 |
| 5 | Costed BOM clean Up (2886) · 3749 | Local | Weekly Sun 14:30 | 20 | 08-30 14:32 | Live |
| 6 | Costed BOM Reports Purging (2887) · 3750 | Local | Monthly 2nd Sun 01:00 | 0 | none in retention | Live · C8 · obs. 4 |
| 7 | AI Companion Role Sync Weekly (3903) · 5344 | Local | Weekly Mon 23:00 | 4 | 09-01 03:01 | Live · C7 |
| 8 | STR Job Manager Runner SS (1238) · 4774 | Bundle 237699 | Daily 16:00, every 15 min | 948 | 09-04 20:31 | Live |
| 9 | STE MR Automated Data Update (3260) · 4722 | Bundle 237702 | Daily 16:00, every 360 min | 300 | 09-04 20:01 | Live · C4 |
| 10 | STE MR Lookup Process Delete (1188) · 1970 | Bundle 237702 | Daily 18:00 | 145 | 09-03 22:02 | Live |
| 11 | FAM Clean Up Depreciation Files (3220) · 4057 | Bundle 508242 | Daily 00:00 | 189 | 09-04 04:03 | Live |
| 12 | FAM Diagnosis Scan daily (3164) · 3999 | Bundle 508242 | Daily 03:00 | 31 | 09-04 03:01 | Live |
| 13 | FAM Diagnosis Scan weekly (3164) · 4000 | Bundle 508242 | Weekly Wed 03:00 | 4 | 09-02 07:01 | Live |
| 14 | FAM Diagnosis Scan monthly (3164) · 4001 | Bundle 508242 | Monthly 2nd Mon 03:00 | 0 | none in retention | Live · C9 · obs. 4 |
| 15 | FAM Trigger Pre-Compute (3167) · 4004 | Bundle 508242 | Weekly Sun 00:00 | 4 | 08-30 04:02 | Live |
| 16 | FAM Trigger Reports Cleanup (3162) · 3996 | Bundle 508242 | Daily 15:00 | 30 | 09-04 19:01 | Live |
| 17 | FAM Trigger Reset Process (3173) · 4010 | Bundle 508242 | Daily 01:00 | 31 | 09-04 01:31 | Live · C5 |
| 18 | ECO MR Bulk Process (468) · 1199 | Bundle 47193 | Daily 00:00 | 150 | 09-04 04:02 | Live |
| 19 | ECO Details MR Delete Orphans (467) · 1197 | Bundle 47193 | Weekly Sun 00:00 | 20 | 08-30 00:02 | Live |
| 20 | SCM Background Cleanup (459) · 1188 | Bundle 47193 | Daily 18:00 | 30 | 09-03 18:02 | Live |
| 21 | SCM CPN Cleaner (458) · 2543 | Bundle 47193 | Monthly day 3 18:00 — endDate 04/03/2016 | 0 | none | Dormant obs. 5 |
| 22 | Org Browser Tree Generator (328) · 492 | Bundle 112469 | Daily 00:00 | 30 | 09-04 04:01 | Live |
| 23 | Request License SS (311) · 4103 | Bundle 116144 | Daily 04:30 | 31 | 09-04 04:31 | Live |
| 24 | Mobile – Remove Logs (1953) · 2673 | Bundle 534299 | Daily 00:00 | 30 | 09-04 04:01 | Live |
| 25 | Mobile – ELK Logging (1958) · 2679 | Bundle 534299 | Weekly Sun 17:30 | 4 | 08-30 21:32 | Live |
| 26 | Mobile – ELK Logs Cleanup (1952) · 2672 | Bundle 534299 | Every 3 months, 1st Sat 22:00 | 0 | none in retention | Not due (A8) |
| 27 | PackShip ELK Metrics (2122) · 3139 | Bundle 534418 | Weekly Sun 18:30 | 4 | 08-30 22:32 | Live |
| 28 | Mfg Mobile Usage Metrics (3016) · 3793 | Bundle 534953 | Weekly Sun 05:30 | 4 | 08-30 09:32 | Live |
startTime. VERIFIEDDormant deployments
| Deployment (pk) | Script | Rule triggered | Change history | Ref. |
|---|---|---|---|---|
| customdeploy_scm_cpn_ss_cleaner (2543) | SCM CPN Cleaner SS (458) | End date 04/03/2016 passed; status still SCHEDULED; 0 instances | none | S7z, R2b |
| customdeploy_print_delete_files_sheduler (2700) | Print – Delete Print Files Scheduler (1969) | isdeployed=F, status SCHEDULED | none | Q3, S7ac |
| customdeploy_print_mr_fileaccess_cleanup (2742) | Print – File Access Clean up (2011) | isdeployed=F, status SCHEDULED | none | Q3, S7ad |
| customdeploy_print_list_sync_sheduler (2692) | Print – Print List Sync Scheduler (1966) | isdeployed=F, status SCHEDULED | none | Q3, S7ae |
| customdeploy_print_mr_statussync (2747) | Print Status Sync (2016) | isdeployed=F, status SCHEDULED | none | Q3, S7af |
| customdeploy_shipcentral_pkgdtlcreation (3304) | ShipCentral – Package Details Creation (2179) | isdeployed=F, status SCHEDULED | none | Q3, S7ag |
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.
| # | Observation | Rating | RPN | Class | Process | Ref. |
|---|---|---|---|---|---|---|
| 1 | Scheduler completes daily, downstream job silent since 17 Jul after 85 failures | High | 3×3×2 = 18 | No-output + hidden recorded failures | C6 | R4, R6, Q14, Q21, S9 |
| 7 | Workflow rewriting subsidiary nexus 3,552×/day | High | 2×3×2 = 12 | Runaway unattended process | Workflow 216/316 | Q22–Q26 |
| 2 | 29-day gap in Cash 360 last-run stamp (Jun–Jul) | Medium | 3×3×1 = 9 | Missed runs (historical) | C2 | Q20, R6 |
| 4 | Monthly deployments: no run in August windows | Medium | 3×3×1 = 9 | Missed run ×2 | C8, C9 | R2, R2b, S7d, S7n |
| 10 | Telemetry retention too short to audit beyond 30 days | Medium | 3×3×1 = 9 | Control gap | Account | Q10, Q19, S3c |
| 3 | Payment Batch Processing runs hourly with 0 schedules | Medium | 3×2×1 = 6 | No-output by configuration | C1 | Q15–Q17, R4 |
| 5 | SCM CPN Cleaner scheduled with 2016 end date | Medium | 1×3×2 = 6 | Dormant | dep 2543 | S7z, R2b |
| 8 | Item360 flagged 15/30 days by default threshold | Low | 3×1×1 = 3 | Threshold artefact | C3 | R6 |
| 6 | Five undeployed deployments still read SCHEDULED | Low | 1×2×1 = 2 | Dormant ×5 | Print ×4, ShipCentral | Q3, S7ac–ag, Q7 |
| 9 | One 52-minute run vs 0-minute median; 4 failures Aug 2025 | Low | 2×1×1 = 2 | Degraded ×1; recorded ×4 (stale) | dep 1986 | R4, Q18 |
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 recordcustomrecord_b360_scheduled_jobin that period; the last write was 17 Jul 16:02 (R6, Q14). Retained system notes show the dispatched jobcustomdeploy_b360_mr_schedbenchmarkdatatransitioned to FAILED 85 times and COMPLETED 12 times between 1 Jan and 17 Jul, every failure carryingUNEXPECTED_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.
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.KNEXUSof 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 316customworkflow_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_runwas 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_configwherecustrecord_cash360_conf_last_mr_runis 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_scheduleand createscustomrecord_2663_file_adminbatches. 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_schedulecount 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
statusto 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).
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| Process | Signal (record type · field · context) | Baseline median / day | Observed active days / 30 | Flagged | Reading | Ref. |
|---|---|---|---|---|---|---|
| C6 Benchmark 360 | customrecord_b360_scheduled_job · custrecord_b360_job_last_run · MPR | 0 (12 writes, all 1–17 Jul) | 0 | — | No output — obs. 1 | R6, Q14 |
| C2 Cash 360 | customrecord_c360_global_config · custrecord_cash360_conf_last_mr_run · MPR | 0 (29-day gap in baseline) | 30 | 0 | Confirmed daily; plus 6 Entity (2171) updates on 3 days | R6, Q20 |
| C1 Payment Batch | customrecord_2663_file_admin created; input customrecord_2663_payment_schedule | — | 0 scheduled-context creates | — | 0 schedules; 7 future-dated batches — obs. 3 | Q15–Q17 |
| C3 Item360 | item · custitem_order_delay_count · MPR | 1 | 15 | 15 | Volume-driven — obs. 8 | R6 |
| C4 STE Auto Data Update | No records; submits task customscript_ste_mr_data_update (file 75871 L13–18) | — | 30 (downstream dep 1986) | 0 | Confirmed via downstream instances | S10, R4 |
| C5 FAM Trigger Reset | customrecord_fam_process (2117) · SCH+MPR | 0 (4 records each Sunday) | 4 | 0 | Footprint consistent with weekly FAM cycle (indirect) | R6 |
| FAM Diagnosis daily/weekly | customrecord_fam_recent_diagnosis · custrecord_fam_diagnosis_scandate · SCH | 2 (5 on Wednesdays) | 30 | 0 | Confirmed | R6 |
| Request License | customrecord_8299_client_audit_trail · custrecord_8299_cat_details · SCH | 2 | 30 | 0 | Confirmed | R6 |
| C7 AI Companion Role Sync | Idempotent CSV import per description; source restricted | — | 0 SCH writes on any type | — | Consistent with “no new roles” (A11) | S10, R6 |
Draft saved searches — independent business-state monitors (not created)
| Process | Record type | Filters | Columns | Summary | Healthy result | Cadence |
|---|---|---|---|---|---|---|
| C6 | customrecord_b360_scheduled_job | custrecord_b360_job_last_run_status is FAILED, OR custrecord_b360_job_last_run before 2 days ago | name, last run, status, next run, message | none | 0 rows | Daily 08:00 email |
| C2 | customrecord_c360_global_config | custrecord_cash360_conf_last_mr_run on or before yesterday | id, last MR run | none | 0 rows | Daily 08:00 email |
| C1 | customrecord_2663_payment_schedule | none | id | Count | > 0 if EBP in use; otherwise pause the job | Weekly |
| C3 | Item | System Notes: Field = custitem_order_delay_count; Date within last 2 days; Context = Map/Reduce | name, note date, new value | Count | ≥ 0 (informational) | Daily |
| C5 / C9 | customrecord_fam_recent_diagnosis | custrecord_fam_diagnosis_scandate = today | id, scan date | Count | ≥ 2 | Daily |
10. Management action plan
- Today — Benchmark 360. Open
customrecord_b360_scheduled_jobid 1. In use? Fix the RESTlet-session error behind 85 FAILED runs and re-run. Not in use? Setcustomdeploy_b360_mr_jobscheduler(pk 3644) to Not Scheduled. (Obs. 1) - 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) - This week — two saved searches, no code. Table 9 rows C2 and C6, emailed daily to owners. Then approve §11. (Obs. 2, 1, 10)
| # | Action | Record · field to change | Owner | Effort | Obs. | Target date | Status |
|---|---|---|---|---|---|---|---|
| 1 | Decide B360 usage; fix or unschedule | scriptdeployment 3644 · status; job record 1 · custrecord_b360_job_frequency | Finance analytics | Hours | 1 | — | Open |
| 2 | Attribute and suspend nexus-rewrite workflow | workflow 316 / 216 · releasestatus or schedule | Administrator | Hours | 7 | — | Open |
| 3 | Create interim saved-search monitors | Table 9 (C2, C6) | Administrator | Minutes | 2, 1 | — | Open |
| 4 | Confirm EBP status; unschedule or configure | scriptdeployment 936 · status | AP lead | Minutes | 3 | — | Open |
| 5 | Watch 13/14 Sep; re-save schedules if silent | scriptdeployment 3750, 4001 · recurringevent | Production; FA accountant | Minutes | 4 | 15 Sep | Open |
| 6 | Resolve six dormant deployments | scriptdeployment 2543 · end date; 2700, 2742, 2692, 2747, 3304 · isdeployed / status | Administrator | Minutes | 5, 6 | — | Open |
| 7 | Approve and build heartbeat control | §11 | Administrator | Project | 10, all | — | Proposed |
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
- Alert on absence, not only on exceptions.
- Independent of the monitored script's own logging (retained 4 days here).
- Verifiable by a human without the agent: a saved search over a custom record.
- The heartbeat must never break the job it monitors.
11.1 Custom record customrecord_sonar_heartbeat — one row per critical process
| Field id | Type | Purpose |
|---|---|---|
name | Text | Process label |
custrecord_hb_deployment | Text | Deployment scriptid, e.g. customdeploy_cash360_mr_so_po_calc |
custrecord_hb_cadence | List: HOURLY / DAILY / WEEKLY / MONTHLY | From Table 2 |
custrecord_hb_window_start / _window_end | Time of day | Expected start window |
custrecord_hb_days_mask | Text, 7 chars | Days of week expected, e.g. 1111111 |
custrecord_hb_last_start | Date/Time | Set by START heartbeat |
custrecord_hb_last_complete | Date/Time | Set by COMPLETE heartbeat |
custrecord_hb_last_objects | Integer | Objects processed on last run — 0 is a valid, visible value |
custrecord_hb_min_objects | Integer | No-output threshold; blank = no volume expectation |
custrecord_hb_owner / custrecord_hb_escalation | Employee | Owner of a missed run; escalation |
custrecord_hb_muted_until | Date | Planned outage — suppress alerts |
custrecord_hb_last_alert | Date/Time | Debounce: one alert per missed window |
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
- Load heartbeat rows where
custrecord_hb_muted_untilis empty or past. - Compute the most recent expected window from cadence, days mask and window start/end.
- Window end passed and
last_start< window start → MISSED.last_startset,last_complete<last_start, now > window end + grace → HUNG.last_objects<min_objects→ NO OUTPUT. - Debounce on
custrecord_hb_last_alert; email owner, cc escalation; log AUDIT. - 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_startolder 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
- Roll-out: (1) create record type and nine rows from Table 2; (2) deploy the monitor alerting the administrator only; (3) instrument the four local scripts (C2, C3, C6, C7); (4) after two clean weeks, switch recipients to owners; (5) add the saved-search layer.
- Test plan: set a row's window to a past time → MISSED within 30 min; stamp start without complete → HUNG after grace; set
min_objectsabove a known run → NO OUTPUT; setmuted_untiltomorrow → silence; disable the monitor deployment → native saved-search email within 90 min. - Rollback: set the monitor Not Scheduled; heartbeat calls become no-ops if the record type is removed (
find()returns null). No monitored job can be broken by rollback.
12. Positive assurance & next checkpoints
VERIFIED The following were tested and found operating as expected for the review period:
- All seven daily or intra-day critical deployments (C1–C6 at instance level; C7 weekly) started in every expected window: 0 missed runs, 0 recorded failures, all durations ≤ 3 min (R4).
- Business output confirmed daily for C2 (Cash 360 stamp, Q20), the FAM diagnosis scan (R6) and Request License (R6); confirmed on volume-appropriate days for C3 (R6); confirmed via downstream task instances for C4 (R4).
- Of the 28 live deployments, 24 show the instance cadence their schedule implies (Table 5); the exceptions are the two monthly deployments (obs. 4), the expired CPN Cleaner (obs. 5) and the quarterly ELK cleanup not due in the period.
- Where the script execution log overlaps the review period (1–4 Sep), log activity matches instance activity for every scheduled deployment that logs (R5).
| Date | What to check | Expected | Obs. |
|---|---|---|---|
| 13 Sep 2026 (2nd Sunday) | Instance for dep 3750 Costed BOM Reports Purging | 1 COMPLETE around 01:00 | 4 |
| 14 Sep 2026 (2nd Monday) | Instance for dep 4001 FAM Diagnosis Scan monthly | 1 COMPLETE around 03:00 | 4 |
| 7 Oct 2026 | customrecord_b360_scheduled_job id 1 next run | Status COMPLETED, message empty — if B360 retained | 1 |
| Any day | systemnote SWF rows on type −117 | 0 after the workflow is suspended | 7 |
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
| id | Probe | Result | Supports |
|---|---|---|---|
| S1 | SELECT * FROM scriptdeployment FETCH FIRST 1 ROWS ONLY (19:36) | Columns incl. primarykey, script, scriptid, status, isdeployed, queueid, priority, loglevel, title | Q1, Q3 |
| S1b | recordsCatalog getRecordTypeDetail scriptdeployment | Field list confirmed | Q1 |
| S2 | SELECT * FROM script … | id, scriptid, name, scripttype, frombundle, owner, isinactive, scriptfile | Q1 |
| S3 | SELECT * FROM scheduledscriptinstance … | taskid, startdate, enddate, datecreated, timestampcreated, status, percentcomplete, mapreducestage, queue, internalid | Q4, Q5, Q18, Q19 |
| S3b | recordsCatalog getRecordTypeDetail scheduledscriptinstance | 10 fields; no script/deployment field | Table 1 |
| S3c | SELECT ssi.script, ssi.scriptdeployment … FROM scheduledscriptinstance | Error: unexpected SuiteScript error | Table 1 |
| S4 | SELECT * FROM workflow … | internalid, scriptid, name, releasestatus, isinactive, initonschedule, recordtype, frombundle, runasadmin, islogenabled | Q2, Q26 |
| S5 | SELECT * FROM systemnote … | id, date, recordid, record, recordtypeid, field, oldvalue, newvalue, name, role, context, type | Q6–Q8, Q11–Q14, Q20–Q25, R6 |
| S6 | recordTypeDescribe scriptdeployment sampleId 5344 match “recur” | Field recurringevent (textarea, JSON) | S7 |
| S7a–ag | recordLoad 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, recurringevent | Schedules in Table 5 | Inventory, obs. 5, 6 |
| S8b | N/search scheduledscriptinstance with joins script.internalid, scriptdeployment.internalid, scriptdeployment.scriptid | Joins valid (unjoined column “script” invalid) | R2–R4 |
| S9 | recordLoad customrecord_b360_scheduled_job id 1, all fields | frequency QUARTERLY; last_run 2026-07-17T23:02:12Z COMPLETED; next_run 2026-10-07; job customscript_b360_mr_schedbenchmarkdata | Obs. 1 |
| S10 | Three read-only research subagents, 102 tool calls | Readable: 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.
| Identifier | Kind | Verified by |
|---|---|---|
| scriptdeployment: primarykey, id, script, scriptid, title, status, isdeployed, queueid, priority, loglevel, executioncontext | table / columns | S1 probe; S1b catalog |
| scriptdeployment.recurringevent | record field | S6; S7 × 33 |
| script: id, scriptid, name, scripttype, frombundle, owner, isinactive, scriptfile | table / columns | S2 probe |
| scheduledscriptinstance: taskid, startdate, enddate, datecreated, timestampcreated, status, percentcomplete, mapreducestage, queue, internalid | table / columns | S3 probe; S3b catalog |
| scheduledscriptinstance joins script.internalid / script.name / scriptdeployment.internalid / scriptdeployment.scriptid | N/search joins | S8b |
| scriptexecutionlog (N/search type) with joins script, scriptdeployment; columns type, date, title | search type | R5 |
| scriptnote: type, date (script, scriptdeployment exist but error under GROUP BY / ORDER BY) | table / columns | Q9a, Q10; Q9 errors |
| workflow: internalid, scriptid, name, releasestatus, isinactive, initonschedule, initoncreate, initonvieworupdate, recordtype, frombundle, owner, datemodified, runasadmin, islogenabled | table / columns | S4 probe; Q2, Q26 |
| systemnote: id, date, recordid, record, recordtypeid, field, oldvalue, newvalue, name, role, context | table / columns | S5 probe; Q6–Q25 |
| customrecordtype: internalid, scriptid, name | table / columns | Q13 |
| customrecord_b360_scheduled_job; custrecord_b360_job_last_run, _last_run_status, _last_run_message, _next_run, _task_id, _frequency, _deployment_id, _job_id | record type / fields | S9; Q13, Q14, Q21 |
| customrecord_c360_global_config; custrecord_cash360_conf_last_mr_run | record type / field | Q13; Q12, Q20 |
| customrecord_cash360_entity_data (2171) | record type | Q13 |
| customrecord_fam_recent_diagnosis; custrecord_fam_diagnosis_scandate | record type / field | Q13; Q12 |
| customrecord_fam_process; custrecord_fam_procstatus, _procstateval, _proccurrstagestatus, _procparams | record type / fields | Q13; Q6, Q12 |
| customrecord_8299_client_audit_trail; custrecord_8299_cat_details | record type / field | Q13; Q12 |
| customrecord_ob_org_tree; custrecord_ob_org_tree_json, _list | record type / fields | Q13; Q12 |
| customrecord_2663_file_admin: created, lastmodified | table / columns | Q15, Q16 |
| customrecord_2663_payment_schedule | table | Q17 |
| item.custitem_order_delay_count (record type −10) | field | Q12; S10 source 15769 |
| SUBSIDIARYNEXUSMAP.KNEXUS on record type −117 (Subsidiary) | system-note field | S5, Q22–Q25 |
| Record type ids −418 (script deployment), −117 (subsidiary), −10 (item) | recordtypeid | Q6/Q8, Q22, Q12 |
| Deployment / script internal ids and scriptids in Tables 5–6 | ids | Q1, Q3 |
| Workflow ids 216, 316 and scriptids | ids | Q2, Q26 |
| Employee 3894; system users −4, −5 | ids | Q6, Q23 |
| customscript_ste_mr_data_update (task target) | scriptid | S10 file 75871 |
| customrecord_sonar_heartbeat; custrecord_hb_*; customscript_sonar_hb_monitor | proposed — do not exist | §11 design only |
Appendix C — Assumptions
| id | Assumption | Why necessary | Impact if wrong | How to verify |
|---|---|---|---|---|
| A1 | The nine C1–C9 processes are the critical set | Owner delegated the choice | A truly critical process was not tested | Owner reviews Table 2 |
| A2 | Owners in Table 2 are placeholders by function | No owner data exists in the account | Alerts go to nobody | Fill custrecord_hb_owner at roll-out |
| A3 | Expected windows anchored on observed steady-state start, not startTime | startTime 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 not | Confirm server time zone and recurringevent zone semantics |
| A4 | Weekends and holidays not excluded | No schedule carries business-day gating | Weekend “misses” would be false positives | Owner confirms per process |
| A5 | System-note context SCH/MPR + record type identifies the writing process | Instance table has no deployment column; sources restricted | Writes attributed to the wrong script when two scheduled scripts touch the same record type | Heartbeat object counts |
| A6 | 5 instance rows per map/reduce run = one run | MR stages each produce an instance row | Expected/observed ratios off by 5× | Compare taskid across rows |
| A7 | C4's “every 360 min from 16:00” producing only 16:01 and 22:01 instances is normal | Observed on all 30 days | Two missed windows per day for 30 days | Setup → Scheduled Script Status |
| A8 | A monthly/quarterly deployment with no instance in a 30-day table “missed” only if its window fell inside the table | Retention | Obs. 4 over- or understated | Re-check 13/14 Sep |
| A9 | Integration inventory limited to counts | Owner delegated; tokens not probed | An external caller that went quiet is not covered | restletDiscover + token census |
| A10 | EBP data (7 future-dated batches, 0 schedules) is demo data | Dates are after today | Obs. 3 is a real production gap | AP confirms EBP status |
| A11 | C7 writes nothing because no new roles arrived | Source restricted; described as idempotent | C7 is a no-output process | Read file 91219 with a role that has access |
| A12 | Workflow 216 or 316 drives the nexus rewrites | Only active scheduled workflows on Subsidiary; context SWF; run-as-admin | Another mechanism is the actor | Workflow 316 log; enable logging on 216 for one hour |
| A13 | CANCELED instances (51, no start date) are not attributable | N/search omits them; SuiteQL shows null dates | Cancelled runs of a critical process uncounted | Scheduled Script Status UI |
Appendix D — Scope limitations
- Instance table retention ≈ 30 days. 4,368 rows Aug 2026, 544 Sep 2026, 4 FAILED rows Aug 2025, 51 CANCELED with no dates (Q19, Q18). Nothing before 5 Aug 2026 is observable at the instance level.
- Script execution log retention 4 days (684 rows, 1–4 Sep; Q10). The instance × log cross-classification was possible only for 1–4 Sep (R5). 129 of the 161 ERROR rows are this agent's own tool-error audit entries.
- No
script/scriptdeploymentcolumn onscheduledscriptinstancein SuiteQL (S3b; S3c errors). Attribution via N/search joins (S8b). scriptnote.scriptand.scriptdeploymenterror in SuiteQL today (Q9). N/search onscriptexecutionlogused instead (R5).- Deployment schedule is the
recurringeventJSON on the record, not a SuiteQL column; next scheduled run is not exposed (S6, S7). - System notes for deployments start 2026-01-08 and exist for 2 of 33 scheduled deployments (Q7, Q8).
- Source access: files 89907, 24931, 24958, 91219, 25732 returned “You do not have access to the media item” to the Administrator role (S10). Only 4063 (EBP), 75871 (STE) and 15770/15769 (Item360) were readable.
- Workflow frequency is not on the
workflowtable (Q2). - Baseline 6 weeks, not 8: no system-note history before 24 June for the Cash 360 and Item360 signals.
- Amount-based backlog was not meaningful: no critical process creates transactions.
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 / rule | Value | Used for | Rationale |
|---|---|---|---|
--ok | = --accent #007AFF | Healthy state in heatmap, scorecard chips, strips | Keeps “good” on brand; blue never means “decoration” |
--warn | #E69500 (amber) | Medium rating chips; no-output cells; flagged bars | RAG is the audit-reporting norm; a single accent cannot encode three states |
--crit | #C8102E (red) | High rating chips; missed-run outlines; failure hatch | As above; used only in chips and chart cells, never text or headings |
| Glyph redundancy | × for missed, hatch for failure, thick border for degraded | Heatmap and legend | Colour is never the only channel (accessibility) |
| Figure / table captions | 9 pt, numbered | All figures and tables | Formal-report convention; enables cross-reference |
| Document control block | Cover | Version, classification, supersedes, next checkpoint | Assurance-report convention |
| Zebra rows | #FAFAFA | Table bodies | Readability of wide tables; within the neutral family |
print-color-adjust: exact | — | All elements | Fills 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.