Operating Procedures

← Back to Operating Procedures compass-management.md

Operating Procedures

Operating procedures define HOW to operate what was built. They are distinct from other planning documents:

Document Type Answers Created When Updated When
5P Plan Why are we building this? Before work starts Scope changes
PRD What exactly should be built? After 5P approved Requirements change
Operating Procedure How does the built system run? What is verified? After deployment Every time verification status changes

Verification markers:

  • VERIFIED — tested and confirmed working in production (date + evidence required)
  • UNTESTED — code exists and builds, but has never executed in production with real data
  • ASSUMED — believed to work based on code reading, not execution
  • BLOCKED — known issue prevents this step from working
  • NOT BUILT — designed or referenced, but implementation does not exist

Compass Management Operating Procedure

Process: Compass artifact build, deployment, freshness, and lifecycle management Owner: Showcase (builds), Pavilion (freshness + state), Q (this SOP, quality gates definition) Platform: packages/compass-template/, scripts/compass/, apps/portal/public/{slug}/compass/ Last Verified: 2026-04-23 Verification score: 63% (29/46 scoreable steps) — Partially Verified tier. See Section 14.


1. Purpose

A Compass is a templated, canonical-sourced, multi-page SPA rendered per client at clients.valuefirstteam.com/{slug}/compass/. It replaces hand-crafted client walkthroughs with an artifact sourced from HubSpot, the Content Vault, and Upstash — not from synthesis files (synthesis-not-evidence rule applies). It provides a navigable record of the VFT-client relationship.

What this SOP covers: Adding a new compass, running the orchestrator, change detection, quality gates, freshness checking, post-session automation, meeting-prep integration, deploy flow, migration from walkthroughs, failure recovery, and ownership.

What this SOP does NOT cover:

  • The VIP Portal container (apps/portal/ Astro app) — Ryan's territory, unchanged
  • Walkthrough builds (scripts/build-client-walkthroughs.mjs, /walkthrough command)
  • The @vf/compass-template package internals (Showcase owns)

2. Architecture Overview

Verification: 7/7 VERIFIED — these components exist on disk as of 2026-04-23.

Component Path Owner Status
Shared package packages/compass-template/ Showcase VERIFIED 2026-04-23 — directory and package.json exist
Orchestrator scripts/compass/build-all.mjs Showcase VERIFIED 2026-04-23 — file exists, 7 design properties documented in source
Manifest scripts/compass/manifest.json Showcase VERIFIED 2026-04-23 — parsed; one entry (vf-team) confirmed
Quality gates scripts/compass/quality-gates.sh Q VERIFIED 2026-04-23 — file exists; G1-G8 defined in source header
Freshness checker scripts/compass/check-freshness.js Pavilion VERIFIED 2026-04-23 — file exists; invoked by /meeting-prep
Data extractor scripts/compass/extract-data.js Showcase VERIFIED 2026-04-23 — file exists; produces typed data files with // Sources: headers confirmed in state file
State seeder scripts/compass/seed-state.js Showcase VERIFIED 2026-04-23 — file exists in scripts/compass/

Pipeline components and conventions:

  • State file: clients/{slug}/.compass-state.json (v2 schema). Source of truth for freshness, deploy metadata, per-page digests, and quality gate results. Schema: scripts/compass/compass-state-schema.json.
  • Output: apps/portal/public/{slug}/compass/ — distinct from walkthrough output at /{slug}/portal/.
  • Gitignore: apps/portal/public/*/compass/assets/ — mirrors walkthrough pattern for hashed bundles.
  • Package name convention: {slug}-compass in the manifest pkgName field.
  • Source convention: clients/{slug}/apps/{slug}-compass/ — pnpm workspace member.
  • Engagement type: Defined in manifest.json under engagementType, mirrors config.yaml. Drives extraction selection in scripts/compass/page-data-sources.js.

Current live compasses (2026-04-23): 1 — vf-team. All other clients remain as walkthroughs pending migration.


3. Adding a New Compass

Precondition: Client has clients/{slug}/config.yaml with vf_hubspot.company_id. Client source app exists at clients/{slug}/apps/{slug}-compass/ as a pnpm workspace member.

ADD-1: Create the source app

What: Scaffold a new compass SPA from @vf/compass-template. The source lives at clients/{slug}/apps/{slug}-compass/ with a package.json that names the package {slug}-compass and lists @vf/compass-template as a dependency. Who: Showcase Status: ASSUMED — The vf-team compass exists and is live (VERIFIED). The scaffold pattern from @vf/compass-template for subsequent clients has not been executed. Reasoning: the package is a pnpm workspace member and follows standard Vite SPA conventions; this should work the same for any client. What would verify: scaffold a second client compass and confirm it builds.

ADD-2: Add entry to manifest

What: Append an entry to scripts/compass/manifest.json:

{
  "slug": "{slug}",
  "pkgName": "{slug}-compass",
  "sourceDir": "clients/{slug}/apps/{slug}-compass",
  "deployTarget": "apps/portal/public/{slug}/compass",
  "stateFile": "clients/{slug}/.compass-state.json",
  "engagementType": "{type}"
}

Who: Showcase Status: VERIFIED 2026-04-23 — vf-team entry is in production manifest with all these fields. Pattern is confirmed.

ADD-3: Seed the state file

What: Run node scripts/compass/seed-state.js {slug} to create the initial clients/{slug}/.compass-state.json (v2 schema). Without this, the orchestrator will fail to find the state file. Who: Showcase Status: UNTESTEDseed-state.js exists (confirmed in scripts/compass/ ls). The vf-team state file exists and contains v2 schema with all expected keys. Whether seed-state.js generates the correct v2 schema from scratch has not been executed for a second client. The manifest comment instructs running it before first build. Failure handling: If state file is missing on first orchestrator run, orchestrator will create a partial state file. Run seed-state.js first to ensure v2 schema completeness.

ADD-4: Verify HubSpot credentials and company ID

What: Confirm node scripts/hubspot/api.js account returns portal 40810431 and grep "company_id" clients/{slug}/config.yaml returns a non-empty value. Who: Showcase (or any agent) Status: VERIFIED 2026-04-23 — standard VFT HubSpot connectivity. Confirmed working for vf-team extraction (state file shows companyId: "49241304942" with real query timestamps).

ADD-5: Run first build

What: node scripts/compass/build-all.mjs {slug}. The orchestrator extracts data, builds the SPA, runs quality gates, and deploys to apps/portal/public/{slug}/compass/. Who: Showcase Status: ASSUMED — vf-team first build was VERIFIED (state file records build.lastRunAt: "2026-04-23T10:20:31.517Z", gatesPassed: true, outcome: "built"). Subsequent client builds follow the same orchestrator path. Risk: client HubSpot data sparseness could cause gate failures. Validate data completeness (ADD-4) before building.

ADD-6: Commit output and push

What: Commit the new source app and state file. The built output in apps/portal/public/{slug}/compass/assets/ is gitignored; only index.html and non-hashed assets are committed or served via Vercel. Who: Showcase Status: ASSUMED — Standard git commit pattern. Gitignore behavior mirrors walkthrough convention. No evidence that a second client's compass has been committed.


4. Running the Orchestrator

Precondition: Client exists in scripts/compass/manifest.json. State file seeded.

ORCH-1: Invocation modes

What: The orchestrator supports three invocation modes:

node scripts/compass/build-all.mjs              # Build all compasses in manifest
node scripts/compass/build-all.mjs {slug}       # Build one compass by slug
node scripts/compass/build-all.mjs --force      # Rebuild all, ignore change detection
node scripts/compass/build-all.mjs {slug} --force  # Force-rebuild one

Who: Orchestrator (build-all.mjs) — invoked by Vercel buildCommand, /compass command (via Showcase), or /post-session Step 7.5 (via Showcase) Status: VERIFIED 2026-04-23 — all four modes are documented in the orchestrator source header and match the vercel.json buildCommand usage (node scripts/compass/build-all.mjs no arguments).

ORCH-2: Expected orchestrator output

What: Successful run prints per-entry logs (extract, build, gates, deploy), writes state file, and exits 0. A skipped (unchanged) compass prints skip reason and exits 0. A failed entry prints the gate failure report but exits 0 (per design property 5 — top-level exit 0 on per-entry failures). Who: Orchestrator Status: VERIFIED 2026-04-23 — state file shows build.outcome: "built", build.gatesPassed: true, build.buildDurationMs: 15998. The exit-0 on per-entry failure is documented in source and was the design lesson from the 2026-04-22 cascade incident.

ORCH-3: Reading orchestrator logs

What: Orchestrator logs are written to stdout. On Vercel, these appear in the deployment build log. Locally, they print to terminal. Key indicators: [compass] skipping {slug} — inputs unchanged (change detection skip), [compass] {slug} gate failure (gate blocked deploy), [compass] {slug} built in {ms}ms (success). Who: Any agent reading logs Status: ASSUMED — Log format is inferred from the orchestrator source code patterns. Specific log strings have not been captured from a live run. Reasoning: the state file records buildDurationMs and outcome, which are set by the orchestrator, confirming it ran to completion.


5. Change Detection and Skip Behavior

CD-1: Input hashing

What: The orchestrator computes a hash of inputs (source files, data extraction outputs, template version) and compares it to the build.inputHash in the state file. If the hash matches, the compass is skipped. Who: Orchestrator (build-all.mjs) Status: VERIFIED 2026-04-23 — state file contains build.inputHash: "7f8012eb8394acc5" written by a confirmed build run. The hashing mechanic is described in the orchestrator source as "Design property 1: Change detection."

CD-2: Force-rebuild override

What: --force flag bypasses change detection and rebuilds regardless of hash match. Use when source data has been updated outside the normal extraction flow, or when debugging gate failures. Who: Showcase Status: VERIFIED 2026-04-23 — --force flag is documented in orchestrator CLI comment and confirmed in the command help text. Evidence: Showcase verified skip + force behavior in one session per context brief.

CD-3: Staleness vs. input hash

What: The state file tracks TWO distinct freshness concepts: (1) build.inputHash — used by the orchestrator for change detection, (2) staleness.status — written by check-freshness.js for session drift. A compass can be staleness.status: "stale" (202 new sessions since last build) while its build.inputHash matches (because extracted data hasn't changed if extraction hasn't re-run). These are independent. Who: Pavilion (staleness), Orchestrator (input hash) Status: VERIFIED 2026-04-23 — state file confirms both fields exist independently: staleness.status: "stale" and build.inputHash are both populated with different semantics. The distinction is documented in the state file schema.


6. Quality Gate Flow

Owner: Q (gate definitions). Showcase (gate execution via orchestrator). Mirror (runtime gates G6-G7).

GATE-1: G1 — Source compliance (automated)

What: Zero synthesis file reads in the build chain. Verified by inspecting extract-data.js imports and the data files it produces. Status: VERIFIED 2026-04-23 — state file extractedFiles entries all show canonical sources (HubSpot, Content Vault). No synthesis file paths appear in source attribution headers.

GATE-2: G2 — Source attribution (automated)

What: Every data file produced by extract-data.js must have a // Sources: header. Status: VERIFIED 2026-04-23 — state file extractedFiles entries include source fields with explicit canonical source descriptions for each file. G2 enforces this at gate time.

GATE-3: G3 — Build success (automated)

What: Vite build completes (pnpm -F {pkgName} build exits 0). The gate re-verifies dist/ exists post-build. Status: VERIFIED 2026-04-23 — state file records build.outcome: "built" and gatesPassed: true. Vite build completed for vf-team.

GATE-4: G4 — Content safety (automated)

What: No forbidden language in built output. Gate scans the dist/ directory. Status: ASSUMED — Gate is defined in quality-gates.sh source. Whether the scan covers all output files (JS bundles + HTML) and which exact forbidden terms it checks has not been verified by reading gate output. Reasoning: the gate passed (state file: gatesPassed: true) so it ran without finding violations. The pass is evidence the gate executed, not that its coverage is complete.

GATE-5: G5 — Deploy path (automated)

What: dist/ directory exists and contains index.html post-build. Status: VERIFIED 2026-04-23 — ls apps/portal/public/vf-team/compass/ returns assets and index.html, confirming the deploy target is populated.

GATE-6: G6 — Navigation (runtime, requires Mirror)

What: All navigation links within the compass SPA function correctly. This gate requires a browser and cannot run in the automated pipeline. Who: Mirror Status: UNTESTED — Gate is explicitly marked requires-runtime in quality-gates.sh source comment and is skipped in automated pipeline. Mirror has not been dispatched to verify navigation on the live vf-team compass.

GATE-7: G7 — Visual consistency (runtime, requires Mirror)

What: Compass renders correctly on desktop and mobile, Tron:Ares theme applies, light/dark toggle functions. Who: Mirror Status: UNTESTED — Same as G6 — requires-runtime, skipped in automated pipeline. Mobile overflow defect tracked as HubSpot Task 108388555848 suggests G7 has surfaced a known issue but the gate itself has not been formally run.

GATE-8: G8 — Data completeness (automated)

What: Data files are non-empty for all pages in the page registry. Status: VERIFIED 2026-04-23 — state file pages section shows 5 pages (dashboard, sessions, changelog, stakeholders, roadmap) all with status: "current" and non-empty sourceDigest values, confirming data was present and complete.

Gate results in state file

What: Gate results are written atomically to clients/{slug}/.compass-state.json under build.gatesPassed. Detailed per-gate results (if any fail) appear in the orchestrator log only. Status: VERIFIED 2026-04-23 — build.gatesPassed: true confirmed in state file.


7. Freshness Checking

FRESH-1: check-freshness.js invocation

What: node scripts/compass/check-freshness.js {slug} reads the state file, queries the Content Vault for session count, computes session drift, and writes staleness block back atomically to clients/{slug}/.compass-state.json. Who: Pavilion (spawned by /meeting-prep Step 0.5) Status: VERIFIED 2026-04-23 — state file shows staleness.checkedAt: "2026-04-22T04:02:16.500Z" and staleness.reasons: ["202 new session(s) since last build"]. The script ran and wrote back to the state file.

FRESH-2: Staleness thresholds

What: The staleness logic detects session count drift between sources.contentVault.sessionCount (at last extraction) and current Content Vault session count. Any positive drift triggers staleness.status: "stale". Who: check-freshness.js Status: ASSUMED — The state file shows staleness.newSessionsSince: 202 which confirms session count drift is computed. The exact threshold (any session = stale, or a minimum drift count) is not confirmed from the script source. Reasoning: the state file shows stale at 202 sessions, indicating stale is triggered at >0 drift. Risk: if threshold is configurable, it may differ from this assumption.

FRESH-3: Atomic write-back

What: Freshness check writes atomically to the state file (write to temp file, rename) to prevent partial writes from corrupting state if interrupted. Who: check-freshness.js Status: ASSUMED — Atomic write is described in the orchestrator source (Design property 6: "State file is source of truth — atomic write"). Whether check-freshness.js uses the same atomic write pattern is assumed by consistency. What would verify: inspect the write method in check-freshness.js source.


8. Post-Session Automation

PS-1: /post-session Step 7.5 trigger

What: /post-session {slug} runs Step 7.5 after transcript processing and HubSpot persistence. It detects whether a compass source app exists: ls -d clients/{slug}/apps/*-compass/ clients/{slug}/apps/*-walkthrough/ clients/{slug}/apps/*-app/ 2>/dev/null. If a compass source is found, V spawns Showcase to rebuild. Who: V (orchestrator), Showcase (builder) Status: VERIFIED 2026-04-23 — Step 7.5 language is in /post-session command source. vf-team compass exists at clients/vf-team/apps/vf-team-compass/. The detection pattern is confirmed. Evidence that Showcase has been spawned and executed a rebuild via this step is ASSUMED — the state file records a build on 2026-04-23 which may have been triggered this way.

PS-2: Showcase spawn pattern in post-session

What: When Step 7.5 finds a compass source, V spawns Showcase with the compass build assignment. Showcase runs the full orchestrator flow for that slug. Who: V → Showcase Status: ASSUMED — The spawn delegation pattern is established and used for /compass direct invocation. Whether Step 7.5 has successfully completed a full compass rebuild via Showcase and written a new state file has not been independently confirmed.

PS-3: State file update after rebuild

What: After Showcase rebuilds, the state file reflects the new build: build.lastRunAt, build.inputHash, build.outcome, per-page digests all update. staleness.status returns to current if extraction picked up new sessions. Who: Orchestrator (writes state file) Status: ASSUMED — State file update is a Design property (property 6: State file is source of truth). The vf-team state file has been updated (build timestamp 2026-04-23 is fresh). Whether a full rebuild cycle (post-session → Showcase → orchestrator → state file update → staleness cleared) has been completed end-to-end has not been confirmed.


9. Meeting-Prep Integration

MP-1: Pavilion freshness check in meeting-prep

What: /meeting-prep {slug} spawns Pavilion in Step 0.5 (before relationship intelligence). Pavilion runs node scripts/compass/check-freshness.js {slug}, reads the updated state file, and reports staleness to the meeting brief footer. Who: Pavilion Status: VERIFIED 2026-04-23 — /meeting-prep command source explicitly instructs Pavilion to run check-freshness.js and report staleness.status, staleness.reasons, staleness.newSessionsSince, and deploy.url. The state file has staleness.checkedAt confirming the script has run.

MP-2: Stale compass handling

What: If Pavilion returns status: stale, this is noted in the brief footer but does NOT block the session or trigger a rebuild. The note flags the stale compass for post-session rebuild by Showcase. Who: Pavilion (reports), Showcase (post-session rebuild) Status: VERIFIED 2026-04-23 — /meeting-prep source explicitly states: "do not block the session or trigger a rebuild. The reasons will surface in the Portal line of the brief footer. Post-session rebuild is Showcase's responsibility."

MP-3: No state file exists

What: If clients/{slug}/.compass-state.json does not exist, Pavilion returns status: untracked, reasons: [], url: null. No error is thrown. Who: Pavilion Status: ASSUMED/meeting-prep source states this explicitly: "If no .compass-state.json exists, return: status=untracked, reasons=[], url=null." Whether the actual check-freshness.js script handles missing state file gracefully is assumed by this instruction.


10. Deploy Flow

DEPLOY-1: Vercel buildCommand chain

What: apps/portal/vercel.json buildCommand runs:

node scripts/compass/build-all.mjs && node scripts/build-client-walkthroughs.mjs && node apps/portal/scripts/copy-client-data.js && node apps/portal/scripts/sync-artifacts.mjs && pnpm turbo run build --filter=portal

Compass orchestrator runs FIRST, before the walkthrough orchestrator. Who: Vercel (triggers on deploy) Status: VERIFIED 2026-04-23 — apps/portal/vercel.json read directly; buildCommand confirmed as shown. Compass is first in chain.

DEPLOY-2: Per-entry failure isolation (exit 0 behavior)

What: If one compass fails gates, the orchestrator exits 0. The walkthrough orchestrator and Astro portal build continue. The failed compass retains its prior deployed output in apps/portal/public/{slug}/compass/. Who: Orchestrator (build-all.mjs) Status: VERIFIED 2026-04-23 — Design property 5 is stated in orchestrator source: "Top-level exit 0 on per-entry failures — one broken compass does not fail the whole Vercel build." This was the lesson from the 2026-04-22 cascade incident where walkthrough failures took down 12 portals.

DEPLOY-3: Catastrophic orchestrator failure

What: Only two conditions cause the orchestrator to exit non-zero (blocking the whole build): (1) unreadable manifest file, (2) orchestrator crash (unhandled exception). All other failures are per-entry and exit 0. Who: Orchestrator Status: ASSUMED — Per source documentation. These conditions have not been triggered in production.

DEPLOY-4: Gitignore for hashed assets

What: apps/portal/public/*/compass/assets/ is gitignored. Only index.html and non-hashed assets (if any) are tracked. Built assets are produced fresh on each Vercel deploy. Who: git + orchestrator Status: ASSUMED — The context brief states this mirrors the walkthrough pattern. The .gitignore has not been read directly in this session to confirm the exact pattern. What would verify: grep -r "compass/assets" .gitignore apps/portal/.gitignore.


