ConnectIQ Internal · phase 2 & deferred · WIP
Document
Phase 2 & deferred
Status
WIP · scoped, not planned
Scope
Deployment domain · S1–S5
Owner
Platform

Phase 2 · deployment domain · the parking lot

Everything after cutover. And everything phase 1 chose not to carry.

Work in progress — this page is scoped, not planned. It holds shape and dependency order, not milestones, estimates or exit gates. Nothing here is committed to and nothing here is binding on a build session.

It exists so the delivery plan can be read as what it actually is: a phase 1 document. Phase 1 replaces HubSpot and builds the CRM. Everything that depends on deployment data, and everything cut from phase 1 for scope rather than for principle, lives here instead of cluttering that plan with work nobody has agreed to do.

This is also the parking lot. When something is deferred out of phase 1, it lands in §04 with the reason attached. A deferred feature with no written reason comes back six months later as an argument.

This page WIP
  • §02 what phase 2 owns
  • §03 S1–S5, dependency order
  • §04 parked — with reasons
  • §05 five open decisions
Not here §
  • Dates none exist yet
  • Exit gates written when planned
  • Phase 1 on the delivery plan
Phase 2 · Absorb operations — take on the deployment domain and absorb Airtable table by table. Begins after phase 1 cutover unless DR-35 says otherwise. Exit — Airtable holds nothing that is not also, and authoritatively, in ConnectIQ.

01 · Why separate

A plan and a parking lot are different documents

Phase 2 used to be two sections at the back of the delivery plan. That was fine while it was a sketch nobody read. It stopped being fine once the plan started being used to run build sessions: a prompt-driven session that scrolls past unbuilt work tends to build some of it.

Two things now live here that were previously mixed into a phase 1 document.

The deployment domain

  • Real work, deliberately later. It depends on data phase 1 does not own — objects, placements, jobs, units.
  • Ordered by dependency in §03, because that order is already knowable even though the dates are not.
  • Five decisions in §05 that only bite after cutover, and are cheap to leave open until then.

The parking lot

  • Features cut from phase 1, each with the reason it was cut and what would bring it back.
  • Not a wish list. If an item has no stated trigger, it is not parked — it is rejected, and should say so.
  • Add to §04 whenever something leaves phase 1 scope. That is the point of the page.
The rule this page runs on

Nothing on this page is binding. The architecture is binding on structure and the delivery plan is binding on phase 1 scope. This page records intent and reasons. When a stage here is planned properly it gets its own numbered document and stops living in a list.

02 · Scope

What comes back off the deferred list

Almost everything phase 1 deferred was deferred for the same reason: it depends on deployment data that phase 1 does not own. Phase 2 is the phase that owns it, so the list resolves in one move rather than piecemeal.

In phase 2

  • The ConnectIQ object — the persistent, location-anchored record the object model proposes, that jobs act on rather than hang off.
  • Jobs, tasks and scheduling, plus field-service partners and workers.
  • Inventory — units, resources, stock locations, movements, scans, delivery notes.
  • Placements — what is installed where, over dated periods, and the history of how it got there.
  • Support — tickets, SLA, out-of-service items, compensation.
  • Device health — status, heartbeat, uptime alerts.
  • Handover — a signed quote becomes execution-ready scope: BOM, readiness checklist, job creation. Fully specified already by the conceptual model.
  • Deployment plan views off a quote, and the per-location rollout screens.
  • Forecast: location rollout and subscription units — both blocked on this data.
  • Migration of the Airtable operational tables, per table, as each domain takes ownership.

Still out, and for its own reasons

  • Calendar sync — a CRM concern, not a deployment one. If it is wanted, it belongs in phase 1 as its own milestone, not parked here. Inbox sync no longer sits here at all: DR-31 answered not optional, and it is now M7 on the phase 1 plan, shipping before cutover. DR-31.
  • Customer-facing portal — plausible once deployment data exists, but a separate product decision with its own access model.
  • E-signature integration.
  • Activity analytics.
  • Finance and billing — invoicing, Xero. An unassigned domain in the architecture, and not obviously phase 2's. DR-37.
The one thing phase 1 owes phase 2

Quote lines carry a location from the start. A quote line that represents a deployable system is the thing a future ConnectIQ object is born from. Phase 1 writes that column and nothing reads it — it is the single cheapest piece of forward compatibility available, and retrofitting it after a migration means reconstructing intent from history.

DR-01 made that obligation cheaper, not harder

While locations were an Airtable mirror, a quote line pointing at one was a cross-prefix reference into a table a nightly sweep could mark absent — and the object's immutable cl_location_id made that worse, not better. With locations settled as cl_ master data owned by ConnectIQ, the quote-line location is an ordinary foreign key into owned data, and the object anchors to something that cannot vanish. The forward-compatibility argument survived the decision; the risk attached to it did not.

03 · Shape

The order the dependencies force

Not milestones — stages, in the only order their dependencies allow. Each is a candidate for its own numbered plan when this phase is written up properly.

S1
Foundation

The object and its placements

The inv_ domain and the persistent object the whole phase hangs off. Nothing else can be modelled until what-is-installed-where has a home. The only stage that could safely start before cutover, if there is pressure to overlap.

  • The object with an immutable location, and its quote line as origin and audit only — no query ever walks through the quote to find where an object lives.
  • Lifecycle: pending install → active → suspended → decommissioned, plus cancelled for deals that die after signature. An object with no hardware is a valid state, not a data error.
  • Fan-out per quote line: one site one system, one site two systems, or several sites — one object each.
  • Units carrying owned_by — company or customer, which changes the rules around a placement without changing its mechanics.
  • Placements as dated periods, one open per unit, stamped with the job that caused the change. Retired units keep their rows — that history is what a warranty claim needs.

Blocked on · DR-10 · DR-12 · DR-35 · DR-41

ExitEvery unit Airtable knows about exists in ConnectIQ, anchored to a location, with its placement history intact.
S2
Execution

Jobs and scheduling

The ops_ domain. Jobs act on objects from S1, so this cannot precede it. Field-service partners and workers land here.

  • Jobs, tasks, schedule log, maintenance packages and cycles.
  • The open question S1 hands over: if one site visit routinely commissions more than one object, a plain job-to-object link will not hold it. Do not resolve it until you know how often that actually happens.
  • A maintenance job does not create or redefine anything — it references the existing object, like any other work against it.
ExitA job is raised, scheduled, worked and closed in ConnectIQ, against a real object.
S3
Handover

Quote to deployment

The plan_ domain — the bridge phase 1 deliberately left unbuilt, and the piece the conceptual model has already specified in full.

  • Readiness states: incomplete → ready → handed over, irreversible.
  • No handover until every sold unit is assigned to a location. The completeness contract between sales and operations.
  • Handover assignments as a frozen snapshot — operations must see what was agreed, not what a later edit says. After handover the location plan is permanently immutable.
  • The prepare-for-deployment screen, including copy-assignments-from-previous-location — the convenience that reveals most sites receive an identical package.
  • BOM, readiness checklist, and the jobs that fulfil it.
  • The two statuses phase 1 refused to write finally get a real writer.

Blocked on · DR-11 · DR-12

ExitA signed quote creates its own deployment without anyone re-keying it.
S4
Service

Support and device health

The sup_ and mon_ domains. Both attach to objects and locations, so both follow S1. Device health is separable and could run in parallel.

  • Tickets attach to a location, and optionally an object — a customer can report a problem at a site before anything is installed there.
  • Inventory knows a serial is a device; monitoring knows whether it is healthy. Two domains, one read projection between them.
ExitA ticket is raised against a known unit at a known site, and an unhealthy device is visible before a customer reports it.
S5
Release

Airtable retirement

Per-table, not big-bang. Each table is migrated as its domain takes ownership, using the same freeze–reconcile–flip sequence as the HubSpot cutover.

  • Load → validate → freeze → reconcile → flip → turn the table off at source.
  • UUID stability across load runs — the highest-risk detail in the migration.
  • Idempotent upsert keyed on external id, never on name or email.
  • A stated rollback before every flip.

Blocked on · DR-36

ExitAirtable holds nothing that is not also, and authoritatively, in ConnectIQ.
S5 got bigger when phase 1 dropped the sync

