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
12 changes: 12 additions & 0 deletions docs/github/prs/shards/010/08000000000000007803000000002985.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"pr_number": 10629,
"archive_path": "docs/history/pr-reviews/PR-10629-fix-hygiene-the-task-validator-rejected-the-repo-s-own-zetaid-and-57-of-real-usa.md",
"source_ids": [],
"fetched_at": "2026-08-14T17:54:40.212Z",
"schema_version": "v1",
"commit_sha": "2fe3d2a36dcd02861b41040e7d53bd9c3e5b31c7",
"title": "fix(hygiene): the Task validator rejected the repo's own ZetaId and 57% of real usage",
"state": "MERGED",
"merged_at": "2026-08-14T17:53:39Z",
"head_ref": "fix/task-regex-rejects-zetaids"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
# PR #10629 -- fix(hygiene): the Task validator rejected the repo's own ZetaId and 57% of real usage

> Git-native PR-review archive. Generated by
> `tools/archive/archive-pr-reviews.ts`. Schema version: 1.
>
> Wall-clock generation timestamp deliberately omitted from the
> rendered file so deterministic re-runs against unchanged
> upstream substrate produce byte-identical content (manifest
> `fetched_at` carries the audit timestamp instead).

## Metadata

| Field | Value |
|---|---|
| Number | 10629 |
| Title | fix(hygiene): the Task validator rejected the repo's own ZetaId and 57% of real usage |
| Author | `AceHack` (human) |
| State | MERGED |
| Created at | 2026-08-14T15:55:52Z |
| Merged at | 2026-08-14T17:53:39Z |
| Merge commit SHA | `2fe3d2a36dcd02861b41040e7d53bd9c3e5b31c7` |
| Branch | `fix/task-regex-rejects-zetaids` |
| Base branch | `main` |
| URL | https://github.com/Lucent-Financial-Group/Zeta/pull/10629 |
| Changed files | 1 |
| Additions / deletions | +54 / -3 |

## Description

fix(hygiene): the Task validator rejected the repo's own ZetaId and 57% of real usage

`TASK_RE` in validate-agencysignature-pr-body.ts accepted ticket-shaped ids only. It was
written before this repo retired sequential B-NNNN ids, and it cannot express a ZetaId at
all - 26 chars, Crockford base32, digit-initial, no dash.

Counted over every `Task:` value in the last 300 commits on main (363 values):

143 passed the old pattern
12 were bare ZetaIds - the canonical work-item key that
.claude/rules/workitems-mint-with-zetaid.md mandates
208 were slugs naming the work, or a ZetaId joined to one

So it rejected 57% of established practice, including the repo's own mandated id format.
#10594 wired this validator to CI unchanged, so at the cutover it would have reddened the
majority of correct commits - and a gate that fires mostly on correct work gets switched
off, which is strictly worse than no gate: a disabled check still occupies the slot where
a real one would go. Every Task value I used today would have failed, and so would the
ZetaIds in agent PRs.

The field's job is to NAME the work, so a slug always was a legitimate name and shape was
never the property worth enforcing. What must stay caught is the unfilled template, so
that is now explicit and checked FIRST, independently of shape: PLACEHOLDER_TASK_RE
rejects todo / tbd / xxx / task / placeholder / fixme / n/a / bare dashes / <...>. That
complements the existing PLACEHOLDER_RE rather than duplicating it - that one catches the
angle-bracket skeleton across every required key, while these are the words someone types
when they have not decided yet, none of which contain angle brackets and all of which
would have satisfied the widened shape.

The dashed alternative is case-INSENSITIVE deliberately. The commonest real form is a
ZetaId joined to a slug (081KZZYWBN2087G0R003NAQQAF-exact-cyclotomic-amplitude-carrier,
and the reverse order too); a lowercase-only slug rule left 23 of those still failing,
which my own test caught before commit. A second self-caught regression: dropping the
explicit `task-#?\d+` alternative broke `task-#12`, because `#` is not alphanumeric.

Verified: replaying all 363 historical values through the new patterns gives 0 failures;
every legacy form (none, Otto-343, task-#12, #99, FOO-12) still passes; all ten
placeholder spellings are rejected; 18 validator unit tests pass; lint-typescript exits 0.

Found by an agent while filing its own PR - it hit the rejection, worked around it with
`Task: none`, and flagged the regex rather than treating the workaround as the answer.

Agency-Signature-Version: 1
Agent: Otto
Agent-Runtime: Claude Code
Agent-Model: claude-opus-5
Credential-Identity: AceHack via gh
Credential-Mode: shared
Human-Review: pending
Human-Review-Evidence: chat
Action-Mode: autonomous-fail-open
Task: fix-task-regex-rejects-zetaids

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>


## Outcome

| Field | Value |
|---|---|
| Merged | true |
| Re-reviewed post-fix | false |
| Total threads | 0 |
| Resolved threads | 0 |
| Unresolved threads | 0 |
| Total review comments | 0 |
| Total fix commits (touching thread paths) | 0 |

## Review threads

(no review threads on this PR)

## Fix commits (touching thread paths)

(no commits in this PR touched files anchored by review threads)
Loading