diff --git a/marketing-site/data/sample-chapter.js b/marketing-site/data/sample-chapter.js index 1833e1d..e92102c 100644 --- a/marketing-site/data/sample-chapter.js +++ b/marketing-site/data/sample-chapter.js @@ -56,6 +56,7 @@ const RE04 = { time: "~15 min", cost: "≈ $0.03", vertical: "Real Estate", + shortTitle: "Market brief", title: "Draft a property-market brief with an AI agent without leaking client data.", problem: "You need a neighborhood market brief for a client meeting this week. The listing sheet and client notes cannot go into a public model.", @@ -115,6 +116,7 @@ const RE05 = { time: "~12 min", cost: "≈ $0.02", vertical: "Real Estate", + shortTitle: "Listing copy", title: "Rewrite a listing description from public comps without pasting the client address book.", problem: "You need listing copy that sounds like this house, not every house on the street. The CRM holds owner notes and the showing list. Those do not go into a public model.", @@ -188,6 +190,7 @@ export const CHAPTER = { { id: "RE-05", href: "#re-05", title: "Listing copy" }, ], stakes: { + id: "stakes", heading: "The stakes", paragraphs: [ "A listing that stalls because the market brief is late is a lost weekend. A listing that leaks because you pasted the client sheet into a public model is a lost license. Real estate work runs on both clocks: the showing at 4pm, and the file that must never leave the office.", @@ -195,6 +198,7 @@ export const CHAPTER = { ], }, constraints: { + id: "constraints", heading: "Constraints you cannot ignore", paragraphs: [ "You already work in MLS exports, a CRM, and a phone that rings during the write-up. Done is a brief the client can read in a meeting, with numbers you can stand behind, reviewed by a human. Public models are useful for draft and classify. They are not a filing cabinet.", @@ -202,12 +206,14 @@ export const CHAPTER = { ], }, practice: { + id: "practice", heading: "How we work here", paragraphs: [ "Redact locally. Prompt with a sample or a stripped file. Review against a checklist. Share the artifact, not the workflow text. The first job this week is the neighborhood market brief. Run it on sample comps before you touch a live listing.", ], }, between: { + id: "between", heading: "The brief is half the meeting", paragraphs: [ "The brief gets you into the room with numbers. The other half is the listing copy: public comps, a description that does not sound like every other house on the street, and an address book that never belongs in the prompt. Same rule. Different job.", @@ -224,3 +230,33 @@ export const CHAPTER = { "Local redaction fields: owner_name, phone, exact_address.", ], }; + +/** Outline groups for the chapter map. Headings come from the essay objects. */ +export function buildOutline(chapter, recipes) { + return [ + { + label: "Essay", + items: [chapter.stakes, chapter.constraints, chapter.practice, chapter.between].map((s) => ({ + id: s.id, + label: s.heading, + })), + }, + { + label: "Workflows", + items: recipes.map((r) => ({ + id: r.anchor, + recipeId: r.id, + label: r.id + " · " + r.shortTitle, + time: r.time, + shortTitle: r.shortTitle, + })), + }, + { + label: "End", + items: [ + { id: "further", label: "Further workflows" }, + { id: "sources", label: "Sources" }, + ], + }, + ]; +}