This stage used to read "each mirror is retired as its domain takes ownership" — because phase 1 was going to build an Airtable read sync and leave a warm copy of every operational table sitting in ConnectIQ. It is not, and there will be no mirrors. Every table S5 touches is migrated cold, straight from the Airtable API, with no prior reconciliation to lean on. That is a real cost of the phase 1 simplification and it is paid here.

Why this is harder than phase 1

HubSpot had a clean boundary, a well-understood export and a data model that mapped almost one-to-one onto Accounts. Airtable has none of those things: it is load-bearing for daily operations, its schema has grown by accretion, and it is being used while it is being replaced. Expect the per-table retirement in S5 to take longer than the whole of M7 did.

04 · Parked

Deferred out of phase 1, with the reason attached

Each entry states what was cut, why, and what would bring it back. An item with no trigger is not deferred, it is declined — and should be written as declined so nobody re-litigates it.

The Airtable read synccut by DR-01

Phase 1 was to pull a defined set of Airtable tables into int_*_mirror read copies — 15-minute incremental, nightly full reconcile, soft deletes via absent_since, stale-data banners, two-failure alerting. The whole pipeline is cut. Once DR-01 moved locations into ConnectIQ, its only remaining payload was a display-only view of jobs and installed objects, which is not required for phase 1's stated goal — a sales team can run a full week without opening HubSpot. The goal names HubSpot, not Airtable.

Brings it back: a phase 1 screen that genuinely cannot be used without live operational data. Watch for it during M3 and M5. If one appears, the pipeline is a milestone of its own and phase 1 gets longer — it does not get bolted onto whichever milestone noticed.

The display-only jobs and objects viewcut with the sync

A read-only window in ConnectIQ onto what Airtable knows about jobs and installed kit. Nice, and not load-bearing. Without the sync there is nothing to render.

Accepted cost, state it plainly: through the whole of phase 1, a rep who wants to know what is installed at a site opens Airtable. Brings it back: S1, which builds the real thing rather than a mirror of somebody else's.

Handover screensDR-11

Deferred to S3 by precedence, but only the screen. Phase 1 still ships the line-to-location assignment table and its constraint in M5 — that part is not parked, and S3 depends on it existing.

Calendar syncDR-31

Inbox sync has left this list. It was assumed optional for phase 1 — a compose link and an outbound record only — and named here as the most likely cause of a rep saying the new system is worse than the old one. Sales said no, so the trigger fired: DR-31 answered not optional, and connected email is now M7 on the phase 1 plan, shipping before cutover — exactly the outcome this entry described. Calendar sync stays parked. Brings it back: meetings needing to appear on a record without anyone typing them in.

Customer-facing portalno trigger yet

Plausible once deployment data exists. A separate product decision with its own access model, and the architecture already forbids it reading a raw domain table under any circumstance. Brings it back: a customer asking, and someone owning the access model.

E-signature integrationDR-33

Phase 1 defines a signed quote as a status change made by a person, with a signed date and an attachment. That definition is what the whole DR-02 cascade fires off. An integration replaces the trigger, not the cascade.

Activity analyticsafter DR-15

Reporting over the activity timeline. Cannot be scoped until DR-15 says which domain owns activities and whether the four-way link survives intact.

Finance and billingDR-37

Invoicing and Xero. An unassigned domain in the architecture, claimed by neither phase. Do not let phase 2 absorb it quietly — if subscriptions are expected to produce invoices, that is a third phase or a phase 1 extension.

05 · Decisions

Five that only bite after cutover

These continue the register in §19 of the delivery plan and keep their original numbers — the series is global, not per-document. They moved here because none of them blocks a phase 1 milestone, and leaving them in a phase 1 register made six blockers look like thirty.

These five are deliberately thinner than the phase 1 entries. That register now carries a recommended answer on every open row; these do not, because recommending an answer to a question this phase has not yet gathered evidence for is how a scoped phase turns into a planned one by accident. DR-12 and DR-41 in particular want a measurement, not an argument — how often a site actually receives more than one system.

Phase 2 · deployment domain

DR-12 · What creates the object

The object model says quote confirmation, so the install job is born with a target rather than floating and being retro-linked. The conceptual model's gate is handover, because objects fan out per quote line and a line's location assignments are not complete until readiness. Both arguments are good and point at different events.

