import { createHash } from 'node:crypto'; /** Escape a value for an HTML text node or a quoted attribute. */ export function escapeHtml(value) { return String(value ?? '').replace(/[&<>"']/g, character => ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''', })[character]); } /** * Render a complete, script-free page. `body` is trusted authored HTML; * callers must escape any user-supplied values before inserting them. */ export function renderPage(title, body) { const safeTitle = escapeHtml(title); return ` ${safeTitle} · Charitology

Charitology · The science of doing the most good

${safeTitle}

${body}
`; } // Adapted from src/pages/record/newsletter/edition-1.astro. The email omits // the page's print button and replaces its delivery-setup note with this // delivery footer. All editorial claims and their limits remain visible. const id = 'edition-1'; const title = 'A system we can question'; const subject = 'The Charitology Letter · Edition 1: A system we can question'; const unsubscribe = '{{{RESEND_UNSUBSCRIBE_URL}}}'; const address = '938 Peacock Station Rd, McLean, VA 22102'; const editionUrl = 'https://charitology.org/record/newsletter/edition-1/'; const html = renderPage(title, `

The Charitology Letter · Edition 1 · October 25, 2026

The complete brief, working research desks, an open course and a way to keep uncertainty visible.

Generosity is already here. Charitology asks how its signals, channels, work and feedback can help it reach the outcomes people value. This letter is an invitation to use the tools, challenge the assumptions and improve the record. It is an editorial draft, produced with AI assistance.

The full ambition is public

The 66-item original brief includes research programs, donor tools and information bases. Every item has a public page. Its software status describes the function available on that page; a research desk does not establish a staffed institute, a fund or a professional credential.

Try one concrete piece of work

What would make this useful?

A page is useful if it improves a real decision or makes an assumption easier to challenge. It is not useful merely because it exists. If a form omits a crucial question, a classification hides a disagreement or a claim outruns its source, open a correction. Public contributions should avoid personal details about people receiving support.

A question for your next meeting

What evidence would change the decision we are about to make?

Write the answer before seeing the next result. Record who can act on it and how people affected by the work can challenge it. Then return to that record after the decision. This is a proposed learning practice; its effectiveness still needs testing.

Review an entry · Subscribe to this letter by RSS · Read this edition online

`); const text = `THE CHARITOLOGY LETTER Edition 1 · October 25, 2026 ${title} The complete brief, working research desks, an open course and a way to keep uncertainty visible. Generosity is already here. Charitology asks how its signals, channels, work and feedback can help it reach the outcomes people value. This letter is an invitation to use the tools, challenge the assumptions and improve the record. It is an editorial draft, produced with AI assistance. THE FULL AMBITION IS PUBLIC The 66-item original brief includes research programs, donor tools and information bases. Every item has a public page. Its software status describes the function available on that page; a research desk does not establish a staffed institute, a fund or a professional credential. Original brief and roadmap: https://charitology.org/roadmap/ TRY ONE CONCRETE PIECE OF WORK - Use the Evidence Reviews desk to define a question, track inclusion decisions and extract study results. https://charitology.org/programs/evidence-reviews/ - Read the complete textbook, then work through the self-paced course. Completion records describe self-study. Textbook: https://charitology.org/record/principles/read/ Course: https://charitology.org/programs/principles-course/ - Compare dated indicators in the country data desk, keeping national statistics separate from local interpretation. https://charitology.org/record/country-profiles/ - Make a nomination packet that includes the strongest objection, funding limits and missing voices. The tool does not publish a ranking. https://charitology.org/record/charitology-100/ - Listen to Principles read aloud. Each episode discloses computer narration and links to its transcript and sources. https://charitology.org/record/podcast-and-newsletter/ WHAT WOULD MAKE THIS USEFUL? A page is useful if it improves a real decision or makes an assumption easier to challenge. It is not useful merely because it exists. If a form omits a crucial question, a classification hides a disagreement or a claim outruns its source, open a correction. Public contributions should avoid personal details about people receiving support. A QUESTION FOR YOUR NEXT MEETING What evidence would change the decision we are about to make? Write the answer before seeing the next result. Record who can act on it and how people affected by the work can challenge it. Then return to that record after the decision. This is a proposed learning practice; its effectiveness still needs testing. Review an entry: https://charitology.org/contribute/review/ Subscribe to this letter by RSS: https://charitology.org/newsletter.xml Read this edition online: ${editionUrl} Charitology ${address} Unsubscribe from the Charitology Letter: ${unsubscribe} `; // This hash covers the complete reviewed content, including subject and // plain text. No recipient data, token substitution or timestamp enters it. const payload = { id, subject, title, html, text }; export const edition = Object.freeze({ ...payload, hash: createHash('sha256').update(JSON.stringify(payload), 'utf8').digest('hex'), });