PageSourceSearch

https://builderforce.ai/_next/static/chunks/18128-03737051030739e8.js

js builderforce.ai collected 2026-09-29 08:15:07 UTC 84,354 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[18128],{10371:(e,t,n)=>{n.d(t,{$G:()=>u,$V:()=>l,ID:()=>h,OW:()=>c,aI:()=>d,nB:()=>i,uD:()=>s});var a=n(76044),r=n(82713);let i="idea",o=["captured","exploring","validating"];function s(e){let t=e.testedBy,n=Array.isArray(t)?t:"string"==typeof t?t.split(","):[],a=new Set,i=[];for(let e of n){let t="string"==typeof e?e.trim():"",n=(0,r.ip)(t);!n||a.has(n)||(a.add(n),i.push(t))}return i}function l(e,t){let n=s(e),a=(0,r.ip)(t);return a&&!n.some(e=>(0,r.ip)(e)===a)?[...n,t.trim()]:n}function d(e){var t;let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:new Date,a=e.trim();if(!a)return null;let r=null!=(t=a.split(/\r?\n/).map(e=>e.trim()).find(Boolean))?t:a;return{title:r.length>80?"".concat(r.slice(0,79).trimEnd(),"…"):r,scratch:a,stage:"captured",capturedAt:n.toISOString()}}function h(e){let t=e.filter(e=>e.data.kind===i).map((e,t)=>{var n;return{index:t,entry:{id:e.id,data:e.data,stage:(n=e.data,(0,a.U1x)(n.stage)?n.stage:"captured"),capturedAt:function(e){let t="string"==typeof e.capturedAt?e.capturedAt.trim():"";return t&&Number.isFinite(Date.parse(t))?t:null}(e.data),testedBy:s(e.data)}}});return t.sort((e,t)=>{let n=e.entry.capturedAt?Date.parse(e.entry.capturedAt):null,a=t.entry.capturedAt?Date.parse(t.entry.capturedAt):null;return null!==n&&null!==a&&n!==a?a-n:null===n&&null!==a?1:null!==n&&null===a?-1:e.index-t.index}),t.map(e=>{let{entry:t}=e;return t})}function c(e){let t=Object.fromEntries(a.Md3.map(e=>[e,0]));for(let n of e)t[n.stage]+=1;return t}function u(e){return e.filter(e=>o.includes(e.stage)&&0===e.testedBy.length).length}},18128:(e,t,n)=>{n.d(t,{El:()=>o,MG:()=>c,Rv:()=>d,XL:()=>i,eC:()=>s,mS:()=>l,r3:()=>h,zq:()=>r.zq});var a=n(65644),r=n(53911);let i=e=>(0,a.AT)("/api/legal-documents/".concat(encodeURIComponent(e))).then(e=>e.document),o=(e,t)=>(0,a.AT)("/api/legal-documents/".concat(encodeURIComponent(e),"/share"),{method:"POST",body:JSON.stringify(t)}),s=e=>(0,a.AT)("/api/legal-documents/shares/".concat(encodeURIComponent(e),"/revoke"),{method:"POST"}),l=(e,t)=>(0,a.AT)("/api/legal-documents/".concat(encodeURIComponent(e),"/request-signature"),{method:"POST",body:JSON.stringify(t)}),d=e=>(0,a.AT)("/api/public/legal-documents/".concat(encodeURIComponent(e))).then(e=>e.document);function h(e){return"".concat((0,a.hY)(),"/api/public/legal-documents/").concat(encodeURIComponent(e),"/download")}async function c(e,t){let n=new FormData;return n.append("file",e),n.append("title",t.title),t.category&&n.append("category",t.category),null!=t.entityId&&n.append("entityId",String(t.entityId)),null!=t.matterId&&n.append("matterId",String(t.matterId)),null!=t.ipId&&n.append("ipId",String(t.ipId)),t.objectId&&n.append("objectId",t.objectId),t.documentId&&n.append("documentId",t.documentId),(0,a.AT)("/api/legal-documents",{method:"POST",body:n})}},20463:(e,t,n)=>{n.d(t,{BR:()=>c,Di:()=>p,GV:()=>d,JZ:()=>l,Mq:()=>m,Qw:()=>g,T1:()=>h,Ym:()=>s,eh:()=>u,i2:()=>o});var a=n(76044);function r(e){return[...e].sort((e,t)=>e-t)}function i(e){return Number(e.toFixed(6))}function o(e){if(!e.length)return null;let t=0;for(let n of e)t+=n;return i(t/e.length)}function s(e,t){if(!e.length)return null;let n=r(e);if(1===n.length)return i(n[0]);let a=Math.min(1,Math.max(0,t))*(n.length-1),o=Math.floor(a),s=Math.ceil(a);return o===s?i(n[o]):i(n[o]+(n[s]-n[o])*(a-o))}function l(e){return s(e,.5)}function d(e){if(e.length<2)return null;let t=e.reduce((e,t)=>e+t,0)/e.length,n=0;for(let a of e)n+=(a-t)**2;return i(n/(e.length-1))}function h(e){let t=d(e);return null==t?null:i(Math.sqrt(t))}function c(e,t){let n=Math.min(e.length,t.length);if(n<2)return null;let a=0,r=0;for(let i=0;i<n;i+=1)a+=e[i],r+=t[i];let o=a/n,s=r/n,l=0,d=0,h=0;for(let a=0;a<n;a+=1){let n=e[a]-o,r=t[a]-s;l+=n*r,d+=n*n,h+=r*r}return d<=0||h<=0?null:i(l/Math.sqrt(d*h))}function u(e){if(!e.length)return null;let t=r(e),n=s(t,.25),a=s(t,.75),l=i(a-n);return{count:t.length,mean:o(t),stddev:h(t),min:i(t[0]),q1:n,median:s(t,.5),q3:a,max:i(t[t.length-1]),iqr:l,outlierLow:i(n-1.5*l),outlierHigh:i(a+1.5*l)}}function m(e){var t;if(!e.length)return null;let n=new Map;for(let a of e)n.set(a,(null!=(t=n.get(a))?t:0)+1);let a=null,r=0;for(let[e,t]of n)(t>r||t===r&&null!=a&&e<a)&&(a=e,r=t);return null==a?null:i(a)}function p(e){let t=(0,a.Di_)(e);return t?{slope:i(t.slope),intercept:i(t.intercept),r2:i(t.r2)}:null}function g(e){let t=o(e),n=h(e);return null==t||null==n||0===n?e.map(()=>0):e.map(e=>i((e-t)/n))}},47440:(e,t,n)=>{function a(e){return Number(e.toFixed(6))}n.d(t,{NN:()=>b,b$:()=>D,JY:()=>_,wA:()=>w,iS:()=>A}),n(20463);let r={.8:1.281552,.9:1.644854,.95:1.959964,.99:2.575829};function i(e){var t;return null!=(t=r[e])?t:r[.95]}function o(e){let t=Math.abs(e)/Math.SQRT2,n=1/(1+.3275911*t);return .5*(1+(e<0?-1:1)*(1-((((1.061405429*n-1.453152027)*n+1.421413741)*n-.284496736)*n+.254829592)*n*Math.exp(-t*t)))}var s=n(1184),l=n(76044),d=n(82713),h=n(58716),c=n(10371);let u="creationCanvas.founder",m='A human-readable amount including its currency and any qualifier the source actually carried, e.g. "$1.2M ARR (2025 estimate)" or "not disclosed". Never invent a precise figure — it is parsed into a real number for totals, and "not disclosed" is preserved as undisclosed rather than counted as zero.',p='A plain 
1number in major units (dollars, not cents) — no symbols, no "k"/"M" suffix, no commas. The currency lives in the `currency` field so this object can be totalled and consolidated. Leave it empty rather than estimating.',g={name:"currency",render:"stat",label:"currency",hint:'ISO-4217 code for every amount on this object, e.g. "USD", "EUR", "GBP". One currency per object — a mixed-currency total is refused rather than silently added.'},b="The legal name of the counterparty, as it appears on the paperwork. Where an `account` object for them is on this board, use that account's title verbatim — it is the ONE object every commercial reference points at, so matching it is what joins this to their other invoices, their contract and their renewal. Author the account first if it is missing.";function f(e,t){var n;let a="string"==typeof e?e.trim():"";if(!a)return null;let r=t.byRef("account",a);if(r)return r;let i=a.toLowerCase();return null!=(n=t.ofKind("account").find(e=>(Array.isArray(e.alsoKnownAs)?e.alsoKnownAs:[]).some(e=>"string"==typeof e&&e.trim().toLowerCase()===i)))?n:null}function w(e,t,n){return(0,s.CD)(e,"percent").counted?(0,s.CD)([...e,{percent:n>0?t/n*100:0}],"percent"):null}function y(e){let{name:t,label:n,sourceField:a,targetKind:r,hint:i,resolve:o,describe:s}=e;return{name:t,render:"verdict",label:n,hint:i,derived:!0,derive:(e,t)=>{let n="string"==typeof e[a]?e[a].trim():"";if(!n)return;let i=o?o(n,t):t.byRef(r,n),l=i?s(i,e,t):v("boardRef.notFound",{kind:r,ref:n});return Array.isArray(l)?l.map(k):k(l)}}}function v(e,t){return(0,h.l7)(e,t,u)}function k(e){return e.namespace?e:{...e,namespace:u}}function A(e){return y({name:"".concat(e,"Account"),label:"counterpartyAccount",sourceField:e,targetKind:"account",hint:"READ-ONLY. Resolved automatically by matching `".concat(e,"` against the `account` objects on this board — never author it directly."),resolve:f,describe:(t,n)=>{let a="string"==typeof n[e]?n[e].trim():"",r="string"==typeof t.title&&t.title.trim()?t.title.trim():a,i="string"==typeof t.relationship&&t.relationship?t.relationship:"contact",o="string"==typeof t.owner?t.owner.trim():"";return o?v("counterparty.linkedOwned",{title:r,relationship:i,owner:o}):v("counterparty.linked",{title:r,relationship:i})}})}let S=["reference","obligation","kind","owner","due","cadence","amount","status"],T={receivable:"invoice",payable:"bill"};function I(e){let t=String(null!=e?e:"").trim().toLowerCase();return"none"===t?"once":t}function O(e){for(let t of["invoiceNumber","reference","title"]){let n=e[t];if("string"==typeof n&&n.trim())return n.trim()}return v("fallback.untitledDocument")}function x(e){let{host:t,cadenceSource:n}=e;return y({name:"contractObligation",label:"contractObligation",sourceField:"contractRef",targetKind:"contract",hint:"READ-ONLY. Resolved by matching `contractRef` to a `contract` on this board and `obligationRef` to one of its obligation rows, then comparing what this ".concat(t," actually says against what was agreed. Never author it — and never treat its silence as approval: a ").concat(t," with no `contractRef` draws nothing here at all, which is the state to fix rather than the state to trust."),describe:(e,a)=>{var r,i;let o=function(e){let t="string"==typeof e.title?e.title.trim():"",n="string"==typeof e.reference?e.reference.trim():"";return t||n||v("fallback.thisContract")}(e),s=(0,d.$k)(e.obligations),l=(0,d.ip)(a.obligationRef);if(!l){let e=s.map(e=>{var t;return String(null!=(t=e.reference)?t:"").trim()}).filter(Boolean);return e.length?v("obligation.noRef",{contract:o,available:e}):v("obligation.noReferences",{contract:o,host:t})}let h=s.find(e=>(0,d.ip)(e.reference)===l);if(!h)return v("obligation.unknownRef",{contract:o,ref:String(a.obligationRef).trim(),host:t});let c=String(null!=(i=null!=(r=h.obligation)?r:h.reference)?i:"").trim()||l,u=[],m=[],p=(0,d.Dc)(h.amount),g=(0,d.Dc)(a.amount);void 0!==p&&void 0!==g&&(m.push(v("obligation.axis.amount")),Math.abs(p-g)>.01&&u.push(v("obligation.problem.amount",{actual:g,agreed:p})));let b=(0,d.J3)(h.due,a.dueAt);if(void 0!==b&&(m.push(v("obligation.axis.date")),0!==b&&u.push(v("obligation.problem.date",{days:Math.abs(b),direction:b>0?"after":"before",due:String(h.due).trim()}))),n){let e=I(h.cadence),t=I(a[n]);
1e&&t&&(m.push(v("obligation.axis.cadence")),e!==t&&u.push(v("obligation.problem.cadence",{actual:t,agreed:e})))}return u.length?v("obligation.mismatch",{obligation:c,contract:o,problems:u,host:t}):m.length?v("obligation.discharged",{obligation:c,contract:o,checked:m,count:m.length}):v("obligation.linkedOnly",{obligation:c,contract:o})}})}function E(e){return{name:"contractRef",render:"stat",label:"contractRef",hint:"The `reference` of the `contract` this ".concat(e," is raised under — its reference verbatim, or its title where it has no reference yet. This is an EXPLICIT binding and not a guess: never infer it from the counterparty matching a contract's counterparty, because two agreements with one company is the normal case and the wrong one would be charged. Leave it empty for a ").concat(e," that genuinely has no contract behind it, which is itself worth saying out loud.")}}function R(e){return{name:"obligationRef",render:"stat",label:"obligationRef",hint:"The `reference` of the obligation row on that contract this ".concat(e," discharges — one of the values in the contract's own `obligations` table. Without it the ").concat(e,' is joined to the contract and to none of its clauses, so "has the support fee been billed this quarter" stays unanswerable.')}}let _=[{kind:"company",icon:"⌂",group:"Insights",defaultStatus:"describeBusiness",actions:["sync","research"],fields:[{name:"legalName",render:"stat",label:"legalName",hint:"Registered legal name, if it differs from the trading name in the title."},{name:"sector",render:"stat",label:"sector",hint:"The industry the business actually sells into, in the words its buyers use."},{name:"stage",render:"stat",label:"stage",hint:"idea | pre-seed | seed | series-a | growth | profitable."},{name:"headcount",render:"stat",label:"headcount",hint:"Current full-time-equivalent headcount as an integer."},{name:"arr",render:"stat",label:"arr",hint:m},{name:"website",render:"stat",label:"website",hint:"Primary marketing domain."},{name:"geography",render:"chips",label:"geography",hint:'Markets served today, most important first, e.g. ["Florida", "Georgia"]. This is what a geographic analysis is scoped against.'},{name:"offerings",render:"list",label:"offerings",hint:"What the business sells: [{title, detail}] where detail names who it is for and what it costs."},{name:"differentiators",render:"chips",label:"differentiators",hint:"The reasons a customer picks this business over the obvious alternative. Specific and checkable, never adjectives."},d.wZ,d.IS]},{kind:"competitor",icon:"⚔",group:"Insights",defaultStatus:"researching",actions:["research","map","battlecard"],fields:[{name:"website",render:"stat",label:"website",hint:"Primary domain. Use it to verify every other claim."},{name:"headquarters",render:"stat",label:"headquarters",hint:"City, state of the head office."},{name:"estimatedRevenue",render:"stat",label:"estimatedRevenue",hint:m},{name:"employeeRange",render:"stat",label:"employeeRange",hint:'Reported headcount band, e.g. "50-200".'},{name:"positioning",render:"text",label:"positioning",hint:"How they describe themselves to a buyer, close to their own words."},{name:"locations",render:"rows",label:"locations",columns:["name","city","region","lat","lng"],hint:"Physical presence, one row per site: {name, city, region, lat, lng}. `lat`/`lng` are decimal degrees — resolve them with builtin_geo_geocode and never estimate them, because canvas_map_competitors plots these coordinates and a guessed one puts a rival in the ocean."},{name:"pricingModel",render:"text",label:"pricingModel",hint:'How they charge, with real figures where published, and "not published" where not.'},{name:"strengths",render:"chips",label:"strengths",hint:"What they genuinely do well. A competitor analysis with no strengths listed is flattery, not analysis."},{name:"weaknesses",render:"chips",label:"weaknesses",hint:"Verifiable gaps — from reviews, pricing pages, coverage maps. These become the wedge in a battlecard, so a soft one wastes the whole strategy."},{name:"segmentsServed",render:"chips",label:"segmentsServed",hint:"Which customer segments they actually serve today."},d.wZ,d.IS]},{kind:"customerSegment",icon:"◕",group:"Insights",defaultStatus:"sizing",actions:["size","target"],fields:[{name:"sizeEstimate",render:"stat",label:"sizeEstimate",hint:'How many buyers are in this segment, with the basis in brackets, e.g. "~4,200 firms (FL SoS registrations, 2025)".'},{name:"valueEstimate",render:"stat",label:"valueEstimate",hint:m},{name:"fitScore",render:"meter",label:"fitScore",hint:"0-100: how well this segment matches what the company can actually deliver today. Justify it in `summary`."},{name:"geography",render:"chips",label:"geography",hint:'Where these buyers are, specific enough to act on — metro areas, not "the south".'},{name:"pains",render:"list",label:"pains",hint:"The problems that make them buy: [{title, detail}]. Sourced from interviews or reviews wherever possible."},{name:"buyingTriggers",render:"chips",label:"buyingTriggers",hint:"Events that start a purchase — a renewal, a regulation, a hire, an outage."},{name:"channels",render:"chips",label:"channels",hint:"Where this segment can actually be reached. Must be consistent with the linked gtmPlan."},{name:"currentProvider",render:"chips",label:"currentProvider",hint:"Who they buy from today. Naming a competitor here is what makes a switch strategy targetable."},d.wZ,d.IS]},{kind:"gtmPlan",icon:"➤",group:"Work",defaultStatus:"draft",actions:["review","plan"],fields:[{name:"motion",render:"stat",label:"motion",hint:"The dominant motion: self-serve | inside-sales | field-sales | partner-led | community-led."},{name:"salesCycleDays",render:"stat",label:"salesCycleDays",hint:"Typical days from first touch to closed-won, as an integer."},{name:"targetCac",render:"stat",label:"targetCac",hint:m},{name:"targetLtv",render:"stat",label:"targetLtv",hint:m},{name:"segments",render:"chips",label:"segments",hint:"Titles of the customerSegment objects this plan targets. Keep them identical to the segment titles on the board so the two objects stay joined."},{name:"channels",render:"rows",label:"channels",columns:["channel","motion","cost","expected"],hint:"One row per channel: {channel, motion, cost, expected}. `expected` is the outcome you would call success."},{name:"offer",render:"text",label:"offer",hint:"The specific offer that opens a conversation — the thing said in the first message, not the value proposition."},{name:"proofPoints",render:"chips",label:"proofPoints",hint:"Evidence a sceptical buyer would accept: named customers, measured outcomes, certifications."},d.wZ,d.IS]},{kind:"battlecard",icon:"⛊",group:"Work",defaultStatus:"draft",actions:["review","deliver"],fields:[{name:"againstCompetitor",render:"stat",label:"againstCompetitor",hint:"The exact title of the competitor object this card is written against. A battlecard with no named rival is a positioning doc."},{name:"wedge",render:"verdict",label:"wedge",hint:"The ONE weakness being attacked, in a sentence. This is the whole strategy; everything else supports it."},{name:"targetSegments",render:"chips",label:"targetSegments",hint:"Which of their customers to go after first — the segments where the wedge bites hardest."},{name:"switchTriggers",render:"chips",label:"switchTriggers",hint:"Moments when their customer is reachable: renewal dates, price rises, outages, acquisitions."},{name:"talkTrack",render:"list",label:"talkTrack",hint:"What to actually say: [{title, detail}] where title is the situation and detail is the line."},{name:"objections",render:"rows",label:"objections",columns:["objection","response","evidence"],hint:"One row per likely objection: {objection, response, evidence}. `evidence` must be something that exists."},{name:"switchOffer",render:"text",label:"switchOffer",hint:"The concrete offer that lowers the cost of switching — migration help, overlap credit, a pilot."},{name:"doNotSay",render:"chips",label:"doNotSay",hint:"Claims that are untrue, unprovable, or legally risky. A battlecard without this list gets someone in trouble."},d.wZ,d.IS]},{kind:"idea",icon:"✎",group:"Insights",defaultStatus:"captured",actions:["explore","test"],fields:[{name:"stage",render:"stat",label:"stage",bookkeeping:!0,hint:"Where the idea is: ".concat(l.Md3.join(" | "),'. Move it forward only on evidence — `validated` means a linked interview or experiment said yes, not that the idea feels good. `parked` is "not now", `dropped` is "the evidence said no", `promoted` is "it became something" (name what in `promotedTo`).')},{name:"scratch",render:"text",label:"scratch",hint:"The idea as it was first written down, in the person's own words — half-formed is correct. APPEND new thoughts below rather than rewriting it: the scratch is the record of how the idea started, and the tidied version belongs in `problem` and `summary`."},{name:"problem",render:"verdict",label:"problem",hint:'The problem this solves, as "who is hurting, and how" — specific enough that you could go and find that person this week. An idea with 
1no problem is a feature looking for a customer.'},{name:"segment",render:"stat",label:"segment",hint:"Title of the customerSegment this idea is for, verbatim, where one is on the board."},{name:"riskiestAssumptions",render:"chips",label:"riskiestAssumptions",hint:"What must be true for this to work, riskiest first. Each one should be something a customer interview or an experiment could prove wrong."},{name:"nextStep",render:"stat",label:"nextStep",hint:'The ONE cheapest thing that would teach the most next, e.g. "Interview 5 ops directors about scheduling". Never "build an MVP" — building is what the evidence earns.'},{name:"testedBy",render:"chips",label:"testedBy",hint:"Titles of the `customerInterview` and `experiment` objects on this board that tested this idea, verbatim. This is what `evidence` counts — an interview not named here does not count for this idea."},{name:"evidence",render:"verdict",label:"evidence",hint:'COMPUTED. How many of the `testedBy` refs resolve to a `customerInterview` or `experiment` on this board, and which do not. "Untested" is a real and common answer — it is the reason to plan an interview, not a reason to invent one.',derive:(e,t)=>{let n=(0,c.uD)(e);if(!n.length)return(0,h.l7)("idea.untested");let a=0,r=0,i=[];for(let e of n)t.byRef("customerInterview",e)?a+=1:t.byRef("experiment",e)?r+=1:i.push(e);let o=[];return a+r>0&&o.push((0,h.l7)("idea.tested",{interviews:a,experiments:r})),i.length&&o.push((0,h.l7)("idea.missing",{refs:i})),1===o.length?o[0]:o}},{name:"promotedTo",render:"stat",label:"promotedTo",hint:"What the idea became once `stage` is `promoted` — the title of the project, company or proof it turned into. Empty until then."},{name:"capturedAt",render:"stat",label:"capturedAt",bookkeeping:!0,hint:"ISO date-time the idea was first written down. Set by the canvas when it is captured; never backdate it."},d.wZ,d.IS]},{kind:"customerInterview",icon:"☏",group:"People",defaultStatus:"scheduled",actions:["record","synthesize"],fields:[{name:"participant",render:"stat",label:"participant",hint:'Role and company of the person, e.g. "Ops Director, mid-size FL contractor". Use a role rather than a name unless consent to record it is explicit.'},{name:"segment",render:"stat",label:"segment",hint:"Title of the customerSegment this person belongs to."},{name:"heldAt",render:"stat",label:"heldAt",hint:"ISO date the conversation happened."},{name:"questions",render:"list",label:"questions",hint:"What was asked and what came back: [{title, detail}]."},{name:"painsHeard",render:"chips",label:"painsHeard",hint:"Problems the participant raised UNPROMPTED. These are worth more than answers to your own questions, so keep them separate."},{name:"quotes",render:"list",label:"quotes",hint:"Verbatim lines worth reusing. Never paraphrase into a quote."},{name:"verdict",render:"verdict",label:"verdict",hint:"What this conversation changed: confirmed, contradicted, or left the assumption untested."},d.wZ,d.IS]},{kind:"experiment",icon:"⚗",group:"Data",defaultStatus:"designing",actions:["run","evaluate"],fields:[{name:"hypothesis",render:"verdict",label:"hypothesis",hint:'"If we <change>, then <metric> moves <direction> because <reason>." An experiment without a falsifiable hypothesis is a change.'},{name:"primaryMetric",render:"stat",label:"primaryMetric",hint:"The ONE metric that decides it. Naming two is how an experiment is declared a success afterwards."},{name:"sampleSize",render:"stat",label:"sampleSize",hint:"Units observed, as an integer."},{name:"result",render:"stat",label:"result",hint:"The measured outcome, with its confidence where one was computed."},{name:"abTestKey",render:"stat",label:"abTestKey",hint:"The `ab_tests.key` this experiment is bound to. When set, `variants` is REPLACED by the live split's own exposure and conversion counts on every refresh and must not be hand-edited. Empty means the numbers below were typed, which `evidence` will say out loud.",bookkeeping:!0},{name:"trafficAllocation",render:"rows",label:"trafficAllocation",columns:["variant","percent"],hint:"How traffic is split, one row per arm. Written by the binding from `ab_test_variants.traffic_percent`; on an unbound experiment it is the allocation you INTEND, which is worth recording because an intended 50/50 that ran 90/10 is the most common reason a result is wrong.",derived:!0}
1,{name:"variants",render:"rows",label:"variants",columns:["variant","exposure","conversion","lift"],hint:"One row per variant: {variant, exposure, conversion, lift}. The FIRST row is the control — every other row is tested against it. On a BOUND experiment these are the live split's counts and are overwritten on refresh; on an unbound one they are authored."},{name:"evidence",render:"verdict",label:"evidence",hint:"COMPUTED. Where the numbers under this experiment came from. An experiment nobody bound to a live split is a report, and saying so on the card is the difference between a measurement and a claim.",derive:e=>{var t;let n=String(null!=(t=e.abTestKey)?t:"").trim();if((0,d.$k)(e.variants).length)return n?(0,h.l7)("evidence.bound",{key:n}):(0,h.l7)("evidence.authored")}},{name:"significance",render:"verdict",label:"significance",hint:"COMPUTED. Whether each variant beats the control by more than noise, with its p-value and interval.",derive:e=>{let t=(0,d.$k)(e.variants);if(t.length<2)return;let n=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:.95,n=e.map((e,t)=>{var n;return{variant:(null!=(n=e.variant)?n:"").toString().trim()||"Variant ".concat(t+1),exposure:Number.isFinite(e.exposure)?Math.max(0,Math.trunc(e.exposure)):0,conversion:Number.isFinite(e.conversion)?Math.max(0,Math.trunc(e.conversion)):0}}),r=n[0];return n.map((e,n)=>({...e,rate:e.exposure>0?a(e.conversion/e.exposure):null,interval:function(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:.95;if(!Number.isFinite(e)||!Number.isFinite(t)||t<=0||e<0||e>t)return null;let r=i(n),o=e/t,s=1+r*r/t,l=(o+r*r/(2*t))/s,d=r*Math.sqrt(o*(1-o)/t+r*r/(4*t*t))/s;return{low:a(Math.max(0,l-d)),high:a(Math.min(1,l+d)),level:n}}(e.conversion,e.exposure,t),control:0===n,test:0!==n&&r?function(e,t,n,r){let s=arguments.length>4&&void 0!==arguments[4]?arguments[4]:.95;if(t<=0||r<=0||e<0||n<0||e>t||n>r)return null;let l=e/t,d=n/r,h=d-l,c=(e+n)/(t+r),u=Math.sqrt(c*(1-c)*(1/t+1/r)),m=u>0?h/u:0,p=a(2*(1-o(Math.abs(m)))),g=i(s),b=Math.sqrt(l*(1-l)/t+d*(1-d)/r),f=g*b,w=b>0?a(Math.min(1,Math.max(0,1-o(g-Math.abs(h)/b)+o(-g-Math.abs(h)/b)))):0,y=0!==h?Math.ceil(7.848861702723998*(l*(1-l)+d*(1-d))/h**2):null;return{baseRate:a(l),variantRate:a(d),absoluteLift:a(h),relativeLift:l>0?a(h/l):null,zScore:a(m),pValue:p,interval:{low:a(h-f),high:a(h+f),level:s},significant:p<1-s,power:w,requiredSampleSize:null!=y&&Number.isFinite(y)?y:null}}(r.conversion,r.exposure,e.conversion,e.exposure,t):null}))}(t),r=n[0];if(!r||null==r.rate)return;let s=n.slice(1).filter(e=>e.test);if(!s.length)return;let l=s.map(e=>{var t;let n=e.test,a=n.absoluteLift>=0?"up":"down",r=Math.abs(Math.round(1e3*n.absoluteLift)/10),i=String(null!=(t=e.variant)?t:""),o=String(n.pValue);return n.significant?(0,h.l7)("significance.real",{variant:i,direction:a,points:r,p:o,low:Math.round(1e3*n.interval.low)/10,high:Math.round(1e3*n.interval.high)/10}):(0,h.l7)("significance.noise",{variant:i,p:o})});return s.some(e=>e.test.significant)?l:[(0,h.l7)("significance.nothingYet"),...l]}},{name:"verdict",render:"verdict",label:"verdict",hint:'shipped | rejected | inconclusive, and the reason. "Inconclusive" is a real and common answer.'},d.wZ,d.IS]},{kind:"decision",icon:"⚖",group:"Work",defaultStatus:"open",actions:["decide","revisit"],fields:[{name:"question",render:"verdict",label:"question",hint:"The decision being made, as a question with a real fork in it."},{name:"chosen",render:"stat",label:"chosen",hint:"The option taken. Empty while the decision is still open."},{name:"decidedBy",render:"stat",label:"decidedBy",hint:"Who actually decided."},{name:"decidedAt",render:"stat",label:"decidedAt",hint:"ISO date."},{name:"reversibility",render:"stat",label:"reversibility",hint:"one-way | reversible | cheap-to-reverse. This is what says how much deliberation the decision deserved."},{name:"options",render:"rows",label:"options",columns:["option","upside","risk","cost"],hint:"Every option considered, including the ones rejected: {option, upside, risk, cost}. A decision log with one option recorded is a note."},{name:"rationale",render:"text",label:"rationale",hint:"Why this option, in terms of what was known AT THE TIME. This is the field the whole object exists for."},{name:"revisitWhen",render:"chips",label:"revisitWhen",hint:"Conditions that should reopen this — the facts whose change would flip the answer."},d.IS]},{kind:"risk",icon:"⚠",group:"Work",defaultStatus:"open",actions:["review","mitigate"],fields:[{name:"description",render:"verdict",label:"description",hint:"What could go wrong, stated plainly enough that someone outside the project understands the exposure."},{name:"likelihood",render:"stat",label:"likelihood",hint:"low | medium | high. Re-scored at every review, not set once."},{name:"impact",render:"stat",label:"impact",hint:"low | medium | high — the cost if this actually happens."},{name:"owner",render:"stat",label:"owner",hint:"The single person accountable for watching and mitigating this. Not a team."},{name:"mitigation",render:"text",label:"mitigation",hint:"The plan to reduce the likelihood or the impact — not a hope that it will not happen."},{name:"reviewedAt",render:"stat",label:"reviewedAt",hint:"ISO date of the last likelihood/impact re-score."},d.IS]},{kind:"objective",icon:"◎",group:"Work",defaultStatus:"draft",actions:["review","link"],fields:[{name:"owner",render:"stat",label:"owner",hint:"The single person accountable. Not a team."},{name:"period",render:"stat",label:"period",hint:'The window, e.g. "Q3 2026".'},{name:"progress",render:"meter",label:"progress",hint:"0-100, derived from the key results rather than asserted."},{name:"keyResults",render:"rows",label:"keyResults",columns:["result","baseline","target","current"],hint:"One row per key result: {result, baseline, target, current}. Each must be a number that moves, not an activity that completes."},{name:"rationale",render:"text",label:"rationale",hint:"Why this objective matters more than the alternatives this period."},d.IS]},{kind:"liveMetric",icon:"↗",group:"Data",defaultStatus:"bindMetric",actions:["refresh","bind","watch"],fields:[{name:"value",render:"stat",label:"value",hint:"The latest observed value. Written by canvas_refresh_live_metric, not authored by hand once a binding exists."},{name:"unit",render:"stat",label:"unit",hint:'The unit the value is in, e.g. "months", "USD", "%".'},{name:"target",render:"stat",label:"target",hint:"The value that would mean this is healthy."},{name:"trend",render:"stat",label:"trend",hint:'Direction and size of the recent move, e.g. "-1.4 vs 30d ago".'},{name:"binding",render:"stat",label:"binding",hint:'The domain metric key this object re-reads, e.g. "finance.runway_months", "revenue.pipeline", "growth.leads". This is what makes the object LIVE instead of a snapshot — set it and canvas_refresh_live_metric can answer the same question tomorrow.'},{name:"series",render:"rows",label:"series",columns:["at","value"],hint:"Observed points: {at, value}. Written by the refresh, never authored.",bookkeeping:!0},{name:"fetchedAt",render:"stat",label:"fetchedAt",hint:"ISO instant the value was last read. Rendered as staleness, so never fabricate it.",bookkeeping:!0},d.wZ]},{kind:"trigger",icon:"⚑",group:"Data",defaultStatus:"armed",actions:["evaluate","mute"],fields:[{name:"watches",render:"stat",label:"watches",hint:"Title of the object on this board that this trigger evaluates — a `liveMetric` for a numeric comparator, or any deadline-bearing object for a date one (contract, invoice, bill, fundingRound, obligation, policy, offer, assignment, grant, peerReview, legalEntity, ipAsset, legalMatter among them; canvas_evaluate_triggers names the full list)."},{name:"watchesField",render:"stat",label:"watchesField",hint:"Which field on the watched object to read. Leave EMPTY unless the object has more than one deadline — the object's first declared deadline field is used, which is the right one for every kind that has only one. A `contract` is the kind that has two: empty watches `renewsAt` (the auto-renewal), and `nextObligationAt` watches the earliest obligation still owed. Watching both takes two triggers."},{name:"comparator",render:"stat",label:"comparator",hint:'For a number: below | above | equals | changes-by. For a deadline: due-within (breaches when the date is `threshold` days away or closer, INCLUDING already past — the "warn me before" case) | overdue-by (breaches only once the date is `threshold` days past; 0 means the day after it lapses — the "chase it" case).'},{name:"threshold",render:"stat",label:"threshold",hint:"The number the comparator tests against. For a date comparator this is a number of DAYS, never a date — the date lives on the object being watched, which is what keeps the trigger true next quarter without being re-typed."},{name:"state",render:"verdict",label:"state",hint:"armed | breached | muted. Written by canvas_evaluate_triggers.",bookkeeping:!0},{name:"lastEvaluatedAt",render:"stat",label:"lastEvaluatedAt",hint:"ISO instant of the last evaluation.",bookkeeping:!0},{name:"thenDo",render:"list",label:"thenDo",hint:"What should happen on breach: [{title, detail}]. An alert nobody acts on is noise, so name the action and its owner."},d.wZ]},{kind:"pricing",icon:"\xa7",group:"Work",defaultStatus:"draft",actions:["model","review"],fields:[{name:"model",render:"stat",label:"pricingModel",hint:"per-seat | usage | flat | tiered | value-based."},{name:"grossMargin",render:"stat",label:"grossMargin",hint:"Gross margin as a percentage, with the cost basis stated in `summary`."},{name:"paybackMonths",render:"stat",label:"paybackMonths",hint:"Months to recover acquisition cost."},{name:"tiers",render:"rows",label:"tiers",columns:["tier","price","includes","target"],hint:"One row per tier: {tier, price, includes, target}. `target` is which segment it is priced for."},{name:"unitEconomics",render:"rows",label:"unitEconomics",columns:["metric","value","basis"],hint:"CAC, LTV, contribution margin: {metric, value, basis}. `basis` names the assumption, which is the part that is actually load-bearing."},{name:"competitorPricing",render:"rows",label:"competitorPricing",columns:["competitor","entry","mid","notes"],hint:"What rivals charge: {competitor, entry, mid, notes}. Only from published pricing — mark inference as inference in `notes`."},d.wZ,d.IS]},{kind:"capTable",icon:"◱",group:"Work",defaultStatus:"draft",actions:["sync","model"],fields:[{name:"companyRef",render:"stat",label:"companyRef",hint:"Which company this is the cap table of — lowercase and hyphenated, the same ref the `company` object and every `equityGrant` uses. The one field on this card you author; everything else is folded from the ledger by canvas_sync_cap_table.",bookkeeping:!0},{name:"asOf",render:"stat",label:"asOf",hint:'READ-ONLY. The instant this table was folded at. A past date is a real answer — "what did we own in March" is the same ledger with an earlier cutoff — so never treat an old `asOf` as staleness without checking whether it was asked for.',derived:!0}
1,{name:"holders",render:"rows",label:"holders",columns:["holder","shareClass","instrument","shares","vested","percent"],hint:"READ-ONLY. One row per holder per share class, folded from `equity_events` by canvas_sync_cap_table — never author it. `vested` is computed from that holder's grant schedule at `asOf`, so a founder two years into a four-year vest reads as half. If a holder is missing, the ledger has no event for them: record the grant, do not type a row.",derived:!0},{name:"issued",render:"stat",label:"issued",hint:"READ-ONLY. Shares actually issued and outstanding — options excluded, because an option is not a share until it is exercised.",derived:!0},{name:"fullyDiluted",render:"stat",label:"fullyDiluted",hint:"READ-ONLY. Issued plus every option, RSU and warrant plus the UNALLOCATED pool. The denominator every percentage on this card divides by.",derived:!0},{name:"poolAuthorized",render:"stat",label:"poolAuthorized",hint:"READ-ONLY. Shares authorised into the option pool by the board.",derived:!0},{name:"poolUnallocated",render:"stat",label:"poolUnallocated",hint:"READ-ONLY. Pool authorised minus pool granted — what is actually left to hire against, which is the number a founder is asked for and the one a typed cap table always got wrong.",derived:!0},{name:"convertibles",render:"rows",label:"convertibles",columns:["reference","holder","kind","principal","cap","discount"],hint:"READ-ONLY. Outstanding SAFEs and notes. They are NOT in the percentages above and must never be added to them: what they become is not known until a round prices them. Model that with the `model` action rather than estimating it.",derived:!0},{name:"ownershipCheck",render:"verdict",label:"ownershipCheck",hint:"COMPUTED. Whether the folded holdings account for the fully diluted total, whether the percent column itself totals 100 including the pool, and what is outstanding beside them.",derive:e=>{var t,n,a;let r=(0,d.Dc)(e.fullyDiluted),i=(0,d.$k)(e.holders);if(!r||!i.length)return;let o=null!=(t=(0,d.QQ)(i,"shares"))?t:0,s=null!=(n=(0,d.Dc)(e.poolUnallocated))?n:0,l=null!=(a=(0,d.pT)(o+s,r))?a:0,c=(0,d.$k)(e.convert
1ibles).length,u=l>=99&&l<=101,m=w(i,s,r);return[(0,h.l7)(u?"ownership.balanced":"ownership.unbalanced",{accounted:l}),...m&&!m.balanced?[(0,h.l7)("ownership.percentSkew",{total:m.total})]:[],...c?[(0,h.l7)("ownership.convertibles",{count:c})]:[]]}},d.wZ]},{kind:"equityGrant",icon:"◇",group:"Work",defaultStatus:"granted",actions:["issue","sync"],fields:[{name:"reference",render:"stat",label:"reference",hint:"The certificate or grant number — the string a holder quotes. Unique per company.",bookkeeping:!0},{name:"holder",render:"stat",label:"holder",hint:"Who holds it, by name. The grant also carries the `partyRef` this resolves to, which is what joins it to an `account` card and to the cap table."},{name:"shareClass",render:"stat",label:"shareClass",hint:'Which authorised class it comes out of — "Common", "Series A Preferred", "Option Pool". A grant out of a class nobody authorised is refused, which is what keeps the table adding up.'},{name:"instrument",render:"stat",label:"instrument",hint:"What is actually held: ".concat(l.Zvx.join(" | "),". An option is not a share until it is exercised.")},{name:"quantity",render:"stat",label:"quantity",hint:"READ-ONLY. Shares or options under this grant, folded from its own ledger events — so a partly cancelled grant reads as what is left rather than what was promised.",derived:!0},{name:"vested",render:"stat",label:"vested",hint:"READ-ONLY. Vested at the date this card was last synced. Computed from the schedule below and stored nowhere, so it cannot go stale in the direction that matters.",derived:!0},{name:"vestingStartAt",render:"stat",label:"vestingStartAt",hint:"ISO date the clock starts — usually a start date, not the grant date. The two differ more often than they agree."},{name:"vestingMonths",render:"stat",label:"vestingMonths",hint:"Total length of the schedule in months. 48 is the common answer and is not the only one."},{name:"cliffMonths",render:"stat",label:"cliffMonths",hint:"Nothing vests until this many months have passed, and then that whole portion vests at once. 12 is standard."},{name:"vestingFrequency",render:"stat",label:"vestingFrequency",hint:"How often a tranche vests after the cliff: ".concat(l.Unb.join(" | "),". `none` means fully vested — purchased shares, or a founder's already-earned stock.")},{name:"acceleration",render:"stat",label:"acceleration",hint:"What happens on a change of control: ".concat(l.nr3.join(" | "),". Single accelerates on the acquisition alone; double needs the acquisition AND a termination. They are agreed in a conversation and recorded nowhere, which is why this field exists.")},{name:"cliffAt",render:"stat",label:"cliffAt",hint:'READ-ONLY. The date the cliff lands, computed from `vestingStartAt` + `cliffMonths` and written by the sync. Bind a `trigger` with comparator "due-within" to it so the conversation happens before the date rather than after — this is the first ownership date on the canvas that a trigger can watch.',derived:!0,deadline:!0},{name:"daysToCliff",render:"stat",label:"daysToCliff",hint:"COMPUTED. Days from today until the cliff lands — negative once it has passed, empty when the grant has no cliff. The one number a founder is asked for and could not previously answer without a calendar.",derive:e=>{var t,n,a;return null!=(a=(0,l.l5E)({startAt:"string"==typeof e.vestingStartAt?e.vestingStartAt:null,durationMonths:null!=(t=(0,d.Dc)(e.vestingMonths))?t:null,cliffMonths:null!=(n=(0,d.Dc)(e.cliffMonths))?n:null,frequency:l.Unb.includes(String(e.vestingFrequency))?e.vestingFrequency:"monthly",acceleration:l.nr3.includes(String(e.acceleration))?e.acceleration:"none"},Date.now()))?a:void 0}},{name:"unvested",render:"stat",label:"unvested",hint:"COMPUTED. Quantity minus vested — what a departure would return to the pool.",derive:e=>{let t=(0,d.Dc)(e.quantity),n=(0,d.Dc)(e.vested);if(void 0!==t&&void 0!==n)return Math.max(0,t-n)}},{name:"vestedPercent",render:"meter",label:"vestedPercent",hint:"COMPUTED. How far through the schedule this grant is.",derive:e=>(0,d.pT)((0,d.Dc)(e.vested),(0,d.Dc)(e.quantity))},{name:"pricePerShare",render:"stat",label:"pricePerShare",hint:m},{name:"fmvPerShare",render:"stat",label:"fmvPerShare",hint:"The 409A fair market value the grant was priced against, where there was one. A str
1ike below FMV is a tax problem, not a bargain."},d.wZ]},{kind:"convertible",icon:"◐",group:"Work",defaultStatus:"outstanding",actions:["record","model"],fields:[{name:"reference",render:"stat",label:"reference",hint:"This instrument's own reference. Unique per company.",bookkeeping:!0},{name:"instrumentKind",render:"stat",label:"instrumentKind",hint:"".concat(l.qiK.join(" | "),'. A note is DEBT — it accrues and it matures; a SAFE is neither. Recording one as the other makes "what is due when" unanswerable.')},{name:"holder",render:"stat",label:"holder",hint:"Who put the money in."},{name:"principal",render:"stat",label:"principal",hint:m},{name:"valuationCap",render:"stat",label:"valuationCap",hint:"The valuation the holder's money buys in at, at most. Leave empty for an uncapped instrument rather than writing a large number — uncapped and capped-very-high convert differently."},{name:"discountPercent",render:"stat",label:"discountPercent",hint:"Percent off the round price, 0–100. The holder takes whichever of the cap and the discount gives them the better price, which is the standard term on every form of both instruments."},{name:"postMoney",render:"stat",label:"postMoney",hint:"true for a post-money SAFE (the 2018 YC form), false for pre-money. DECISIVE, not cosmetic: on a post-money SAFE the holder's percentage is fixed and the FOUNDERS absorb every other SAFE's dilution; on a pre-money one the SAFEs dilute each other. If you do not know, say you do not know — guessing this misstates who owns the company."},{name:"interestRate",render:"stat",label:"interestRate",hint:'Simple annual interest, for a note. A SAFE does not accrue — leave it empty rather than writing 0, which reads as "a note at zero percent".'},{name:"maturesAt",render:"stat",label:"maturesAt",hint:'ISO date a note falls due. Bind a `trigger` with comparator "due-within" to it: a note nobody noticed maturing is a demand letter. A SAFE has no maturity and must leave this empty.',deadline:!0},{name:"convertsInto",render:"stat",label:"convertsInto",hint:"READ-ONLY. What this would become at the last modelled round, and on which basis — cap, discount or round price. Written by the `model` action; a number here that no round produced would be a promise rather than a projection.",derived:!0},d.wZ]},{kind:"fundingRound",icon:"◈",group:"Work",defaultStatus:"planning",actions:["plan","track"],fields:[{name:"roundType",render:"stat",label:"roundType",hint:"pre-seed | seed | series-a | series-b | bridge | safe. Recorded on the round itself by canvas_plan_funding_round — this card shows it, and the record is what every allocation joins to."},{name:"instrument",render:"stat",label:"instrument",hint:'equity | safe | convertible-note | grant | debt. What the money actually buys, which is a different question from the round\'s name — a "seed" can be a SAFE.',bookkeeping:!0},{name:"leadInvestor",render:"stat",label:"leadInvestor",hint:"The firm leading the round, once one has committed. Never invent one — a round with no lead is the normal state for most of its life.",bookkeeping:!0},{name:"roundStatus",render:"stat",label:"roundStatus",hint:"open | closed | abandoned, from the round record. Distinct from this card's own `status`, which summarises the board.",bookkeeping:!0},{name:"targetAmount",render:"stat",label:"targetAmount",hint:"".concat(m," What the round is RAISING — the plan. Recorded by canvas_plan_funding_round. What has actually closed is `committed`, derived from the allocations, and the two are deliberately different fields.")},{name:"committed",render:"stat",label:"committed",hint:"".concat(m," Money actually CLOSED — never money promised. Written by canvas_sync_funding_round from the allocations that reached the closing stage; counting soft circles here is the single most common way a raise is misreported."),bookkeeping:!0},{name:"valuation",render:"stat",label:"valuation",hint:m},{name:"closeTarget",render:"stat",label:"closeTarget",hint:'ISO date you intend to close. Bind a `trigger` with comparator "due-within" so the runway conversation happens while there is still runway.',deadline:!0},{name:"useOfFunds",render:"rows",label:"useOfFunds",columns:["area","amount","outcome"],hint:"Where the money goes: {area, amount, outcome}. `outcome` is what the money BUYS, which is the question an investor actually asks."},{name:"investors",render:"rows",label:"investors",columns:["investor","stage","amount","nextStep","warmIntro","touches"],hint:"READ-ONLY. The raise, one row per firm: {investor, stage, amount, nextStep, warmIntro, touches}. Projected from the workspace's real investor allocations by canvas_sync_funding_round — never authored, because a hand-typed investor list is a second set of numbers that starts disagreeing with the record 
1immediately and cannot hold a conversation. Add a firm with canvas_open_deal, move one with canvas_move_deal, and record a conversation with canvas_log_deal_touch; `nextStep` IS the latest conversation and `touches` is how many there have been, so a firm with a stage and no touches is a name somebody typed.",derived:!0},{name:"syncedAt",render:"stat",label:"syncedAt",hint:"ISO instant the allocations were last read. Rendered as staleness, so a round nobody has refreshed says so rather than looking current.",bookkeeping:!0},d.wZ]},{kind:"investorUpdate",icon:"✉",group:"Knowledge",defaultStatus:"draft",actions:["draft","send"],fields:[{name:"period",render:"stat",label:"period",hint:"The month or quarter being reported."},{name:"highlights",render:"list",label:"highlights",hint:"What went well: [{title, detail}] with a number in each detail."},{name:"lowlights",render:"list",label:"lowlights",hint:"What did not. An update with no lowlights is not read as good news, it is read as unreliable."},{name:"metrics",render:"rows",label:"metrics",columns:["metric","value","previous","change"],hint:"The standing numbers: {metric, value, previous, change}. Same metrics every period, including the ones that got worse."},{name:"asks",render:"chips",label:"asks",hint:"Specific, actionable requests — an intro to a named company, a hire, a customer reference."},{name:"recipients",render:"rows",label:"recipients",columns:["name","email"],hint:"Who this goes to: {name, email}. REQUIRED for `send` to do anything — an update with no addresses is a document. Take them from the `fundingRound` investors on this board; never invent an address, because the failure mode is a private update reaching a stranger."},d.wZ]},{kind:"dataRoom",icon:"▤",group:"Knowledge",defaultStatus:"assembling",actions:["assemble","share"],fields:[{name:"audience",render:"stat",label:"audience",hint:"Who this room is for — a named firm or a stage of diligence."},{name:"dataRoomId",render:"stat",label:"dataRoomId",hint:"The canonical `data_rooms` row this card is a view of. Written by canvas_sync_data_room, and what canvas_share_data_room reads back — the id is the identity, and matching a room by its title is the defect this removes.",bookkeeping:!0},{name:"readiness",render:"meter",label:"readiness",hint:'READ-ONLY, 0-100: share of REQUIRED documents actually provided, computed from the room\'s own diligence obligations by canvas_sync_data_room. A room with nothing required reads 0 rather than 100 — "nothing is required" is an unprepared room, not a complete one.',derived:!0},{name:"documents",render:"rows",label:"documents",columns:["document","category","status","owner","required","source"],hint:'READ-ONLY. One row per document in the room: {document, category, status, owner, required, source}. Projected by canvas_sync_data_room from BOTH shapes a room holds — a diligence obligation (`source` "diligence", which may still be missing) and an encrypted legal file that has been filed into the room (`source` "legal"). The missing ones are listed too: a data room that shows only what exists hides the gap it was built to close. Put a legal file in the room with canvas_file_document_in_data_room.',derived:!0},{name:"unstampable",render:"stat",label:"unstampable",hint:"READ-ONLY. How many PROVIDED documents this room's watermark cannot reach — an image, an archive, a binary spreadsheet. Zero when the room does not watermark. Reported here rather than discovered when a firm tries to open one, because those documents can only ever be served view-only and knowing which they are is the difference between a control and a surprise.",derived:!0},{name:"ndaRequired",render:"stat",label:"ndaRequired",hint:'true | false, read from the room itself. When true, a shared link resolves to "NDA pending" and opens NOTHING until the recipient signs the mutual NDA the share sends. Defaults to true — the safer default for diligence material.',derived:!0},{name:"watermark",render:"stat",label:"watermark",hint:"true | false, read from the room itself. When true no share can carry a download at all, and text documents are stamped with the recipient and the instant on the way out — the only way to read the room is through the stamped view.",derived:!0}
1,{name:"expiresAt",render:"stat",label:"expiresAt",hint:'ISO date the whole room lapses. Enforced on top of each link\'s own expiry, so shortening the room shortens every link into it. Bind a `trigger` with comparator "due-within" to be told before a live diligence room closes under a firm mid-read.',deadline:!0,derived:!0},{name:"recipientName",render:"stat",label:"recipientName",hint:"Who the last share granted access to. Pass the recipient to canvas_share_data_room rather than typing it here.",bookkeeping:!0},{name:"recipientEmail",render:"stat",label:"recipientEmail",hint:"Their real email, never invented — this is who the NDA (when required) and the access grant went to.",bookkeeping:!0},{name:"ndaState",render:"stat",label:"ndaState",hint:'not-required | pending | signed | declined | expired. Derived from the `signature_requests` row the share is bound to — never asserted, because a room must not report "signed" for an NDA that was declined.',bookkeeping:!0},{name:"ndaSignatureRequestId",render:"stat",label:"ndaSignatureRequestId",hint:"The signature_requests row the NDA was sent through.",bookkeeping:!0},{name:"shares",render:"rows",label:"shares",columns:["recipient","email","access","nda","state","expires"],hint:"READ-ONLY. Who currently holds a link: {recipient, email, access, nda, state, expires}. Written by canvas_sync_data_room and canvas_share_data_room; each row carries its `shareId`, which canvas_revoke_data_room_share reads back. A revoked or lapsed row stays visible — who HAD access is part of the record.",derived:!0},{name:"views",render:"rows",label:"views",columns:["document","views","lastViewedAt"],hint:"READ-ONLY. What the recipients actually read: {document, views, lastViewedAt}, most-read first, from the room's access log. This is the half that makes sending a data room something you can follow up on — a firm that opened the cap table twice and never opened the contracts is a different conversation from one that read everything.",derived:!0},d.wZ]},{kind:"budget",icon:"▦",group:"Work",defaultStatus:"drafting",actions:["plan","compare","approve"],fields:[{name:"period",render:"stat",label:"period",hint:'The period this budget covers — "FY2027", "2026-Q4", "2026-09".'},g,{name:"plannedTotal",render:"stat",label:"plannedTotal",hint:"".concat(p," The total of every line's planned amount. Computed from `lines` — do not author it independently, or the header will disagree with the table under it.")},{name:"actualTotal",render:"stat",label:"actualTotal",hint:"".concat(p," The total actually spent so far. Written by a refresh against connected actuals, not typed."),bookkeeping:!0},{name:"variance",render:"verdict",label:"variance",hint:'The one sentence a budget exists to produce: which lines are over, by how much, and whether the period total is still achievable. Say "under" or "over" explicitly.'},{name:"lines",render:"rows",label:"lines",columns:["line","category","owner","planned","actual","variance"],hint:"One row per budget line: {line, category, owner, planned, actual, variance}. `planned` and `actual` are plain numbers in the object currency. `owner` is REQUIRED — an over-budget line with nobody accountable is a number, not a control."},{name:"assumptions",render:"list",label:"assumptions",hint:"What this budget takes for granted: [{title, detail}]. Headcount, price, conversion, FX. The assumptions are what a reviewer actually challenges, so an unstated one is the defect."},d.wZ]},{kind:"forecast",icon:"◹",group:"Insights",defaultStatus:"modelling",actions:["model","run","compare"],fields:[{name:"horizon",render:"stat",label:"horizon",hint:'How far forward this projects, e.g. "12 months", "8 quarters".'},g,{name:"basis",render:"stat",label:"basis",hint:'What the projection extends — "actuals to 2026-07", "budget FY27", "bottom-up pipeline". A forecast whose basis is unstated cannot be checked.'},{name:"runwayMonths",render:"stat",label:"runwayMonths",hint:"Months of cash remaining under the base scenario. The single number a founder opens this object for."},{name:"drivers",render:"rows",label:"drivers",columns:["driver","value","unit","appliesTo"],hint:"The INPUTS the model is sensitive to: {driver, value, unit, appliesTo}. Growth rate, churn, headcount adds, ACV, gross margin. A scenario changes these, so anything a scenario needs to move must appear here."},{name:"scenarios",render:"rows",label:"scenarios",columns:["scenario","change","runwayMonths","endingCash","verdict"],hint:'One row per scenario: {scenario, change, runwayMonths, endingCash, verdict}. `change` names which driver moved and to what ("churn 2%→4%"). Always include a DOWNSIDE — a forecast with only a base and an upside is a pitch, not a plan.'},{name:"periods",render:"rows",label:"periods",columns:["period","revenue","costs","netCash","closingCash"],hint:"The projected series, one row per period: {period, revenue, costs, netCash, closingCash}. Plain numbers in the object currency."},d.wZ]},{kind:"invoice",icon:"↙",group:"Work",defaultStatus:"draft",actions:["issue","record-payment","chase"],fields:[{name:"customer",render:"stat",label:"customer",hint:"The party that owes this. ".concat(b)},A("customer"),{name:"invoiceNumber",render:"stat",label:"invoiceNumber",hint:"Your own reference for it. This is the key everything else joins to — the lines, the payments and the collections history — so set it once and never edit it after the invoice is issued."},E("invoice"),R("invoice"),x({host:"invoice"}),{name:"customerEmail",render:"stat",label:"customerEmail",hint:"Where the issued invoice is SENT, and where the collections ladder chases. Without it an invoice can still be issued — for one handed over in person — but nothing will ever leave the building for it."},g,{name:"amount",render:"stat",label:"amount",hint:"".concat(p," The total payable including tax.")},{name:"issuedAt",render:"stat",label:"issuedAt",hint:"ISO date it was issued."},{name:"dueAt",render:"stat",label:"dueAt",hint:'ISO date payment is due. This is the field that makes an invoice something the board can warn about, so an invoice without it cannot age. Bind a `trigger` with comparator "overdue-by" to have the board chase it.',deadline:!0},{name:"paidAmount",render:"stat",label:"paidAmount",hint:"".concat(p," How much has actually landed. Part payment is the normal case, so this is not a boolean.")},{name:"ageingDays",render:"stat",label:"ageingDays",hint:"Days past due. Computed from `dueAt` — never authored, because a stale ageing is worse than none.",bookkeeping:!0},{name:"lineItems",render:"rows",label:"lineItems",columns:["description","quantity","unitPrice","amount"],hint:"One row per billed 
1item: {description, quantity, unitPrice, amount}. Plain numbers in the object currency."},{name:"collection",render:"list",label:"collection",hint:"What has actually been done to collect it: [{title, detail}] with a date in each detail. Collections work with no record is collections work that gets done twice or not at all. READ-ONLY once the invoice is issued: the collections ladder writes every rung it climbs here, and an authored entry beside those is a second collections history.",bookkeeping:!0},{name:"collectionMode",render:"stat",label:"collectionMode",hint:"off | notify | auto. How hard the collections ladder may work this one. `notify` (the default) records the reminder that is due and tells the board; `auto` is you delegating the send, so the customer is emailed without anybody looking. Set `off` for an invoice you are handling by hand."},{name:"issuedBy",render:"stat",label:"issuedBy",hint:"Who issued it. Written by the issue flow from the session — never authored, because it is who stood behind the document that left the building.",bookkeeping:!0},{name:"paymentLink",render:"stat",label:"paymentLink",hint:"The hosted page the customer pays on, minted against this workspace's own merchant account when the invoice is issued. Written by the issue flow. Absent means no merchant account is connected — the invoice is still real and is paid by bank transfer.",bookkeeping:!0},d.wZ]},{kind:"bill",icon:"↗",group:"Work",defaultStatus:"received",actions:["approve","schedule-payment","dispute"],fields:[{name:"vendor",render:"stat",label:"vendor",hint:"The party owed — a bill without its counterparty cannot be checked against what was agreed. ".concat(b)},A("vendor"),{name:"reference",render:"stat",label:"reference",hint:"The vendor's own invoice reference."},E("bill"),R("bill"),x({host:"bill",cadenceSource:"recurring"}),g,{name:"amount",render:"stat",label:"amount",hint:"".concat(p," The total payable including tax.")},{name:"dueAt",render:"stat",label:"dueAt",hint:'ISO date payment is due. Bind a `trigger` with comparator "due-within" so a payment run is prepared before the date, not after it.',deadline:!0},{name:"category",render:"stat",label:"category",hint:"Which budget line this lands on. This is what connects a bill to a `budget` — an uncategorised bill cannot appear in a variance."},{name:"approvedBy",render:"stat",label:"approvedBy",hint:"Who authorised it. Never fill this in on the requester's behalf: an approval nobody gave is the one field on this object that can cause real harm.",bookkeeping:!0},{name:"recurring",render:"stat",label:"recurring",hint:"none | monthly | quarterly | annual. A recurring bill is a committed cost and belongs in the forecast, not just in this month."},{name:"risks",render:"chips",label:"risks",hint:'Anything worth a second look — an unexpected increase, an auto-renewal, a duplicate. NOT "a charge with no matching contract": that one is computed by `contractObligation` above from the contract this bill actually names, so writing it here as an observation is a second, staler answer to a question the card already answers.'},d.wZ]},{kind:"payRun",icon:"⇉",group:"Work",defaultStatus:"processed",actions:["sync"],fields:[{name:"source",render:"stat",label:"source",hint:"Which provider ran it: gusto | rippling | adp | deel | manual. `manual` is a run entered from a bureau's PDF, which is how most companies outside the US actually receive one. Written by the sync — never authored for a connected provider."},{name:"externalRef",render:"stat",label:"reference",hint:"The provider's own id for this run. What makes re-reading the same period an update rather than a second run.",bookkeeping:!0},g,{name:"periodStart",render:"stat",label:"periodStart",hint:"ISO date the pay period starts."},{name:"periodEnd",render:"stat",label:"periodEnd",hint:"ISO date the pay period ends."},{name:"paidAt",render:"stat",label:"paidAt",hint:"ISO date the money actually left. This — not the period — is the month the cost belongs to, because a period straddling a month boundary would otherwise land its whole cost in the wrong one."},{name:"grossAmount",render:"stat",label:"grossAmount",hint:"".concat(p," Total gross pay before employer taxes.")},{name:"employerTaxes",render:"stat",label:"employerTaxes",hint:"".concat(p," What the employer owed on top of gross.")},{name:"totalCost",render:"stat",label:"totalCost",hint:"".concat(p," What the run cost the company in total. This is the number that is BURN — stored separately from gross plus taxes rather than derived from them, because a provider also bills benefits and its own fee and deriving the total would silently drop both.")},{name:"employeeCount",render:"stat",label:"employeeCount",hint:"How many people were paid."},{name:"lines",render:"rows",label:"lines",columns:["employee","hours","rate","amount"],hint:"One row per person: {employee, hours, rate, amount}. Plain numbers in the object currency. Read from the provider — do not author these, and do not correct them here: a figure that disagrees with the provider is a conversation with the provider."},{name:"syncedAt",render:"stat",label:"syncedAt",hint:"When this was last read back from the provider. A run whose sync is a month old is still a fact; saying WHEN it was read is what stops it being mistaken for a live one.",bookkeeping:!0},d.wZ]},{kind:"contract",icon:"✎",group:"Knowledge",defaultStatus:"draft",actions:["review","sign"],fields:[{name:"reference",render:"stat",label:"reference",hint:'THIS agreement\'s own short reference — "MSA-AC
1ME-2026", "SOW-3". The identity every invoice and bill raised under it points at through `contractRef`, and what `SpecDeriveBoard.byRef` resolves before it falls back to the title. Two agreements with one company is the normal case, so a contract without a reference is one nothing can be charged against without ambiguity.'},{name:"counterparty",render:"stat",label:"counterparty",hint:b},A("counterparty"),{name:"contractType",render:"stat",label:"contractType",hint:"msa | sow | nda | employment | vendor | formation."},{name:"effectiveAt",render:"stat",label:"effectiveAt",hint:"ISO start date."},{name:"renewsAt",render:"stat",label:"renewsAt",hint:'ISO renewal or expiry date — the field that makes a contract something the board can warn about. Bind a `trigger` with comparator "due-within" to be told before an auto-renewal rather than after it. A contract carries TWO clocks: this one, which is the default a trigger watches, and `nextObligationAt` below, which a trigger reaches by setting `watchesField` to it. One trigger cannot watch both — author two.',deadline:!0},g,{name:"valueAmount",render:"stat",label:"valueAmount",hint:m},{name:"obligations",render:"rows",label:"obligations",columns:S,hint:"What this commits either side to, one row per clause somebody has to DO something about: {".concat(S.join(", "),"}. `reference` is the identity an `invoice` or a `bill` points at through its own `obligationRef` — an obligation without one can never be shown to have been discharged, which is what made this table prose. `kind` is receivable (we invoice for it) | payable (they bill us for it) | deliverable | report | notice; only the first two should ever produce a document, so a deliverable is never counted as un-invoiced revenue. `cadence` is once | monthly | quarterly | annual, `amount` is a plain number in this contract's `currency`, and `status` is pending | invoiced | met | waived | breached. `due` is what `nextObligationAt` counts down to, and `status` is what retires a row from that countdown — only `met` and `waived` do, because an obligation that has merely been `invoiced` is still owed.")},{name:"nextObligationAt",render:"stat",label:"nextObligationAt",hint:'COMPUTED from `obligations` — the earliest `due` among the rows still owed, i.e. every row whose `status` is not met or waived. This is the date the board WARNS on: bind a `trigger` with comparator "due-within" and `watchesField` set to `nextObligationAt`, and the nightly sweep will say which obligation is coming due before it is missed rather than after. A cadence is never rolled forward — an obligation six months past reports six months overdue, because projecting the next instance would quietly turn a missed commitment into a comfortable future one.',deadline:!0,derive:e=>{var t;return null==(t=(0,l.ymm)(e))?void 0:t.due}},{name:"obligationCoverage",render:"verdict",label:"obligationCoverage",hint:"COMPUTED. Which of this contract's billable obligations have an invoice or a bill against them, which have nothing raised yet, and which documents point here matching no obligation at all.",derive:(e,t)=>{let n=(0,d.$k)(e.obligations);if(!n.length)return;let a=function(e){return new Set([(0,d.ip)(e.reference),(0,d.ip)(e.title)].filter(Boolean))}(e);if(!a.size)return(0,h.l7)("coverage.noIdentity");let r=[...t.ofKind("invoice"),...t.ofKind("bill")].filter(e=>a.has((0,d.ip)(e.contractRef))),i=n.filter(e=>{var t;return T[String(null!=(t=e.kind)?t:"").trim().toLowerCase()]}),o=n.filter(e=>!(0,d.ip)(e.reference)).length,s=[],l=[];for(let e of i){var c,u;let t=(0,d.ip)(e.reference);(t&&r.some(e=>(0,d.ip)(e.obligationRef)===t)?s:l).push(String(null!=(u=null!=(c=e.obligation)?c:e.reference)?u:"").trim()||(0,h.l7)("fallback.unnamedObligation"))}let m=new Set(n.map(e=>(0,d.ip)(e.reference)).filter(Boolean)),p=r.filter(e=>!m.has((0,d.ip)(e.obligationRef)));return[i.length?(0,h.l7)("coverage.billable",{covered:s.length,total:i.length}):(0,h.l7)("coverage.noneBillable"),...l.length?[(0,h.l7)("coverage.open",{names:l})]:[],...p.length?[(0,h.l7)("coverage.orphans",{count:p.length,names:p.map(O)})]:[],...o?[(0,h.l7)("coverage.unreferenced",{count:o})]:[]]}},{name:"documentBody",render:"text",label:"documentBody",hint:"The FULL text of the agreement, in markdown. This is what `canvas_request_signature` sends verbatim and what the signature record freezes — so what the card holds is what the signer sees, not a summary of it. Written by canvas_draft_legal_document from a real template; edit it here to change the terms before sending, and never send a contract whose body you have not read back to the user."},{name:"templateKey",render:"stat",label:"templateKey",hint:"Which document template `documentBody` was drafted from — provenance, not resolution. A later edit to the template does not change what was signed.",bookkeeping:!0},{name:"risks",render:"chips",label:"risks",hint:"Clauses worth a second look — auto-renewal, unlimited liability, exclusivity, IP assignment."},{name:"signatureState",render:"stat",label:"signatureState",hint:"unsent | sent | completed | declined | expired. Written by the sign flow over `signature_requests` — never asserted, because a signature is a recorded event with its own audit trail.",bookkeeping:!0},{name:"signatureRequestId",render:"stat",label:"signatureRequestId",hint:"The signature_requests row this sign flow created. Written by the sign flow.",bookkeeping:!0},{name:"signedAt",render:"stat",label:"signedAt",hint:"ISO instant every party completed. Written by the sign flow.",bookkeeping:!0},d.wZ]},{kind:"account",icon:"⬡",group:"People",defaultStatus:"prospect",actions:["sync","research"],fields:[{name:"partyRef",render:"stat",label:"partyRef",hint:'The stable reference every other object joins to this account by — lowercase, hyphenated, derived from the legal name ("Acme Holdings Ltd" → "acme-holdings-ltd"). Set it ONCE and never edit it: changing a ref orphans every invoice, bill and contract that already points at it. canvas_sync_account writes it when the account comes from the workspace.'},{name:"relationship",render:"stat",label:"relationship",hint:"What this party is to us: ".concat(l.cRH.join(" | "),". One account can be more than one thing — a customer who also supplies you is TWO relationships, so use `alsoKnownAs` to say so rather than picking the more flattering one.")},{name:"legalName",render:"stat",label:"legalName",hint:"Registered legal name as it appears on the contract, if it differs from the trading name in the title. This is the name that has to match on an invoice."},{name:"owner",render:"stat",label:"owner",hint:"The single person here who owns this relationship. Not a team — an account with no named owner is an account nobody chases."},{name:"website",render:"stat",label:"website",hint:"Primary domain. The cheapest way to tell two similarly-named companies apart."},{name:"segment",render:"stat",label:"segment",hint:'Title of the `customerSegment` object this account belongs to, where one is on the board. This is what makes "how are we doing in mid-market" answerable.'},{name:"since",render:"stat",label:"since",hint:"ISO date the relationship started — first order, first invoice, signature date."},{name:"alsoKnownAs",render:"chips",label:"alsoKnownAs",hint:"Every other name this party appears under — the trading name, the old name before an acquisition, the abbreviation the team actually types. This is the list that stops a second account being created for a company you already have."},{name:"contacts",render:"rows",label:"contacts",columns:["name","role","email","notes"],hint:"The people at this account: {name, role, email, notes}. `role` is what they DO in a deal — economic buyer, champion, blocker, user — not their job title, because the title is on their business card and the role is 
1what a next step depends on."},{name:"history",render:"rows",label:"history",columns:["kind","reference","amount","currency","due","status"],hint:"READ-ONLY. This account's open invoices and open bills, resolved live from finance by `canvas_sync_account` — never author it directly. Absent or empty does not mean nothing is owed: call canvas_sync_account again to refresh before concluding an account is current. A `contract`'s renewal is not here — read it off the `contract` object itself, which this account's cards already join to.",derived:!0},d.wZ,d.IS]}];[...new Set(_.flatMap(e=>e.fields.map(e=>e.name)))];let D=[...new Set(_.flatMap(e=>e.fields.filter(e=>e.bookkeeping).map(e=>e.name)))];(0,d.GO)({id:"founder",namespace:u,specs:_})},53911:(e,t,n)=>{n.d(t,{J1:()=>d,WM:()=>h,jz:()=>c,zq:()=>o});var a=n(47440),r=n(82713),i=n(58716);let o=["nda","msa","sow","offer_letter","ip_assignment","formation","registration","other"],s="Written by canvas_sync_legal from the real row — never authored here. A value typed onto this card is a second answer the legal seat does not hold; change the record through the entity browser or the legal seat and re-sync.";function l(e){return{name:"recordId",render:"stat",label:"recordId",hint:"The `".concat(e,"` row this card is a view of — the JOIN KEY canvas_sync_legal matches on, so a re-sync updates this card rather than authoring a second one. Empty on a card no sync has reached yet."),bookkeeping:!0}}let d=[{kind:"legalDocument",icon:"\uD83D\uDD0F",group:"Knowledge",defaultStatus:"draft",actions:["upload","share","request-signature","sync"],fields:[{name:"category",render:"stat",label:"category",hint:"The document type: ".concat(o.join(" | "),". Set once, at upload, by the person choosing what they are uploading — never re-typed by a later flow."),bookkeeping:!0},{name:"entityId",render:"stat",label:"entityId",hint:"The `legal_entities` row this document belongs to, when it was uploaded against one. Numeric id, or empty when this document is not scoped to a single legal entity.",bookkeeping:!0},{name:"matterId",render:"stat",label:"matterId",hint:"The `legal_matters` row this document belongs to, when it was uploaded against one. Numeric id, or empty.",bookkeeping:!0},{name:"ipId",render:"stat",label:"ipId",hint:"The `intellectual_property` row this document belongs to, when it was uploaded against one. Numeric id, or empty.",bookkeeping:!0},{name:"documentId",render:"stat",label:"documentId",hint:"The `legal_document_files.id` this card represents — the JOIN KEY every legal-document tool needs to read or act on the real record. Written by the upload control the instant a file lands; empty on a card nobody has uploaded into yet.",bookkeeping:!0},{name:"artifactId",render:"stat",label:"artifactId",hint:"The `kernel.artifacts` row holding the CURRENT version's encrypted bytes. Re-uploading never overwrites it — a new artifact is created and this is repointed — so a signature completed against an earlier version keeps resolving to that version's exact bytes.",bookkeeping:!0},{name:"checksum",render:"stat",label:"checksum",hint:"SHA-256 of the current version's bytes, frozen at upload. What a signature request binds to, so the signed document cannot silently change under the signature.",bookkeeping:!0},{name:"mime",render:"stat",label:"mime",hint:"The current version's content type, as the browser reported it at upload.",bookkeeping:!0},{name:"byteSize",render:"stat",label:"byteSize",hint:"The current version's size in bytes.",bookkeeping:!0},{name:"documentStatus",render:"stat",label:"documentStatus",hint:"".concat("draft | shared | awaiting_signature | declined | signed",". Computed server-side, every read, from this document's shares and its signature request — never stored and never asserted. Call canvas_legal_document_sync to refresh it; do not guess at it from what the card showed last."),bookkeeping:!0},{name:"signatureRequestId",render:"stat",label:"signatureRequestId",hint:"The `signature_requests` row `canvas_legal_document_request_signature` created, if any. Written by that flow; re-read its progress rather than asserting completion.",bookkeeping:!0},{name:"signedAt",render:"stat",label:"signedAt",hint:"ISO instant every party completed the signature request, or empty. Written by canvas_legal_document_sync from the signature request's own record — never asserted.",bookkeeping:!0},{name:"activeShares",render:"stat",label:"activeShares",hint:"How many un-revoked share links currently grant access to this document. Written by canvas_legal_document_sync by RE-READING the workspace record, never by incrementing a local count — a revoke elsewhere on the board must be reflected here too.",bookkeeping:!0},r.wZ]},{kind:"legalEntity",icon:"\uD83C\uDFDB",group:"Knowledge",defaultStatus:"unsynced",actions:["sync"],fields:[l("legal_entities"),{name:"legalName",render:"stat",label:"legalName",hint:"The registered legal name, exactly as filed. ".concat(s),bookkeeping:!0},{name:"entityType",render:"stat",label:"entityType",hint:"".concat("c-corp | llc | ltd | gmbh | pty | sole-trader | partnership",". ").concat(s),bookkeeping:!0},{name:"jurisdiction",render:"stat",label:"jurisdiction",hint:"Where it is INCORPORATED, which is frequently not where it operates — Delaware being the usual case. Where it TRADES is one row per jurisdiction in `registrations`. ".concat(s),bookkeeping:!0},{name:"registrationNumber",render:"stat",label:"registrationNumber",hint:"The file or company number the registry issued. ".concat(s),bookkeeping:!0},{name:"formedAt",render:"stat",label:"formedAt",hint:"ISO date of incorporation. ".concat(s),bookkeeping:!0},{name:"registeredAgent",render:"stat",label:"registeredAgent",hint:"The agent of record. A service of process missed because nobody knew who the agent was is the failure this exists for. ".concat(s),bookkeeping:!0},{name:"registeredAddress",render:"text",label:"registeredAddress",hint:"The address service is accepted at. ".concat(s),bookkeeping:!0},{name:"renewsAt",render:"stat",label:"renewsAt",hint:'ISO date the agent appointment or the entity\'s own standing lapses — the field that makes this card something the board can warn about. Bind a `trigger` with comparator "due-within" so the filing happens before the date rather than after the penalty. '.concat(s),bookkeeping:!0,deadline:!0},{name:"entityStatus",render:"stat",label:"entityStatus",hint:"".concat("active | good-standing | delinquent | dissolved",". `delinquent` is a real and recoverable state, not a rounding of `dissolved`. ").concat(s),bookkeeping:!0},{name:"parentEntity",render:"stat",label:"parentEntity",hint:"The legal name of the group parent, or empty when this IS the parent. More than one entity is the normal case — a US company with a UK subsidiary has two, and two filing calendars. ".concat(s),bookkeeping:!0},{name:"registrations",render:"rows",label:"registrations",columns:["jurisdiction","kind","reference","renewsAt","status"],hint:"Permission to do business somewhere that is not where you incorporated, one row per `legal_registrations` record: {jurisdiction, kind, reference, renewsAt, status}. `kind` is one of ".concat("foreign-qualification | sales-tax | payroll-tax | licence | data-protection | other",". These lapse quietly and the first symptom is usually a penalty, so the renewal dates are here rather than 
1in a note. ").concat(s),bookkeeping:!0},{name:"notes",render:"text",label:"notes",hint:"Whatever the record's own notes column holds. ".concat(s),bookkeeping:!0},r.wZ]},{kind:"ipAsset",icon:"⌗",group:"Knowledge",defaultStatus:"unsynced",actions:["sync"],fields:[l("intellectual_property"),{name:"ipKind",render:"stat",label:"ipKind",hint:"".concat("trademark | patent | design | copyright | domain | trade-secret",'. One shape for all six, because each is "a right, in a jurisdiction, in a class, with a filing date and a renewal date". ').concat(s),bookkeeping:!0},{name:"jurisdiction",render:"stat",label:"jurisdiction",hint:"Where the right runs. A mark registered in the US is not registered in the EU, and treating one filing as global is the mistake this column exists to make visible. ".concat(s),bookkeeping:!0},{name:"classification",render:"stat",label:"classification",hint:"Nice classes for a mark, IPC for a patent — the classification the filing was made under, verbatim. ".concat(s),bookkeeping:!0},{name:"registrationNumber",render:"stat",label:"registrationNumber",hint:"The application or registration number. ".concat(s),bookkeeping:!0},{name:"filedAt",render:"stat",label:"filedAt",hint:"ISO date of filing. ".concat(s),bookkeeping:!0},{name:"grantedAt",render:"stat",label:"grantedAt",hint:"ISO date it was granted, or empty while it is still pending. ".concat(s),bookkeeping:!0},{name:"renewsAt",render:"stat",label:"renewsAt",hint:'ISO date the right lapses without a renewal fee or a statement of use. Bind a `trigger` with comparator "due-within": a mark nobody renewed is a mark somebody else can register. '.concat(s),bookkeeping:!0,deadline:!0},{name:"ipStatus",render:"stat",label:"ipStatus",hint:"".concat("idea | filed | pending | registered | opposed | lapsed | abandoned",". ").concat(s),bookkeeping:!0},{name:"assignedFrom",render:"stat",label:"assignedFrom",hint:"Who the right was assigned FROM — a founder, a contractor, an acquired company. Empty means unassigned, which is a FINDING and not a blank: work done before incorporation belongs to whoever did it until it is assigned. ".concat(s),bookkeeping:!0},{name:"assignedAt",render:"stat",label:"assignedAt",hint:"ISO date the assignment was executed. ".concat(s),bookkeeping:!0},{name:"owner",render:"stat",label:"owner",hint:"The single person here accountable for keeping this filed and renewed. Not a team. ".concat(s),bookkeeping:!0},{name:"entityName",render:"stat",label:"entityName",hint:"The legal name of the `legalEntity` that holds this right. Which of two entities owns a mark is the question a diligence request asks first. ".concat(s),bookkeeping:!0},{name:"assignment",render:"verdict",label:"assignment",hint:"COMPUTED. Whether this right has actually been assigned to the company, and when.",derive:e=>{let t="string"==typeof e.assignedFrom?e.assignedFrom.trim():"",n="string"==typeof e.assignedAt?e.assignedAt.trim():"";return t?n?(0,i.l7)("assignment.dated",{from:t,at:n.slice(0,10)}):(0,i.l7)("assignment.undated",{from:t}):(0,i.l7)("assignment.none")}},{name:"notes",render:"text",label:"notes",hint:"Whatever the record's own notes column holds. ".concat(s),bookkeeping:!0},r.wZ]},{kind:"legalMatter",icon:"\xa7",group:"Knowledge",defaultStatus:"unsynced",actions:["sync"],fields:[l("legal_matters"),{name:"matterKind",render:"stat",label:"matterKind",hint:"".concat("advice | dispute | diligence | regulatory | employment | transaction",". A matter is a thing being ARGUED, which is what distinguishes it from a governance finding (a control that failed) and from a support ticket (nobody is adverse). ").concat(s),bookkeeping:!0},{name:"counterparty",render:"stat",label:"counterparty",hint:"The adverse party, or empty for a matter with no other side (advice, a regulatory filing). ".concat(a.NN),bookkeeping:!0},(0,a.iS)("counterparty"),{name:"counsel",render:"stat",label:"counsel",hint:"External counsel of record. ".concat(s),bookkeeping:!0},{name:"owner",render:"stat",label:"owner",hint:"The single person here accountable for this matter. Not a team — a matter nobody owns is a matter nobody answers counsel on. ".concat(s),bookkeeping:!0},{name:"matterStatus",render:"stat",label:"matterStatus",hint:"".concat("open | advice-received | settled | closed | escalated",". ").concat(s),bookkeeping:!0},{name:"exposure",render:"stat",label:"exposure",hint:"".concat("low | medium | high | existential"," — how bad this gets if it goes the wrong way. ").concat(s),bookkeeping:!0},{name:"currency",render:"stat",label:"currency",hint:"ISO-4217 code for both amounts on this card. ".concat(s),bookkeeping:!0},{name:"exposureAmount",render:"stat",label:"exposureAmount",hint:"Estimated financial exposure, as a plain number in major units. ".concat(s),bookkeeping:!0},{name:"spendToDate",render:"stat",label:"spendToDate",hint:'What has actually been spent arguing it, as a plain number in major units. Two numbers rather than one "cost", because they answer different questions and a single column ends up meaning whichever the last writer intended. '.concat(s),bookkeeping:!0},{name:"spendAgainstExposure",render:"verdict",label:"spendAgainstExposure",hint:"COMPUTED. What has been spent so far, set against what this could cost.",derive:e=>{let t=(0,r.Dc)(e.spendToDate),n=(0,r.Dc)(e.exposureAmount);if(void 0===t||void 0===n||n<=0)return;let a=Math.round(t/n*100);return(0,i.l7)(a>=100?"spend.over":"spend.under",{share:a})}},{name:"openedAt",render:"stat",label:"openedAt",hint:"ISO date the matter opened. ".concat(s),bookkeeping:!0},{name:"nextActionAt",render:"stat",label:"nextActionAt",hint:'ISO date this matter is next JUDGED against — a filing deadline, a hearing, a response-by. Bind a `trigger` with comparator "due-within": this is the one date on the card that has a consequence attached to missing it. '.concat(s),bookkeeping:!0,deadline:!0},{name:"closedAt",render:"stat",label:"closedAt",hint:"ISO date it closed, or empty while it is live. ".concat(s),bookkeeping:!0},{name:"timeline",render:"rows",label:"timeline",columns:["at","event","note"],hint:"The matter's chronology, one row per milestone: {at, event, note}. Held on the record and not in `activity_log` because a matter's chronology is EDITABLE — counsel corrects a date after the fact — and an append-only audit stream must never allow that. ".concat(s),bookkeeping:!0},{name:"entityName",render:"stat",label:"entityName",hint:"The legal name of the `legalEntity` this matter is against. Which entity is named is the whole question in a group with a subsidiary. ".concat(s),bookkeeping:!0},{name:"notes",render:"text",label:"notes",hint:"Whatever the record's own notes column holds. ".concat(s),bookkeeping:!0},r.wZ]}],h={legalDocument:"Legal document",legalEntity:"Legal entity",ipAsset:"IP asset",legalMatter:"Legal matter"},c={draft:"Draft",unsynced:"Not synced"};(0,r.GO)({id:"legal",namespace:"creationCanvas.legal",specs:d})}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.