Add chapter outline data and recipe short titles

This commit is contained in:
pat
2026-09-01 03:44:03 +00:00
parent f0c6a48187
commit 5f24a406cf
+36
View File
@@ -56,6 +56,7 @@ const RE04 = {
time: "~15 min", time: "~15 min",
cost: "≈ $0.03", cost: "≈ $0.03",
vertical: "Real Estate", vertical: "Real Estate",
shortTitle: "Market brief",
title: "Draft a property-market brief with an AI agent without leaking client data.", title: "Draft a property-market brief with an AI agent without leaking client data.",
problem: 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.", "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", time: "~12 min",
cost: "≈ $0.02", cost: "≈ $0.02",
vertical: "Real Estate", vertical: "Real Estate",
shortTitle: "Listing copy",
title: "Rewrite a listing description from public comps without pasting the client address book.", title: "Rewrite a listing description from public comps without pasting the client address book.",
problem: 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.", "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" }, { id: "RE-05", href: "#re-05", title: "Listing copy" },
], ],
stakes: { stakes: {
id: "stakes",
heading: "The stakes", heading: "The stakes",
paragraphs: [ 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.", "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: { constraints: {
id: "constraints",
heading: "Constraints you cannot ignore", heading: "Constraints you cannot ignore",
paragraphs: [ 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.", "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: { practice: {
id: "practice",
heading: "How we work here", heading: "How we work here",
paragraphs: [ 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.", "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: { between: {
id: "between",
heading: "The brief is half the meeting", heading: "The brief is half the meeting",
paragraphs: [ 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.", "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.", "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" },
],
},
];
}