Feedback gathered while running a full open-audit sweep (triage every open finding into a task, then close fully-triaged audits) against a real planning tree. Version: tskflwctl v0.14.1-0.20260707002012-89afc6655ae2+dirty. Bundled into one issue for context; happy to split into separate ones.
| # |
Priority |
Area |
One-liner |
| P1 |
High |
audit show / audit list |
Progress number contradicts its own bar and hides triage state |
| P2 |
High |
id validation |
Non-Crockford id → wrong error, aborts the whole command, no repair path |
| P3 |
Medium |
audit lint |
Legacy finding-status debt has no --fix; was masked by P2 |
| P4 |
Low |
task new --json |
created.id is the slug; real minted id only in created.path |
| P5 |
Low |
lifecycle |
No hard-delete for a mistaken/duplicate create |
P1 — The audit progress signal contradicts itself and hides triage state
The N% in audit show / audit list counts only fixed/landed, but the bar glyphs encode a 3-level gradient (█ fixed, ▓ in-progress, ▒ superseded). So the number and the bar disagree in the same widget:
findings: ▒▒▒▒▒▒▒▒▒▒ 0% 0/5 # all 5 superseded (fully offloaded to tasks) — reads as "0% done"
findings: ▓▓▓▓▓▒▒▒▒▒ 0% 0/4 # 2 in-progress + 2 superseded — bar says "half", number says "0%"
findings: ██████████ 100% 2/2 # all fixed
Consequences:
- An audit that is 100% triaged (0
open, every finding superseded to a real task → correctly closeable) is indistinguishable at the number from an audit nobody has touched — both show 0%.
- This directly caused a false alarm: "0%" was read as "nothing handled / the counter missed findings," when in fact every finding was parsed and superseded.
Suggested fixes (any one helps):
P2 — Invalid-id handling is brittle and misdiagnosed
Some audit files were generated with a non-Crockford char in the id (an l; Crockford base32 excludes i/l/o/u). Result:
- Wrong error message.
not an entity file: "<id>-<date>-<area>.md" has no leading id — move it to meta/ or delete it. The file has a leading id — it's just non-canonical. Correct message: id "<id>" contains non-Crockford-base32 char 'l' (i/l/o/u disallowed).
- One bad file aborts the whole command.
audit list, audit findings, and audit lint print the good rows and then exit 11 — so you can neither trust the exit code nor get clean output, even to query an unrelated audit by slug.
- No repair path.
lint --fix "backfills missing ids" but cannot repair an invalid id — chicken-and-egg: the file isn't discoverable, so the fixer never sees it. (Removing the id + renaming to a bare date-area slug doesn't help either — a no-id filename is hard-rejected the same way.)
The manual fix that worked: substitute the illegal char with its Crockford decode-alias (l→1, i→1, o→0) in both filename and id: frontmatter — same decoded value, canonical char, preserves sort order.
Suggested fixes:
P3 — Legacy finding-status debt has no migration path (and was masked by P2)
audit lint enforces a strict vocabulary (deferred/fixed/in-progress/landed/open/superseded/wontfix), but older audits use emoji (✅/⏳/⛔) or words (tracked, declined), and the oldest predate the Status: convention entirely.
lint --fix repairs tasks/epics but there is no audit lint --fix to normalize finding statuses (strip emoji, map declined→wontfix / tracked→superseded, backfill missing).
- The P2 abort hid this: whole-tree
audit lint never completed until the invalid-id files were fixed, so ~10 audits' worth of status debt was invisible.
schema audit documents the Status-line format but not the allowed vocabulary — I had to learn it from lint errors.
Suggested fixes:
P4 — task new --json output is confusing
The created object is under created, and created.id is the slug; the real minted id is only embedded in created.path (tasks/<minted-id>-<slug>.md). Scripting created.id expecting the id yields the slug.
Suggested fix:
P5 — No hard-delete for a mistaken create
A duplicate task new can only be undone with deprecate (leaves a tombstone) or by rm-ing the file (bypasses the CLI, against the "drive the lifecycle via tskflwctl" principle).
Suggested fix:
Working well (so this isn't all complaints)
--body-file, --dry-run, multi-slug audit close, schema <kind>, -c column selection, the finding→task supersede model, and the status-grouped tree in audit show are all great. The bar's glyph gradient is a genuinely good idea — it just needs a headline number that agrees with it (P1).
Feedback gathered while running a full open-audit sweep (triage every open finding into a task, then close fully-triaged audits) against a real planning tree. Version:
tskflwctl v0.14.1-0.20260707002012-89afc6655ae2+dirty. Bundled into one issue for context; happy to split into separate ones.audit show/audit listaudit lint--fix; was masked by P2task new --jsoncreated.idis the slug; real minted id only increated.pathP1 — The audit progress signal contradicts itself and hides triage state
The
N%inaudit show/audit listcounts onlyfixed/landed, but the bar glyphs encode a 3-level gradient (█fixed,▓in-progress,▒superseded). So the number and the bar disagree in the same widget:Consequences:
open, every findingsupersededto a real task → correctly closeable) is indistinguishable at the number from an audit nobody has touched — both show0%.Suggested fixes (any one helps):
0% resolved), or2 superseded · 2 in-progress · 0 fixed), oraudit listopencolumn so there's one consistent notion of "progress."P2 — Invalid-id handling is brittle and misdiagnosed
Some audit files were generated with a non-Crockford char in the id (an
l; Crockford base32 excludesi/l/o/u). Result:not an entity file: "<id>-<date>-<area>.md" has no leading id — move it to meta/ or delete it. The file has a leading id — it's just non-canonical. Correct message:id "<id>" contains non-Crockford-base32 char 'l' (i/l/o/u disallowed).audit list,audit findings, andaudit lintprint the good rows and then exit 11 — so you can neither trust the exit code nor get clean output, even to query an unrelated audit by slug.lint --fix"backfills missing ids" but cannot repair an invalid id — chicken-and-egg: the file isn't discoverable, so the fixer never sees it. (Removing the id + renaming to a baredate-areaslug doesn't help either — a no-id filename is hard-rejected the same way.)The manual fix that worked: substitute the illegal char with its Crockford decode-alias (
l→1,i→1,o→0) in both filename andid:frontmatter — same decoded value, canonical char, preserves sort order.Suggested fixes:
--strict).lint --fixshould repair/re-mint an invalid id, not only backfill a missing one.P3 — Legacy finding-status debt has no migration path (and was masked by P2)
audit lintenforces a strict vocabulary (deferred/fixed/in-progress/landed/open/superseded/wontfix), but older audits use emoji (✅/⏳/⛔) or words (tracked,declined), and the oldest predate theStatus:convention entirely.lint --fixrepairs tasks/epics but there is noaudit lint --fixto normalize finding statuses (strip emoji, mapdeclined→wontfix/tracked→superseded, backfill missing).audit lintnever completed until the invalid-id files were fixed, so ~10 audits' worth of status debt was invisible.schema auditdocuments the Status-line format but not the allowed vocabulary — I had to learn it from lint errors.Suggested fixes:
audit lint --fixcovering the emoji/legacy-word normalizations.schema audit.P4 —
task new --jsonoutput is confusingThe created object is under
created, andcreated.idis the slug; the real minted id is only embedded increated.path(tasks/<minted-id>-<slug>.md). Scriptingcreated.idexpecting the id yields the slug.Suggested fix:
slug.P5 — No hard-delete for a mistaken create
A duplicate
task newcan only be undone withdeprecate(leaves a tombstone) or byrm-ing the file (bypasses the CLI, against the "drive the lifecycle via tskflwctl" principle).Suggested fix:
task rm(andaudit rm) for never-committed mistakes.Working well (so this isn't all complaints)
--body-file,--dry-run, multi-slugaudit close,schema <kind>,-ccolumn selection, the finding→task supersede model, and the status-grouped tree inaudit showare all great. The bar's glyph gradient is a genuinely good idea — it just needs a headline number that agrees with it (P1).