<feed xmlns='http://www.w3.org/2005/Atom'>
<title>sisudoc-spine/src/sisudoc/io_in, branch main</title>
<subtitle>SiSU Spine: document publishing and search (in D) 2015</subtitle>
<link rel='alternate' type='text/html' href='https://www.doc-reform.org/projects/sisudoc-spine/'/>
<entry>
<title>include .ssp document abstraction in source pod</title>
<updated>2026-04-23T00:42:31+00:00</updated>
<author>
<name>Ralph Amissah</name>
<email>ralph.amissah@gmail.com</email>
</author>
<published>2026-04-22T17:57:17+00:00</published>
<link rel='alternate' type='text/html' href='https://www.doc-reform.org/projects/sisudoc-spine/commit/?id=8df299dc69ade4484b1167a8fa293c291fbb8a4a'/>
<id>8df299dc69ade4484b1167a8fa293c291fbb8a4a</id>
<content type='text'>
- When --source/--pod is used, automatically generate the .ssp
  document abstraction and bundle it into the pod at
  media/abstraction/{doc_uid}.{lang}.ssp

- This makes show_abstraction implicitly true when source_or_pod
  is active, so the .ssp file is generated before the pod
  assembler runs (abstraction runs before outputHub, and
  source_or_pod is the first task in outputHub).

- Changes:
    paths_source.d:
      Add abstraction_root() path helper to _PodPaths struct,
      following the same pattern as image_root(). Produces
      paths like pod/media/abstraction/ for both zpod (inside
      zip) and filesystem_open_zpod (open directory).

    source_pod.d:
      - Create media/abstraction/ directory in
        podArchive_directory_tree
      - Bundle .ssp file in pod_zipMakeReady: reads from the
        abstraction output directory, copies to open pod
        directory, adds to zip archive, computes SHA-256 digest
      - Write .ssp digest in zipArchiveDigest alongside sstm
        and ssi digests

    spine.d:
      Make show_abstraction() return true when source_or_pod is
      active (previously only returned true for explicit
      --show-abstraction flag).

- The .ssp is always included when building pods - no exclusion
  flag for this experimental feature to keep things simple.
  Not generated for non-pod outputs (--text, --html, etc.)
  unless --show-abstraction is explicitly passed.

- Tested against all 35 sample documents - zero failures.

  Co-Authored-By: Anthropic Claude Opus 4.6 (1M context)
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
- When --source/--pod is used, automatically generate the .ssp
  document abstraction and bundle it into the pod at
  media/abstraction/{doc_uid}.{lang}.ssp

- This makes show_abstraction implicitly true when source_or_pod
  is active, so the .ssp file is generated before the pod
  assembler runs (abstraction runs before outputHub, and
  source_or_pod is the first task in outputHub).

- Changes:
    paths_source.d:
      Add abstraction_root() path helper to _PodPaths struct,
      following the same pattern as image_root(). Produces
      paths like pod/media/abstraction/ for both zpod (inside
      zip) and filesystem_open_zpod (open directory).

    source_pod.d:
      - Create media/abstraction/ directory in
        podArchive_directory_tree
      - Bundle .ssp file in pod_zipMakeReady: reads from the
        abstraction output directory, copies to open pod
        directory, adds to zip archive, computes SHA-256 digest
      - Write .ssp digest in zipArchiveDigest alongside sstm
        and ssi digests

    spine.d:
      Make show_abstraction() return true when source_or_pod is
      active (previously only returned true for explicit
      --show-abstraction flag).

- The .ssp is always included when building pods - no exclusion
  flag for this experimental feature to keep things simple.
  Not generated for non-pod outputs (--text, --html, etc.)
  unless --show-abstraction is explicitly passed.

- Tested against all 35 sample documents - zero failures.

  Co-Authored-By: Anthropic Claude Opus 4.6 (1M context)
