Completes "chat is the write-path" (decisions.md D1). Ask Reginald to re-estimate or reprioritize; it formulates a proposal, you approve it inline, and the write runs through the same guarded apply_changes engine the Issue screen uses. The model never writes — it proposes; the app owns approval + execution.
Core (@commitea/core)
propose_change tool declaration; REGINALD_SYSTEM updated — "never claim a change is applied; you propose, the human approves."
proposalsFor(args, currentLabels, title) — pure: builds the concrete, non-noop ChangeProposal(s) (change + label diff) for a request, dropping invalid or unchanged axes. ChangeProposal / ProposeChangeArgs types.
App
model bridge executes propose_change by planning against the issue's current labels (no write) and returns the proposals with the turn.
useChat surfaces pending proposals + approve/dismiss; approve calls onApplyChange (AppShell's guarded handler → PUT + board/forecast refetch), dismiss leaves it.
ChatPanel renders each proposal as a propose-approve card (diff + Approve/Dismiss).
Gated live e2e against gemma-4-26b: "Set the estimate on #3 to est/5d" → Reginald proposes "est/2d → est/5d" as an inline card and says it's proposed, not done; Dismiss leaves the repo untouched (screenshot in PR). The approve→write path is the #41 engine (separately verified change→revert).
Not in this slice (later)
Destructive ops via chat (close/remove-dep) need the approved:true gate surfaced in the card.
capture_work (big-model decomposition → Capture tray) and record_directive (→ pm-state ledger) are the remaining write tools.
Completes **"chat is the write-path"** (decisions.md D1). Ask Reginald to re-estimate or reprioritize; it formulates a **proposal**, you approve it **inline**, and the write runs through the same guarded `apply_changes` engine the Issue screen uses. The model never writes — it proposes; the app owns approval + execution.
## Core (`@commitea/core`)
- **`propose_change`** tool declaration; `REGINALD_SYSTEM` updated — *"never claim a change is applied; you propose, the human approves."*
- **`proposalsFor(args, currentLabels, title)`** — pure: builds the concrete, non-noop `ChangeProposal`(s) (change + label diff) for a request, dropping invalid or unchanged axes. `ChangeProposal` / `ProposeChangeArgs` types.
## App
- model bridge executes `propose_change` by planning against the issue's current labels (**no write**) and returns the proposals with the turn.
- `useChat` surfaces pending proposals + `approve`/`dismiss`; **approve** calls `onApplyChange` (AppShell's guarded handler → PUT + board/forecast refetch), **dismiss** leaves it.
- `ChatPanel` renders each proposal as a propose-approve card (diff + Approve/Dismiss).
## Verified
101 core tests green (4 `proposalsFor` added), desktop typecheck clean, 14 fixture e2e green.
**Gated live e2e** against `gemma-4-26b`: *"Set the estimate on #3 to est/5d"* → Reginald proposes **"est/2d → est/5d"** as an inline card and says it's *proposed*, not done; Dismiss leaves the repo untouched (screenshot in PR). The approve→write path is the #41 engine (separately verified change→revert).
## Not in this slice (later)
- Destructive ops via chat (close/remove-dep) need the `approved:true` gate surfaced in the card.
- `capture_work` (big-model decomposition → Capture tray) and `record_directive` (→ pm-state ledger) are the remaining write tools.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
christian
added 1 commit 2026-07-09 01:38:46 +00:00
Completes "chat is the write-path" (decisions.md D1). Ask Reginald to re-estimate
or reprioritize an issue; it formulates a proposal, you approve it inline, and the
write runs through the same guarded apply_changes engine the Issue screen uses.
The model never writes — it proposes; the app owns approval + execution.
core (@commitea/core):
- propose_change tool declaration + REGINALD_SYSTEM updated ("never claim a change
is applied; you propose, the human approves").
- proposalsFor(args, currentLabels, title): pure — builds the concrete, non-noop
ChangeProposal(s) (change + label diff) for a propose_change request, dropping
invalid/unchanged axes. ChangeProposal / ProposeChangeArgs types.
app:
- model bridge executes propose_change by planning against the issue's current
labels (no write) and returns the proposals with the turn.
- useChat surfaces pending proposals + approve/dismiss; approve calls onApplyChange
(AppShell's guarded handler → PUT + board/forecast refetch), dismiss leaves it.
- ChatPanel renders each proposal as a propose-approve card (diff + Approve/Dismiss).
Verified: 101 core tests green (4 proposalsFor added), desktop typecheck clean,
14 fixture e2e green. Gated live e2e against gemma-4-26b: "Set the estimate on #3
to est/5d" → Reginald proposes "est/2d → est/5d" as an inline card, says it's
*proposed* not done; Dismiss leaves the repo untouched. The approve→write path is
the #41 engine (separately verified change→revert).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Completes "chat is the write-path" (decisions.md D1). Ask Reginald to re-estimate or reprioritize; it formulates a proposal, you approve it inline, and the write runs through the same guarded
apply_changesengine the Issue screen uses. The model never writes — it proposes; the app owns approval + execution.Core (
@commitea/core)propose_changetool declaration;REGINALD_SYSTEMupdated — "never claim a change is applied; you propose, the human approves."proposalsFor(args, currentLabels, title)— pure: builds the concrete, non-noopChangeProposal(s) (change + label diff) for a request, dropping invalid or unchanged axes.ChangeProposal/ProposeChangeArgstypes.App
propose_changeby planning against the issue's current labels (no write) and returns the proposals with the turn.useChatsurfaces pending proposals +approve/dismiss; approve callsonApplyChange(AppShell's guarded handler → PUT + board/forecast refetch), dismiss leaves it.ChatPanelrenders each proposal as a propose-approve card (diff + Approve/Dismiss).Verified
101 core tests green (4
proposalsForadded), desktop typecheck clean, 14 fixture e2e green.Gated live e2e against
gemma-4-26b: "Set the estimate on #3 to est/5d" → Reginald proposes "est/2d → est/5d" as an inline card and says it's proposed, not done; Dismiss leaves the repo untouched (screenshot in PR). The approve→write path is the #41 engine (separately verified change→revert).Not in this slice (later)
approved:truegate surfaced in the card.capture_work(big-model decomposition → Capture tray) andrecord_directive(→ pm-state ledger) are the remaining write tools.🤖 Generated with Claude Code
Completes "chat is the write-path" (decisions.md D1). Ask Reginald to re-estimate or reprioritize an issue; it formulates a proposal, you approve it inline, and the write runs through the same guarded apply_changes engine the Issue screen uses. The model never writes — it proposes; the app owns approval + execution. core (@commitea/core): - propose_change tool declaration + REGINALD_SYSTEM updated ("never claim a change is applied; you propose, the human approves"). - proposalsFor(args, currentLabels, title): pure — builds the concrete, non-noop ChangeProposal(s) (change + label diff) for a propose_change request, dropping invalid/unchanged axes. ChangeProposal / ProposeChangeArgs types. app: - model bridge executes propose_change by planning against the issue's current labels (no write) and returns the proposals with the turn. - useChat surfaces pending proposals + approve/dismiss; approve calls onApplyChange (AppShell's guarded handler → PUT + board/forecast refetch), dismiss leaves it. - ChatPanel renders each proposal as a propose-approve card (diff + Approve/Dismiss). Verified: 101 core tests green (4 proposalsFor added), desktop typecheck clean, 14 fixture e2e green. Gated live e2e against gemma-4-26b: "Set the estimate on #3 to est/5d" → Reginald proposes "est/2d → est/5d" as an inline card, says it's *proposed* not done; Dismiss leaves the repo untouched. The approve→write path is the #41 engine (separately verified change→revert). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>christian referenced this pull request2026-07-10 19:57:45 +00:00