Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions .tbd/workspaces/outbox/issues/is-01khx9xwpv03xfg2cc5aqtwn8g.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
---
type: is
id: is-01khx9xwpv03xfg2cc5aqtwn8g
title: "Spec: Table row validation — empty row dropping, cell-level warnings, minRows/maxRows enforcement"
kind: epic
status: closed
priority: 2
version: 7
spec_path: docs/project/specs/active/plan-2026-02-20-validate-form-rows.md
labels: []
dependencies: []
child_order_hints:
- is-01khx9y5kgsweghjsdnt8wze22
- is-01khx9yd02anf0w14rkt37mcej
- is-01khx9ym9e1d2dyb3nh3dqs7qe
- is-01khx9yvwgs8af6m7q1yp8jb6s
- is-01khx9z3qgwx2s3gfnwbsnv45j
created_at: 2026-02-20T10:36:03.162Z
updated_at: 2026-02-20T17:28:14.954Z
closed_at: 2026-02-20T17:28:14.954Z
close_reason: "All phases complete: doc updates, empty row dropping in parse+apply, mostly-empty warnings, minRows enforcement, full test coverage"
---
21 changes: 21 additions & 0 deletions .tbd/workspaces/outbox/issues/is-01khx9y5kgsweghjsdnt8wze22.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
---
type: is
id: is-01khx9y5kgsweghjsdnt8wze22
title: "Phase 1: Update markform-spec.md and markform-reference.md with empty row handling and sparseness warning docs"
kind: task
status: closed
priority: 1
version: 5
spec_path: docs/project/specs/active/plan-2026-02-20-validate-form-rows.md
labels: []
dependencies:
- type: blocks
target: is-01khx9yd02anf0w14rkt37mcej
- type: blocks
target: is-01khx9ym9e1d2dyb3nh3dqs7qe
parent_id: is-01khx9xwpv03xfg2cc5aqtwn8g
created_at: 2026-02-20T10:36:12.271Z
updated_at: 2026-02-20T17:17:04.687Z
closed_at: 2026-02-20T17:17:04.686Z
close_reason: Updated markform-spec.md and markform-reference.md with empty row handling, minRows/maxRows semantics, and sparseness warning docs
---
19 changes: 19 additions & 0 deletions .tbd/workspaces/outbox/issues/is-01khx9yd02anf0w14rkt37mcej.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
---
type: is
id: is-01khx9yd02anf0w14rkt37mcej
title: "Phase 2a: Add isRowFullyEmpty() helper and empty row filtering in parseMarkdownTable()"
kind: task
status: closed
priority: 1
version: 4
spec_path: docs/project/specs/active/plan-2026-02-20-validate-form-rows.md
labels: []
dependencies:
- type: blocks
target: is-01khx9yvwgs8af6m7q1yp8jb6s
parent_id: is-01khx9xwpv03xfg2cc5aqtwn8g
created_at: 2026-02-20T10:36:19.841Z
updated_at: 2026-02-20T17:20:25.083Z
closed_at: 2026-02-20T17:20:25.081Z
close_reason: Added isRowFullyEmpty() helper and empty row filtering in parseMarkdownTable() and parseInlineTable() with full TDD coverage
---
19 changes: 19 additions & 0 deletions .tbd/workspaces/outbox/issues/is-01khx9ym9e1d2dyb3nh3dqs7qe.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
---
type: is
id: is-01khx9ym9e1d2dyb3nh3dqs7qe
title: "Phase 2b: Filter empty rows in set_table and append_table patch handlers in apply.ts"
kind: task
status: closed
priority: 1
version: 4
spec_path: docs/project/specs/active/plan-2026-02-20-validate-form-rows.md
labels: []
dependencies:
- type: blocks
target: is-01khx9yvwgs8af6m7q1yp8jb6s
parent_id: is-01khx9xwpv03xfg2cc5aqtwn8g
created_at: 2026-02-20T10:36:27.310Z
updated_at: 2026-02-20T17:22:27.541Z
closed_at: 2026-02-20T17:22:27.540Z
close_reason: Filtered empty rows in set_table and append_table patch handlers with unanswered edge case, full TDD coverage
---
19 changes: 19 additions & 0 deletions .tbd/workspaces/outbox/issues/is-01khx9yvwgs8af6m7q1yp8jb6s.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
---
type: is
id: is-01khx9yvwgs8af6m7q1yp8jb6s
title: "Phase 3: Add mostly-empty row warning in validateTableRow() with strict-majority threshold"
kind: task
status: closed
priority: 1
version: 4
spec_path: docs/project/specs/active/plan-2026-02-20-validate-form-rows.md
labels: []
dependencies:
- type: blocks
target: is-01khx9z3qgwx2s3gfnwbsnv45j
parent_id: is-01khx9xwpv03xfg2cc5aqtwn8g
created_at: 2026-02-20T10:36:35.087Z
updated_at: 2026-02-20T17:25:14.221Z
closed_at: 2026-02-20T17:25:14.221Z
close_reason: Added mostly-empty row warning in validateTableRow() with strict-majority threshold, moved minRows check before isEmpty early return, full TDD coverage
---
17 changes: 17 additions & 0 deletions .tbd/workspaces/outbox/issues/is-01khx9z3qgwx2s3gfnwbsnv45j.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
---
type: is
id: is-01khx9z3qgwx2s3gfnwbsnv45j
title: "Phase 4: Verify example forms and run full test suite for regressions"
kind: task
status: closed
priority: 2
version: 3
spec_path: docs/project/specs/active/plan-2026-02-20-validate-form-rows.md
labels: []
dependencies: []
parent_id: is-01khx9xwpv03xfg2cc5aqtwn8g
created_at: 2026-02-20T10:36:43.119Z
updated_at: 2026-02-20T17:28:07.041Z
closed_at: 2026-02-20T17:28:07.040Z
close_reason: "All quality gates pass: typecheck, lint, build, publint, 2256 unit tests, 44 golden tests"
---
15 changes: 15 additions & 0 deletions .tbd/workspaces/outbox/issues/is-01khy5qjtzdbp2189eh4x1xkea.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
type: is
id: is-01khy5qjtzdbp2189eh4x1xkea
title: Code review fixes for table row validation feature
kind: task
status: closed
priority: 1
version: 3
labels: []
dependencies: []
created_at: 2026-02-20T18:41:56.574Z
updated_at: 2026-02-20T18:48:08.151Z
closed_at: 2026-02-20T18:48:08.150Z
close_reason: Simplified isRowFullyEmpty logic, consolidated redundant tests, removed obvious comments
---
7 changes: 7 additions & 0 deletions .tbd/workspaces/outbox/mappings/ids.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
2h7f: 01khx9yd02anf0w14rkt37mcej
ds98: 01khx9xwpv03xfg2cc5aqtwn8g
iyg4: 01khx9yvwgs8af6m7q1yp8jb6s
osok: 01khx9y5kgsweghjsdnt8wze22
s6wk: 01khx9ym9e1d2dyb3nh3dqs7qe
tq4r: 01khy5qjtzdbp2189eh4x1xkea
xg2p: 01khx9z3qgwx2s3gfnwbsnv45j
13 changes: 11 additions & 2 deletions docs/markform-reference.md
Original file line number Diff line number Diff line change
Expand Up @@ -415,8 +415,13 @@ Structured tabular data with typed columns. Uses standard markdown table syntax.
| `columnIds` | string[] | Yes | Array of snake_case column identifiers |
| `columnLabels` | string[] | No | Display labels (defaults to header row) |
| `columnTypes` | (string \| object)[] | No | Column types with optional constraints (defaults to all `string`) |
| `minRows` | number | No | Minimum row count (default: 0) |
| `maxRows` | number | No | Maximum row count (default: unlimited) |
| `minRows` | number | No | Minimum number of non-empty rows (default: 0) |
| `maxRows` | number | No | Maximum number of non-empty rows (default: unlimited) |