11. Migrating a Walkthrough to a Compass

BLOCKED — Playbook naming mismatch. See Section 15, Flag 1.

MIG-1: Reference migration playbook

What: docs/plans/compass-migration-playbook.md provides the step-by-step migration recipe. Hone is auditing this document in parallel. Status: BLOCKED — File docs/plans/compass-migration-playbook.md does not exist on disk as of 2026-04-23. The file found at docs/plans/portal-migration-playbook.md uses old naming (@vf/portal-template, scripts/portal/, .portal-state.json). This is either: (a) the playbook has not yet been renamed/updated to match compass naming, or (b) the playbook Chris referenced is a different file from what is on disk. Hone must confirm which file is canonical before this step can be marked anything other than BLOCKED.

MIG-2: 5-step migration flow (summary)

What (from context brief): (1) Scaffold source app from @vf/compass-template, (2) add to manifest, (3) seed state file, (4) run first build + gates, (5) decommission walkthrough source (leave legacy output at /{slug}/portal/ until client is notified). Status: NOT BUILT — This summary describes ADD-1 through ADD-6 combined with a decommission step. The decommission step (leaving walkthrough output live during transition) has not been documented or executed for any client other than vf-team, and vf-team's walkthrough (collective-walkthrough) was left live separately per state file notes.


