From c6d070163983840a49d7b651d57535d187f52893 Mon Sep 17 00:00:00 2001 From: Bendik Aagaard Lynghaug Date: Thu, 24 Sep 2026 20:28:27 +0200 Subject: [PATCH] build: the mail cleanup runs on the final words, not only a model's reply A stray placeholder or a lost link was only fixed when a model wrote the mail, so a words file that already carried one kept it through every later build. The pass now runs once on the finished aggregates.yaml words, covering --words, --words-from and the model alike; the football club's three mails lose the `{chain}` they were shipped with. Co-Authored-By: Claude Opus 5 (1M context) --- runs/fotballklubb-2026-09-24/README.md | 4 ++-- runs/fotballklubb-2026-09-24/site/aggregates.yaml | 6 +++--- runs/fotballklubb-2026-09-24/words-short.json | 6 +++--- src/build.rs | 13 +++++++++---- 4 files changed, 17 insertions(+), 12 deletions(-) diff --git a/runs/fotballklubb-2026-09-24/README.md b/runs/fotballklubb-2026-09-24/README.md index ebe1344..d764a84 100644 --- a/runs/fotballklubb-2026-09-24/README.md +++ b/runs/fotballklubb-2026-09-24/README.md @@ -29,8 +29,8 @@ mails went from 33 to 40 words to 16 to 19 on one pass and 21 to 27 on the next, LIX from 30 to 39 to 29 to 40. The site here carries the second pass; its approved mail reads "{child} har fått plass på laget for sitt årskull. Faktura for treningsavgiften kommer, og plassen er -klar når den er betalt." with a stray `{chain}` the model left at the -end, which renders as the record id. On the vel the same prompt +klar når den er betalt." The stray `{chain}` the model left at the end of each is gone: the +cleanup now runs on the final words, whatever wrote them. On the vel the same prompt evened six mails out at 17 to 24 words with both links kept. A first version of this note quoted a mail that did not exist and copied the vel's aggregates over the club's; both corrected here. diff --git a/runs/fotballklubb-2026-09-24/site/aggregates.yaml b/runs/fotballklubb-2026-09-24/site/aggregates.yaml index 6bab69b..6067752 100644 --- a/runs/fotballklubb-2026-09-24/site/aggregates.yaml +++ b/runs/fotballklubb-2026-09-24/site/aggregates.yaml @@ -55,19 +55,19 @@ aggregates: betalt: event: betalt mail: - body: Betalingen er registrert, og plassen på laget er sikret. Trenerne tar kontakt før oppstart. Har du spørsmål, bare svar på denne mailen. {chain} + body: Betalingen er registrert, og plassen på laget er sikret. Trenerne tar kontakt før oppstart. Har du spørsmål, bare svar på denne mailen. subject: Betalt - plassen er sikret to: submitter godkjent: event: godkjent mail: - body: '{child} har fått plass på laget for sitt årskull. Faktura for treningsavgiften kommer, og plassen er klar når den er betalt. {chain}' + body: '{child} har fått plass på laget for sitt årskull. Faktura for treningsavgiften kommer, og plassen er klar når den er betalt.' subject: Godkjent - plass på laget to: submitter open: event: received mail: - body: Innmeldingen er mottatt, og trenerne ser på den nå. Du hører fra oss så snart plassen er avklart. {chain} + body: Innmeldingen er mottatt, og trenerne ser på den nå. Du hører fra oss så snart plassen er avklart. subject: Innmeldingen er mottatt to: submitter trukket: diff --git a/runs/fotballklubb-2026-09-24/words-short.json b/runs/fotballklubb-2026-09-24/words-short.json index 4ec8a20..d433774 100644 --- a/runs/fotballklubb-2026-09-24/words-short.json +++ b/runs/fotballklubb-2026-09-24/words-short.json @@ -2,15 +2,15 @@ "aggregates.yaml": { "innmeldinger": { "betalt": { - "body": "Betalingen er registrert, og plassen på laget er sikret. Trenerne tar kontakt før oppstart. Har du spørsmål, bare svar på denne mailen. {chain}", + "body": "Betalingen er registrert, og plassen på laget er sikret. Trenerne tar kontakt før oppstart. Har du spørsmål, bare svar på denne mailen.", "subject": "Betalt - plassen er sikret" }, "godkjent": { - "body": "{child} har fått plass på laget for sitt årskull. Faktura for treningsavgiften kommer, og plassen er klar når den er betalt. {chain}", + "body": "{child} har fått plass på laget for sitt årskull. Faktura for treningsavgiften kommer, og plassen er klar når den er betalt.", "subject": "Godkjent - plass på laget" }, "open": { - "body": "Innmeldingen er mottatt, og trenerne ser på den nå. Du hører fra oss så snart plassen er avklart. {chain}", + "body": "Innmeldingen er mottatt, og trenerne ser på den nå. Du hører fra oss så snart plassen er avklart.", "subject": "Innmeldingen er mottatt" } } diff --git a/src/build.rs b/src/build.rs index 6ed62ff..b074c22 100644 --- a/src/build.rs +++ b/src/build.rs @@ -1620,10 +1620,7 @@ pub fn run(argv: &[String]) -> anyhow::Result<()> { std::fs::write(out.join(format!("llm/{:02}-{}.md", n + 1, path.replace('/', "_"))), format!("{prompt}\n\n=== REPLY ===\n{reply}"))?; match first_object(&reply) { Some(given) => { - let mut merged = merge_words(fallback, &given); - if path == "aggregates.yaml" { - keep_links(fallback, &mut merged); - } + let merged = merge_words(fallback, &given); match wrong_language(&plan.language, &given) { Some(found) => eprintln!("words: {path} - the reply reads as {found} for a {} plan, keeping the words it had", plan.language), None => { @@ -1636,6 +1633,14 @@ pub fn run(argv: &[String]) -> anyhow::Result<()> { } } } + // Last, whatever the words came from - a model, an overrides file, + // a lift from a live repo: a mail keeps the link to the sender's + // own move, and a placeholder left loose in its prose goes. + if let Some(mails) = words.get("aggregates.yaml").cloned() { + let mut mails = mails; + keep_links(&fallback_words(&plan)["aggregates.yaml"], &mut mails); + words.insert("aggregates.yaml".to_string(), mails); + } write_repo(&out, render(&plan, &words)?)?; // The words as used, so the next rebuild can start from them. std::fs::write(out.join("words.json"), serde_json::to_string_pretty(&words)?)?;