assessThought rejects markdown leakage with:
if (/^(#{1,6}\s|\*\*)/.test(trimmed)) {
reasons.push('markdown formatting leaked into thought');
}
That is anchored to the start of the text, so it catches a thought that opens with ** and misses one where the bold appears anywhere after the first character. The abstract phase reliably produces the latter.
Observed on a real dream run — five new abstraction rows, all accepted:
The unifying pattern is **"Persistence through Structure"** — a principle where organized, hierarchical frameworks…
The deeper connection is the **"Boundary Translation Principle"** — a pattern that emphasizes the necessity of…
Because names are derived from definitions, the asterisks propagate into the label too: the stored name is literally The unifying pattern is **"Persistence through Structure"**.
The gate does fire sometimes — [dream:abstract] Rejected abstraction: markdown formatting leaked into thought appeared once in the same run — which is what makes this easy to miss. It looks like a working check.
Suggested fix
Detect paired emphasis anywhere in the text rather than only at position 0, e.g. /\*\*.+?\*\*/ or a general /(^|\s)(\*\*|__)\S/. Worth checking against the existing test corpus first: a legitimate thought could conceivably contain an asterisk, though bold pairs are far less likely than a leading **.
Consider also stripping rather than rejecting for abstract specifically — an abstraction whose only flaw is formatting carries real content, and discarding it loses the synthesis. Rejection is right for refine, where the previous definition survives; it is more costly for abstract, where nothing takes its place.
Found while verifying #52; out of scope for that change.
assessThoughtrejects markdown leakage with:That is anchored to the start of the text, so it catches a thought that opens with
**and misses one where the bold appears anywhere after the first character. Theabstractphase reliably produces the latter.Observed on a real dream run — five new abstraction rows, all accepted:
Because names are derived from definitions, the asterisks propagate into the label too: the stored
nameis literallyThe unifying pattern is **"Persistence through Structure"**.The gate does fire sometimes —
[dream:abstract] Rejected abstraction: markdown formatting leaked into thoughtappeared once in the same run — which is what makes this easy to miss. It looks like a working check.Suggested fix
Detect paired emphasis anywhere in the text rather than only at position 0, e.g.
/\*\*.+?\*\*/or a general/(^|\s)(\*\*|__)\S/. Worth checking against the existing test corpus first: a legitimate thought could conceivably contain an asterisk, though bold pairs are far less likely than a leading**.Consider also stripping rather than rejecting for
abstractspecifically — an abstraction whose only flaw is formatting carries real content, and discarding it loses the synthesis. Rejection is right forrefine, where the previous definition survives; it is more costly forabstract, where nothing takes its place.Found while verifying #52; out of scope for that change.