12. Failure Modes and Recovery

FAIL-1: Gate failure — prior output preserved

What: If G1-G5 or G8 fail, the orchestrator does NOT swap the dist/ into deployTarget. Prior output at apps/portal/public/{slug}/compass/ remains live. The build is isolated to a temp directory. Who: Orchestrator (Design property 3: per-entry atomic failure isolation) Status: VERIFIED 2026-04-23 — Design property 3 is stated in orchestrator source: "temp build + gate + swap; failed builds leave the prior deployed output in place."

FAIL-2: Extraction failure — non-fatal warning

What: If extract-data.js fails to query one canonical source (e.g., HubSpot timeout), it logs a warning but does not crash. Pages sourced from the failed query will produce empty data files, which triggers G8 failure. Who: extract-data.js → G8 gate → orchestrator Status: ASSUMED — Non-fatal warning behavior is implied by the gate architecture (G8 catches empty data files). Whether extract-data.js itself handles errors gracefully (try/catch per source) vs. crashes has not been confirmed by reading the full script source.

FAIL-3: 2026-04-22 cascade lesson — Vercel cascade prevention

What: Before compass, walkthrough build failures could exit non-zero and cascade to cancel the entire Vercel deploy, taking down all portals. The compass orchestrator's top-level exit 0 design (Design property 5) prevents this. If a compass breaks, other compasses, walkthroughs, and the portal Astro build continue. Who: Orchestrator Status: VERIFIED 2026-04-23 — Design property 5 cites this lesson explicitly in source. Confirmed by state file (build succeeded; gatesPassed: true) across a full Vercel deploy cycle.

FAIL-4: Mobile overflow defect (HubSpot Task 108388555848)

What: Mobile layout overflow is an active defect on the live vf-team compass. Tracked as HubSpot Task 108388555848. G7 (visual consistency) would catch this if run via Mirror. No automated gate currently prevents mobile overflow from deploying. Who: Mirror (to detect), Showcase (to fix) Status: BLOCKED — Active defect. G7 is runtime-only and has not been executed. The defect is known and tracked but not yet resolved.


13. Who Owns What

Domain Owner Scope
@vf/compass-template package Showcase PortalShell, page components, Tron:Ares theme, light/dark toggle
scripts/compass/build-all.mjs Showcase Orchestrator — invocation, change detection, failure isolation
scripts/compass/manifest.json Showcase Source of truth for what to build
scripts/compass/extract-data.js Showcase Canonical source queries, data file output
scripts/compass/quality-gates.sh Q (definition), Showcase (execution) G1-G8 gate definitions and automated execution
scripts/compass/check-freshness.js Pavilion Session drift computation, state file write-back
scripts/compass/seed-state.js Showcase State file initialization for new compasses
clients/{slug}/.compass-state.json Orchestrator (writes), Pavilion (freshness writes) Build metadata, page digests, staleness
apps/portal/public/{slug}/compass/ Orchestrator (writes), Vercel (serves) Built output
G6-G7 runtime gates Mirror Visual QA, navigation verification
Chain integrity (vercel.json buildCommand order) Hone Cross-layer consistency audit
Migration playbook Hone (auditing), Showcase (update) Pending Hone audit resolution
This SOP Q Maintenance per QMS framework