Decide with DR-41 — what creates an object and how many it creates are one conversation. Listed before S1 rather than before M5, because M5 only has to name the events, not consume them.

Needs · Sky + operations · before S1

DR-41 · The object grain

The two documents disagree, and the CRM lacks the concept that would settle it. The object model says each quote line "names a location and a system" and instantiates one object. The conceptual model says a line is assigned across any number of locations with a quantity each — fifty players over thirty sites is one line, thirty assignments. So objects are counted from the assignment, not the line.

What one assignment yields is the open part: one object per site, one per assignment, or one per system per site. The last is what the object model intends — a site can hold a monitoring system and an access-control system — but nothing in a quote line says which product anchors a system. Closing it that way needs a flag on the catalogue.

Safe to defer — the assignment table M5 builds supports all three answers, and the catalogue flag is a one-column migration if it is ever wanted. Both this and DR-12 want the same evidence: how often a site actually receives more than one system.

Needs · Sky + operations · before S1

DR-35 · Does phase 2 start before phase 1 has settled, or strictly after?

Assumed: strictly after cutover. Running them concurrently means building the deployment domain against a CRM whose schema is still moving, and splitting a small team across two migrations at once. If there is pressure to overlap, S1 is the only stage that could safely start early.

Needs · Sky · before phase 2 is planned

DR-36 · Is Airtable retired table by table, or kept indefinitely for some tables?

Assumed: retired entirely, per table, over the course of phase 2. A permanent partial Airtable is a legitimate alternative — some operational tables may never be worth rebuilding — but it is a different phase 2 and should be chosen deliberately rather than arrived at by running out of appetite.

Weightier since DR-01. Phase 1 now builds no Airtable integration at all, so "keep some tables indefinitely" no longer means "keep the mirrors running" — it means a permanent second system with no connection to the first.

Needs · operations + Sky · before S5

DR-37 · Who owns finance and billing?

Assumed: nobody yet. Invoicing and Xero are an unassigned domain in the architecture, and neither phase claims them. If subscriptions are expected to produce invoices, that is a third phase or a phase 1 extension — not something phase 2 absorbs quietly.

Needs · finance + Sky · unscheduled

Still on the delivery plan, despite sounding like phase 2

DR-10 (what a subscription hangs off) and DR-11 (handover — phase 1 or phase 2) stay in the phase 1 register. Both are decided during phase 1 even though they are felt in phase 2: DR-10 decides whether a nullable anchor column ships in M6 or is backfilled in S1, and DR-11 has already been answered for the part that matters — the assignment table ships in M5, only the screen is deferred.

06 · Build prompts

Six files, and the same standing context

These are the S-prompts, in phase-2/prompts/. They are deliberately thinner than the M-prompts — the phase is scoped, not planned, and a prompt that pretends otherwise invents detail nobody agreed. Read S0 before any of the others.

Do not run these during phase 1

Unless DR-35 has been answered to allow an overlap — and even then, S1 is the only stage that could safely start early. Building the deployment domain against a CRM whose schema is still moving is how both phases get slower.

Copy with context gives you the standing context and the stage in one paste — that is what you want in a fresh session. Show displays the file inline. The standing context is shared with phase 1 and lives at crm/prompts/00-standing-context.md.
S0 Phase 2 note Read before the S-prompts. What phase 1 owed and must have delivered, the governing rule, and what is open across the phase.
S1 Object & placements The persistent object, its immutable location, and placements as dated periods.
S2 Jobs & scheduling The ops_ domain, acting on objects rather than owning them.
S3 Quote to deployment The plan_ domain — the bridge phase 1 deliberately left unbuilt.
S4 Support & device health Tickets against a location, optionally an object. Device health separable.
S5 Airtable retirement Per-table freeze–reconcile–flip. No mirrors to lean on — every table migrates cold.
Before any of these are run properly

This phase gets planned first. 1. Answer DR-35 — it decides whether phase 2 exists yet. 2. Answer DR-12 and DR-41 together, with evidence rather than argument. 3. Give each stage its own document, with exit criteria, the way M1–M8 have. 4. Until then these prompts scope work; they do not authorise it.