Skip to main content

← Sales CRM & RFP · Prompt Deck · Pictures

Sales CRM & RFP Spec Stories

How do we think slowly so the answer library compounds and win rate climbs?

Intent Contract

Agent autonomy boundary. Not parsed by engineering — governance instrument for humans and agents.

DimensionStatement
ObjectiveVertical CRM for construction/infrastructure sales that learns from every bid — answer once, auto-fill forever, win rate climbs.
Outcomes1. Answer library has 10+ approved entries within 14 days of pilot. 2. Second RFP auto-fills 5+ answers from first. 3. Win rate trends >30%.
Health MetricsAuth uptime (no regression). Data integrity (no orphaned records). Page load <2s on all CRM routes.
ConstraintsHard: Multi-tenant isolation (org data never leaks). Steering: Vertical-first (construction entities native, not configured).
AutonomyAllowed: UI layout, component choice, query optimization. Escalate: Schema changes, new entity types. Never: Delete user data, modify billing without confirmation.
Stop RulesComplete when: all Build Contract rows at Live + 1 real RFP processed end-to-end. Halt when: auth regresses or library shows 0 queries after 14 days.
Counter-metricsAnswer library must not become a data-entry chore — if users stop approving answers after week 2, the workflow has failed. Auto-fill must not degrade answer quality — if SME rejection rate exceeds 30%, the algorithm is matching wrong.
Blast RadiusCRM routes (all /crm/*), server actions (contact/deal/venture CRUD), answer library (new matching algorithm), Stripe webhooks (payment flow). Multi-tenant isolation is the critical boundary.
RollbackFeature flags per module. Answer library can be disabled without affecting CRM CRUD. Auto-fill algorithm can be rolled back to manual-only. Stripe integration can be disabled without losing deal data.

Story Contract

Stories are test contracts. Each row converts to test files. Tests must be RED before implementation starts. Tests going GREEN = value delivered.

Every story follows the P2P arc: Pain (who hurts, measurable cost) → Performance Target (the number that proves it works) → Validated Outcome (the Tight Five dimension this serves).

#WHEN (Trigger + Precondition)THEN (Exact Assertion)ARTIFACTTest TypeFORBIDDEN (Must not happen)OUTCOME (Performance Number)
S1User navigates to /crm/contacts with 20+ contacts in DB for current orgList renders with pagination (10 per page). Search input filters by name in <500ms. Click on contact row navigates to detail page showing linked ventures, deals, and activity history.BLOCKER — test path TBD by engineeringe2eList dumps all records without pagination. Search returns 0 results for exact name match that exists. Contact detail shows contacts from another org.Find any contact in <5s vs scrolling spreadsheet rows at ~30s per lookup
S2User navigates to /crm/pipeline with deals across 3+ stages, each with dollar valuesKanban renders cards per stage. Dollar values sum per column header. Drag card from "Proposal" to "Negotiation" persists on page reload. Deal count badge updates.BLOCKER — test path TBD by engineeringe2eDrag updates UI but does not persist — card reverts on reload. Pipeline shows $0 column total when deals have values. Cards from other orgs appear in pipeline.Pipeline status visible in <10s vs weekly team call + shared spreadsheet reconciliation
S3Venture A has 5+ approved answers in library AND user creates Venture B with 3+ questions that match Venture A questions by keyword overlapAuto-fill populates Venture B with matching answers from library. Fill rate % displayed on venture detail. Each auto-filled answer shows source venture link. Unapproved answers excluded from auto-fill.BLOCKER — test path TBD by engineeringintegrationAuto-fill returns 0 matches when identical questions exist in library. Auto-fill silently succeeds with 200 response but creates 0 answer records. Auto-fill pulls from unapproved/rejected answers.Venture B response time <8 hours at 70% fill rate vs 20-40 hours from scratch per RFP
S4User logs a call from deal detail page with notes, 2 linked contacts, and a follow-up date 3 days from nowActivity record appears on deal timeline AND both contact timelines within 5s. Follow-up creates a task with due date, assignee, and linked deal. Task visible on /crm/calendar for the due date.BLOCKER — test path TBD by engineeringintegrationActivity logged on deal timeline but missing from contact timeline. Task created without due date or assignee. Activity references contacts from a different org.Zero follow-ups forgotten — task appears on due date vs current "I think we promised to send that last week"
S5User creates a venture linked to: 1 deal, 2 contacts with buying roles (Decision Maker, Influencer), and 1 property with GPS coordinatesVenture detail page shows: deal link (clickable), contacts with role badges, property with address and map pin. Deal detail shows venture link. Contact detail shows venture + role. Property detail shows linked venture.BLOCKER — test path TBD by engineeringe2eVenture links to deal but deal detail does not show venture. Stakeholder role assigned but not visible on contact profile page. Property created without GPS/address renders blank map.New hire understands deal context in <2 min vs 30 min verbal explanation from colleague
S6User opens Go/No-Go scoring form for a venture with RFP deadline in 14 daysAll 8 criteria render (Relationship, Capability, Capacity, Competition, Margin, Location, Terms, Timeline). User scores each. Composite computes with weights. Result: 70%+ = Go, 50-70% = Review, <50% = No-Go. Decision persists per venture.BLOCKER — test path TBD by engineeringintegrationScore always computes "Go" regardless of criteria values. Form saves with fewer than 8 criteria scored. Score saved but not visible on venture detail or pipeline card.Stop pursuing unwinnable bids — save 20-40 hours per no-go decision at $1,150 estimated value
S7User navigates to /crm/analytics with 3+ ventures containing 10+ total approved answers across all venturesLibrary growth chart renders answers over time. Per-venture fill rate % visible. Time saved estimate computed: approved_answers × avg_time_per_manual_answer. Compound rate shows projected fill rate at current growth pace.BLOCKER — test path TBD by engineeringintegrationAnalytics page shows 0 approved answers when library has entries. Fill rate always displays 0% despite auto-fills working. Time saved shows $0 when fill rate >0%.Prove compound ROI: $1,150 per RFP saved × fill rate %. Library value grows with every approved answer.

Tight Five coverage check:

P DimensionStories covering itGap?
Pain (3-5 tools, 20-40h per RFP)S1 (contact lookup pain), S2 (pipeline visibility pain), S3 (copy-paste pain)No
Demand (app live, real data)S5 (relationship linking — construction-specific), S6 (Go/No-Go — industry workflow)No
Edge (vertical + compounding library)S3 (auto-fill compound), S7 (compound measurement)No
Trend (AI vertical SaaS)S3 (AI auto-fill), S6 (qualification scoring)No
Conversion (pilot proof)S7 (ROI measurement), S3 (time saved per RFP)No

Build Contract

The deliverable. Engineering builds from this. Commissioning reads this. Every row has an acceptance test.

Job 1: Know Who I'm Dealing With

#FunctionArtifactVerificationValueState
1Browse, search, filter contactsContact list page at /crm/contactsList loads <1s, search filters in <500ms. 29 contacts render.Find the right person in secondsPartial
2View profile, linked ventures, linked dealsContact detail page with relationship graphClick contact card → detail page with linked entitiesSee full relationship context before a meetingBroken
3Add new contact with companyContact create form + redirectCreate saves, redirects to detail with canonical IDCapture a new relationship immediatelyPartial
4View company with all contacts and dealsCompany detail pageCompany shows all contacts + deals + activityUnderstand an organisation's full engagementBuilt
27Log calls, emails, meetings per dealActivity timeline componentLog from deal, appears on both deal and contact timelinesBuild an interaction historyBuilt
28Bulk import contacts from spreadsheetCSV import page with validationUpload 50 contacts, all appear with correct fields, duplicates flaggedOnboard existing contacts in minutesNot verified

Job 2: See Where Every Deal Stands

#FunctionArtifactVerificationValueState
5Visual kanban of all deals by stageDeal pipeline at /crm/dealsCards/Table/Kanban views. 8 deals render with values + weighted pipeline.See where every deal stands at a glanceLive
6Create new deal with value and stageDeal create formSave + appears on pipeline in correct columnCapture a new opportunity immediatelyLive
7View deal with stakeholders, linked RFP, activityDeal detail pageAll relationships visible, click-through to venture + contactsUnderstand everything about opportunityLive
8Add contacts as stakeholders with buying rolesStakeholder management UIAssign role, see influence mapping, remove stakeholderMap the buying committeeLive
9Summary cards and pipeline overviewCRM Overview at /crm + Dashboard at /dashboardCards show correct counts (29 contacts, 8 deals, 10 activities). L4 verified 2026-03-21.Know what needs attention todayLive
10Track pipeline and won revenue targetsMonthly goals componentSet target, track progress, percentage updates with deal changesKnow if you're on track this monthLive
38Predict deal close probabilitySales forecasting algorithm + insights UIProbability correlates with actual close rate within 20% over 10 dealsKnow which deals will close and whenDormant
35Analytics and forecastsInsights dashboard at /insightsFinancial, Sales Forecast, Deal Analytics, Scoreboard, RAG, HITL — all render with 0 dataMake data-driven decisionsPartial

Job 3: Win More Bids, Waste Less Time

#FunctionArtifactVerificationValueState
11Visual board of RFP projects by stageVenture kanban pageCards show stage, linked deal, deadline. Drag between stages.Track every bid from discovery to submitLive
12View RFP questions, linked deal, linked contactsVenture detail pageAll Q&A visible, linked deal clickable, contacts with roles shownFull picture of a bid in one pageLive
13Create new RFP ventureVenture create formSave + appears on kanban, link to deal optionalStart tracking a new bidLive
16Manage Q&A per ventureRFP questions list + CRUDAdd, edit, delete questions. Reorder by drag.Structure the RFP responseLive
17Review AI answer or write manual answerAnswer detail editorAI draft visible, manual override saves, approval status tracksBuild library one question at a timeLive
18AI-powered answer generation across ventureAI Loop endpoint + UI triggerGenerate answers for all unanswered Qs, each references source materialAuto-generate draft answersBuilt
19Generate presentation deck from answersDeck generation endpoint + downloadPDF/PPTX output with all approved answers formattedTurn answers into a deliverableBuilt
20Upload PDF, DOCX, TXT to venturesDocument upload componentFile persists, linked to venture, extractable textAttach RFP documents to right projectLive
21Auto-populate RFP answers from libraryAuto-fill algorithm + UI indicatorVenture B auto-fills 5+ answers from Venture A libraryCut 70% of RFP response timeLive
22Store approved answers for reuseAnswer library page with searchApproved answer queryable by keyword, linked to source ventureNever write the same answer twiceBuilt
23SME approval workflow for answersReview queue pageAssign reviewer, approve/reject, status visible on answerEnsure answer quality before auto-fillBuilt
24Track time saved, fill rate, compound growthRFP analytics dashboardFill rate %, time saved estimate, library growth chart. Route /crm/analytics → 404. May have moved to /insights.Prove the ROI of the RFP toolBroken
31Qualification checklist for RFP decisionsGo/No-Go scoring form8 criteria scored, recommendation displayed, saved per ventureStop wasting time on unwinnable bidsGap
34Assign reviewers to answer queuesRFP assignment UIAssign reviewer per question, notification sent, queue filteredDistribute review work across teamGap
39Track answer library growth rateCompound rate algorithm + chartGrowth curve visible, projected fill rate at current paceProve the RFP tool compounds over timeDormant
40Auto-classify uploaded documentsRFP type detection algorithmUpload PDF, type auto-detected with >80% accuracySkip manual tagging on every uploadDormant

Job 4: Never Let a Follow-Up Fall Through

#FunctionArtifactVerificationValueState
25Create, assign, track tasksTask management UI at /crm/tasksPage renders with empty state + "Create Your First Task" CTA. 0 tasks.Never let a follow-up fall throughPartial
26View deadlines and follow-ups by dateCalendar page at /crm/calendarRoute → 404. Not deployed.See the week aheadBroken
36Team plans and task trackingPlans pageCreate plan, assign tasks, filter by team memberCoordinate team activityStub
#FunctionArtifactVerificationValueState
14Bidirectional link between RFP venture and CRM dealVenture-deal link UILink from either side, both detail pages show the linkOne project, one deal, full pictureLive
15Assign roles and influence to linked contactsStakeholder role assignmentRole dropdown, influence score, visible on deal + ventureKnow who decides, influences, blocksLive
30Track physical sites as standalone entitiesProperty registry pageCreate property, link to venture, GPS + address, site photosLink projects to real-world locationsPartial

Cross-Cutting

#FunctionArtifactVerificationValueState
29Search across contacts, deals, venturesGlobal search componentSearch "Acme" returns contacts, deals, and ventures in <500msFind anything from one search boxPartial
32Sign-in, sign-up, user managementAuth pages + session managementLogin works, redirects to /dashboard. L4 verified 2026-03-21.Secure access per userLive
33App-wide sidebar and top navNavigation componentSidebar works. Pipeline dropdown expands to Contacts/Deals/Tasks/Activities. Active state correct. "Contacts" from dropdown → CRM Overview, not contacts list (nav mismatch).Move between modules without frictionPartial
37AI agent registry and workflowsAgents pageRegistry loads, agent list visible, workflow trigger functionalAutomate repetitive sales tasksStub
41Accept subscription payments via StripeStripe integration + webhook handlerCheckout creates subscription, webhook confirms, seat countedGet paid for the productPartial

Principles

What truths constrain the design?

The Job

ElementDetail
SituationConstruction sales team has 3 weeks to respond to an RFP and half the questions have been answered before.
IntentionFind those answers, auto-fill from the library, get SME review, and submit on time.
ObstacleCopy-paste from old Word docs, hope someone saved the right version. 3-5 tools per deal.
Hardest ThingThe AI value prop requires seed data that requires active usage that requires working auth. Chicken-and-egg.

The hidden objection: "I don't want to enter data just so a system can show it back to me." The answer library solves this — answer once, the system learns, and auto-fills next time. The data entry IS the value creation.

Why Now

22% win rate (industry average: 20-30%)
3-5 tools per deal (CRM + spreadsheet + email + file share + notebook)
20-40 hours per RFP response (70% copy-paste from previous bids)
0 approved answers in the library (auto-fill returns nothing)
$1,150 estimated value per RFP saved (from analytics page)

The product is 49% live. The demand generation isn't. Fix auth (done) -> seed library -> prove compound -> recruit pilot.

Design Constraints

ConstraintRationale
Vertical-firstGeneric CRMs force configuration tax. Native entities (Property, Venture, multi-company deals)
Answer library is the moatAuto-fill from library creates compounding value — each bid makes the next faster
Multi-tenant from day oneOrg isolation required for pilot customers
Agent composes, human sendsHidden objection: "AI outreach feels spammy." Human review before every external action.

Vertical CRM Thesis

Generic CRMs can be configured for construction. None are designed for it. Configuration tax compounds: every new hire needs custom field setup, every report needs field mapping, every integration needs configuration. Industry-specific entities (Property, Venture, multi-company deals) require custom objects. This CRM has these natively.

CapabilitySalesforceHubSpotPipedriveThis CRM
Contact/Company mgmtYesYesYesYes
Visual pipelineYesYesYesYes
Property/site registryNo (custom obj)NoNoNative
Multi-company dealsYes (complex)LimitedNoNative
RFP/tender workflowNo (add-on)NoNoNative
AI answer auto-fillNoNoNoNative
Price per seat/month$75-300$0-150$15-100Target: $30-80

Performance

How do we know it's working?

Priority Score

PRIORITY = Pain x Demand x Edge x Trend x Conversion

DimensionScore (1-5)Evidence
Pain53-5 tools per deal. 20-40h per RFP. Copy-paste from Word docs. 22% win rate.
Demand4App live with real data. 23 contacts, 3 ventures. No competitor has native RFP workflow.
Edge3Vertical CRM + AI auto-fill + compounding library. No proprietary data yet.
Trend4AI vertical SaaS fastest growing. Construction tech accelerating.
Conversion3$30-80/seat vs Salesforce $75-300. Internal use only. Needs pilot.
Composite7205 x 4 x 3 x 4 x 3

North Star: Win Rate > 30% (currently 22%).

Quality Targets

MetricTargetNow
Win rate>30%22%
First answer to libraryWithin 7 days of pilotN/A
Deal creation (activation)Within 48h of onboardingN/A
Library size10+ approved0
Weekly active usageCRM + RFP modulesInternal only

Failure Budget

Failure TypeBudgetResponse
Auth regression0%Immediate fix — blocks all users
Data loss0%Immediate fix — trust destroyed
Route 404<5%Fix within sprint — broken navigation
Auto-fill mismatch<10%Review algorithm — wrong answers cost trust

Kill signal: Contacts but no deals = rolodex. Ventures but no answers = project board.

Platform

What do we control?

Domain Model

CONTACTS <--> COMPANIES
| |
VENTURES <--> DEALS (Bids)
| |
PROPERTIES DOCUMENTS
EntityWhat It RepresentsKey Fields
ContactA person you do business withName, role, company, phone, email, tags, status
CompanyAn organisation (client, subcontractor, supplier)Name, type, industry, ABN/tax ID, address
PropertyA physical site or address where work happensAddress, GPS, site type, status, photos
VentureA project or job that ties people, places, and bidsName, property, client company, stage, value
DealA bid, tender, or commercial opportunityVenture link, value, stage, due date, probability
ActivityAny interaction (call, email, meeting, site visit)Type, date, contacts, notes, linked entity
DocumentProposals, RFPs, contracts, drawingsFile, version, type, linked deal/venture

Current State (Commissioned 2026-03-20)

ComponentBuiltWiredWorkingNotes
Auth + sessionsYesYesPartialLogin works. URL doesn't update after redirect.
Contact listYesYesPartial29 contacts render. No pagination. Cards not clickable.
Contact detailYes?NoClick from list does nothing. Detail page unreachable.
Company pagesYesYesPartialNeeds verification
Deal pipelineYesYesYesKanban, Cards, Table views all work. 8 deals, $1.32M.
CRM OverviewYesYesYesSummary cards correct. Pipeline mini-chart works.
Venture + RFP Q&AYesYesYesHub renders. 0 ventures, 0 answers — no seed data.
Answer libraryYesPartialNoBuilt but 0 entries. 70% fill rate displayed (misleading).
AI auto-fillYesYesNoReturns nothing (empty library)
InsightsYesYesPartial6 dashboard types render. All show 0 data.
TasksYesYesPartialPage renders with empty state. Create CTA present.
CalendarNoNoNo/crm/calendar → 404
RFP analyticsNoNoNo/crm/analytics → 404
ChatYes??Not tested. Sidebar link exists.
Stripe paymentsYesPartialNoWebhooks not wired
3 algorithmsYesNoNoDormant in agency lib

Delivery State (Honest count after 2026-03-20 commissioning)

StateCount%
Live1434%
Partial922%
Built512%
Broken37%
Dormant37%
Gap25%
Stub25%
Not verified37%

Build Ratio

~75% composition (platform, auth, data layer), ~25% new code (answer library compound, Go/No-Go, assignments).

Protocols

How do we coordinate?

RFP Workflow

TENDER NOTICE -> GO/NO-GO DECISION -> BID PREPARATION -> SUBMISSION -> EVALUATION -> AWARD/LOSS -> HANDOVER

Go/No-Go Checklist

CriteriaQuestionWeight
RelationshipDo we know the decision-maker?High
CapabilityHave we done this type of work before?High
CapacityDo we have the team available?High
CompetitionHow many competitors are bidding?Medium
MarginCan we hit target margin at competitive price?High
LocationIs the site in our operating area?Medium
TermsAre contract terms acceptable?Medium
TimelineCan we meet the submission deadline?High

Score: 70%+ = Go. 50-70% = Review. Below 50% = No-Go.

Build Order (Revised 2026-03-20 — foundation first)

Previous build order started with dormant algorithms. Wrong. Fix what's broken before adding what's missing.

Dependency chain: Contact detail → Activity logging → Chat → Tasks → Answer library → Auto-fill compound → Analytics

SprintFeaturesWhatWhy FirstAcceptance
F0#2, #32, #33Fix contact detail click-through. Fix auth URL redirect. Fix sidebar nav routing.Foundation. Nothing works downstream if you can't open a contact. Agents need contact detail to operate.Click contact card → detail page with linked deals/ventures. Auth redirect updates URL. Sidebar "Contacts" → /crm/contacts.
F1#1, ChatAdd pagination to contacts (10/page). Wire chat function.Scale + engagement. 29 contacts works. 200 won't. Chat is the engagement surface — users need a reason to come back.Pagination at 10/page. Chat sends/receives messages.
F2#27, #25Activity logging from deal detail. Task creation from deal.Enables follow-up loop. Can't build interaction history or track follow-ups without these.Log call from deal → appears on deal + contact timelines. Create task from deal with due date.
F3#26Deploy calendar pageCloses follow-up loop. Tasks without a calendar view are invisible./crm/calendar renders tasks on correct dates.
F4#22, #23, seedAnswer library + review queue + seed 5 ventures with 20 answersProves compound. Empty library = dead value prop. Manual seed breaks the chicken-and-egg.Library has 20+ approved answers. Review queue shows pending.
F5#21, #18, #24Auto-fill from seeded library. AI answer generation. RFP analytics page.Value multiplier. Only works after F4 seeds the library. Analytics proves ROI.Venture B auto-fills 5+ from library. /crm/analytics renders fill rate + time saved.
Park#30, #31, #34, #29, #38-41Properties, Go/No-Go, assignments, search, algorithms, StripeOnly after F5 proves compound. These scale what works — don't build them before proving the core loop.

Kill date: 2026-04-07 (extended from 2026-03-24 — original was unrealistic given foundation gaps discovered).

Commissioning

#Feature groupInstallTestOperationalOptimize
1-3Contacts (list/detail/create)PassPass----
5-8Deals (pipeline/create/detail/stakeholders)PassPass----
9-10Dashboard + GoalsPassPass----
11-17Ventures + RFP Q&APassPass----
18-19AI Loop + Deck GenPass------
20-24Docs + Auto-fill + Library + AnalyticsPassPartial----
25-30Tasks + Calendar + Activity + Search + PropertyPartial------
31,34Go/No-Go + Assignments--------
32-33Auth + NavPassPassPass--
38-41Forecasting + Compound + Detection + PaymentsDormant------

E2E Test Evidence (2026-03-19)

31 E2E tests failed. 6.2min total run time. Mapped against Story Contract:

StoryE2E TestFileStatusFailure Category
S1Contacts CRUD: navigate to formcrm-contacts-crud.authenticated.spec.ts:26FAILFeature — contact form navigation broken
S2Kanban: navigate, switch view, verify columnskanban-deals.authenticated.spec.ts:462FAILFeature — pipeline rendering broken
S2CRM overview lifecyclecrm-overview.authenticated.spec.ts:266FAILFeature — dashboard cards broken
S3Auto-fill suggestion panel with approved matchrfp-auto-fill.authenticated.spec.ts:37FAILFeature — THE VALUE PROP is broken
S4Activities page lifecyclecrm-activities.authenticated.spec.ts:153FAILFeature — activity logging broken
S5Beings list to detail with associationsbeings-crm.authenticated.spec.ts:906FAILFeature — relationship linking broken
S7RFP analytics lifecyclerfp-analytics.authenticated.spec.ts:272FAILFeature — compound measurement broken
--Global search in headerglobal-search.authenticated.spec.ts:17FAILCross-cutting — no story coverage
--RFP document uploadbet-10-3-rfp-demo.authenticated.spec.ts:46FAILRFP workflow — upload broken
--SME assignment navigationsme-assignments.authenticated.spec.ts:130FAILRFP workflow — review queue broken
--Venture detail from listrfp-venture-detail.authenticated.spec.ts:19FAILRFP workflow — venture detail broken

Infrastructure failures (cascade risk):

TestFileImpact
Home page render (auth + unauth)navigation.unauthenticated.spec.ts:27All downstream tests suspect
404 handling (auth + unauth)navigation.unauthenticated.spec.ts:52Routing broken
Route sync: public pages <500route-sync.unauthenticated.spec.ts:75Public routes returning errors
Owner login: no redirect loopsidentity-owner-login.authenticated.spec.ts:24Auth may cascade all auth tests

Diagnosis: Smoke tests (home page, route sync, auth redirect) are failing. This likely cascades — if the home page doesn't render, every downstream test fails on navigation. Fix infrastructure first, then re-run to isolate feature-level failures.

Story coverage: 6/7 CRM stories have at least one failing E2E test. S6 (Go/No-Go) has no test — feature is Gap. Stories validated against reality.

Commissioning Spec: Contact Management

Binary success criteria for L4. Commissioner walks each row. All critical rows must PASS.

#FeatureNavigateHappy PathOutput Matches SpecError HandlingEvidenceResult
1Contact list/crm/contacts loadsList shows all contacts with paginationCount matches DB, search filters correctlyEmpty state shows messageScreenshotPASS
2Contact detailClick from listProfile, linked ventures, linked dealsAll relationship context presentNon-existent ID shows 404ScreenshotPASS
3Contact create"New" buttonFill name + email, saveRow appears in listEmpty name shows validationGIFPASS (redirect bug #19)
4Contact updateClick, editChange field, saveUpdated value persists on reloadInvalid email shows errorGIFPASS
5Contact deleteDelete actionConfirm, removed from listRow gone from DBCancel leaves contact intactGIFFAIL -- no delete (#20)

Last commissioned: 2026-03-09. Result: 4/5 PASS. Cannot reach L4 -- delete missing (#20), create redirect wrong UUID (#19).

Agent-Facing Spec

Commands:

pnpm nx serve stackmates        # Dev server
pnpm nx test stackmates # Unit tests
pnpm nx e2e stackmates-e2e # E2E tests

Boundaries: Always: UI layout, query optimization. Ask first: schema changes, new routes. Never: delete user data, modify billing.

Players

Who creates harmony?

Demand-Side Jobs

Job 1: Know Who I'm Dealing With

Situation: BD manager prepares for a meeting with a client they haven't spoken to in 3 months.

ElementDetail
Struggling momentSearching email, spreadsheets, and memory to reconstruct a relationship
Current workaroundEmail search + notebook + asking colleagues
What progress looks likeOpen a contact, see everything -- company, linked deals, full activity history
Hidden objection"I don't want to enter data just so a system can show it back to me"
Switch triggerLose a deal because they didn't know a colleague already had the relationship

Features that serve this job: #1, #2, #3, #27, #28

Job 2: See Where Every Deal Stands

Situation: Monday morning. Sales director needs pipeline visibility.

ElementDetail
Struggling momentChasing reps for updates, reconciling spreadsheets, guessing pipeline health
Current workaroundWeekly team call + shared Google Sheet + gut feeling
What progress looks likeOne screen shows every deal, every stage, every value, every next action
Hidden objection"My reps won't update this -- I'll end up maintaining it alone"
Switch triggerForecast is wrong because a deal silently died 3 weeks ago

Features that serve this job: #5, #6, #7, #9, #10, #38

Job 3: Win More Bids, Waste Less Time

Situation: RFP lands. 3 weeks to respond. Half the questions answered before in previous bids.

ElementDetail
Struggling momentRebuilding proposals from scratch, duplicating effort across bids
Current workaroundCopy-paste from old Word docs, hope someone saved the last version
What progress looks likeUpload an RFP, auto-fill 70% from past answers, human reviews the rest
Hidden objection"AI-generated answers will be generic and need so much editing they're not worth it"
Switch triggerMiss a deadline because team spent all time on formatting, not content

Features that serve this job: #11-24, #31, #34

Job 4: Never Let a Follow-Up Fall Through

Situation: Site visit last Tuesday. Three action items. By Friday, one forgotten, one unassigned, one waiting on a document nobody sent.

ElementDetail
Struggling momentAction items live in meeting notes nobody re-reads
Current workaroundPersonal to-do lists, sticky notes, memory
What progress looks likeTasks linked to deals with due dates, assignees, and status
Hidden objection"I already have a to-do app -- why do I need tasks inside CRM?"
Switch triggerClient says "you promised to send that last week"

Features that serve this job: #25, #26, #27

Situation: Solar installation involves property owner, EPC contractor, two subcontractors, and a financier. Three separate bids over 18 months.

ElementDetail
Struggling momentRelationships between entities exist in the salesperson's head, not the system
Current workaroundNotes fields, custom tags, "see deal X for context" comments
What progress looks likeA venture page showing: property, all companies (with roles), all deals, all contacts
Hidden objection"Our deals are simple enough -- we don't need all this linking"
Switch triggerNew hire joins and can't understand any deal without 30 minutes of verbal context

Features that serve this job: #4, #8, #14, #15, #30

ICP: Construction/Solar EPC Sales Team

AttributeSpecification
RoleSales director, BD manager, or bid manager at construction or solar EPC firm
Context10-200 employees, 5+ bids/quarter, using spreadsheets for bid tracking
GeographyNew Zealand initially, Australia expansion
Budget$30-80/seat/month -- pain threshold is time, not money

Psycho-logic: "We need a better CRM" means "we need our reps to actually use the CRM we have." "We've tried Salesforce" means "we configured it for months, nobody used it, we went back to spreadsheets." The stated problem is tracking. The real problem is adoption. The unlock: answer library auto-fill creates positive ROI on data entry.

Role Definitions

RoleAccessPermissions
AdminAll modules, all org dataCRUD all entities, manage users, billing
Sales RepCRM + RFP, own org dataCRUD contacts/deals/ventures, view analytics
Bid ManagerRFP module, own org dataCRUD ventures/answers, approve answers, run AI
ViewerRead-only, own org dataView contacts/deals/ventures, no create/edit

Awareness Levels

LevelThey KnowWhat We ShowFeature Priority
UnawareUsing spreadsheetsCost of lost dealsMarketing, not product
Problem Aware"We lose track of deals"Name their painDashboard, pipeline
Solution AwareTried Salesforce/HubSpotWhy construction needs verticalProperty, RFP workflow
Product AwareKnow this toolRemove hidden objectionCSV import, auto-fill
Most AwareReady to switchZero frictionOnboarding wizard

Relationship to Other PRDs

PRDRelationshipData Flow
Identity & AccessPlatform (depends)Auth, roles, permissions
ETL Data ToolPeer (feeds)ETL -> business profiles + contacts -> CRM
Sales Dev AgentPeer (consumer)CRM pipeline feeds sales dev prospecting
Agent PlatformPlatform (depends)Agent registry for AI features

Context