Date: 2026-01-27 Scope: Fix pool parsing, tabular parsing correctness/robustness, schema generic parsing, pool concurrency safety, and documentation alignment.
Principles
- Atomic, committable tasks with explicit validation.
- Each sprint ends in a runnable/demoable state and builds on prior work.
- Prefer tests; if tests are not meaningful, specify alternate validation.
Goal: @pool.str and @pool.obj accept full GLYPH values (including spaces, structs, lists) and validate string-pool types.
Demo: go test ./go/glyph -run Pool
Tickets
-
S1-T1: Replace whitespace tokenization with full GLYPH parsing for pool entries.
- Files:
glyph/go/glyph/pool.go - Notes: Parse entries by wrapping in
[...], useParseWithOptions(tolerant=false), require list result. - Validation:
go test ./go/glyph -run PoolParse(add test)
- Files:
-
S1-T2: Enforce
@pool.strentry types are strings; allow any value for@pool.obj.- Files:
glyph/go/glyph/pool.go - Validation:
go test ./go/glyph -run PoolType
- Files:
-
S1-T3: Add pool parse tests for nested structs, quoted strings with spaces, lists, and round-trip via
EmitPool.- Files:
glyph/go/glyph/pool_test.go - Validation:
go test ./go/glyph -run PoolRoundTrip
- Files:
-
S1-T4: Add pool parse error tests (unterminated entries, invalid types for
@pool.str).- Files:
glyph/go/glyph/pool_test.go - Validation:
go test ./go/glyph -run PoolErrors
- Files:
Goal: Correct row parsing, inline row splitting, and cell syntax edge cases.
Demo: go test ./go/glyph -run Tabular
Tickets
-
S2-T1: Detect and error on extra columns (leftover non-whitespace) after expected fields.
- Files:
glyph/go/glyph/parse_tabular.go,glyph/go/glyph/parse_tabular_test.go - Validation:
go test ./go/glyph -run TabularExtraColumns
- Files:
-
S2-T2: Treat date-only
YYYY-MM-DDas time in tabular cells.- Files:
glyph/go/glyph/parse_tabular.go,glyph/go/glyph/parse_tabular_test.go - Validation:
go test ./go/glyph -run TabularDateOnly
- Files:
-
S2-T3: Accept
_andnullas null tokens in tabular cells (in addition to∅).- Files:
glyph/go/glyph/parse_tabular.go,glyph/go/glyph/parse_tabular_test.go - Validation:
go test ./go/glyph -run TabularNullAliases
- Files:
-
S2-T4: Allow optional commas inside nested list/map cells in tabular parsing.
- Files:
glyph/go/glyph/parse_tabular.go,glyph/go/glyph/parse_tabular_test.go - Validation:
go test ./go/glyph -run TabularNestedCommas
- Files:
-
S2-T5: Fix inline tabular row splitting to respect quoted strings and escaped pipes.
- Files:
glyph/go/glyph/parse_tabular.go,glyph/go/glyph/parse_tabular_test.go - Validation:
go test ./go/glyph -run InlineTabularSplit
- Files:
Goal: Improve resilience to large rows and explicit schema handling.
Demo: go test ./go/glyph -run TabularReader
Tickets
-
S3-T1: Increase
bufio.Scannerbuffer forTabularReaderto handle large rows (e.g., embeddings).- Files:
glyph/go/glyph/parse_tabular.go - Validation:
go test ./go/glyph -run TabularLargeRow
- Files:
-
S3-T2: Return a clear error when
TabularReaderis used with a nil schema.- Files:
glyph/go/glyph/parse_tabular.go,glyph/go/glyph/parse_tabular_test.go - Validation:
go test ./go/glyph -run TabularNilSchema
- Files:
Goal: Correctly parse list<T>, map<K,V>, nested generics, and inline struct{...} types.
Demo: go test ./go/glyph -run ParseSchemaParameterizedTypes
Tickets
-
S4-T1: Extend lexer to tokenize
<and>; update token enums and stringers.- Files:
glyph/go/glyph/token.go - Validation:
go test ./go/glyph -run TokenizeSchemaGenerics
- Files:
-
S4-T2: Implement recursive
parseTypeSpechandling forlist<T>andmap<K,V>with proper error cases.- Files:
glyph/go/glyph/parse.go - Validation:
go test ./go/glyph -run ParseSchemaParameterizedTypes
- Files:
-
S4-T3: Add inline
struct{...}parsing inside type specs (e.g.,list<struct{a:int}>).- Files:
glyph/go/glyph/parse.go,glyph/go/glyph/schema_parse_test.go - Validation:
go test ./go/glyph -run ParseSchemaParameterizedTypes
- Files:
-
S4-T4: Add negative tests for malformed generic syntax (missing
>, missing type params).- Files:
glyph/go/glyph/schema_parse_test.go - Validation:
go test ./go/glyph -run ParseSchemaParameterizedTypesErrors
- Files:
Goal: Make pool operations safe for concurrent access (AutoInterner + PoolRegistry consumers).
Demo: go test -race ./go/glyph -run PoolConcurrent (or go test ./go/glyph -run PoolConcurrent if -race unavailable)
Tickets
-
S5-T1: Add locking to
PoolforAdd,Get, andStringaccess toEntries.- Files:
glyph/go/glyph/pool.go - Validation:
go test ./go/glyph -run PoolConcurrent
- Files:
-
S5-T2: Add concurrency test that calls
AutoInterner.Processin parallel with pool resolves.- Files:
glyph/go/glyph/pool_test.go - Validation:
go test -race ./go/glyph -run PoolConcurrent
- Files:
Goal: Sync docs with current behavior (auto-tabular default, null style, and pool parsing capabilities).
Demo: rg -n "auto-tabular" glyph/docs/LOOSE_MODE_SPEC.md and read updated docs.
Tickets
-
S6-T1: Update
LOOSE_MODE_SPEC.mdto reflect auto-tabular enabled by default in Go canonicalization; clarify null default_vs pretty∅.- Files:
glyph/docs/LOOSE_MODE_SPEC.md - Validation: Manual doc review;
rg -n "Auto-tabular" glyph/docs/LOOSE_MODE_SPEC.md
- Files:
-
S6-T2: Update
glyph/README.mdandglyph/docs/README.mdexamples to match defaults and pool capabilities.- Files:
glyph/README.md,glyph/docs/README.md - Validation: Manual doc review
- Files:
Subagent Review (Simulated)
- Suggest adding tests for pool parsing using
@pool.objwith nested lists/maps and quoted strings containing spaces. - Suggest adding inline-tabular tests with quoted values that include
|to verify splitter logic. - Suggest explicit error messages for nil schema to aid callers.
- Suggest docs to mention tabular reader row-size limits and new buffer behavior.
Edits incorporated into Sprint plan above.
Goal: Align default null style to _ across implementations and enforce 50% shared-key threshold for auto-tabular; keep parity tooling standalone and correct.
Demo: python3 tests/all_impl_parity_test.py
Tickets
-
S7-T1: Enforce ≥50% shared-key threshold (intersection/union) for auto-tabular eligibility when missing keys are allowed; reject empty-object rows.
- Files:
glyph/go/glyph/loose.go,glyph/py/glyph/loose.py - Validation:
go test ./go/glyph -run AutoTabularandpython3 -m pytest py/tests/test_glyph.py
- Files:
-
S7-T2: Make underscore the default null style in Python and adjust tests to match.
- Files:
glyph/py/glyph/loose.py,glyph/py/tests/test_glyph.py - Validation:
python3 -m pytest py/tests/test_glyph.py
- Files:
-
S7-T3: Update JS tests to expect
_for default loose canonicalization outputs (including tabular missing values).- Files:
glyph/js/src/glyph.test.ts - Validation:
npm test(run inglyph/js)
- Files:
-
S7-T4: Fix cross-impl parity helpers to use correct JSON bridges and in-repo paths; build Rust offline and build C lib if missing.
- Files:
glyph/tests/all_impl_parity_test.py,glyph/tests/cross_impl_parity_test.py - Validation:
python3 tests/all_impl_parity_test.py
- Files:
-
S7-T5: Document 50% shared-key rule in loose mode spec.
- Files:
glyph/docs/LOOSE_MODE_SPEC.md - Validation: Manual doc review
- Files: