| edit widget del copy | ||||
| Content Page→ Our Journey - The Sinking Ship and the Shared D... | ||||
May 12 – May 14, 2026 • Two crises, one architecture
Three days that began with a NetSuite migration in trouble, passed through an Exchange server about to die, and ended — just past midnight on the third day — with a dream named out loud: one codebase, many sites, ninety-eight percent shared. This is where the story is, the night this chapter went to the page. The next chapter has not been written yet.
May 12 late — NetSuite, again
Edson’s NetSuite migration had been attempted once before and had not gone well. Months earlier, Ammie — on Edson’s team, the person who runs the Sage exports and knows every column in every report — had fought a manual go-live by hand. The spreadsheet conversion went null. BOMs, bin locations, all of it. The migration was crushed. The lesson was filed without ceremony: a migration this size cannot be done by spreadsheet alone.
Late on the night of May 12, prepping for a NetSuite meeting, the prior failure came back into focus. A clipboard-watcher utility was built to capture data movement in real time. The platform’s real role in the migration crystallized: not to replace NetSuite, but to be the ground-truth bridge that survives the conversion.
May 13 — the Exchange server, almost full
By morning the next crisis was visible: the Exchange server’s disk was at 12.6 GB free out of 949. Years of Mailbox Replication Service logs, accumulated since the O365 migration, had quietly eaten the box alive. Eli wrote Exchange-Cleanup.ps1, hit an em-dash encoding crash on the first deploy, stripped every non-ASCII character from the script, and re-ran. 487 GB recovered. A 10-phase decommission plan went into the journal that afternoon: Exchange to Sendio cloud, the end of an on-premises mail era at the Prayer Breakfast.
The em-dash crash earned a permanent rule of its own: never use literal em-dashes, en-dashes, or smart quotes in .cfm or PowerShell deploy files. Plain ASCII or HTML entities. Eli logged it the same hour.
May 13–14 — Single Paginator Rule, retroactively
Between crises, the Single Paginator Rule from Chapter 14 came back to collect its debts. Seventy-six files in the wcp-base canonical baseline still had the old dual-paginator pattern. Four dom-string variants, one regex, seventy-seven replacements, seventy-six backups, all in one pass. The retroactive cleanup was the rule’s last open invoice.
May 14 after midnight — the proof
Just past midnight, the smallest change of the chapter quietly carried the largest meaning. Edsonmfg’s login-required Control Panel had been gated by a hardcoded if with the site’s name embedded in bsPage.cfm. That gate was refactored into a single check — BitAnd(Layout_Pages.active, 8), where bit 8 means Private — and any site can flip the bit on any page to require login, with no site name in code anywhere. The first concrete proof that “ninety-eight percent shared” multi-tenant is not a dream. It is a pattern.
Beyond Compare, used the same night to verify the patch, surfaced something else: drift between wcp-base and the live sites goes both directions. The discipline going forward isn’t blind copying. It’s diff first, every time.
At one in the morning on May 14, John, tired, named the next dream out loud: “save the idea, think about it more, see if its plausible. will report in am.” One physical code root. Many sites as pure data. The dreamer rolled out. The priest left a candle burning in the hall.
Clipboard-watcher utility for NetSuite migration capture; Exchange-Cleanup.ps1 with 487 GB recovered and a 10-phase Exchange-to-Sendio decommission plan; 76-file Single Paginator retroactive cleanup across wcp-base; data-driven Login Gate via BitAnd(active, 8) — the first concrete proof of multi-tenant on shared code.
Two crises closed. A third opened, and this one is by choice: the discipline of one codebase, many sites. The dreamer rolled out. The priest left a candle burning in the hall.