Skip to content

capability: serve the person loop in the cockpit #415

Closed

Description

@smota

Kind: capability

Epic: #371

Part

The person sees a waiting decision, who must answer, and the subject.
The person can give a source note or a gate answer. Those are different inputs.
The answer shows as agreed, refused, or stale. A stale answer does not count.
A note, a phase pass, a PR approval, a comment, or an on-behalf action cannot satisfy the gate.
When an execution layer is configured, the coordinator also receives the answer and still cannot satisfy the gate.

Depends on

The execution-control capability. The coordinator copy also needs the execution-events part.

Acceptance boundary

Change class: high-assurance.

A waiting person gate is visible, the person can answer it, and the product accepts that answer. Nothing else satisfies it.

Excludes

A new gate class. A second answer record. Treating a note as agreement.

Part of #371

Replaces #376

Activity

  1. smota commented on Oct 11, 2026

    @smota
    OwnerAuthor

    phase: 0
    role: product-manager
    status: skipped
    seat: pm.manager
    reason: Parent goal #371 already framed this part.
    body:
    Phase 0 skipped. Parent goal #371 already framed this part. The human sponsor ordered phase 2 and phase 3 on #415. Recorded by orch.arch so the phase graph can enter architecture.

  2. smota commented on Oct 11, 2026

    @smota
    OwnerAuthor

    phase: 1
    role: analyst
    status: skipped
    seat: pm.analyst
    reason: Acceptance is the capability body on #415.
    body:
    Phase 1 skipped. The acceptance is the capability body on #415. Recorded by orch.arch so phase 2 can start.

  3. smota commented on Oct 11, 2026

    @smota
    OwnerAuthor

    phase: 2
    role: architect
    status: pass
    seat: orch.arch
    reason:
    body:
    Phase 2 — architect · #415 person loop

    What this slice owns

    A waiting person gate is visible. The view names who must answer and the subject. The person answers with the confirmation line already supported by the cockpit. The result shows agreed, refused, or stale.

    A source note and a gate answer stay different inputs. A clarification, a follow-up, a section update, a handover note, a phase pass, a pull-request approval, a comment, and an on-behalf action do not satisfy the gate.

    What this slice does not own

    The coordinator copy of the answer waits for the execution-events part. This slice does not send to a coordinator and does not invent that store. No new gate class. No second answer record. No execution layer is required to see or answer the gate.

    Profile

    High-assurance. Builder dev.build-sr. Human acceptance is required on the open pull request before merge.

  4. smota commented on Oct 11, 2026

    @smota
    OwnerAuthor

    phase: 3
    role: implementation-planner
    status: pass
    seat: orch.arch
    reason:
    body:
    Phase 3 — implementation plan · #415 only

    Branch

    feat/371-person-loop from origin/development, in .worktrees/feat/371-person-loop. Do not commit on the primary checkout.

    Files

    • Extend the cockpit waiting-gate panel so it shows who must answer and the subject, plus the existing confirmation line. No agree button.
    • Tests: a note write leaves the gate waiting. The confirmation line moves it to agreed, refused, or stale. A phase pass, a comment, and an on-behalf record do not satisfy it.
    • Do not add a coordinator send.

    Proof

    pnpm exec vitest run on the cockpit person-loop test.

    Out of scope

    #376 stays the note. Do not open a second capability. Do not file the live gates on #371 or #380.

  5. smota commented on Oct 11, 2026

    @smota
    OwnerAuthor

    phase: 4
    role: developer
    status: pass
    seat: dev.build-sr
    reason:
    body:
    Phase 4, #415 person loop. Branch feat/371-person-loop at 188e0ee from origin/development 2a39d35, local and not pushed. Changes: lib/cockpit-gate-answer.mjs and lib/cockpit-ui.mjs. Each waiting gate now shows 'Who must answer' (the named person, or else 'the person') and 'Subject' (this goal as written now, its title and body; for an admission, the change class it opens). Both sit above the existing decision card and confirmation line. No digest is shown beyond the line prefix, and there is still no agree button. A new 'Answered decisions' list shows each answered gate as agreed, refused (changes asked or blocked), or stale; stale is worded as not counting. docs/cockpit.md is updated. Tests: lib/tests/cockpit-person-loop.test.mjs, 10 tests. (1) Who and subject render for a named and an unnamed gate and for an admission. (2) All seven cockpit note intents, each holding a valid line, leave the gate waiting and the issue body unchanged. (3) A phase 4 pass, a comment holding the line, an 'Approved. LGTM.' comment, and an on-behalf record leave it waiting. (4) The agree, changes, and block lines move it to agreed or refused and show the result. The only GitHub calls are issue, issueComments, and updateIssue, so nothing is sent to a coordinator or a seat. (5) After a title or body change the answer shows stale and does not count, a new gate waits, and the old line is refused. Against the old rendering, 7 of 10 fail; the 3 that still pass prove existing non-satisfaction. Run: vitest run lib/tests/cockpit-person-loop.test.mjs, 10/10 pass. pnpm is blocked in worktrees, so I used the repo's vitest binary. Full suite: 153 files, 1532 passed, 1 skipped. All 5 validators exit 0, and prettier is clean. Not done: a PR approval is not tested, because the cockpit has no PR approval path and the plan does not list it. No coordinator send, no gate class, no second capability, and no live gate filed.

  6. smota commented on Oct 11, 2026

    @smota
    OwnerAuthor

    phase: 5
    role: tester
    status: pass
    seat: dev.qa
    reason:
    body:
    Phase 5 PASS — #415 person loop, high-assurance. Independent dev.qa execution; launcher/executor codex, local CLI transport, no delegation. Exact commit188e0ee847ac36f2009974e0a4c98687cac89f8b in .worktrees/feat/371-person-loop, clean before/after. Linux x64, Nodev22.23.3, Vitest2.1.9.
    Phase2/3/4 read verified; phase4 #415 (comment) at revision cb7b16c44478eae9a4fc70dd242b7567cf7b51f82a55f6680801e0f3f3229bac.

    Exact commands:
    ../../../node_modules/.bin/vitest run --root . lib/tests/cockpit-person-loop.test.mjs — 10passed.
    ../../../node_modules/.bin/vitest run --root . — 153files passed, 1532tests passed, 1skipped, 0failed.
    node scripts/validate-docs.mjs —119files, noerrors.
    node scripts/verify-agent-workflow.mjs —pass.
    node scripts/verify-hooks.mjs —pass.
    node scripts/validate-role-catalog.mjs —READY.
    node scripts/audit-reachability.mjs —READY.
    ../../../node_modules/.bin/prettier --check docs/cockpit.md lib/tests/cockpit-person-loop.test.mjs lib/cockpit-gate-answer.mjs lib/cockpit-ui.mjs —pass.
    node scripts/cockpit-smoke.mjs via node --input-type=module wrapper with isolated PATH logging refusal stubs rig/gh/agentflow-sdlc/git/tmux —oktrue, health200, asset200, nonecalled; fixture removed.
    git status --short and git rev-parse HEAD —clean, SHAabove.

    Independent node --input-type=module black-box fake-GitHub probes: 21 note non-satisfaction cases (seven canonical note intents times three goals), each holding the valid answer phrase, leave gate waiting and source body unchanged. Legal phase0–4 passes containing the phrase also leave gate waiting. agree/changes/block file through existing API and show agreed/refused results; only issue, issueComments, updateIssue called during filing. Changed title produces stale answer and new waiting gate, renderer says does not count, old phrase refused without write. Initial harness attempted phase4 without prior phases and correctly hit phase graph refusal; corrected fixture sequence, not candidate defect.
    Independent rendering: four answer outcomes (agreed, changes refusal, block refusal, stale) show correct status and escape script-tag person text. Waiting panel renders who and subject and exactly one Send button; title/person markup escaped.
    Targeted suite additionally covers body staleness and on-behalf non-satisfaction.
    PR approval not tested: no cockpit PR approval path exists; phase4 discloses this limit. Coordinator copy deferred explicitly by phase2 to execution-events. No coordinator send, new gate class, candidate source inspection/modification, or live gate filing.
    Scoped pass covers implemented waiting panel, note-versus-answer distinction, result rendering and stale refusal. High-assurance human security/acceptance review remains required on open PR. Hand phase6 to rev.review.

  7. smota commented on Oct 11, 2026

    @smota
    OwnerAuthor

    phase: 6
    role: reviewer
    status: pass
    seat: rev.review
    reason:
    body:
    Phase 6 — independent review · APPROVED · 188e0ee847ac36f2009974e0a4c98687cac89f8b

    Verdict

    APPROVED for the person-loop view at 188e0ee847ac36f2009974e0a4c98687cac89f8b on feat/371-person-loop. This is not human security or acceptance review. The candidate was not edited.

    Reviewed 2a39d35..188e0ee (4 files). Worktree was clean. Re-ran lib/__tests__/cockpit-person-loop.test.mjs: 10 passed.

    What holds

    • Each waiting gate shows who must answer and a subject in words, above the existing decision card and the one confirmation line. There is still no agree button. Who, subject, card text, person, and line are escaped.
    • An admission names the change class it opens. A goal gate names the goal as written now.
    • Answered gates are listed as agreed, refused (changes asked or blocked), or stale. Stale is worded as not counting.
    • The seven cockpit note intents, a phase pass, a comment that holds the line, an "Approved. LGTM." comment, and an on-behalf record leave the gate waiting.
    • Agree, changes, and block move it through the existing filing path. GitHub is only read and the gate block is rewritten. Nothing is sent to a coordinator.

    Residuals (not a return)

    • There is no product path that turns a pull-request approval into a gate answer. The architect confirmed this slice does not invent one.
    • The coordinator copy of the answer waits for execution-events, as phase 2 said.
    • High-assurance human security and acceptance review on the open PR remains. Do not merge on this verdict. No live gate was filed.

    Executed by: pi · Launcher: pi · Executor: pi · Transport: intercom-session · Delegation boundary: separate-local-session · Model: grok-4.7 · Seat: rev.review

  8. smota commented on Oct 11, 2026

    @smota
    OwnerAuthor

    phase: 7
    role: technical-writer
    status: pass
    seat: orch.arch
    reason:
    body:
    Phase 7 — technical writer · already in the approved commit

    Review approved 188e0ee847ac36f2009974e0a4c98687cac89f8b. docs/cockpit.md already says each waiting gate shows who must answer and its subject, above the decision card. Answered gates are listed as agreed, refused, or stale. A note, a phase pass, a comment, and an on-behalf record leave the gate waiting. Only the confirmation line moves it. The answer is written to the gate record and sent nowhere else.

    No further edit. No screenshot. No pull-request approval path is invented.

  9. smota commented on Oct 11, 2026

    @smota
    OwnerAuthor

    phase: 8
    role: pr-readiness
    status: pass
    seat: orch.arch
    reason:
    body:
    Phase 8. PR #416 is open against development at 188e0ee. Manifest READY. High-assurance. Merge owner is the person. Human acceptance is still required. The coordinator copy is not in this pull request.

  10. smota commented on Oct 11, 2026

    @smota
    OwnerAuthor

    Delivered and merged via PR #416 (commit 2975016).

  11. github-actions commented on Oct 11, 2026

    @github-actions

    Integrated into development by PR #416: #416

    Merge commit: 297501651b340223d96dc9e4e55318d82419443e
    Release/promotion to main is tracked separately.

  12. added
    integrated:developmentManaged by agentflow-sdlc integration lifecycle automation
    awaiting-releaseManaged by agentflow-sdlc integration lifecycle automation
    state:deliveredManaged by agentflow-sdlc integration lifecycle automation
    and removed on Oct 11, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    awaiting-releaseManaged by agentflow-sdlc integration lifecycle automationintegrated:developmentManaged by agentflow-sdlc integration lifecycle automationkind:capabilityWork altitude: capabilitystate:deliveredManaged by agentflow-sdlc integration lifecycle automation

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions