Development record
2026-08-01 — iss-30 (v0.5.0 item C7), FINAL increment, test-only: the memory-ingest boundary's last four acceptance instances were absences, not defects, and are now drained behind detectors in `internal/core/memory/ingest_boundary_test.go` and `internal/core/memory/yaml_boundary_test.go`. The no-new-dep STOP the entry flagged for PDF extraction never fired, and the reason is the design rather than luck: `PDFExtractor` is a plain `func([]byte) (string, error)` the caller supplies, so a fake extractor covers the nil / error / empty-text / success matrix on the fetched path and both local sniffs (`.pdf` extension, `%PDF-` magic) without a parser ever entering `go.mod` — the nil case (no parser installed) is itself one of the behaviours under test. Likewise `Fetcher` carries the whole URL-ingest success path with no network: the fetcher is asked for the REQUESTED url, the FINAL url after redirects is what reaches the citation and the registry origin, the response headers reach licence detection (an HTTP `License:` header has no local-path equivalent), and `--keep-original` takes its extension from the final url's PATH, so a query string or fragment cannot leak into it. Two judgement calls worth recording. (1) On the parser's block-scalar limit: only the literal `|` opens a block — `>`, `|-` and `|+` are read as ordinary scalars — and rather than treat that as a defect to fix, the increment pins the property that makes it safe, which is that an unsupported indicator fails LOUDLY (the indented lines beneath it are refused as top-level content) rather than silently swallowing or dropping them. Widening the parser was rejected as scope the memory store has no shape asking for; the dumper never emits a block scalar at all. (2) No CHANGELOG entry: nothing user-facing changed, and the repo's own definition of done ties an entry to a user-facing change — the precedent is the behaviour-preserving `internal/urlguard` extraction, which carried none either. Every case was mutation-checked (sixteen targeted reversions of shipped behaviour, each turning at least one new case red), and no production behaviour was found to diverge from its own documentation, which is why this increment adds no fix.
2026-08-01 — iss-30 (v0.5.0 item C7), FINAL increment, test-only: the memory-ingest boundary's last four acceptance instances were absences, not defects, and are now drained behind detectors in internal/core/memory/ingest_boundary_test.go and internal/core/memory/yaml_boundary_test.go. The no-new-dep STOP the entry flagged for PDF extraction never fired, and the reason is the design rather than luck: PDFExtractor is a plain func([]byte) (string, error) the caller supplies, so a fake extractor covers the nil / error / empty-text / success matrix on the fetched path and both local sniffs (.pdf extension, %PDF- magic) without a parser ever entering go.mod — the nil case (no parser installed) is itself one of the behaviours under test. Likewise Fetcher carries the whole URL-ingest success path with no network: the fetcher is asked for the REQUESTED url, the FINAL url after redirects is what reaches the citation and the registry origin, the response headers reach licence detection (an HTTP License: header has no local-path equivalent), and --keep-original takes its extension from the final url's PATH, so a query string or fragment cannot leak into it. Two judgement calls worth recording. (1) On the parser's block-scalar limit: only the literal | opens a block — >, |- and |+ are read as ordinary scalars — and rather than treat that as a defect to fix, the increment pins the property that makes it safe, which is that an unsupported indicator fails LOUDLY (the indented lines beneath it are refused as top-level content) rather than silently swallowing or dropping them. Widening the parser was rejected as scope the memory store has no shape asking for; the dumper never emits a block scalar at all. (2) No CHANGELOG entry: nothing user-facing changed, and the repo's own definition of done ties an entry to a user-facing change — the precedent is the behaviour-preserving internal/urlguard extraction, which carried none either. Every case was mutation-checked (sixteen targeted reversions of shipped behaviour, each turning at least one new case red), and no production behaviour was found to diverge from its own documentation, which is why this increment adds no fix.
Frontmatter
| id | dcn-2608010000000014 |
|---|---|
| type | decision |
| date | 2026-08-01 |
.abcd/work/decisions/dcn-2608010000000014-iss-30-v0-5-0-item-c7-final-increment.md
open on GitHub ↗ · commit history ↗
mentions1
- iss-30memory ingest input-boundary defects: HTTP status is never checked so 404/500 error pages are silently ingested as source content (internal/core/memory/ingest.go:558-575); tilde expansion mangles ~user paths into home+user concatenations (ingest.go:579-584); a --keep-original failure after the page write reports total failure although pages and registry were durably mutated (ingest.go:301-311); CRLF pages are accepted by parseFrontmatter but rejected by splitFileFrontmatter so hashes and summaries silently degrade (yaml.go:558-591); the URL-ingest success path, content-type handling, PDF extraction, and original-storage are untested, as are YAML block scalars and double-quoted escapes. Detector: an ingest-boundary test suite — fetch status matrix, content-type matrix, CRLF round-trip, tilde cases, partial-failure reporting, parser-parity cases. Acceptance corpus: the six instances above.