Skip to content

epic(194): recurring maintenance and contributor quality policy - #284

Merged
bravew merged 22 commits into
mainfrom
epic/194-maintenance-process
Oct 15, 2026
Merged

bravew merged 22 commits into
mainfrom
epic/194-maintenance-process

Conversation

@bravew

@bravew bravew commented Oct 15, 2026 •

Copy link
Copy Markdown
Owner

Refs #194

Adds the PR evidence template, a manual weekly/pre-release maintenance process with accountable ownership and expiring exceptions, and contributor-policy records. The records include an incident template, an empty blocklist with a shared validator, fixtures, and a replay against documented historical cases. No scheduled job, access restriction, or repository settings change is enabled.

All three sub-issues (#229, #230, #231) are merged. Main through E6 (9539e2ab) was integrated cleanly. Final verified head: 1eed6f135d7aa8a3b1614deb4d5ae4234b15bd6b.

Verification at that exact head, Node v26.11.1 / pnpm 11.22.0:

  • pnpm validate: passed.
  • pnpm test:fast: passed, 407 frontend files / 1,837 tests and 608 API files / 4,058 tests; 3 API files and 6 tests skipped.
  • GITHUB_BASE_REF=main pnpm check:warning-baseline: passed.
  • Blocklist validator: passed, zero entries.
  • node --test doc/maintenance/incidents/check-blocklist.test.mjs: all five tests passed.
  • Checked 32 relative documentation links: all resolved.
  • Diff and staged-diff checks: passed; working tree clean.
  • Frozen install passed during preparation; no dependency changes were introduced by E7.

All non-skipped CI checks passed at the final head. Squash merged into main as aaca138d7c3773be662941b4081c8d97ea40019c. Browser E2E, live provider calls, and release operations were not run locally. The historical dry-run report records its original source baseline and does not claim to describe the newly integrated code. Related epic issue #194 remains open; no automatic closing keyword is added.

bravew added 14 commits October 13, 2026 20:27
Recent feature PRs merged while the automatic quality and test jobs were
skipped, so contracts such as FFmpeg publication, caption schema
validation, chat-dock handoff, and permission precedence reached main
without an integration check. The review records what is verified, what
stays conditional, and which PRs should have been held, so cleanup starts
from evidence rather than file size.

Contributor blocking is defined as an evidence-based policy. The
blocklist stays empty until attribution and review gates can support it.
LESSONS.md records what the 2026-10-13 review found merged work got wrong,
as rules with evidence and a review-day count, so agents read the rule
before repeating the mistake. AGENTS.md and CLAUDE.md point to it.

The regression docs now cite reference practice for each fix, link the
lessons, and index the seven epics (#188 to #194) and their 37 sub-issues.
Each sub-issue is worked in its own worktree and merged into its epic
branch, and the epic merges into main in one reviewed PR.
The quality and test jobs were gated on a release/* or release-v* head
branch, so an ordinary PR, including a PR into an epic branch, reported
green check names without running anything. LESSONS.md records 77 of 84
merged PRs never running them.

Run quality and test on every non-draft pull request regardless of base
branch, keep them off drafts (which cannot be merged), and stop excluding
dependency-bot actors. Add a push trigger for main and epic/** so the
integrated head is validated too.

Add a ci-gate job named "CI Gate" that needs quality, test, browser-e2e
and build and runs with if: always(). It succeeds only when quality, test
and build all succeeded; a skipped, cancelled or failed required job is a
failure, so a skipped job cannot read as green. Browser E2E is accepted
only when it was not requested, and a draft PR is accepted because GitHub
cannot merge it. Values reach the script through env, and every action
reference remains a full commit SHA.

Refs #196

(cherry picked from commit 952c925)
The quality and test jobs were gated on a release/* or release-v* head
branch, so an ordinary PR, including a PR into an epic branch, reported
green check names without running anything. LESSONS.md records 77 of 84
merged PRs never running them.

Run quality and test on every non-draft pull request regardless of base
branch, keep them off drafts (which cannot be merged), and stop excluding
dependency-bot actors. Add a push trigger for main and epic/** so the
integrated head is validated too.

Add a ci-gate job named "CI Gate" that needs quality, test, browser-e2e
and build and runs with if: always(). It succeeds only when quality, test
and build all succeeded; a skipped, cancelled or failed required job is a
failure, so a skipped job cannot read as green. Browser E2E is accepted
only when it was not requested, and a draft PR is accepted because GitHub
cannot merge it. Values reach the script through env, and every action
reference remains a full commit SHA.

Refs #196

(cherry picked from commit 952c925)
…ook (#238)

Define the recurring maintenance review in doc/maintenance/review-process.md:
cadence and owner, the review scope, the report format, how bounded cleanup
pull requests are selected, and the LESSONS.md step for adding, incrementing,
and promoting a lesson.

Record the first dry run in doc/maintenance/2026-10-14-weekly-dry-run/README.md
against head d182f23, in the documented format, with the real check output and
the checks that could not run.

Scheduling a recurring job is a separate maintainer decision and is not live.

Closes #230
Records what each live channel provider actually does, per provider and per
runtime, with a path:line citation for every cell and the live consumer named.

Covers the plugin runtime (shared/channels, Slack/Discord/Telegram/Lark), the
gateway runtime (shared/services/gateway, WhatsApp/iMessage webhooks and the
feishu, linear, sms adapters), and the legacy slack-gateway path. Documents
inbound transport, credentials source, user identity, permissions, persistence,
scheduling, and stop behavior for each.

Findings recorded: the gateway runtime has no production caller of
startGateway(), so its adapter map is empty and the WhatsApp and iMessage
webhook routes return 503; the gateway_* tables have no migration; the legacy
Slack gateway runs with no permission or persistence layer; and the two live
Slack stacks are uncoordinated.

Ends with a decision-needed section listing candidate canonical runtimes and
stating that migration is a separate issue. No runtime is chosen here.
…cy replay (#239)

Checkpoint 7 of the regression maintenance plan asks for the records behind
the contributor quality policy. This adds the incident record template, an
empty blocklist with its entry schema, a schema check with fixtures, and the
replay of the thresholds against the documented historical cases.

The incident template follows blameless postmortem practice: it records the
failed contract and the gate that missed it, not a judgement of a person.

The blocklist is empty and names no contributor, vendor, model family, or
agent session. An entry requires evidence, affected scope, effective date,
expiry, remediation, and an appeal link. The check validates the committed
blocklist, accepts the valid fixture, and rejects the fixture that is missing
a required field.

The replay places stacked PRs #102, #103 and #105, manual CI #176, and the
different-authors case below the probation threshold of two. It counts the
stacked chain once, does not blame the corrective author, and does not count
the environment-specific resolve.test.ts failure.
git-workspace derived its repos and sessions directories from homedir()
at import time, and the local archive adapter defaulted to the previous
brand directory .neuma. Both ignored NEUMAR_APP_DATA_DIR, so tests and
packaging could write into the developer's real home directory.

Resolve the repos and sessions roots through getAppDir() per call, and
default the archive root to {app data dir}/archive. A pre-rebrand
.neuma/archive tree is renamed to the new root on the first write, so
archives published before the rebrand stay reachable; an injected rootDir
is left untouched.

Refs #226
…nd CI (#244)

The tracked architecture pages still described a browser IndexedDB fallback,
Vite 7, TypeScript 5.8, Node 20 build targets, a Bun-compiled API sidecar, and
a tauri-action release step. None of those match the current tree.

Take each statement from its source of truth: src/shared/db/database.ts (an API
client for the /db routes), the manifests in package.json, src-api/package.json,
and src-tauri/Cargo.toml, and .github/workflows/ci.yml plus build.yml.

Also correct stale details found while verifying: react-markdown replaced by
streamdown, the Tauri migration list, the workspace member list, the pnpm and
oxlint/oxfmt claims, and the validate script summary.
A failed read used to mean "empty", so an unguarded ALTER TABLE on a
table that does not exist aborted ten later migrations and left the
database half-upgraded with no error. `addColumnIfMissing` now names the
missing table instead of surfacing SQLite's generic message.

The new suite drops each table a migration alters, reruns the registry,
and asserts the resulting schema and applied versions match a database
built from scratch. Migrations that repair a missing video intent table
are listed explicitly; every other missing prerequisite is corruption and
must throw without advancing the version.
…262)

The wrapper typed every handler as (args: never) and round-tripped the
tool list and resolved args through `as unknown as` / `as never`. Give
the handler a single bivariant input type (projectId: string, rest
unknown) so each tool's own typed handler is assignable without a cast
and valid calls compile at the call site. Tool names, descriptions and
input schemas are unchanged on the wire.

Add a compile-time check that the wrapped handler types projectId.

Refs #224
…263)

* fix(api): make unsupported 501 routes truthful and pin V1 task route

POST /memory/entities/extract, /memory/consolidate and the chat surface of
POST /plugins/:id/apply now answer 501 not_available_over_http with a reason
that names no unreachable alternative. No UI or external caller exists for any
of them. Keep /task/:taskId mounted as the reversible assumption pending the
open V1 retirement decision, and pin both task routes with a wiring test.

Refs #223

* docs(task): reflect approved V1 route retention

Refs #223
…#273)

Move the four vivid-overlay library tools (list presets, save preset,
save style from template, save user document) plus their exclusive
schemas and color-normalization helper into
src-api/src/shared/mcp/video-overlay-library-tools.ts. The factory
receives session resolution, the proposal-only policy, and the result
helpers from the host, so registration still passes through the typed
wrapper and each tool name, description, schema, and registration
position is unchanged.

The real MCP tools/list inventory is byte-identical before and after for
all four transcript/multicam flag combinations. video-edit-server.ts
drops from 7,157 to 6,879 lines.

Refs #228
@coderabbitai

coderabbitai Bot commented Oct 15, 2026 •

Copy link
Copy Markdown

Warning

Review limit reached

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Next included review available in 14 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used the included review currently available.

Learn how review limits work.

Review configuration:

⚙️ Run configuration
  • Configuration used: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 4bcbfcea-99bc-4571-ab48-cab581bc547f
📥 Commits

Reviewing files that changed from the base of the PR and between 9539e2a and 1eed6f1.

📒 Files selected for processing: 12
  • .github/PULL_REQUEST_TEMPLATE.md
  • doc/maintenance/2026-10-14-weekly-dry-run/README.md
  • doc/maintenance/incidents/README.md
  • doc/maintenance/incidents/blocklist-schema.mjs
  • doc/maintenance/incidents/blocklist.json
  • doc/maintenance/incidents/check-blocklist.mjs
  • doc/maintenance/incidents/check-blocklist.test.mjs
  • doc/maintenance/incidents/fixtures/blocklist-invalid.json
  • doc/maintenance/incidents/fixtures/blocklist-valid.json
  • doc/maintenance/incidents/incident-record-template.md
  • doc/maintenance/incidents/policy-replay.md
  • doc/maintenance/review-process.md
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@bravew
bravew merged commit aaca138 into main Oct 15, 2026
19 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant