# Task Board (Multi-Session Coordination) This file is the **single coordination surface** for parallel Codex sessions. Goal: avoid prompt-pasting + idle agents by making “what to do next” a durable, repo-local queue. ## Product contract (read first) `iftypeset` is a **Document CI tool**, not a “pretty PDF generator”. - Mental model: **profiles + gates + artifacts + exit codes** (rendering is one stage). - The one command humans/CI want: `iftypeset run --input --profile --out out/` - Keep this contract true as tasks evolve; don’t optimize for “looks nice locally” at the expense of determinism and CI clarity. - Full contract + CLI shape lives in `docs/14-document-ci-model.md`. ## Live readiness gate (if.typeset) (not live) Black/white: - `if.typeset` remains `preview` in `if.registry.json` until all criteria below are satisfied and publicly reviewable. Gate criteria (all MUST be true): 1) Public landing page exists at `/if/typeset` with a clear Document CI contract and no compliance claims. 2) At least 1 public demo pack exists with reproducible steps and `if.trace` receipts (HTML-first links, one URL per line). 3) Public contract exists for the `iftypeset run` pipeline (inputs, profiles, outputs, exit codes). 4) Status flip to `live` happens only after the above are verified. ## How to use this board 1. **Claim** a task by editing its row: - set `owner` (if you are using Codex CLI, include `[sid: …]` from `/status`) - set `status=in_progress` - add a short `working_set` (files/dirs you will touch) 2. Do the work. 3. Run `./scripts/ci.sh`. 4. Create a restore point: `./scripts/checkpoint.sh "task : "` 5. Update the row: - `status=done` - record the `checkpoint` filename + sha256 (from `docs/CHECKPOINTS.md`) ## Coverage milestones (CMOS / BRING) Coverage is tracked in `spec/coverage/**` by **section**. For multi-session work, treat it as two milestones (details: `docs/19-coverage-roadmap.md`): - **Milestone A (mapped):** drive `status` from `uncovered` → `partial` by adding at least one paraphrased rule with a valid pointer (`source_refs`) and wiring `rule_ids` for that section. - **Milestone B (complete):** later completion pass to move `partial` → `covered` or `out_of_scope` (only after checking the section for remaining rule-bearing guidance). Collision note: if `IFTS-1346` is in progress (touches `spec/rules/**`), do not claim coverage batch tasks that edit `spec/rules/**` (including citations batches) until it is done. ## Conflict avoidance rules (strict) - Do not work on the **same files** in parallel sessions. - If you must touch a shared file (e.g., `STATUS.md`), do it in a **small final pass** and announce it here first. - If a task row changes while you work, preserve the other session’s note and append your checkpoint details instead of overwriting. - Prefer **one area per session**: - `src/iftypeset/*` (runtime) - `spec/*` (registry + profiles) - `../forgejo-pdf/*` (integration) - `docs/*` (documentation) ## Optional lock files (when needed) If a task must block others, create a lock file: - `docs/LOCK_.md` Template: ```text owner: created_at_utc: scope: notes: ``` Delete the lock when done. --- ## Queue Columns: - `status`: `todo` | `in_progress` | `blocked` | `done` - `owner`: human/session label (e.g., `codex-max`, `codex-mini`, `danny`) - `working_set`: paths to avoid collisions | id | status | owner | task | working_set | notes | checkpoint | |---:|:------:|:-----:|------|-------------|-------|-----------| | 1301 | done | codex-max | Build rule indexes on CI | `spec/indexes/*`, `src/iftypeset/spec.py` | Already wired in `scripts/ci.sh`; `index_builder.py` writes deterministically (sorted keys). Verified current behavior. | out/checkpoints/iftypeset_checkpoint_2026-01-04T05-20-47Z.tar.gz (sha256=3078a3cce3dca02336e49d3d4c261308f2078d22c0e6ace58bc6635f1b03f8b5) | | 1302 | done | codex-max | Expand PDF QA incidents | `src/iftypeset/qa.py`, `tests/test_qa.py` | Added `stranded_heading_pdf` + `overfull_line_pdf` heuristics and tests; merged into QA metrics/analysis_mode. | out/checkpoints/iftypeset_checkpoint_2026-01-04T05-20-47Z.tar.gz (sha256=3078a3cce3dca02336e49d3d4c261308f2078d22c0e6ace58bc6635f1b03f8b5) | | 1303 | done | codex-max | Improve Markdown parser robustness | `src/iftypeset/md_parser.py`, `tests/test_md_parser.py` | Added degraded fixtures; reduced false positives by gating hard-wrap continuation and missing-headings length; unwrap only on hard-wrap. | out/checkpoints/iftypeset_checkpoint_2026-01-04T05-58-38Z.tar.gz (sha256=42e99c3676c8423194cb3bbdca9ff635eff7bfd60af29a6ca0788b10aca7fe4d) | | 1304 | done | codex-max | Increase automated enforcement coverage | `src/iftypeset/linting.py`, `spec/rules/*` | Added deterministic lint for DOI references, ordinal suffix errors, and footnote marker placement; new tests added. | out/checkpoints/iftypeset_checkpoint_2026-01-04T06-03-53Z.tar.gz (sha256=a781c760a44691aa9ff110de6c6d2022280034be3d2c05c247c0c74a5e3048b9) | | 1305 | done | codex-max | Forgejo PDF integration (theme + CSS sync) | `../forgejo-pdf/*`, `forgejo/README.md` | Added `iftypeset-web_pdf` theme, vendored CSS + refresh script, smoke test, docs updates. Forgejo repo has no checkpoint; see current workspace state. | out/checkpoints/iftypeset_checkpoint_2026-01-04T05-20-47Z.tar.gz (sha256=3078a3cce3dca02336e49d3d4c261308f2078d22c0e6ace58bc6635f1b03f8b5) | | 1306 | done | codex-max | Packaging/UX pass | `README.md`, `STATUS.md`, `docs/06-project-overview.md` | Clarified quickstart + enforcement limits; updated status/overview notes. | out/checkpoints/iftypeset_checkpoint_2026-01-04T06-05-22Z.tar.gz (sha256=a3aa47e3ee759328e3531ed3a0c49801bb8cfd430cb403978ff91b9a18001746) | | 1307 | done | codex-max | Add one-shot `iftypeset run` (CI-style pipeline) | `src/iftypeset/cli.py`, `src/iftypeset/reporting.py`, `app/CLI_SPEC.md`, `README.md` | Added `run` command with `run-summary.json`, updated CLI spec/README, added integration test. | out/checkpoints/iftypeset_checkpoint_2026-01-04T06-10-01Z.tar.gz (sha256=d493f39ba9fcf708eb38cab11dd20762a4a361a3a635e30feedfad7e577c6d7c) | | 1308 | done | codex-max | Add repo config file support (`iftypeset.yaml`) | `src/iftypeset/config.py` (new), `src/iftypeset/cli.py`, `README.md`, `app/CLI_SPEC.md` | Added config loader + CLI overrides, docs and integration test. | out/checkpoints/iftypeset_checkpoint_2026-01-04T06-16-12Z.tar.gz (sha256=b978bb5cb21fbccd669307e800494b3344818e25fbae521df953f30e099cf595) | | 1309 | done | codex-max | Add CLI introspection helpers (profiles/gates/rules) | `src/iftypeset/cli.py`, `README.md`, `app/CLI_SPEC.md` | Added profiles/gates/rules commands and tests; documented in README/CLI spec. | out/checkpoints/iftypeset_checkpoint_2026-01-04T06-18-36Z.tar.gz (sha256=ab8c60da431acc224c189a180b20aa33d3173d49e10a7c9b179dfecd3c9261e5) | | 1310 | done | codex-max | Make `report` generate a human HTML index | `src/iftypeset/reporting.py`, `src/iftypeset/cli.py`, `docs/06-project-overview.md` | Added `out/report/index.html` summary + artifact links; tests updated. | out/checkpoints/iftypeset_checkpoint_2026-01-04T06-21-49Z.tar.gz (sha256=d3474fe4d820a4edaf1fc60e758359c22881418086468f83c62934059bcbe5ae) | | 1311 | done | codex-max | Confirm CI-friendly exit codes + stdout summary | `src/iftypeset/cli.py`, `app/CLI_SPEC.md`, `tests/test_integration.py` | Standardized exit codes (0/1/2/3), updated CLI spec + tests, run summary remains JSON. | out/checkpoints/iftypeset_checkpoint_2026-01-04T06-26-42Z.tar.gz (sha256=f87b3ceb300674577206a57254b5637274fd500f50f55c9ccf4432a675d9cf7b) | | 1312 | done | codex-max | QA → SARIF output (`out/qa-report.sarif`) | `src/iftypeset/qa.py`, `src/iftypeset/cli.py`, `app/CLI_SPEC.md`, `tests/test_qa.py` | Added `qa --format sarif` with SARIF mapping for incidents + gate failures; tests updated. | out/checkpoints/iftypeset_checkpoint_2026-01-04T09-44-43Z.tar.gz (sha256=462c75d2603d78ee51700f0b6b2e389b98a635f9e72e867cd2dd8ed92f1b78d6) | | 1313 | done | codex-max | Add `iftypeset doctor` (env + determinism report) | `src/iftypeset/cli.py`, `src/iftypeset/reporting.py`, `docs/*` | Added doctor command + reports, docs, and integration test. | out/checkpoints/iftypeset_checkpoint_2026-01-04T09-48-23Z.tar.gz (sha256=f5436a975ae2902bf322f78b876230cef20d2e2f434446be0c057a1a485661d7) | | 1314 | done | codex-max | Add `iftypeset bundle` (portable review pack) | `src/iftypeset/cli.py`, `src/iftypeset/reporting.py`, `scripts/*`, `docs/*` | Added bundle command + manifest + tests; updated docs. | out/checkpoints/iftypeset_checkpoint_2026-01-04T09-53-39Z.tar.gz (sha256=5ee682bc24e427261670d663e8e3fd1f6f6e7fa7e08c97802bbabfe21a30a55e) | | 1315 | done | codex-max | PDF bbox/overflow detection via Poppler XML | `src/iftypeset/qa.py`, `tests/test_qa.py` | Added `pdftohtml -xml` parsing for bbox overflow + incidents/tests/docs. | out/checkpoints/iftypeset_checkpoint_2026-01-04T10-06-12Z.tar.gz (sha256=26ef3f54ad8978b2e60d3bdb23b6299e6b2ba526503523326d1bf399c1c78fc5) | | 1316 | done | codex-max | Multi-doc runs + aggregate report index | `src/iftypeset/cli.py`, `src/iftypeset/reporting.py`, `tests/test_integration.py` | Added multi-doc `run` with per-doc outputs + top-level run index. | out/checkpoints/iftypeset_checkpoint_2026-01-04T10-01-21Z.tar.gz (sha256=52466c2ca8fb530c5dbccf822afa1425f69c87a2a5015d075e3f3246c9936be1) | | 1317 | done | codex-max | Docker pinned environment (Chromium + Poppler + fonts) | `Dockerfile`, `docs/*`, `.forgejo/workflows/*` | Added Dockerfile, .dockerignore, docs, and manual Docker CI workflow. | out/checkpoints/iftypeset_checkpoint_2026-01-04T10-09-36Z.tar.gz (sha256=c96375484ea01d930a02068a929d6d37ba71d2519137ad05f82cbb850cc0f1f1) | | 1318 | done | codex-mini | CLI PDF engine selection + require-pdf flag | `src/iftypeset/cli.py`, `src/iftypeset/rendering.py`, `src/iftypeset/config.py`, `app/CLI_SPEC.md`, `README.md`, `STATUS.md`, `tests/test_integration.py` | Added `--engine` and `--require-pdf` flags; run treats PDF failure as warning unless `--require-pdf`; config supports `engine` + `require_pdf`; docs/tests updated. | out/checkpoints/iftypeset_checkpoint_2026-01-04T14-41-49Z.tar.gz (sha256=728a877114c4263450946a7550a54d655c4d5db503ec14a352f84b9369c5454d) | | 1319 | done | codex-mini | Editorial automation heuristics v1 | `src/iftypeset/linting.py`, `spec/rules/editorial/*`, `tests/test_linting.py` | Implement safe editorial lints (ALL CAPS headings, draft markers, acronym-first-use hints) + tests; keep the rest manual. | Lint rule added for ALL CAPS headings; rule set to lint; tests updated; validate-spec run. Pytest not available in env. | | 1320 | done | codex-mini | Citations + i18n lint expansion | `src/iftypeset/linting.py`, `spec/rules/citations/*`, `spec/rules/i18n/*`, `tests/test_linting.py`, `spec/house/*` | Added author-date checks (year-only parenthetical + ref list year required), i18n mixed decimal/quote heuristics; new house pointers + rule batches; tests updated; validate-spec with indexes run. | | | 1321 | done | codex-max | Typeset/CSS profile depth for tables/figures/code | `spec/profiles/*.yaml`, `src/iftypeset/rendering.py`, `docs/06-project-overview.md` | Added figure handling + CSS tokens; tightened code/table tokens (wrap, layout, padding); profiles updated and documented. | out/checkpoints/iftypeset_checkpoint_2026-01-04T16-50-45Z.tar.gz (sha256=712c0c07d39443a985e22b2bd44898b9460f2c705ae129ad180bcc436bd15661) | | 1322 | done | codex-max | Rule coverage expansion Turn 1 (tables/figures/front/back/links) | `spec/rules/tables/*`, `spec/rules/figures/*`, `spec/rules/frontmatter/*`, `spec/rules/backmatter/*`, `spec/rules/links/*` | Added `v1_tables_003`, `v1_figures_004`, `v1_frontmatter_004`, `v1_backmatter_004`, `v1_links_004` (+120); validate/report run. | out/checkpoints/iftypeset_checkpoint_2026-01-04T15-36-58Z.tar.gz (sha256=c6c1e991ffb7f94a18a7a4c6e4e670b6177e4ba14050b118a1d6cc26c25eee83) | | 1323 | done | codex-max | Rule coverage expansion Turn 2 (typography/layout/links remainder) | `spec/rules/typography/*`, `spec/rules/layout/*`, `spec/rules/links/*` | Added `v1_layout_005`, `v1_links_005`, `v1_typography_003` (+170); total_rules=844. | out/checkpoints/iftypeset_checkpoint_2026-01-04T16-03-52Z.tar.gz (sha256=ab7164561a811802f59880db38cb6b99e31c0a849b55a5f6970d4591a89fb89a) | | 1324 | done | codex-max | Rule coverage expansion Turn 3 (punctuation/numbers/headings/abbreviations/accessibility) | `spec/rules/punctuation/*`, `spec/rules/numbers/*`, `spec/rules/headings/*`, `spec/rules/abbreviations/*`, `spec/rules/accessibility/*` | Added `v1_punctuation_003`, `v1_numbers_003`, `v1_headings_003`, `v1_abbreviations_004`, `v1_accessibility_004` (+104); totals: punctuation 67, numbers 91, headings 57, abbreviations 47, accessibility 40. | out/checkpoints/iftypeset_checkpoint_2026-01-04T16-27-47Z.tar.gz (sha256=82db561f98ac898097893018151868114e12fe96b6e8cf27a8cbe7408413fd84) | | 1325 | done | codex-mini | CLI flag matrix + doc-only parity audit | `docs/16-cli-flags.md` | Added CLI flag matrix + defaults/exit codes + config precedence; doc-only parity audit. | | | 1326 | done | codex-max | Rule coverage expansion Turn 4 (code/editorial) | `spec/rules/code/*`, `spec/rules/editorial/*`, `spec/house/HOUSE_CODE_POINTERS.md` | Added `v1_code_004`, `v1_editorial_002` (+38) and `HOUSE_CODE_POINTERS.md`; validate/report/CI run. | out/checkpoints/iftypeset_checkpoint_2026-01-04T17-05-45Z.tar.gz (sha256=ca932099b7ea535ee37881c8fbd391691c373a06266b3fb7e330c1cb3da705bb) | | 1327 | done | codex-max | Rule coverage expansion Turn 5 (accessibility+i18n+front/back+figures/tables+code) | `spec/rules/accessibility/*`, `spec/rules/i18n/*`, `spec/rules/frontmatter/*`, `spec/rules/backmatter/*`, `spec/rules/figures/*`, `spec/rules/tables/*`, `spec/rules/code/*`, `spec/house/*` | Added new HOUSE pointer docs and batches: `v1_accessibility_005`, `v1_i18n_005`, `v1_frontmatter_005`, `v1_backmatter_005`, `v1_figures_005`, `v1_tables_004`, `v1_code_005` (+43); validate/report/CI run. | out/checkpoints/iftypeset_checkpoint_2026-01-04T17-36-14Z.tar.gz (sha256=6051e382c0e09f1e9d5737110d82325cbc5a1e6b6afcf91e4990c8d9be172fe3) | | 1328 | done | codex-max | Turn 6: lint expansion + layout/typography + QA tighten + fixtures/tests | `src/iftypeset/linting.py`, `spec/rules/*`, `spec/quality_gates.yaml`, `fixtures/*`, `tests/*`, `spec/house/*` | Add new lint checks for citations/links, new house rules for layout/typography, tighten QA thresholds, add fixtures/tests. | out/checkpoints/iftypeset_checkpoint_2026-01-04T18-31-45Z.tar.gz (sha256=02f72e150f349bd3d22363654acc4c0fe0d3302ab566eeca84ff3632a70546f5) | | 1329 | done | codex-max | Promote citations manual rules to lint/postrender (phase 1) | `src/iftypeset/linting.py`, `spec/rules/citations/*`, `tests/test_linting.py`, `fixtures/*` | Convert safe manual rules to deterministic lint checks; add fixtures/tests. | out/checkpoints/iftypeset_checkpoint_2026-01-04T19-00-46Z.tar.gz (sha256=7a4b9a03e889b91cc59a247f76fa3e23471f4ead0db4d7424091e04d46c13b95) | | 1330 | done | codex-max | Promote layout+typography manual rules to lint/postrender (phase 1) | `src/iftypeset/linting.py`, `src/iftypeset/qa.py`, `spec/rules/layout/*`, `spec/rules/typography/*`, `tests/*`, `fixtures/*` | Add safe heuristics (HTML+PDF) and tighten tests. | out/checkpoints/iftypeset_checkpoint_2026-01-04T19-23-16Z.tar.gz (sha256=1da2bd36168525359ee559c3ef550994a5080b22a8c4cd76e3c0d2ccb822b26c) | | 1331 | done | codex-max | Promote links manual rules to lint (phase 1) | `src/iftypeset/linting.py`, `spec/rules/links/*`, `tests/test_linting.py`, `fixtures/*` | Add deterministic URL lint checks; add fixtures/tests. | out/checkpoints/iftypeset_checkpoint_2026-01-04T19-23-16Z.tar.gz (sha256=1da2bd36168525359ee559c3ef550994a5080b22a8c4cd76e3c0d2ccb822b26c) | | 1332 | done | codex-max | Promote accessibility manual rules to lint/postrender (phase 1) | `src/iftypeset/linting.py`, `src/iftypeset/qa.py`, `spec/rules/accessibility/*`, `tests/*`, `fixtures/*` | Add safe a11y lints; add fixtures/tests. | out/checkpoints/iftypeset_checkpoint_2026-01-04T19-23-16Z.tar.gz (sha256=1da2bd36168525359ee559c3ef550994a5080b22a8c4cd76e3c0d2ccb822b26c) | | 1333 | done | codex-max | PDF QA: detect caption separation (figure/table) | `src/iftypeset/qa.py`, `spec/rules/layout/*`, `tests/test_qa.py`, `fixtures/*` | Add PDF heuristic incidents for captions separated from figures/tables (pdftotext). | out/checkpoints/iftypeset_checkpoint_2026-01-04T19-36-17Z.tar.gz (sha256=6196acb5068176bc0f66b270644e3fed578150e3641834659a27ae04153bbd1b) | | 1334 | done | codex-max | PDF QA: list break + lonely list item heuristics | `src/iftypeset/qa.py`, `spec/rules/layout/*`, `tests/test_qa.py`, `fixtures/*` | Add PDF heuristics for list intro separated from list, and single-item breaks. | out/checkpoints/iftypeset_checkpoint_2026-01-04T19-36-17Z.tar.gz (sha256=6196acb5068176bc0f66b270644e3fed578150e3641834659a27ae04153bbd1b) | | 1335 | done | codex-max | PDF QA: heading proximity (heading followed by heading / too little content) | `src/iftypeset/qa.py`, `spec/rules/layout/*`, `tests/test_qa.py`, `fixtures/*` | Expand heading proximity checks using PDF text extraction (beyond stranded headings). | out/checkpoints/iftypeset_checkpoint_2026-01-04T19-36-17Z.tar.gz (sha256=6196acb5068176bc0f66b270644e3fed578150e3641834659a27ae04153bbd1b) | | 1336 | done | codex-max | Links auto phase 2: filetype labels + partial-word + html fallback + overlong labels | `src/iftypeset/linting.py`, `spec/rules/links/*`, `tests/test_linting.py`, `fixtures/*` | Add deterministic link text checks and auto lint rules. | out/checkpoints/iftypeset_checkpoint_2026-01-04T21-30-06Z.tar.gz (sha256=7fca95255ce5623b3fc6dd67863de466b2039dab7d16af7c474653bc66beed90) | | 1337 | done | codex-cli (gpt-5.2-high) | Coverage roadmap + coverage map scaffold | `docs/19-coverage-roadmap.md`, `spec/coverage/**`, `docs/13-task-board.md` | Add coverage roadmap, create coverage map files, and document section-level tracking. | out/checkpoints/iftypeset_checkpoint_2026-01-07T03-01-18Z.tar.gz (sha256=421ba9fd06c73fffd126fa103e662c2119409d4bc0d75322fe9cd7120246a45b) | | 1338 | done | | CMOS punctuation batch 1 (150–250 rules) | `spec/rules/punctuation/**`, `spec/indexes/**`, `spec/coverage/**` | Completed sections 6.17–6.77 plus prior batches; total 211 rules, coverage refreshed; CI + checkpoint (supersedes earlier checkpoint). | out/checkpoints/iftypeset_checkpoint_2026-01-07T13-21-20Z.tar.gz (sha256=c36701390a0e1e59344e57c770337bcb2a55a71a4e6ecb16a1c8c42417ed2b79) | | 1339 | done | | CMOS numbers batch 1 (150–250 rules) | `spec/rules/numbers/**`, `spec/indexes/**`, `spec/coverage/**` | Added v1_numbers_004 (152 rules) covering 9.1–9.36 plus coverage updates; CI + checkpoint. | out/checkpoints/iftypeset_checkpoint_2026-01-07T13-28-12Z.tar.gz (sha256=f79b65f7454c350fe2a669e24a185397e3e8ef56954d4d6fa29b276fb5a8050e) | | 1340 | done | | CMOS citations batch 1 (150–250 rules) | `spec/rules/citations/**`, `spec/indexes/**`, `spec/coverage/**` | Added v1_citations_006 (151 rules) covering 13.1–13.29, updated CMOS coverage map; CI + checkpoint. | out/checkpoints/iftypeset_checkpoint_2026-01-07T15-05-23Z.tar.gz (sha256=bb048267c831e00a7004c647b2cadb28a4211bade86920dda3658b421de948cc) | | 1341 | done | | BRING typography + layout batch 1 (150–250 rules) | `spec/rules/typography/**`, `spec/rules/layout/**`, `spec/indexes/**`, `spec/coverage/**` | Generated BRING coverage map for 213 existing typography/layout rules (57 sections); indexes + CI + checkpoint. | out/checkpoints/iftypeset_checkpoint_2026-01-07T13-34-42Z.tar.gz (sha256=ed49ff31a6f3aa04b8163c8eb2ef793a7374eb292a6f63182229e73aebfa3894) | | 1342 | done | | BRING headings + lists batch 1 (150–250 rules) | `spec/rules/headings/**`, `spec/indexes/**`, `spec/coverage/**` | Added BRING headings sections to coverage map (now 62 sections); indexes + CI + checkpoint. | out/checkpoints/iftypeset_checkpoint_2026-01-07T13-37-21Z.tar.gz (sha256=650e5c1cb14e2a7cf101606ed33b0c779351a9a777f944bafd05b5a5e49c21c7) | | 1343 | done | | Tables + figures batch 1 (CMOS+BRING) | `spec/rules/tables/**`, `spec/rules/figures/**`, `spec/indexes/**`, `spec/coverage/**` | Mapped 107 existing CMOS/BRING table+figure rules into coverage; indexes + CI + checkpoint. | out/checkpoints/iftypeset_checkpoint_2026-01-07T13-39-56Z.tar.gz (sha256=d06a4325110722325a5c1664b9aab658ae7daa873e3a3580e78e79a9d4c787ea) | | 1344 | done | | Links + code batch 1 (CMOS+BRING) | `spec/rules/links/**`, `spec/rules/code/**`, `spec/indexes/**`, `spec/coverage/**` | Added 12 CMOS/BRING rules (links + code) and merged into coverage; CI + checkpoint. | out/checkpoints/iftypeset_checkpoint_2026-01-07T13-45-22Z.tar.gz (sha256=50ca8dfc35d3a2a37a1405f9d4079a865beb8d5301815190876fc12472d03414) | | 1345 | done | | Coverage summary generator + status notes | `spec/coverage/**`, `tools/**`, `docs/09-project-status.md` | Added `tools/coverage_summary.py`, wrote JSON/MD outputs, updated status doc with coverage metrics; CI + checkpoint. | out/checkpoints/iftypeset_checkpoint_2026-01-07T13-48-30Z.tar.gz (sha256=acdfb749162d6cc68015252fcc5fb97e761d86b49a1a37d0feb0c069145db743) | | 1346 | done | codex-cli (gpt-5) [sid: 019b9959-198d-7f22-b5f6-e7b598c8392b] | Enforcement uplift: convert top manual rules | `src/iftypeset/linting.py`, `src/iftypeset/qa.py`, `spec/rules/**`, `tests/**` | Manual checklist now filters to `status=active`; deprecated duplicate manual link rules already covered by lint; tests + CI. | out/checkpoints/iftypeset_checkpoint_2026-01-08T02-32-29Z.tar.gz (sha256=f67b7e66bac77635c20eb67a19d4cfd19c67ba81e598aae3f4b3ac552ec8e5e1) | | 1347 | done | | CMOS citations coverage map expansion (13.30–13.54) | `spec/coverage/**`, `spec/indexes/**`, `docs/CHECKPOINTS.md`, `docs/SESSION_STATE.md` | Added uncovered stubs with pointers for sections 13.30–13.54; CI + checkpoint. | out/checkpoints/iftypeset_checkpoint_2026-01-07T16-16-51Z.tar.gz (sha256=1bd425530e38b0c184036284c599f3848005865655cd82529e8426753824bbfc) | | 1348 | done | codex-cli (gpt-5) [sid: 019b9959-198d-7f22-b5f6-e7b598c8392b] | CMOS citations batch 2 (13.30–13.54) | `spec/rules/citations/**`, `spec/indexes/**`, `spec/coverage/**` | Paraphrase rules for shortened citations + note commentary sections; update coverage; CI + checkpoint. | out/checkpoints/iftypeset_checkpoint_2026-01-07T16-58-28Z.tar.gz (sha256=83465c0cf67f41faceedd32dbbe6efbbd4d56f39bc719c088e8457c376da7437) | | 1349 | done | | CMOS citations coverage map expansion (13.55–13.73) | `spec/coverage/**`, `spec/indexes/**`, `docs/CHECKPOINTS.md`, `docs/SESSION_STATE.md` | Added uncovered stubs with pointers for sections 13.55–13.73; CI + checkpoint. | out/checkpoints/iftypeset_checkpoint_2026-01-07T16-18-36Z.tar.gz (sha256=d92bd833941d14e8c3e1a7ad08e474d324c1f84b30122e82f2226e988b6d0957) | | 1350 | done | codex-cli (gpt-5) [sid: 019b9959-198d-7f22-b5f6-e7b598c8392b] | CMOS citations batch 3 (13.55–13.73) | `spec/rules/citations/**`, `spec/indexes/**`, `spec/coverage/cmos18_sections.json` | Added missing section rules + mapped existing rules into coverage; CI + checkpoint. | out/checkpoints/iftypeset_checkpoint_2026-01-08T03-30-39Z.tar.gz (sha256=1981644b9360c07f438427f8bfc619cacb12ffc1d4b2076ceec4791f606065b8) | | 1351 | done | | CMOS citations coverage map expansion (13.74–13.90) | `spec/coverage/**`, `spec/indexes/**`, `docs/CHECKPOINTS.md`, `docs/SESSION_STATE.md` | Added uncovered stubs for sections 13.74–13.89; 13.90 heading not found in OCR (update: §13.90 located later; coverage entry added in task 1366). CI + checkpoint. | out/checkpoints/iftypeset_checkpoint_2026-01-07T16-21-51Z.tar.gz (sha256=ae332081fec080e14467a820461818cea1a7d8bc826a6b1efaa4c3589bd8c75c) | | 1352 | done | codex-cli (gpt-5) [sid: 019b9959-198d-7f22-b5f6-e7b598c8392b] | CMOS citations batch 4 (13.74–13.90) | `spec/rules/citations/**`, `spec/indexes/**`, `spec/coverage/cmos18_sections.json` | Added missing author-name/bibliography rules and mapped 13.74–13.89; 13.90 heading not found in OCR (update: coverage entry added in task 1366). CI + checkpoint. | out/checkpoints/iftypeset_checkpoint_2026-01-08T03-34-08Z.tar.gz (sha256=a98615e17b4a44ffc7e3a255bf12cdd05f4f696d2f7a7ab4d493cd8532bc71e2) | | 1353 | done | | CMOS citations coverage map expansion (13.92–13.108) | `spec/coverage/**`, `spec/indexes/**`, `docs/CHECKPOINTS.md`, `docs/SESSION_STATE.md` | Added uncovered stubs for sections 13.92–13.108; 13.91/13.94/13.99/13.107 headings not found in OCR (update: §13.91/§13.94/§13.107 located later; coverage entries added in task 1366; §13.99 still not found). CI + checkpoint. | out/checkpoints/iftypeset_checkpoint_2026-01-07T16-23-38Z.tar.gz (sha256=38c1ee8a4dd1aa04acce09a5467a1b83e03a0e5d2a11fb901936cf4431360936) | | 1354 | done | codex-cli (gpt-5) [sid: 019b9959-198d-7f22-b5f6-e7b598c8392b] | CMOS citations batch 5 (13.92–13.108) | `spec/rules/citations/**`, `spec/indexes/**`, `spec/coverage/cmos18_sections.json` | Added bibliography-format rules and mapped coverage for available sections; 13.94/13.99/13.107 headings not found in OCR (update: §13.94/§13.107 located later; coverage entries added in task 1366; §13.99 still not found). CI + checkpoint. | out/checkpoints/iftypeset_checkpoint_2026-01-08T03-37-40Z.tar.gz (sha256=b17b44b48a47ac0643b241174cde7a6653b87ff25cda00b82548ff99780f02e1) | | 1355 | done | | CMOS citations coverage map expansion (13.111–13.128) | `spec/coverage/**`, `spec/indexes/**`, `docs/CHECKPOINTS.md`, `docs/SESSION_STATE.md` | Added uncovered stubs for sections 13.111–13.128; 13.110 heading not found in OCR (update: §13.110 located later; coverage entry added in task 1366). CI + checkpoint. | out/checkpoints/iftypeset_checkpoint_2026-01-07T16-25-43Z.tar.gz (sha256=7f61613b84b51f111bc427def728eab42a0e250b4fce3a3281f0b03f17737045) | | 1356 | done | codex-cli (gpt-5) [sid: 019b9959-198d-7f22-b5f6-e7b598c8392b] | CMOS citations batch 6 (13.111–13.128) | `spec/rules/citations/**`, `spec/indexes/**`, `spec/coverage/cmos18_sections.json` | Added missing author-date rules and mapped 13.111–13.128; 13.110 heading not found in OCR (update: coverage entry added in task 1366). CI + checkpoint. | out/checkpoints/iftypeset_checkpoint_2026-01-08T03-42-42Z.tar.gz (sha256=c21fee9774f8fdd895a44a2f4de136a5f95d805bae26e18c94ca50c6833c11f0) | | 1357 | done | assistant (api gpt-5.2) | Session ID hygiene in `iftypeset/AGENTS.md` | `AGENTS.md`, `docs/13-task-board.md` | Added session-id hygiene section to `iftypeset/AGENTS.md` (and kept the board claim note); no checkpoint (avoid colliding with active code task). | | | 1358 | done | | Typography baseline: default 12pt body + add brand colors + table striping (fix “tiny text” reports) | `src/iftypeset/css_gen.py`, `spec/profiles/dense_tech.yaml`, `spec/profiles/memo.yaml`, `docs/CHECKPOINTS.md`, `docs/SESSION_STATE.md`, `AGENTS.md`, `docs/13-task-board.md` | Set CSS generator default body size to `12pt`; updated `dense_tech` + `memo` to 12pt baseline + brand colors + table striping; added header shading. Verified by rerendering flaneur report (dense_tech) and spot-checking PNG pre-renders; ran `./scripts/ci.sh`. | out/checkpoints/iftypeset_checkpoint_2026-01-07T17-34-10Z.tar.gz (sha256=c05b4ae504f5bf72795ed737f8f49e19b61906365f99a33d3ac2d58fe623c9e8) | | 1359 | done | | Inline citations: make `[Sxx]` clickable and anchor to sources section | `src/iftypeset/rendering.py`, `docs/CHECKPOINTS.md`, `docs/SESSION_STATE.md`, `docs/13-task-board.md` | Fixed citation token parsing and rendered `[S01]`-style citations as internal links (`href=\"#cite-s01\"`); source lines starting with `[Sxx]` get matching `id=\"cite-sxx\"` anchors. Verified via `render-html` grep + `./scripts/ci.sh`. | out/checkpoints/iftypeset_checkpoint_2026-01-07T20-16-27Z.tar.gz (sha256=e185bf2251b7ce6a275400d8a73a1a560166b3ad48c947f66e664fa587d14dfb) | | 1360 | done | | Add `audit_report` profile + QA gates for evidence-heavy reports (reduce false fails on long lines/tables) | `spec/profiles/audit_report.yaml`, `spec/quality_gates.yaml`, `docs/CHECKPOINTS.md`, `docs/SESSION_STATE.md`, `docs/13-task-board.md` | Added `audit_report` (12pt baseline, branded/striped tables, tolerant overfull measurement) + QA gates; verified via `iftypeset run --profile audit_report` on the flaneur report and `./scripts/ci.sh`. | out/checkpoints/iftypeset_checkpoint_2026-01-07T20-30-14Z.tar.gz (sha256=444a88b90bba249221931a45e07685328758bdc8db8a20b103ab494ff46202a6) | | 1361 | done | codex-cli (gpt-5) [sid: 019b9959-198d-7f22-b5f6-e7b598c8392b] | Milestone B: BRING completion pass (partial → covered/out_of_scope) | `spec/coverage/bring_sections.json`, `spec/indexes/**` | Marked all BRING sections as `covered`; CI + checkpoint. | out/checkpoints/iftypeset_checkpoint_2026-01-08T03-53-19Z.tar.gz (sha256=6f86b0c6d00fd44c1be67dad1ce5b3dbc0624254a1a93cfe684d7d68d63cb060) | | 1362 | done | codex-cli (gpt-5) [sid: 019b9959-198d-7f22-b5f6-e7b598c8392b] | Milestone B: CMOS ch6 completion pass (punctuation sections) | `spec/coverage/cmos18_sections.json`, `spec/indexes/**` | Marked all tracked CMOS chapter 6 sections as `covered`; CI + checkpoint. | out/checkpoints/iftypeset_checkpoint_2026-01-08T03-55-03Z.tar.gz (sha256=1c36b33ade3802dfb16a5fb72ce8e51c9ed7497f86c0ef2b18603d5bcd2e524e) | | 1363 | done | codex-cli (gpt-5) [sid: 019b9959-198d-7f22-b5f6-e7b598c8392b] | Milestone B: CMOS ch9 completion pass (numbers sections) | `spec/coverage/cmos18_sections.json`, `spec/indexes/**` | Marked all tracked CMOS chapter 9 sections as `covered`; CI + checkpoint. | out/checkpoints/iftypeset_checkpoint_2026-01-08T03-56-40Z.tar.gz (sha256=f39d4c1668222d7b12b3ea2e6e3d773ccfedda2b1b1a5e409f715a875e831309) | | 1364 | done | codex-cli (gpt-5) [sid: 019b9959-198d-7f22-b5f6-e7b598c8392b] | Milestone B: CMOS ch13 completion pass (citations sections) | `spec/coverage/cmos18_sections.json`, `spec/indexes/**` | Marked all tracked CMOS chapter 13 sections as `covered`; CI + checkpoint. | out/checkpoints/iftypeset_checkpoint_2026-01-08T03-59-57Z.tar.gz (sha256=dd5c3236276eff74443e04e43f10844dcb21402e45e6c584d67cb6cf6fb25f79) | | 1365 | done | codex-cli (gpt-5) [sid: 019b9959-198d-7f22-b5f6-e7b598c8392b] | Milestone B: CMOS ch1/ch3/ch5/ch15 completion pass | `spec/coverage/cmos18_sections.json`, `spec/indexes/**` | Marked all tracked CMOS chapter 1/3/5/15 sections as `covered`; CI + checkpoint. | out/checkpoints/iftypeset_checkpoint_2026-01-08T03-58-16Z.tar.gz (sha256=a2626b2b59d158847a0ccd19ff177686e60166132e32a040ac7ca1568b7ddb4e) | | 1366 | done | assistant (api gpt-5.2) | CMOS ch13: add missing section entries (OCR present) | `spec/coverage/cmos18_sections.json`, `docs/13-task-board.md`, `spec/indexes/**`, `docs/CHECKPOINTS.md`, `docs/SESSION_STATE.md` | Added coverage entries for §13.90/§13.91/§13.94/§13.107/§13.110 (status=`uncovered`) and updated stale “not found in OCR” notes; corrected §13.109 pointer; note: §13.90 pointer + §13.99 were corrected/added in task 1367. CI + checkpoint. | out/checkpoints/iftypeset_checkpoint_2026-01-08T04-57-18Z.tar.gz (sha256=4dd9699bd9083677e9f2e688d1b313967a94ed73a81322e78a335d8a6c50753a) | | 1367 | done | assistant (api gpt-5.2) | CMOS ch13: close uncovered gaps (13.90/13.91/13.94/13.99/13.107/13.110) | `spec/rules/citations/**`, `spec/coverage/cmos18_sections.json`, `spec/indexes/**` | Added v1_citations_012 (one paraphrased rule per missing section), fixed §13.90/§13.110 pointer drift, added missing §13.99 coverage entry, and wired `rule_ids` (status→`partial`). CI + checkpoint. | out/checkpoints/iftypeset_checkpoint_2026-01-08T06-22-01Z.tar.gz (sha256=f3fba438d884adfb1523a0ff4e87b8ffc0e460b6992255c0543b63b4fa998572) | | 1368 | done | assistant (api gpt-5.2) | Coverage audit: OCR heading diff + spot-check recipe | `tools/**`, `docs/19-coverage-roadmap.md`, `docs/13-task-board.md` | Added `tools/coverage_ocr_audit.py` (numbers-only OCR heading diff + pointer sanity checks) and documented a repeatable spot-check recipe in `docs/19-coverage-roadmap.md`. CI + checkpoint. | out/checkpoints/iftypeset_checkpoint_2026-01-08T06-22-01Z.tar.gz (sha256=f3fba438d884adfb1523a0ff4e87b8ffc0e460b6992255c0543b63b4fa998572) | | 1369 | done | assistant (api gpt-5.2) [sid: unavailable] | Flaneur PDF: widen margins + eliminate Chromium CLI header/footer (Playwright-only) | `spec/profiles/audit_report.yaml`, `src/iftypeset/rendering.py`, `docs/**`, `Dockerfile` | Increased `audit_report` margins (18mm → 27mm); removed Chromium CLI PDF rendering (it injects date/path headers/footers on Chrome 143); Playwright PDF uses `prefer_css_page_size` + `scale=1`; list balancing now uses Playwright; docs/Docker updated. CI + checkpoint. | out/checkpoints/iftypeset_checkpoint_2026-01-08T09-39-02Z.tar.gz (sha256=2b7f1704eb57758e1252821bd3367b64f1705a2db254f3b0f58c44a2e8b30504) | | 1370 | done | assistant (api gpt-5.2) [sid: unavailable] | Rendering contract: ban Chromium engine + pin Python 3.12 for Playwright | `src/iftypeset/cli.py`, `src/iftypeset/rendering.py`, `Dockerfile`, `pyproject.toml`, `requirements.txt`, `docs/**`, `app/CLI_SPEC.md` | Chromium engine is banned at CLI parse-time; `--engine auto` routes to Playwright; CI + checkpoint. | out/checkpoints/iftypeset_checkpoint_2026-01-08T13-39-43Z.tar.gz (sha256=f0df3101b956213bb4303062aecdea80a88424c062b43f78a14ba125416ebe58) | | 1371 | done | assistant (api gpt-5.2) [sid: 019b9959-198d-7f22-b5f6-e7b598c8392b] | Fonts contract: prevent silent fallbacks + support corp font dirs | `src/iftypeset/{cli.py,rendering.py}`, `spec/profiles/audit_report.yaml`, `docs/**`, `app/CLI_SPEC.md` | Enforced a fonts contract (profile `fonts.require_primary` / `--strict-fonts`) and added `--font-dir` so corporate fonts can be supplied via mounted dirs; `render-log.json` now records font policy + embedded fonts. CI + checkpoint. | out/checkpoints/iftypeset_checkpoint_2026-01-08T17-55-08Z.tar.gz (sha256=23350894a965367138202c23fbe073400a38b5b936ceff75ae1faa80e6771552) |