**Empty row handling:** Fully-empty rows (where every cell is empty or skipped) are
silently dropped during normalization.
They are never counted toward `minRows`/`maxRows` and do not appear in parsed output.
A row with at least one non-empty cell is retained.

**Column types:**

Expand Down Expand Up @@ -445,6 +450,10 @@ Structured tabular data with typed columns. Uses standard markdown table syntax.
| `min` / `max` | `number`, `year`, `date` | Value bounds |
| `integer` | `number` | Must be integer |

**Row sparseness warning:** When a non-empty row has the majority of its cells empty
(strictly more than half), a validation warning is emitted.
This helps catch cases where an agent produced sparse or incomplete data.

**Sentinel values in cells:** Use `%SKIP%` or `%ABORT%` with optional reasons:

```markdown
Expand Down
13 changes: 11 additions & 2 deletions docs/markform-spec.md
Original file line number Diff line number Diff line change
Expand Up @@ -456,8 +456,13 @@ type.
| `columnIds` | string[] | Yes | Array of snake_case column identifiers |
| `columnLabels` | string[] | No | Array of display labels (backfilled from table header row if omitted) |
| `columnTypes` | (string \| object)[] | No | Array of column types with optional constraints (defaults to all `'string'`) |
| `minRows` | number | No | Minimum row count (default: 0) |
| `maxRows` | number | No | Maximum row count (default: unlimited) |
| `minRows` | number | No | Minimum number of non-empty rows (default: 0) |
| `maxRows` | number | No | Maximum number of non-empty rows (default: unlimited) |

**Empty row handling:** Fully-empty rows (where every cell is empty or skipped) are
silently dropped during normalization.
They are never counted toward `minRows`/`maxRows` and do not appear in parsed output.
A row with at least one non-empty cell is retained.

**Column types and validation:**

Expand Down Expand Up @@ -488,6 +493,10 @@ columnTypes=[{type: "string", required: true}, "number", "url"]
| `max` | `number`, `year`, `date` | Maximum value |
| `integer` | `number` | Value must be an integer |

**Row sparseness warning:** When a non-empty row has the majority of its cells empty
(strictly more than half), a validation warning is emitted.
This helps catch cases where an agent produced sparse or incomplete data.

**Example with per-column constraints:**
```md
{% field kind="table" id="priority_table" label="Ranked Insights"
Expand Down
Loading