feat: CEO Phase 3 — decision-guidance redlines (CEO drafts, board ratifies) #250
No reviewers
Labels
No labels
Agent
Compat/Breaking
Kind/Bug
Kind/Documentation
Kind/Enhancement
Kind/Feature
Kind/Security
Kind/Testing
Priority
Critical
Priority
High
Priority
Low
Priority
Medium
Reviewed
Confirmed
Reviewed
Duplicate
Reviewed
Invalid
Reviewed
Won't Fix
Status
Abandoned
Status
Blocked
Status
Need More Info
No milestone
No assignees
2 participants
Notifications
Total time spent: 1 minute 48 seconds
Due date
igor
1 minute 48 seconds
No due date set.
Dependencies
No dependencies set
Reference
joshtronic/igor!250
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/ceo-mandate-redline"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
CEO Phase 3 — decision-guidance redlines (the layer's 100%)
The mandate-as-living-board-document, fully realized: the CEO drafts mandate edits, the board ratifies by merging. No board member files their own mandate edits.
How it works:
Agent-labeled) / declined (closed) / pending (ceo_proposal_outcomes) — and folds them into the prompt.===GUIDANCE===line (parsed into.guidance). No signal → nothing.## Decision guidancesection inCEO.md(ceo_open_guidance_pr— contents-API +new_branch, no clone), assigned to you to merge. Over weeks,CEO.mdaccumulates "how Josh actually decides," the CEO reads its own mandate, and asks less.Safety posture (unchanged):
ceo_guidance_pr_open) — redlines never stack.masteror merges — it drafts (issues + redline PRs), the board ratifies. Same "propose, you ratify" line as Phase 2.Validated: unit tests for the guidance parse (present/absent/with-issues) + outcomes classification (greenlit/declined/pending);
check-syncgreen. Live against porksicle: outcomes flow in, and with no proposal history yet the model correctly emits zero guidance — the "only on real signal" restraint holds.That's the CEO layer at 100% (digest → proposals → self-refining mandate).
🤖 Review —
REQUEST_CHANGES(automated)CI for
1ea7bf64: successSummary: Adds CEO "Phase 3" decision-guidance redlines — parses an optional
===GUIDANCE===section, classifies board verdicts on prior proposals (ceo_proposal_outcomes), and opens a throttled append-only PR toCEO.md(ceo_open_guidance_pr/ceo_guidance_pr_open). Scope is tight (~130 lines), no CI-config or workflow changes, no security concerns, CI is green, and the checklist matches the diff. The blocker is test coverage on the feature's riskiest, entirely-unverified code path.Blocking
ceo_open_guidance_pr(lib/ceo.sh) is the most complex new function and is verified by nothing. It does a base64 decode → conditional## Decision guidancesection creation → bullet append → base64 re-encode → contents PUT → PR open. None of that is unit-tested, and by the PR's own account it was not exercised live either ("with no proposal history yet the model correctly emits zero guidance" — so theif [ -n "$guidance" ]branch never fired against porksicle). That's the worst combination: the core PR-opening mechanics have never actually run. The harness already supports exactly this kind of test —ceo_file_proposalis tested by capturing the POST body (POST_BODY) and asserting on it. Please add an equivalent: mock_fjto return a known CEO.md, invokeceo_open_guidance_pr, and assert the captured PUT body's decodedcontentcontains (a) the new## Decision guidanceheader when absent, and (b) the- <week>: <guidance>bullet. A test forceo_guidance_pr_open(head-refceo-guidance*→ throttles) would close the loop too.Non-blocking observations
branch="ceo-guidance-${week}"is derived fromdate +%G-W%V, so it's stable for the whole ISO week. If a guidance PR is merged early in the week and its branch isn't deleted, a second guidance attempt that same week will fail thenew_branchPUT and only log a warning. The open-PR throttle doesn't cover the merged-but-undeleted case. Likely rare given the weekly cadence, but worth a comment or a uniquifier.## Decision guidancesection. This is correct only as long as that section stays last inCEO.md. If anything is ever added below it, bullets land under the wrong heading. Fine for the current design; just fragile to document.What's good
ceo_parse_response) correctly splits===GUIDANCE===before body/issues, and the three parse tests (absent / present / coexists-with-issue) plus the verdict-classification tests (greenlit / declined / pending / ignores-non-proposals) are solid and on-point.guidance/FORGEJO_REVIEWERgating is sensible.jq --arg/printf %susage keeps model-supplied guidance out of any injection surface.Add the
ceo_open_guidance_prtest (the one path that is neither unit-tested nor was run live) and this is in good shape.Independent review by the harness on
claude-opus-4-8. The human reviewer is requested once Igor has reviewed; a human still merges.