odysseus/services
ashvinctrl ff2138d837 fix(skills): stop SKILL.md frontmatter escapes compounding on every save
_emit_scalar quotes a frontmatter scalar with json.dumps when it holds
punctuation that would change how the line reads back. _parse_scalar undid that
with a bare raw[1:-1]: it stripped the quotes but never decoded the escapes. So
a description containing ü was written as the escape sequence \u00fc, read
back with that escape still sitting literally in the value, and re-escaped on
the next save. The backslash run doubles every save, so a non-English skill
description degrades into backslash noise after a few edits, and the escapes are
shown verbatim in the skills list and the /skills catalog.

This is not limited to non-ASCII. Any description containing a quote takes the
same path, since the quote is itself what forces the quoted form.

Make the two halves symmetric: emit with ensure_ascii=False, since SKILL.md is
UTF-8 at both ends (skills.py reads it, atomic_write_text writes it) and the
ASCII-escaped form bought nothing; and parse double-quoted scalars with
json.loads, falling back to the previous literal reading when the value is not
valid JSON. Files already corrupted heal one level per load.

ensure_ascii=False on its own would open a smaller hole. json.dumps escapes
every C0 control character but passes NEL, LINE SEPARATOR and PARAGRAPH
SEPARATOR through literally, and parse_frontmatter reads one scalar per line via
str.splitlines(), which breaks on all three. Re-escape those three, and add them
plus the remaining splitlines characters to the set that forces a quoted scalar,
so none of them can reach the file bare.
2026-08-03 22:50:52 +05:30
..
docs refactor(constants): single source of truth for data dir (#3368) 2026-06-08 09:58:52 +02:00
faces Odysseus v1.0 2026-05-31 23:58:26 +09:00
hwfit Merge verified Odysseus fixes 2026-07-23 14:49:02 +00:00
memory fix(skills): stop SKILL.md frontmatter escapes compounding on every save 2026-08-03 22:50:52 +05:30
research fix: services research source extraction crashes on a non-dict finding (#1868) 2026-07-20 09:39:16 +02:00
search fix(search): extract non-ASCII capitalized names in _extract_entities 2026-07-04 20:42:06 +03:00
shell fix: use running loop for shell stream deadlines (#1694) 2026-06-03 13:37:46 +09:00
stt STT: clean temp audio files on transcription failure 2026-06-02 20:43:24 +09:00
tts improve cache size calculation by filtering file types 2026-07-29 12:47:55 +03:00
youtube fix(youtube): consolidate duplicate handler 2026-06-15 15:03:41 +09:00
__init__.py Odysseus v1.0 2026-05-31 23:58:26 +09:00