{"$schema":"https://grimaldi.ca/api/cluster/","generated":"2026-09-05T22:59:31.287Z","license":"CC BY 4.0 — quote with attribution to Grimaldi Engineering (https://grimaldi.ca/).","evidenceRule":"A KPI without a measurement is null, never 0. Roadmap progress is counted from the evidence log. GitHub metadata is fetched, never hand-copied. Nothing here is typed in as if measured.","cluster":{"id":"operations","agent":"Agent 3","name":"Operations & Commercial Automation","mandate":"Turn existing operational software into a profitable, repeatable business. Primary KPI: revenue. Not a research laboratory. No generic SaaS infrastructure without a customer-driven reason.","command":"Make money and build distribution.","controlSurface":"https://grimaldi.ca/","operator":{"@id":"https://igrimaldi.engineering/#person","name":"Vincenzo Ceccarelli Grimaldi","brand":"Grimaldi Engineering"},"siblings":[{"id":"energy","agent":"Agent 1","name":"Energy Intelligence","command":"Create the highest-value deep-tech company."},{"id":"physical-ai","agent":"Agent 2","name":"Physical AI & Robotics","command":"Prove whether physical autonomy can create a defensible second moat."}]},"constitution":{"clusters":"There are exactly three strategic clusters. No agent may create a fourth.","ownership":"Each cluster owns its domain. Domain logic remains isolated: energy logic remains Energy, robotics logic remains Robotics, operations logic remains Operations.","moves":"No repository moves between clusters without documenting reason, commercial benefit, technical benefit, migration cost, dependency impact, and the CEO approval requirement.","sharing":"Shared primitives only when genuinely cross-cluster: authentication, billing, observability, deployment tooling, AI model gateway, secrets management, analytics, audit logging, documentation tooling.","communication":"Clusters communicate through versioned APIs, events, schemas, contracts and documented interfaces — never through undocumented database coupling.","gate":["CUSTOMER PAIN","BUYER","MONEY","DIFFERENTIATION","TECHNICAL FEASIBILITY","STRATEGIC FIT","EXECUTION COST"],"gateRule":"A proposed project that fails two or more criteria is archived.","artefacts":["repository registry","architecture map","dependency graph","decision log","kill list","roadmap","customer evidence","competitive intelligence","research backlog","weekly KPI report"],"notRewarded":["number of commits","number of repositories","lines of code","number of features","architectural complexity"],"rewarded":["revenue","customers","deployments","measurable ROI","technical benchmarks","proprietary IP","research quality","reduced engineering complexity"],"whenUncertain":["smaller scope","fewer repositories","clearer ownership","faster customer validation","stronger interfaces","lower burn","higher evidence"],"allocation":"Agents compete for resources on evidence, not activity. Whichever cluster produces contracted value gets the next euro and the next engineer."},"mandate":{"title":"Operations & Commercial Automation — Revenue First","primaryKpi":"REVENUE","secondaryKpis":["RETENTION","GROSS MARGIN","CUSTOMER ACQUISITION","TIME SAVED","CONVERSION","IMPLEMENTATION SPEED"],"sections":[{"n":1,"title":"Repositories under control","lead":"Core: Runway Fuel, ecowoods-app. Vertical applications: floorforge-ai, paintforge-ai, dryforge-ai, bahn-project-manager. Related: LogistiSync, equipment tracking, field-service software, contractor software, operational dashboards, relevant commercial websites.","rule":"Do not treat every repository as a separate company."},{"n":2,"title":"Target architecture","lead":"Runway Fuel is the Operations OS. Applications sit on top: field service, contractors, logistics, industrial services, critical infrastructure.","items":["EcoWoods is the commercial proving ground.","FloorForge, PaintForge and DryForge are vertical experiments.","Runway Fuel becomes generalized infrastructure only after repeated customer evidence."]},{"n":3,"title":"Find the money","lead":"Identify workflows where businesses lose money, and rank every problem by PAIN × FREQUENCY × BUDGET × URGENCY × ABILITY TO PAY × REPEATABILITY.","items":["lead response","estimating","quoting","scheduling","dispatch","procurement","labor utilization","material waste","change orders","job documentation","customer communication","invoicing","collections","warranty","quality control"],"rule":"Do not build based on founder preference."},{"n":4,"title":"Commercial wedge","lead":"Choose ONE vertical initially: flooring, painting, drywall, specialty contractors, field service or industrial service. The winner is the vertical where customers can be acquired cheaply and immediate financial ROI can be demonstrated.","rule":"Do not launch five verticals simultaneously."},{"n":5,"title":"Product strategy","lead":"The initial product solves a complete workflow — lead → estimate → quote → schedule → job → documentation → invoice → payment — but not every stage is built automatically.","rule":"Build the smallest workflow customers will pay for."},{"n":6,"title":"Runway Fuel","lead":"Runway Fuel remains a platform hypothesis. Shared components are extracted only after at least two independent customers require similar workflows.","items":["identity","organizations","users","permissions","jobs","assets","documents","workflow engine","notifications","audit logs","integrations","AI tools","reporting","billing"],"rule":"Do not generalize architecture prematurely."},{"n":7,"title":"Agentic workflows","lead":"Agents are built around specific economic workflows — estimation, sales, operations, finance — each with explicit permissions and a human approval step.","rule":"No uncontrolled autonomous financial or customer-facing action."},{"n":8,"title":"Web intelligence","lead":"Continuously monitor competitors, vertical SaaS, ERP products, AI-native vertical SaaS, pricing, acquisitions, customer complaints, forums, trade publications, search trends and new AI capabilities. Extract unmet demand.","rule":"Customer complaint → unserved workflow → simple product → fast sale. The goal is not to copy competitors."},{"n":9,"title":"Customer research","lead":"Interview real buyers. Minimum initial target: 50 conversations. Track industry, company size, revenue, current software, workflow, pain, cost, decision maker, budget, urgency, competitors and willingness to pay.","rule":"Never count compliments as validation. Validation is money, a signed pilot, or a committed design partnership."},{"n":10,"title":"Revenue experiments","lead":"Test monthly SaaS, annual SaaS, setup fee, implementation fee, usage pricing, per-user, per-job and percentage-of-value. Optimize for ARR, gross margin, retention, CAC and payback period.","rule":"Do not optimize vanity metrics."},{"n":11,"title":"Hard kill rule","lead":"A vertical that cannot produce meaningful commercial evidence within the validation period is frozen. A feature that does not improve revenue, conversion, retention, gross margin or utilization is not built.","rule":"If customers repeatedly request something, prioritize it. If nobody requests something, question why it exists."},{"n":12,"title":"AI discoverability / web dominance","lead":"Authoritative online assets for each winning niche: product page, industry landing page, problem guides, implementation guides, comparison pages, API and workflow documentation, case studies, ROI calculators, FAQ, structured metadata, AI-readable documentation.","rule":"Do not create spam pages. Every page must provide genuine expertise or utility."},{"n":13,"title":"Shared infrastructure","lead":"Share infrastructure with the other clusters only where it creates economic value: authentication, billing, observability, deployment tooling, AI model gateway, secrets management, analytics, audit logging, documentation tooling.","rule":"Do not share domain logic for architectural elegance. Energy logic remains Energy. Robotics logic remains Robotics. Operations logic remains Operations."},{"n":14,"title":"Integration with the other clusters","lead":"Integration happens through contracts, not spaghetti dependencies. Energy Intelligence produces an operational event; Runway Fuel converts it into a workflow; Physical AI executes the physical task; the result returns to Energy.","rule":"None of the systems may require the others to function."},{"n":15,"title":"Weekly CEO report","lead":"Revenue, MRR, ARR, pipeline, leads, qualified opportunities, conversion, churn, retention, gross margin, customer requests, top workflow, top failure, competitive change, features killed, customers won, customers lost, next 7 days."},{"n":16,"title":"90-day objective","lead":"50 customer conversations, 10 qualified opportunities, 3 serious design partners, 1+ paying customer. Then optimize.","rule":"If there is no paying customer, change the wedge. Do not respond by writing more code."}],"finalRule":["Revenue beats elegance.","Customers beat opinions.","Retention beats downloads.","ROI beats features.","Distribution beats architecture.","A working ugly product with paying customers beats a beautiful platform with zero customers."]},"registry":{"reviewed":"2026-09-05","allowedStatuses":["CORE","MODULE","RESEARCH","INTERNAL","EXPERIMENT","ARCHIVE"],"countByStatus":{"CORE":1,"MODULE":0,"RESEARCH":0,"INTERNAL":8,"EXPERIMENT":3,"ARCHIVE":0},"entries":[{"slug":"runway-fuel","name":"Runway Fuel","repo":null,"site":null,"tier":"core","status":"INTERNAL","layer":"operations-os","maturity":"hypothesis","description":"The Operations OS the vertical applications are meant to sit on. Per the mandate it remains a platform hypothesis: identity, organizations, users, permissions, jobs, assets, documents, workflow engine, notifications, audit logs, integrations, AI tools, reporting and billing are extracted only after repeated customer evidence.","stack":[],"hypothesis":"Two or more independent paying customers will require the same job → documentation → invoice workflow, making shared primitives cheaper than per-vertical code.","customer":"None yet. Runway Fuel has no customer of its own by design; it inherits them from the verticals.","role":"Platform hypothesis. Not to be generalized prematurely.","duplicates":["ecowoods-app","bahn-project-manager"],"gate":"Promote to CORE code only when at least two independent customers require similar workflows. Until then nothing is built here that a vertical does not already need.","risk":"Premature generalization — the mandate names it explicitly. No public repository located under this name on 2026-09-05.","reviewed":"2026-09-05","url":"https://grimaldi.ca/cluster/registry/runway-fuel/","github":null},{"slug":"ecowoods-app","name":"ecowoods-app","repo":"iceccarelli/ecowoods-app","site":"https://ecowoods.ca","tier":"core","status":"CORE","layer":"contractors","maturity":"live-no-paying-customers","description":"The web platform behind Ecowoods Hardwood Flooring Inc., a Toronto hardwood contractor operating since 2000: installation, refinishing, dust-free sanding, restoration, custom inlays and stair refinishing across the GTA. The repository is the single source of the facts every search engine, map service, directory and AI system resolves for this business; job management, quoting, invoicing and lead capture live in the same monorepo.","stack":["pnpm","Turborepo","Next.js 15","TypeScript","Prisma","Supabase"],"hypothesis":"A contractor that runs its whole lead → estimate → quote → schedule → job → invoice workflow on this software saves enough hours per month that a second, unrelated contractor would pay for the same thing.","customer":"One operating business (Ecowoods Hardwood Flooring Inc.) uses it in production. The software has no external paying customer yet.","role":"Commercial proving ground. Every workflow claim in this cluster is tested here first.","duplicates":["runway-fuel","field-service-software","contractor-software"],"gate":"Stays CORE while it is the only place a complete contractor workflow runs with real jobs and real invoices. Second contractor on the same code → extract shared primitives into Runway Fuel.","risk":"Business facts (NAP, reviews, pricing) are load-bearing for a real company; the repository enforces them from one constants file and fails the build when a retired literal reappears.","reviewed":"2026-09-05","url":"https://grimaldi.ca/cluster/registry/ecowoods-app/","github":"https://github.com/iceccarelli/ecowoods-app"},{"slug":"floorforge-ai","name":"FloorForge","repo":"iceccarelli/floorforge-ai","site":"https://floorforge-ai.vercel.app","tier":"vertical","status":"EXPERIMENT","layer":"contractors","maturity":"pre-launch","description":"Marketing and pilot-waitlist site for an operating system for autonomous hardwood floor refinishing — early stage, pilot program forming. Hardware and software are in development; all specifications are design targets, pricing is indicative, and the ROI calculator is a transparent model with stated assumptions, not measured customer results.","stack":["Next.js 16","TypeScript","Tailwind CSS v4","Clerk (optional)","Supabase (optional)"],"hypothesis":"Flooring contractors will join a paid pilot for robot-assisted refinishing because labour is the binding constraint on their throughput.","customer":"None. The one conversion path is the pilot waitlist.","role":"Vertical experiment — flooring. Shares its buyer with the EcoWoods proving ground.","duplicates":["paintforge-ai","dryforge-ai"],"gate":"Freeze if the validation period ends without a signed pilot. Moves to the Physical AI cluster only if actual robotic execution exists — a documented cluster move with CEO approval, not a drift.","risk":"Every number on the site is a design target and must stay labelled as such. No shipped hardware or production software yet.","reviewed":"2026-09-05","url":"https://grimaldi.ca/cluster/registry/floorforge-ai/","github":"https://github.com/iceccarelli/floorforge-ai"},{"slug":"paintforge-ai","name":"PaintForge","repo":"iceccarelli/paintforge-ai","site":"https://paintforge-ai.vercel.app","tier":"vertical","status":"EXPERIMENT","layer":"contractors","maturity":"pre-launch","description":"Robotic wall-and-ceiling painting for contractors, positioned as a 2026 GTA pilot program on a robot-as-a-service model. The repository is the marketing site with a 3D simulator; the published figures — 4× crew output, ±2 mil thickness tolerance, 1,000+ sq ft per coat per day — are engineering targets for pilot units, not measurements.","stack":["Next.js 16","React 19","TypeScript","react-three-fiber","Resend","Zod"],"hypothesis":"General contractors and painting subcontractors in the GTA will pay per finished square foot for consistency and schedule certainty they cannot hire.","customer":"None. Pilot program recruiting.","role":"Vertical experiment — painting.","duplicates":["floorforge-ai","dryforge-ai"],"gate":"Same as FloorForge: signed pilot within the validation period or freeze. One of the three Forge verticals wins; the others do not launch simultaneously.","risk":"Targets presented alongside pricing must never be read as delivered performance.","reviewed":"2026-09-05","url":"https://grimaldi.ca/cluster/registry/paintforge-ai/","github":"https://github.com/iceccarelli/paintforge-ai"},{"slug":"dryforge-ai","name":"DryForge","repo":"iceccarelli/dryforge-ai","site":null,"tier":"vertical","status":"EXPERIMENT","layer":"contractors","maturity":"pre-launch","description":"Robot-assisted drywall finishing as a service — semi-autonomous taping, mudding and sanding supervised by trained operators, sold per finished square foot with no capex for contractors. Pre-launch, recruiting founding pilot partners in the GTA. The repository states plainly: no deployed robots, no customers, no certifications.","stack":["Next.js 16","TypeScript","Tailwind CSS 4","Clerk (optional)","Supabase (optional)"],"hypothesis":"Drywall finishing is labour-bound and quality-variable enough that a contractor will pay per square foot for a supervised robot cell.","customer":"None. Founding pilot partners sought.","role":"Vertical experiment — drywall.","duplicates":["floorforge-ai","paintforge-ai"],"gate":"Signed pilot within the validation period or freeze. Domain ownership (dryforge.ai) is unconfirmed per the repository; no production URL is listed here until it is.","risk":"The README carries an explicit honesty policy: no fabricated metrics, fake customers or certification claims. It binds this registry too.","reviewed":"2026-09-05","url":"https://grimaldi.ca/cluster/registry/dryforge-ai/","github":"https://github.com/iceccarelli/dryforge-ai"},{"slug":"bahn-project-manager","name":"Bahn Project Manager","repo":"iceccarelli/bahn-project-manager","site":null,"tier":"vertical","status":"INTERNAL","layer":"critical-infrastructure","maturity":"internal-tool","description":"Enterprise platform for managing railway infrastructure and station-development projects across 14 technical departments (Fachbereiche), data-driven from a 1,298-project dataset, deployed as a static SPA. Typecheck, lint, tests and build are green end to end on main; the README records the measured state of the repository rather than an aspiration.","stack":["Vite 7","React 19","TypeScript 5.9","Tailwind v4","Biome","Vitest","pnpm 10"],"hypothesis":"Infrastructure operators with many parallel projects and many review departments lose money on coordination — dashboards and a structured project intake (Projektanmeldung) recover it.","customer":"Internal use context only. No commercial customer.","role":"Vertical hypothesis — critical infrastructure project operations. The cluster’s only foothold outside contracting.","duplicates":["operational-dashboards","runway-fuel"],"gate":"Becomes an EXPERIMENT only with a named buyer and a dataset the cluster is entitled to commercialize. Until then it stays INTERNAL.","risk":"The project dataset belongs to its data owner. Commercial use of the tool requires clearance from that owner and a clean separation of data from code. Licence in the repository: MIT.","reviewed":"2026-09-05","url":"https://grimaldi.ca/cluster/registry/bahn-project-manager/","github":"https://github.com/iceccarelli/bahn-project-manager"},{"slug":"logistisync","name":"LogistiSync","repo":null,"site":null,"tier":"related","status":"INTERNAL","layer":"logistics","maturity":"not-located","description":"Named in the mandate as a related logistics repository. No public repository under this name was located in the inventory of 2026-09-05. Listed so the gap is visible, not filled with a guess.","stack":[],"hypothesis":"Logistics operators lose money on dispatch and load synchronization.","customer":"None known.","role":"Related — logistics. Unverified.","duplicates":[],"gate":"Locate the repository or the private source, review it against this registry, then assign a status. If nothing exists: ARCHIVE the name.","risk":"A mandate that names code nobody can find is a mandate with a hole in it. Resolve within the first review cycle.","reviewed":"2026-09-05","url":"https://grimaldi.ca/cluster/registry/logistisync/","github":null},{"slug":"equipment-tracking","name":"Equipment tracking","repo":null,"site":null,"tier":"related","status":"INTERNAL","layer":"field-service","maturity":"not-located","description":"Named in the mandate as a related capability. No dedicated public repository located on 2026-09-05. Asset and equipment tracking would be a Runway Fuel primitive (assets) if two customers ask for it.","stack":[],"hypothesis":"Contractors and field-service firms lose tools, miss maintenance and double-book equipment.","customer":"None known.","role":"Related — capability, not yet code.","duplicates":["runway-fuel"],"gate":"Build only on customer request. Two requests → Runway Fuel `assets` primitive.","risk":"None while it is not built.","reviewed":"2026-09-05","url":"https://grimaldi.ca/cluster/registry/equipment-tracking/","github":null},{"slug":"field-service-software","name":"Field-service software","repo":null,"site":null,"tier":"related","status":"INTERNAL","layer":"field-service","maturity":"hypothesis","description":"Capability category named in the mandate. No dedicated repository; scheduling, dispatch and job documentation of this kind currently exist inside ecowoods-app. Field service is one of the six candidate wedges.","stack":[],"hypothesis":"Field-service firms are a candidate wedge if contracting does not validate.","customer":"None. Candidate wedge.","role":"Related — candidate vertical.","duplicates":["ecowoods-app"],"gate":"Only becomes a repository after the wedge decision, and only if the wedge is field service.","risk":"Building it before the wedge decision violates §4.","reviewed":"2026-09-05","url":"https://grimaldi.ca/cluster/registry/field-service-software/","github":null},{"slug":"contractor-software","name":"Contractor software","repo":null,"site":null,"tier":"related","status":"INTERNAL","layer":"contractors","maturity":"hypothesis","description":"Capability category named in the mandate — the generalized form of what ecowoods-app does for one contractor. It does not exist as separate code and must not until the proving ground produces a second contractor.","stack":[],"hypothesis":"Specialty contractors will pay for the smallest complete workflow, not a platform.","customer":"None beyond the proving ground.","role":"Related — the generalization target of ecowoods-app.","duplicates":["ecowoods-app","runway-fuel"],"gate":"Second contractor customer on ecowoods-app code.","risk":"Premature generalization.","reviewed":"2026-09-05","url":"https://grimaldi.ca/cluster/registry/contractor-software/","github":null},{"slug":"operational-dashboards","name":"Operational dashboards","repo":null,"site":null,"tier":"related","status":"INTERNAL","layer":"industrial-services","maturity":"hypothesis","description":"Capability category named in the mandate. Dashboard capability currently exists inside bahn-project-manager (project portfolio, department reviews, station map) and in the labelled sample dashboards of the Forge sites.","stack":[],"hypothesis":"Operators pay for dashboards only when the dashboard changes a decision that costs money.","customer":"None.","role":"Related — capability slot.","duplicates":["bahn-project-manager"],"gate":"A dashboard is built when a paying customer names the decision it must inform.","risk":"Dashboards are the classic vanity feature. §11 applies.","reviewed":"2026-09-05","url":"https://grimaldi.ca/cluster/registry/operational-dashboards/","github":null},{"slug":"grimaldi-ca","name":"grimaldi.ca","repo":"iceccarelli/grimaldi.ca","site":"https://grimaldi.ca","tier":"related","status":"INTERNAL","layer":"control-surface","maturity":"internal-tool","description":"This site. The control and integration surface of the Operations cluster: registry, KPI system, decision log, kill list, roadmap, weekly CEO report, cross-cluster contracts and the machine-readable index at /api/cluster/. It also carries the operator’s explainers and book manuscripts.","stack":["Next.js 14","TypeScript","Vercel"],"hypothesis":"A cluster that can see its own evidence kills faster and sells earlier.","customer":"The CEO layer.","role":"Control surface. Sells nothing; displays and orchestrates.","duplicates":[],"gate":"Stays INTERNAL. Never becomes a product.","risk":"The danger is decoration: a control room must show measured values or say \"not yet measured\". Nothing here is typed in as if measured.","reviewed":"2026-09-05","url":"https://grimaldi.ca/cluster/registry/grimaldi-ca/","github":"https://github.com/iceccarelli/grimaldi.ca"}],"detail":"https://grimaldi.ca/api/cluster/registry/"},"kpis":{"detail":"https://grimaldi.ca/api/cluster/kpi/","items":[{"id":"revenue","label":"Revenue","rank":"primary","unit":"CAD","definition":"Cash invoiced to external customers for software or software-enabled service in the period. The primary KPI; every other number exists to explain this one.","value":null,"measuredAt":null,"source":"Invoice ledger of the entity that bills the customer."},{"id":"mrr","label":"MRR","rank":"derived","unit":"CAD","definition":"Monthly recurring revenue from active subscriptions at period end. Setup and implementation fees excluded.","value":null,"measuredAt":null,"source":"Billing system."},{"id":"arr","label":"ARR","rank":"derived","unit":"CAD","definition":"MRR × 12.","value":null,"measuredAt":null,"source":"Derived from MRR."},{"id":"pipeline","label":"Pipeline","rank":"secondary","unit":"CAD","definition":"Sum of the annual value of qualified opportunities with a named decision maker and a stated budget.","value":null,"measuredAt":null,"source":"Customer evidence log (content/cluster/evidence.ts)."},{"id":"leads","label":"Leads","rank":"secondary","unit":"count","definition":"Inbound or outbound contacts with a real business in a candidate vertical in the period.","value":null,"measuredAt":null,"source":"Customer evidence log."},{"id":"qualified-opportunities","label":"Qualified opportunities","rank":"secondary","unit":"count","definition":"Leads with a stated pain, a named decision maker, a budget and an urgency other than \"none\".","value":null,"measuredAt":null,"source":"Customer evidence log."},{"id":"conversion","label":"Conversion","rank":"secondary","unit":"%","definition":"Qualified opportunities that became a signed pilot or a paying customer, divided by qualified opportunities.","value":null,"measuredAt":null,"source":"Customer evidence log."},{"id":"churn","label":"Churn","rank":"secondary","unit":"%","definition":"Paying customers lost in the period divided by paying customers at period start.","value":null,"measuredAt":null,"source":"Billing system."},{"id":"retention","label":"Retention","rank":"secondary","unit":"%","definition":"100 − churn, measured on the same cohort.","value":null,"measuredAt":null,"source":"Derived from churn."},{"id":"gross-margin","label":"Gross margin","rank":"secondary","unit":"%","definition":"(Revenue − cost of delivering it: hosting, AI inference, support labour, implementation labour) ÷ revenue.","value":null,"measuredAt":null,"source":"Ledger plus infrastructure invoices."},{"id":"time-saved","label":"Time saved","rank":"secondary","unit":"hours","definition":"Hours per month a customer no longer spends on the workflow the product replaced, measured with the customer, not estimated for them.","value":null,"measuredAt":null,"source":"Customer measurement during pilot."},{"id":"implementation-speed","label":"Implementation speed","rank":"secondary","unit":"days","definition":"Calendar days from signed pilot to first real job processed through the software.","value":null,"measuredAt":null,"source":"Pilot log."},{"id":"cac","label":"CAC","rank":"derived","unit":"CAD","definition":"Sales and marketing cost in the period ÷ customers won in the period.","value":null,"measuredAt":null,"source":"Ledger."},{"id":"payback-period","label":"Payback period","rank":"derived","unit":"months","definition":"CAC ÷ (MRR per customer × gross margin).","value":null,"measuredAt":null,"source":"Derived."}]},"workflows":[{"id":"lead-response","name":"Lead response","leak":"Leads that wait hours go to whoever answered first; the cost is the whole job.","score":{"pain":null,"frequency":null,"budget":null,"urgency":null,"abilityToPay":null,"repeatability":null},"evidenceRefs":[],"rank":null},{"id":"estimating","name":"Estimating","leak":"Site visits and take-offs done by the most expensive person in the company, often for jobs that never close.","score":{"pain":null,"frequency":null,"budget":null,"urgency":null,"abilityToPay":null,"repeatability":null},"evidenceRefs":[],"rank":null},{"id":"quoting","name":"Quoting","leak":"Slow, inconsistent quotes; margin lost to guesswork and unpriced scope.","score":{"pain":null,"frequency":null,"budget":null,"urgency":null,"abilityToPay":null,"repeatability":null},"evidenceRefs":[],"rank":null},{"id":"scheduling","name":"Scheduling","leak":"Crews idle between jobs; customers rescheduled by phone; no view of capacity.","score":{"pain":null,"frequency":null,"budget":null,"urgency":null,"abilityToPay":null,"repeatability":null},"evidenceRefs":[],"rank":null},{"id":"dispatch","name":"Dispatch","leak":"Wrong crew, wrong materials, wrong site; drive time nobody bills.","score":{"pain":null,"frequency":null,"budget":null,"urgency":null,"abilityToPay":null,"repeatability":null},"evidenceRefs":[],"rank":null},{"id":"procurement","name":"Procurement","leak":"Materials ordered late or twice; pickup runs during billable hours.","score":{"pain":null,"frequency":null,"budget":null,"urgency":null,"abilityToPay":null,"repeatability":null},"evidenceRefs":[],"rank":null},{"id":"labor-utilization","name":"Labor utilization","leak":"Paid hours that are not on a job — the largest line in most trades.","score":{"pain":null,"frequency":null,"budget":null,"urgency":null,"abilityToPay":null,"repeatability":null},"evidenceRefs":[],"rank":null},{"id":"material-waste","name":"Material waste","leak":"Over-ordering, off-cuts, damaged stock, returns never processed.","score":{"pain":null,"frequency":null,"budget":null,"urgency":null,"abilityToPay":null,"repeatability":null},"evidenceRefs":[],"rank":null},{"id":"change-orders","name":"Change orders","leak":"Extra work done on a handshake and never invoiced.","score":{"pain":null,"frequency":null,"budget":null,"urgency":null,"abilityToPay":null,"repeatability":null},"evidenceRefs":[],"rank":null},{"id":"job-documentation","name":"Job documentation","leak":"Photos and notes on phones; disputes lost for lack of a record.","score":{"pain":null,"frequency":null,"budget":null,"urgency":null,"abilityToPay":null,"repeatability":null},"evidenceRefs":[],"rank":null},{"id":"customer-communication","name":"Customer communication","leak":"Status calls that interrupt the crew; reviews lost to silence after the job.","score":{"pain":null,"frequency":null,"budget":null,"urgency":null,"abilityToPay":null,"repeatability":null},"evidenceRefs":[],"rank":null},{"id":"invoicing","name":"Invoicing","leak":"Invoices sent days after completion, or not at all for small extras.","score":{"pain":null,"frequency":null,"budget":null,"urgency":null,"abilityToPay":null,"repeatability":null},"evidenceRefs":[],"rank":null},{"id":"collections","name":"Collections","leak":"Receivables ageing while the owner does the chasing personally.","score":{"pain":null,"frequency":null,"budget":null,"urgency":null,"abilityToPay":null,"repeatability":null},"evidenceRefs":[],"rank":null},{"id":"warranty","name":"Warranty","leak":"Callbacks with no record of what was installed, when, by whom.","score":{"pain":null,"frequency":null,"budget":null,"urgency":null,"abilityToPay":null,"repeatability":null},"evidenceRefs":[],"rank":null},{"id":"quality-control","name":"Quality control","leak":"Defects found by the customer instead of by a checklist before handover.","score":{"pain":null,"frequency":null,"budget":null,"urgency":null,"abilityToPay":null,"repeatability":null},"evidenceRefs":[],"rank":null}],"evidence":{"count":0,"byKind":{"conversation":0,"signed-pilot":0,"design-partnership":0,"paying-customer":0},"validated":0,"note":"Entries are described by industry and size; names stay out of the public index."},"roadmap":{"start":"2026-09-05","end":"2026-12-04","objectives":[{"id":"conversations","label":"Customer conversations","target":50,"counts":["conversation","signed-pilot","design-partnership","paying-customer"]},{"id":"qualified","label":"Qualified opportunities","target":10,"counts":[]},{"id":"design-partners","label":"Serious design partners","target":3,"counts":["design-partnership","paying-customer"]},{"id":"paying","label":"Paying customers","target":1,"counts":["paying-customer"]}],"ifMissed":"If there is no paying customer at the end of the period, change the wedge. Do not respond by writing more code.","period":{"total":90,"elapsed":0,"remaining":90,"over":false},"progress":[{"id":"conversations","label":"Customer conversations","target":50,"counts":["conversation","signed-pilot","design-partnership","paying-customer"],"current":0,"pct":0},{"id":"qualified","label":"Qualified opportunities","target":10,"counts":[],"current":0,"pct":0},{"id":"design-partners","label":"Serious design partners","target":3,"counts":["design-partnership","paying-customer"],"current":0,"pct":0},{"id":"paying","label":"Paying customers","target":1,"counts":["paying-customer"],"current":0,"pct":0}]},"decisions":[{"id":"D-001","date":"2026-09-05","title":"grimaldi.ca becomes the control and integration surface of the Operations cluster","status":"accepted","context":"Three strategic clusters, each owned by one agent. Agent 3 (Operations & Commercial Automation) had repositories, live sites and a mandate but no single place where registry, KPIs, decisions and cross-cluster contracts were visible together.","decision":"grimaldi.ca displays and orchestrates the Operations cluster: repository registry, KPI system, workflow ranking, evidence-counted roadmap, decision log, kill list, weekly CEO report, web-intelligence watchlist and versioned integration contracts, all typed content with a machine-readable index at /api/cluster/. The operator’s existing explainers and manuscripts remain on the site under /topics/ and /books/; the person moves to /about/.","consequences":"The site sells nothing itself. Every displayed number is either measured and sourced or shown as not yet measured. The site’s Person @id stays network-wide and unchanged.","requiresCeoApproval":true,"approvedBy":"Vincenzo Ceccarelli Grimaldi (CEO layer)"},{"id":"D-002","date":"2026-09-05","title":"Initial repository statuses assigned from the live inventory","status":"accepted","context":"The constitution allows exactly six statuses. A live inventory of the public GitHub account was taken on 2026-09-05; five repositories the mandate names were located, two (Runway Fuel, LogistiSync) were not.","decision":"ecowoods-app → CORE (proving ground). floorforge-ai, paintforge-ai, dryforge-ai → EXPERIMENT. bahn-project-manager → INTERNAL. Runway Fuel → INTERNAL (hypothesis, no code). Unlocated and capability-only names → INTERNAL with maturity not-located / hypothesis. grimaldi.ca → INTERNAL (control surface). No entry is ARCHIVE yet.","consequences":"Any status change from here is a new decision. Unlocated names must be resolved or archived within the first review cycle.","requiresCeoApproval":false,"approvedBy":null},{"id":"D-003","date":"2026-09-05","title":"Runway Fuel stays a hypothesis; no platform code is written","status":"accepted","context":"§6 of the mandate. Generic SaaS infrastructure without a customer-driven reason is forbidden.","decision":"No identity, organization, permission, workflow-engine or billing primitive is built as shared code until two independent paying customers require the same workflow. Until then, workflow code lives in the vertical that needs it.","consequences":"Some duplication between ecowoods-app and any second vertical is accepted deliberately. The registry records the duplicates so extraction can be evidence-driven later.","requiresCeoApproval":false,"approvedBy":null},{"id":"D-004","date":"2026-09-05","title":"The commercial wedge is not yet chosen","status":"proposed","context":"§4 requires one vertical, chosen where customers are cheapest to acquire and ROI is immediate — not by founder preference. Fact on file: flooring is the only vertical with a live proving ground (ecowoods-app) and a vertical experiment (FloorForge) sharing the same buyer. That is a starting position, not a decision.","decision":"Choose the wedge after the first batch of logged conversations produces at least one fully scored workflow in one vertical. The decision is recorded here with the evidence IDs that justify it.","consequences":"Until the wedge is chosen, no new vertical code is started. Interviews may run across all six candidate verticals.","requiresCeoApproval":true,"approvedBy":null},{"id":"D-005","date":"2026-09-05","title":"The Forge verticals belong to Operations, not Physical AI","status":"accepted","context":"FloorForge, PaintForge and DryForge sound like robotics. Agent 2’s mandate states they must not automatically become robotics products; they remain Operations unless actual physical robotic execution exists.","decision":"All three stay in this cluster as vertical experiments. A move to Physical AI requires the constitution’s documented cluster move: reason, commercial benefit, technical benefit, migration cost, dependency impact, CEO approval.","consequences":"The Forge sites are judged by signed pilots and revenue, not by simulation quality.","requiresCeoApproval":false,"approvedBy":null},{"id":"D-006","date":"2026-09-05","title":"Cross-cluster integration through versioned contracts only","status":"accepted","context":"§13–14 and the constitution. Coupling through shared databases would make each cluster depend on the others.","decision":"Contracts are documented at /cluster/contracts/ with a version, a producer, a consumer and a field-level schema. The first contract (OperationalEvent → WorkOrder → InspectionResult) is proposed, not implemented. No system may require another to function.","consequences":"Nothing is built on the contract until both counterparties have a customer reason. Shared infrastructure (auth, billing, observability…) is a separate, economic decision.","requiresCeoApproval":false,"approvedBy":null},{"id":"D-007","date":"2026-09-05","title":"The control room shows measured values or \"not yet measured\" — never placeholders","status":"accepted","context":"A KPI strip full of zeros or sample data trains the operator to ignore it. The Forge repositories already carry an explicit honesty policy; the control surface must not be weaker than the products it controls.","decision":"Every KPI value is null until measured, with a source named. Roadmap progress is counted from the evidence log, never typed. GitHub metadata is fetched, never hand-copied. The CI guard fails on a KPI with a value but no measurement date.","consequences":"The first version of the control room is visibly empty. That is the correct state of a cluster with zero logged conversations.","requiresCeoApproval":false,"approvedBy":null}],"killList":[],"reports":[],"agents":[{"id":"estimation","name":"Estimation agent","steps":["reads project information","identifies missing information","calculates the estimate","produces the assumptions","requests human approval"],"may":["read job files, photos and measurements the customer uploaded","read the price book","draft an estimate with every assumption listed","ask the estimator a question"],"mayNot":["send anything to a customer","change the price book","approve its own estimate","invent a measurement it does not have"],"approval":"The estimator approves or edits every estimate before it becomes a quote.","status":"specified"},{"id":"sales","name":"Sales agent","steps":["qualifies the lead","prepares the response","schedules the meeting","updates the CRM"],"may":["read inbound leads","draft a reply for review","propose meeting slots from the calendar","write structured fields to the CRM"],"mayNot":["send a reply without review during the pilot","commit to a price","promise a date","contact a lead that opted out"],"approval":"A human sends the first reply. Autonomy is widened only per template, per customer, by decision.","status":"specified"},{"id":"operations","name":"Operations agent","steps":["detects a delayed job","identifies the cause","proposes a schedule change","requests approval"],"may":["read the schedule and job status","read crew availability","propose a re-sequenced schedule with the trade-offs stated"],"mayNot":["move a job without approval","notify a customer","reassign a crew member","suppress a delay from the report"],"approval":"The dispatcher approves every schedule change.","status":"specified"},{"id":"finance","name":"Finance agent","steps":["identifies unpaid invoices","prioritizes collection","drafts the communication","records the outcome"],"may":["read receivables","rank by age and amount","draft a reminder in the company’s tone","record the outcome of a call a human made"],"mayNot":["send a reminder without approval","offer a discount or a payment plan","write off anything","contact a customer in dispute"],"approval":"The owner approves each communication; the agent never touches money.","status":"specified"}],"contracts":[{"id":"operational-event","name":"OperationalEvent","version":"0.1.0","status":"proposed","producer":"energy","consumer":"operations","summary":"Energy Intelligence (e.g. GridOS) detects an asset anomaly and emits an operational event. Operations (Runway Fuel or a vertical) may convert it into a work order.","schema":[{"field":"eventId","type":"string (UUID)","meaning":"Idempotency key; a consumer that sees it twice does nothing the second time."},{"field":"emittedAt","type":"string (RFC 3339)","meaning":"Producer clock, UTC."},{"field":"producer","type":"\"energy\"","meaning":"Cluster of origin. Fixed per contract."},{"field":"assetRef","type":"string (URI)","meaning":"Opaque reference into the producer’s asset registry. The consumer never resolves it against a shared database."},{"field":"kind","type":"\"anomaly\" | \"threshold\" | \"outage\" | \"maintenance-due\"","meaning":"Closed set; new kinds bump the minor version."},{"field":"severity","type":"\"info\" | \"warning\" | \"critical\"","meaning":"Producer’s assessment. The consumer decides what a work order is worth."},{"field":"summary","type":"string ≤ 280","meaning":"Human-readable, for the work-order title."},{"field":"evidenceUrl","type":"string (URL) | null","meaning":"Where the producer keeps the detail. Optional; the event is complete without it."}],"independence":"Energy runs with no consumer subscribed. Operations runs with no producer: work orders are also created by hand and by the verticals’ own triggers."},{"id":"work-order","name":"WorkOrder","version":"0.1.0","status":"proposed","producer":"operations","consumer":"physical-ai","summary":"Operations issues a work order — an inspection, a pick, a paint pass — that Physical AI may execute with its own planning, simulation, safety and authorization chain. Operations never commands an actuator.","schema":[{"field":"workOrderId","type":"string (UUID)","meaning":"Idempotency key."},{"field":"createdAt","type":"string (RFC 3339)","meaning":"Operations clock, UTC."},{"field":"originEventId","type":"string (UUID) | null","meaning":"The OperationalEvent that caused it, if any."},{"field":"task","type":"\"inspection\" | \"palletize\" | \"surface-finish\" | \"other\"","meaning":"Closed set of task families Physical AI recognizes."},{"field":"siteRef","type":"string (URI)","meaning":"Opaque site or cell reference."},{"field":"window","type":"{ notBefore, notAfter }","meaning":"Execution window. Outside it the order expires without action."},{"field":"approval","type":"{ approvedBy, approvedAt }","meaning":"A human approved the order in Operations. Required; a work order without approval is invalid by schema."},{"field":"callbackUrl","type":"string (URL)","meaning":"Where the result is delivered. Operations polls if the callback fails."}],"independence":"Physical AI accepts work orders from any source including a human console. Operations keeps a work order in state \"awaiting-executor\" indefinitely if no executor exists."},{"id":"inspection-result","name":"InspectionResult","version":"0.1.0","status":"proposed","producer":"physical-ai","consumer":"energy","summary":"Physical AI returns the result of an executed work order. Energy Intelligence attaches it to the asset that raised the original event. Operations receives a copy to close the work order.","schema":[{"field":"resultId","type":"string (UUID)","meaning":"Idempotency key."},{"field":"workOrderId","type":"string (UUID)","meaning":"The WorkOrder executed."},{"field":"completedAt","type":"string (RFC 3339)","meaning":"Executor clock, UTC."},{"field":"outcome","type":"\"completed\" | \"partial\" | \"aborted\" | \"failed-safe\"","meaning":"Closed set. \"failed-safe\" means the safety chain stopped execution — always reported, never hidden."},{"field":"findings","type":"Finding[]","meaning":"Each with classification, localization and confidence. Empty array is a valid result."},{"field":"evidence","type":"Artefact[]","meaning":"Images, point clouds, logs, by URL with hash."},{"field":"interventions","type":"number","meaning":"Human interventions during execution. A KPI for Physical AI; a cost input for Operations."}],"independence":"Energy treats a missing result as \"no inspection performed\" and keeps its own anomaly open. Operations closes work orders manually if no executor reports."}],"watchlist":[{"id":"servicetitan","name":"ServiceTitan","kind":"competitor","url":"https://www.servicetitan.com/","why":"The incumbent field-service and trades platform at the top of the market; its pricing and complaints define what \"too heavy\" means for a small contractor.","lastReviewed":null,"findings":[]},{"id":"jobber","name":"Jobber","kind":"competitor","url":"https://getjobber.com/","why":"The default for small home-service and trades businesses in Canada; the most likely current software of a GTA contractor interviewed for this cluster.","lastReviewed":null,"findings":[]},{"id":"housecall-pro","name":"Housecall Pro","kind":"competitor","url":"https://www.housecallpro.com/","why":"Direct competitor to Jobber in the same segment; its feature releases show which workflows small contractors ask for.","lastReviewed":null,"findings":[]},{"id":"contractor-software","name":"Contractor software (category)","kind":"category","url":null,"why":"Buildertrend, Procore-for-small-firms and trade-specific tools. Where a specialty contractor goes when the field-service tools are too generic.","lastReviewed":null,"findings":[]},{"id":"erp","name":"ERP products for trades and industrial service","kind":"category","url":null,"why":"The ceiling of the market: what a customer migrates to when they outgrow a vertical tool, and what they hate about it.","lastReviewed":null,"findings":[]},{"id":"ai-native-vertical-saas","name":"AI-native vertical SaaS","kind":"category","url":null,"why":"New entrants that start from an agent rather than a form. They set buyer expectations for estimation and lead-response agents.","lastReviewed":null,"findings":[]},{"id":"reddit-trades","name":"Reddit and trade forums","kind":"community","url":null,"why":"Unfiltered complaints from owners and estimators about their software and their paperwork — the raw material of §3.","lastReviewed":null,"findings":[]},{"id":"trade-publications","name":"Trade publications","kind":"community","url":null,"why":"Flooring, painting, drywall and field-service press: pricing changes, acquisitions, labour statistics.","lastReviewed":null,"findings":[]},{"id":"search-trends","name":"Search trends for workflow queries","kind":"signal","url":null,"why":"\"Best software for X workflow\" queries by vertical — what §12 must be discoverable for.","lastReviewed":null,"findings":[]},{"id":"marketplaces","name":"Relevant marketplaces","kind":"signal","url":null,"why":"HomeStars, Houzz and similar: where contractor leads originate and how response time is judged.","lastReviewed":null,"findings":[]},{"id":"ai-capabilities","name":"New AI capabilities","kind":"signal","url":null,"why":"Model and tool changes that make an estimation, sales, operations or finance agent cheaper or safer to run under explicit permissions.","lastReviewed":null,"findings":[]}],"pages":{"home":"https://grimaldi.ca/","architecture":"https://grimaldi.ca/cluster/","mandate":"https://grimaldi.ca/cluster/mandate/","registry":"https://grimaldi.ca/cluster/registry/","kpi":"https://grimaldi.ca/cluster/kpi/","workflows":"https://grimaldi.ca/cluster/workflows/","roadmap":"https://grimaldi.ca/cluster/roadmap/","decisions":"https://grimaldi.ca/cluster/decisions/","reports":"https://grimaldi.ca/cluster/reports/","agents":"https://grimaldi.ca/cluster/agents/","contracts":"https://grimaldi.ca/cluster/contracts/","intelligence":"https://grimaldi.ca/cluster/intelligence/","knowledge":"https://grimaldi.ca/api/knowledge/","llms":"https://grimaldi.ca/llms.txt"}}