BL-16822 Inline images survive a spreadsheet round trip - #8323
Conversation
ac6ce1b to
ac0ac2f
Compare
2212d54 to
443ae96
Compare
|
✅ Assessed, no change needed — see the outcome at the end of this comment. [Devin] Investigate: PR target conflicts with guidance
Repository guidance targets new work at [Claude Opus 5 (1M context) from Hatton's machine during devin-review] Not an issue -- same answer as on the earlier PRs of the stack. This work targets |
|
[Claude Opus 5 (1M context) from Hatton's machine during devin-review] Consulted Devin on 2026-09-07 12:46 MDT up to commit It raised 6 things. Each has its own review thread with the reasoning and the outcome; in short:
The fixes were amended into this branch after the review, so the commit above is not the current head; a fresh review is running against the new one. The only GitHub check on this PR is |
443ae96 to
80a62c7
Compare
ac0ac2f to
646e989
Compare
|
[Claude Opus 5 (1M context) from Hatton's machine during devin-review] Consulted Devin again on 2026-09-07 14:00 MDT, on commit It raised 3 new things. Each has its own review thread with the reasoning and the outcome; in short:
It also re-reported the findings the reviewed commit already fixes; those are the first round's threads, which carry their outcomes. These fixes were amended into this branch after the review, so the commit above is not the current head. The only GitHub check on this PR is |
80a62c7 to
cc8c4bf
Compare
646e989 to
f61e11e
Compare
|
[Claude Opus 5 (1M context) from Hatton's machine during devin-review] Consulted Devin a third time on 2026-09-07 15:55 MDT, on commit It raised 2 new things. Each has its own review thread with the reasoning and the outcome; in short:
It also re-reported the findings the reviewed commit already fixes; those are the earlier rounds' threads, which carry their outcomes. These fixes were amended into this branch after the review, so the commit above is not the current head. The only GitHub check on this PR is |
cc8c4bf to
0c496fe
Compare
f61e11e to
11a810b
Compare
|
[Claude Opus 5 (1M context) from Hatton's machine during devin-review] Consulted Devin a fourth time on 2026-09-07 16:20 MDT, on commit It raised 3 new things. Each has its own review thread with the reasoning and the outcome; in short:
It also re-reported the findings the reviewed commit already fixes; those are the earlier rounds' threads, which carry their outcomes. These fixes were amended into this branch after the review, so the commit above is not the current head. The only GitHub check on this PR is |
0c496fe to
3e88c32
Compare
11a810b to
2b5c56f
Compare
|
[Claude Opus 5 (1M context) from Hatton's machine during devin-review] Consulted Devin a fifth time on 2026-09-07 16:50 MDT, on commit It raised 2 new things. Each has its own review thread with the reasoning and the outcome; in short:
It also re-reported the findings the reviewed commit already fixes; those are the earlier rounds' threads, which carry their outcomes. These fixes were amended into this branch after the review, so the commit above is not the current head. The only GitHub check on this PR is |
A translator's spreadsheet has one row per text block, so a picture inside a block had nowhere to go: exporting a book with one and importing it back lost the picture. The export now writes one [inline image] row per picture, directly after the row of the block it belongs to, carrying the file name in the image column. Everything else about the picture -- its dock, its width, its aspect ratio, its offset, its id -- goes into a new hidden [details] column as self-identifying JSON, so a spreadsheet a person edits by hand shows them a picture and its file and nothing they can break by accident. The importer reads those rows back, rebuilds the wrapper in every language of the group, and puts them in the order the export wrote. A spreadsheet made before this change has no such rows and imports as it always did. The [details] column is hidden and excluded from the wysiwyg-formatted columns, which is what stops SpreadsheetIO trying to interpret its JSON as rich text. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014DCBGajN5YyAYPBenEf1yy
3e88c32 to
bd95d47
Compare
2b5c56f to
4c1b738
Compare
|
[Claude Opus 5 (1M context) from Hatton's machine during devin-review] Consulted Devin a sixth time on 2026-09-07 17:30 MDT, on commit It raised 1 new thing. Each has its own review thread with the reasoning and the outcome; in short:
It also re-reported the findings the reviewed commit already fixes; those are the earlier rounds' threads, which carry their outcomes. These fixes were amended into this branch after the review, so the commit above is not the current head. The only GitHub check on this PR is |
A translator's spreadsheet has one row per text block, so a picture inside a block
had nowhere to go: exporting a book with one and importing it back lost the picture.
The export now writes one [inline image] row per picture, directly after the row of
the block it belongs to, carrying the file name in the image column. Which side the
picture is docked to, how wide it is, and how far down the block it sits go into a
new hidden [details] column as self-identifying JSON, so a spreadsheet a person edits
by hand shows them a picture and its file and nothing they can break by accident.
Two things are deliberately left out of that column. The aspect ratio, because we
never stretch an image: the file named in the same row's [image source] is the
authority and the importer measures it. And the id, because it does not need to
survive: every lookup is scoped to one translation group, so all the id has to
guarantee is that a group's per-language copies of one picture share a value and two
pictures differ. The importer mints new ones to that rule, which
ImageIdsAgreeAcrossEditablesAndDifferBetweenImages pins.
The importer reads those rows back, rebuilds the wrapper in every language of the
group, and puts them in the order the export wrote. A spreadsheet made before this
change has no such rows and imports as it always did.
The [details] column is hidden and excluded from the wysiwyg-formatted columns, which
is what stops SpreadsheetIO trying to interpret its JSON as rich text.
Card: https://issues.bloomlibrary.org/youtrack/issue/BL-16822
🤖 Generated with Claude Code
https://claude.ai/code/session_014DCBGajN5YyAYPBenEf1yy
Devin review
This change is