chore: consolidate completed Epic 172 stack into main - #319
Conversation
test: run root privilege mutations in upgrade proof
test: use root owner for grant option mutation
test: bind root grantor to mutation session
test: close root reconciler grant options
test: close root reconciler column privileges
fix: align root write context schema metadata
test: fix ordinary app trigger proof inputs
test: prove root reconciler actor boundaries
fix: close root reconciler routine allowlist
…ability test: isolate root reconciliation binding rejections
fix: support PostgreSQL 16 root privilege proof
test: prove root reconciler allowlist mutations
test: close root reconciler privilege allowlist
test: make root authority additions admissible
test: align root authority recovery fixture
test: bind root authority assertion inputs
test: distinguish root proof psql statuses
test: diagnose root proof psql failures
test: keep negative reconciliation inputs transactional
test: prove root reconciliation contention
fix: bind root negative assertion inputs
fix: fence recovery actions and project approval CAS
fix(mcp): harden canonical task client presentation
fix(mcp): pin S5 server observation
fix(mcp): harden canonical runtime presentation
feat(mcp): render canonical task recovery state
# Conflicts: # .github/workflows/web-ci.yml # web/package.json
…ission-regression [architecture] Define end-to-end MCP admission regression for #181
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: d2fb8caa96
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| || question.sourcePlanVersion !== currentSource.sourcePlanVersion))) { | ||
| return NextResponse.json({ error: 'Clarification source is unavailable.' }, { status: 409 }) | ||
| } | ||
| const appended = await appendArchitectClarificationAnswers(answers.map((answer) => { |
There was a problem hiding this comment.
Preserve a replan wake-up after persisting answers
When the final protected answers are committed here and the later redis.lpush('forge:answers', ...) fails, the request returns 500 but every question is already marked answered. A retry is then rejected by the status !== 'open' check, and neither worker startup nor the retry route scans answered awaiting_answers tasks, so the task remains stuck until manual intervention. Persist a durable outbox/queue occurrence with the answers, or let an idempotent retry enqueue the missing replan.
AGENTS.md reference: AGENTS.md:L30-L31
Useful? React with 👍 / 👎.
| expect(result).toEqual({ code: 124, stderr: 'DEADLINE_EXCEEDED\n' }) | ||
| descendantPid = Number(await readFile(descendantPidFile, 'utf8')) | ||
| expect(Number.isSafeInteger(descendantPid) && descendantPid > 0).toBe(true) | ||
| expect(() => process.kill(descendantPid!, 0)).toThrow() |
There was a problem hiding this comment.
Test descendant termination without requiring PID disappearance
In containers whose PID 1 does not reap orphaned processes, the deadline wrapper successfully sends SIGKILL to the process group but the descendant remains as a zombie, for which process.kill(pid, 0) still succeeds. I reproduced this as a defunct process and npm run test:unit:zero-skip consequently failed at this assertion (1952 tests passed, one failed). Check that the process is no longer running rather than requiring the PID to disappear, or structure the fixture so the descendant is reaped.
AGENTS.md reference: AGENTS.md:L139-L139
Useful? React with 👍 / 👎.
| detail: 'Ready packages execute in sandbox-only mode. Forge keeps generated files under .forge/task-runs for review and manual application; direct host repository writes are unavailable.', | ||
| label: 'Executable packages', | ||
| mode: 'opt_in_sandbox', |
There was a problem hiding this comment.
Describe ready packages as handoff-only
For every newly ready package without an existing handoff artifact, the dashboard now claims that Forge will execute it and generate files in .forge/task-runs. This commit makes execution unavailable—the worker's normal path creates a no-op handoff artifact, while an explicit execution request fails at the confined-materialization boundary—so operators are promised output that cannot be produced. Present this state as handoff-only or unavailable instead of executable sandbox mode.
Useful? React with 👍 / 👎.
This is a history-consolidation merge for completed Epic 172 PRs #197 through #200. It does not add or rewrite product behavior.
Why this is needed: PR #197 reached main as a squash commit. The completed #198–#200 stack therefore cannot fast-forward to main even though the original #197 tree and the current main tree are identical.
Merge evidence:
d435d2348e1686bf914865b8f8151d77bdbf5157(current main)a0f4861a022b52a2705104e01b4119314aa4fd7d(completed final stack)d2fb8caa9625f2b0352badcb62d05d560c4ab06aeb0f0a4e8fbf496849eb10c87e852cdd1983c62dThe merge resolved only duplicate-history conflicts caused by the PR #197 squash. All conflict results were taken from the already-reviewed final stack; the resulting tree equality check prevents incidental integration edits.
Local validation:
npx tsc --noEmitnpm run lint -- --max-warnings=0npm run test:mcp:contractnpm run test:unit:zero-skip— 1,953 passed, 16 expected fixture skipsnpm run buildgit diff --checkThe exact final-stack head
a0f4861previously passed Web CI and PR Contract. This draft requires fresh CI and review before main is advanced.