</pre>
</div>
</content>
</entry>
<entry>
<title>spine may be run against a zipped spine-pod url</title>
<updated>2026-04-13T20:55:02+00:00</updated>
<author>
<name>Ralph Amissah</name>
<email>ralph.amissah@gmail.com</email>
</author>
<published>2026-04-13T20:32:08+00:00</published>
<link rel='alternate' type='text/html' href='https://www.doc-reform.org/projects/sisudoc-spine/commit/?id=c28f9e360110cd797d47d57cb29d4e4498fb1e0b'/>
<id>c28f9e360110cd797d47d57cb29d4e4498fb1e0b</id>
<content type='text'>
- claude contributed src
  - processes zip from url using (system
    installed) curl for download
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
- claude contributed src
  - processes zip from url using (system
    installed) curl for download
</pre>
</div>
</content>
</entry>
<entry>
<title>spine may be run against a document-markup zip pod</title>
<updated>2026-04-13T20:25:56+00:00</updated>
<author>
<name>Ralph Amissah</name>
<email>ralph.amissah@gmail.com</email>
</author>
<published>2026-04-13T19:33:07+00:00</published>
<link rel='alternate' type='text/html' href='https://www.doc-reform.org/projects/sisudoc-spine/commit/?id=d0ac448e6425c9e4246cd529aeb11643dce8093f'/>
<id>d0ac448e6425c9e4246cd529aeb11643dce8093f</id>
<content type='text'>
- claude contributed src
  - Opens the zip with std.zip.ZipArchive (reads the whole file into
    memory)
  - Locates pod.manifest inside the archive to discover document paths
    and languages
  - Extracts markup files (.sst/.ssm/.ssi) as in-memory strings
  - Extracts images as in-memory byte arrays
  - Extracts conf/dr_document_make if present
  - Presents these to the existing pipeline as if they were read from
    the filesystem
  - Some security mitigations:
    - Zip Slip / Path Traversal: Reject entries containing `..` or
      starting with `/`; canonicalize resolved paths and verify they
      fall within extraction root
    - Zip Bomb: Check `ArchiveMember.size` before extracting; enforce
      per-file (50MB) and total size limits (500MB)
    - Entry Count: Limit number of entries (a pod should have at most
      ~100 files)
    - Path depth: limit (Maximum 10 path components).
    - Symlinks: Verify no symlinks in extracted content before
      processing (post-extraction recursive scan)
    - Filename Validation: Only allow expected characters; reject null
      bytes
    - Malformed Zips: Catch `ZipException` from `std.zip.ZipArchive`
      constructor
    - Cleanup on error
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
- claude contributed src
  - Opens the zip with std.zip.ZipArchive (reads the whole file into
    memory)
  - Locates pod.manifest inside the archive to discover document paths
    and languages
  - Extracts markup files (.sst/.ssm/.ssi) as in-memory strings
  - Extracts images as in-memory byte arrays
  - Extracts conf/dr_document_make if present
  - Presents these to the existing pipeline as if they were read from
    the filesystem
  - Some security mitigations:
    - Zip Slip / Path Traversal: Reject entries containing `..` or
      starting with `/`; canonicalize resolved paths and verify they
      fall within extraction root
    - Zip Bomb: Check `ArchiveMember.size` before extracting; enforce
      per-file (50MB) and total size limits (500MB)
    - Entry Count: Limit number of entries (a pod should have at most
      ~100 files)
    - Path depth: limit (Maximum 10 path components).
    - Symlinks: Verify no symlinks in extracted content before
      processing (post-extraction recursive scan)
    - Filename Validation: Only allow expected characters; reject null
      bytes
    - Malformed Zips: Catch `ZipException` from `std.zip.ZipArchive`
      constructor
    - Cleanup on error