14. Verification Status

Section Scoreable Steps VERIFIED UNTESTED ASSUMED BLOCKED NOT BUILT
2. Architecture Overview 7 7 0 0 0 0
3. Adding a New Compass 6 2 1 3 0 0
4. Running the Orchestrator 3 2 0 1 0 0
5. Change Detection 3 3 0 0 0 0
6. Quality Gates 9 6 2 1 0 0
7. Freshness Checking 3 1 0 2 0 0
8. Post-Session Automation 3 1 0 2 0 0
9. Meeting-Prep Integration 3 2 0 1 0 0
10. Deploy Flow 4 3 0 1 0 0
11. Migration 2 0 0 0 1 1
12. Failure Modes 4 2 0 1 1 0
TOTAL 47 29 3 12 2 1

Score (excl. NOT BUILT): 29/46 = 63% — Partially Verified


15. Open Flags for Resolution

Flag 1 — Migration playbook naming mismatch (HIGH PRIORITY). File at docs/plans/portal-migration-playbook.md still uses pre-rename terminology (@vf/portal-template, scripts/portal/, .portal-state.json). Either the playbook has not been renamed/updated to match compass naming, or a separate compass-migration-playbook.md was planned but never created. Section 11 (MIG-1) is BLOCKED until this is resolved.

Flag 2 — seed-state.js scope. File exists in scripts/compass/ but has never been executed for a client other than vf-team. ADD-3 step is UNTESTED for new clients.

Flag 3 — G4 content safety gate coverage. Gate passed for vf-team but the exact forbidden terms scanned and whether JS bundle content is scanned (vs. only HTML) is unconfirmed.

Flag 4 — G6/G7 never formally run. Live vf-team compass has a known mobile overflow defect (HubSpot Task 108388555848) that G7 would catch. Mirror dispatch needed to close these gates and move the verification score toward Operational.

Flag 5 — Post-session rebuild not end-to-end verified. /post-session Step 7.5 → Showcase spawn → orchestrator → state file update cycle is ASSUMED rather than VERIFIED.


Revision History

Date Change Author Approved By
2026-04-23 Initial draft. Triggered by Compass Template Architecture ship. Q Pending Chris approval