Skip to content

feat(knowledge)!: remove the Review Queue tab - #1519

Merged
os-sales merged 1 commit into
mainfrom
claude/issue-781-delete-review-queue-tab
Sep 3, 2026
Merged

os-sales merged 1 commit into
mainfrom
claude/issue-781-delete-review-queue-tab

Conversation

@os-sales

@os-sales os-sales commented Sep 3, 2026

Copy link
Copy Markdown
Collaborator

Fixes #781

Acts on the maintainer ruling of 2026-08-31, recorded on the card. Quoted verbatim, not translated:

「781 什么叫 知识复核队列,建议删除。」

The card's title asks whether the tab should become a real 180-day cut. That question is closed in a fourth direction: routes A (keep the ranking), B (wait for a view-filter disjunction) and C (window plus backfill) are all rejected — the feature does not stay.

What is deleted

  • The view — stale_articles ('Review Queue · Oldest First') in src/views/knowledge_article.view.ts, with the long note arguing why it stayed a ranking. The Knowledge list now ships three tabs.
  • The four locale labels — 复核队列 · 最久未复核在前, Cola de revisión · Más antiguos primero, レビューキュー · 古い順, and the English one.
  • The tab-bound guard block — the stale_articles runtime describe in test/forecast-current-quarter-view.test.ts (~180 lines) that measured why the honest 180-day window was inexpressible. It retires because its subject retired, not to make anything green; every assertion in it bound to the deleted view, and its first statement (listViews.find(...)!.view) would have thrown at collection time.

What is kept, deliberately

The day-window guard vocabulary stays in full. This is the load-bearing judgement of the change, so it is argued rather than asserted.

DAY_WINDOW_PATTERNS / dayWindowClaims and family 2 of breachesOf fail any view whose label promises an N-day window while its filter carries no matching {N_days_ago}. stale_articles was its origin, not its subject: the derivation runs over every list view the app ships. Deleting it because it went quiet is precisely the failure this repo has paid for before.

One assertion in that family was genuinely tab-bound — it fed breachesOf the filter stale_articles actually shipped. It is reconstructed inline rather than deleted, because it is the only assertion that drives a day-window breach end to end: without it the derivations over the shipped stack pass over an empty set, and a broken reporter would be indistinguishable from a clean tree. The filter still goes through the real filterTokens rather than a hand-written [].

RETIRED_180D_LABELS and the false-positive controls are kept as historical strings. 古い順 sits one character from the firing 古い (>180日) — a property of the strings, not of the view.

Both halves proved by ablation, not by assertion

Each leg: mutate → prove it reached disk (anchored grep -c on injected and removed text, plus git hash-object against the HEAD blob) → run → restore → prove restoration by hash equality.

  1. The guard is still live over the shipped stack. Gave a different, still-shipping view a window claim (published_articles → Published (>90d)). Result: red, 2 failed / 19 passed, naming crm_knowledge_article.published_articles is labelled en:"Published (>90d)" but its filter carries no {90_days_ago}. It caught a view that is not the deleted one — which is the whole claim.
  2. The reconstructed control is not decoration. Blinded the >Nd pattern. Result: red on exactly the two control assertions.

Both restorations verified: git diff HEAD empty and the blob hash equal to the HEAD blob.

Explicitly NOT in scope

last_reviewed_at and #779's bulk-stamping fix are data-layer assets and are untouched — the publish hook still stamps the field, it stays on the article form under Engagement, and its four locale labels are unchanged. Whether the field itself should retire is a separate question and is not answered here. #779 is not addressed by this PR.

References the ruling's file surface did not name

Found by a tree-wide grep and cleaned, since a dangling reference to a deleted view is the likely way this lands red:

  • content/docs/service/knowledge-base.mdx and both Chinese faces — the bullet, the "four tabs" count, and the Retire stale content workflow step that told readers to work the queue from the top. Rewritten to describe the review-date semantics without claiming a navigation surface the app no longer offers. The Traditional face spells it 複核佇列, which a Simplified-only grep does not reach.
  • docs/feature-inventory.md KB-006.
  • src/views/opportunity.view.ts — a cross-reference that would otherwise point at a view that no longer exists.

Left alone on purpose: the 复核队列 in content/docs/sales/leads.* is the lead duplicate-review queue, an unrelated feature.

Bounded in-place fix, declared

The view file's header docblock listed three views for a file shipping four. Removing the stale line would have left it listing two of three, so the missing my drafts line was added in the same edit — same defect class, same file, mechanical.

Verification

pnpm verify (validate && typecheck && lint && lint:i18n-gate && hygiene && hygiene:tokens && build && test) green on the final commit 85c7d01:

✓ Validation passed          ✓ i18n lint gate: 0 i18n/missing-* issues
✓ source hygiene clean       ✓ source token ratchet clean
✓ Build complete             Test Files 156 passed · Tests 3285 passed | 1 skipped

Token ratchet: interaction layer 37,534 → 37,426. No re-anchor is owed — checked with the script's own exported anchor(), not by hand: anchor(37426) = 40,000, equal to the committed ceiling, and the script re-anchors only when anchor(reading) < ceiling. Ceilings untouched.

A changeset is included (minor, following the slim-nav-one-entry-per-destination precedent for a navigation-surface change) rather than a skip-changeset label, since this is a user-visible removal.


🤖 Generated with Claude Code

Generated by Claude Code


Generated by Claude Code

The knowledge base's fourth tab, `stale_articles` ('Review Queue · Oldest
First'), is deleted along with its four locale labels, the product-docs
bullets and workflow step that pointed at it, and the runtime block that
measured why its 180-day window was inexpressible.

The tab returned every published article merely sorted least-recently-reviewed
first, so it degraded into "all articles, different sort" as a knowledge base
grows. The open question was whether it should instead become a real 180-day
cut; that is now closed in the other direction.

`last_reviewed_at` is untouched — the publish hook still stamps it, it stays
on the article form, and its locale labels are unchanged.

The day-window guard vocabulary is RETAINED: its subject is every list view
the app ships, not this one tab. Its positive control is reconstructed inline
rather than bound to the deleted view, so the family still proves it reports.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019hUuCQStzXGMFSX4dzww5t
@vercel

vercel Bot commented Sep 3, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated
hotcrm Ignored Ignored Sep 3, 2026 6:40am UTC

Request Review

@github-actions github-actions Bot added documentation Improvements or additions to documentation ci/cd CI plumbing and the verification pipeline metadata Declarative metadata — schema, security posture, UI surfaces labels Sep 3, 2026
@os-sales
os-sales marked this pull request as ready for review September 3, 2026 07:14
@os-sales
os-sales added this pull request to the merge queue Sep 3, 2026
Merged via the queue into main with commit e8a3ae9 Sep 3, 2026
11 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ci/cd CI plumbing and the verification pipeline documentation Improvements or additions to documentation metadata Declarative metadata — schema, security posture, UI surfaces

Projects

None yet

Development

Successfully merging this pull request may close these issues.

复核队列要不要真的变成 180 天切分 —— 卡在 view filter 写不出析取,产品决策待定(#769 的余额)

2 participants