</pre>
</div>
</content>
</entry>
<entry>
<title>2026</title>
<updated>2026-01-10T02:04:10+00:00</updated>
<author>
<name>Ralph Amissah</name>
<email>ralph.amissah@gmail.com</email>
</author>
<published>2026-01-10T02:04:10+00:00</published>
<link rel='alternate' type='text/html' href='https://www.doc-reform.org/projects/sisudoc-spine/commit/?id=457b4a09b580ad991873638cb8fbbfce23753961'/>
<id>457b4a09b580ad991873638cb8fbbfce23753961</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>terminal output verbosity levels, minor rework</title>
<updated>2025-09-25T15:58:17+00:00</updated>
<author>
<name>Ralph Amissah</name>
<email>ralph.amissah@gmail.com</email>
</author>
<published>2025-09-25T03:55:49+00:00</published>
<link rel='alternate' type='text/html' href='https://www.doc-reform.org/projects/sisudoc-spine/commit/?id=710bb22a76d6dcd33395984726cf0cc08f894122'/>
<id>710bb22a76d6dcd33395984726cf0cc08f894122</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>imports, make line searchable</title>
<updated>2025-07-16T03:52:25+00:00</updated>
<author>
<name>Ralph Amissah</name>
<email>ralph.amissah@gmail.com</email>
</author>
<published>2025-07-16T03:52:22+00:00</published>
<link rel='alternate' type='text/html' href='https://www.doc-reform.org/projects/sisudoc-spine/commit/?id=4321a13979f52a7c3c2fc0352dc7bf253527ddb1'/>
<id>4321a13979f52a7c3c2fc0352dc7bf253527ddb1</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>source &amp; pod (fix build from non-pod source)</title>
<updated>2025-06-12T17:54:06+00:00</updated>
<author>
<name>Ralph Amissah</name>
<email>ralph.amissah@gmail.com</email>
</author>
<published>2025-06-12T17:54:03+00:00</published>
<link rel='alternate' type='text/html' href='https://www.doc-reform.org/projects/sisudoc-spine/commit/?id=801e2c94c36f689a3efd48e1b13550df48a65f93'/>
<id>801e2c94c36f689a3efd48e1b13550df48a65f93</id>
<content type='text'>
- appears to work, but needs review
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
- appears to work, but needs review
</pre>
</div>
</content>
</entry>
<entry>
<title>triple single-quote marks block identifier added</title>
<updated>2025-02-21T17:42:57+00:00</updated>
<author>
<name>Ralph Amissah</name>
<email>ralph.amissah@gmail.com</email>
</author>
<published>2025-02-21T17:42:55+00:00</published>
<link rel='alternate' type='text/html' href='https://www.doc-reform.org/projects/sisudoc-spine/commit/?id=0b2bb143e4512e0c78d4e2efdb9161772d54459c'/>
<id>0b2bb143e4512e0c78d4e2efdb9161772d54459c</id>
<content type='text'>
- tics a bit cumbersome where single quotes work
  just as well
- testing required (special cases not covered)
- diverges from sisu markup which will need an
  update sometime
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
- tics a bit cumbersome where single quotes work
  just as well
- testing required (special cases not covered)
- diverges from sisu markup which will need an
  update sometime
</pre>
</div>
</content>
</entry>
<entry>
<title>2025</title>
<updated>2025-01-01T19:42:38+00:00</updated>
<author>
<name>Ralph Amissah</name>
<email>ralph.amissah@gmail.com</email>
</author>
<published>2025-01-01T19:42:38+00:00</published>
<link rel='alternate' type='text/html' href='https://www.doc-reform.org/projects/sisudoc-spine/commit/?id=24b8d40a8d182120dcd8dbc2874eab21a184db0e'/>
<id>24b8d40a8d182120dcd8dbc2874eab21a184db0e</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>[fn].digest.txt, sha256 of pod source files &amp; pod</title>
<updated>2024-07-04T15:37:24+00:00</updated>
<author>
<name>Ralph Amissah</name>
<email>ralph.amissah@gmail.com</email>
</author>
<published>2024-07-04T15:37:18+00:00</published>
<link rel='alternate' type='text/html' href='https://www.doc-reform.org/projects/sisudoc-spine/commit/?id=d7e7c79253697a7b34df04f547c70669acb67ea1'/>
<id>d7e7c79253697a7b34df04f547c70669acb67ea1</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
</feed>
