Repository navigation
feat(console): a blocked task card shows and decides its approvals (#1891) #1895
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
oxoxDev
merged 45 commits into
tinyhumansai:main
from
sanil-23:feat/1891-task-card-approvals
Aug 28, 2026
Merged
Changes from all commits
Commits
Show all changes
45 commits
Select commit
Hold shift + click to select a range
54c3f11
feat(console): a stacked ApprovalRow variant for a board card (#1891)
sanil-23 878a977
feat(console): a blocked board card shows and decides its approvals (…
sanil-23 ee2186c
feat(console): the task detail decides its approvals, and says what i…
sanil-23 bf2180e
fix(console): scope witnessed verdicts to the live queue, and hold Re…
sanil-23 7a394f5
fix(console): bound the witnessed fold to open batches, and let the h…
sanil-23 50be7a1
fix(console): a board card is not a batch — group its approvals per t…
sanil-23 2981a93
Merge remote-tracking branch 'refs/remotes/upstream/main' into pr/1895
senamakel 664e764
chore(api): update API type definitions
senamakel d88adb8
chore(runtime): update types
senamakel 0ed3871
chore: update runtime implementation
senamakel 7061616
chore: files changed src/company/runtime.rs
senamakel 61d0b65
chore(runtime): update runtime implementation
senamakel ebff908
chore(runtime): update runtime implementation
senamakel fbf875b
chore(runtime): update runtime module
senamakel 119b8c8
chore(api): update api type definitions
senamakel 2d20ca0
chore(runtime): update runtime implementation
senamakel 491ea8f
chore: files changed src/server/ops/tasks.rs
senamakel 6a22444
chore(ops): update task operations
senamakel 3f91f0d
chore: update task API
senamakel e09274a
chore: update ledgers view
senamakel ea97487
chore: files changed frontend/src/views/LedgersView.tsx
senamakel ba52776
chore(ledgers): update ledger view
senamakel 5327320
fix(ledgers): use authoritative approvals for board entries
senamakel b755e5d
chore(ops): update task operations
senamakel 14c1bbf
feat(tasks): group pending approvals by task
senamakel 60d3804
chore: files changed frontend/src/api/tasks.ts
senamakel c9ace7c
fix(ledgers): load authoritative approvals directly
senamakel 17b1c43
Merge remote-tracking branch 'refs/remotes/upstream/main' into pr/1895
senamakel 007b5b5
chore: update task card
senamakel 192fcc2
chore(frontend): update task card
senamakel 10f836a
chore(frontend): update ledgers view
senamakel e702645
chore(frontend): update ledgers view
senamakel f2a8ace
chore: update ledgers view
senamakel f1a991e
chore(app-shell): update application shell
senamakel b0d8734
chore(frontend): update app shell
senamakel 15589c5
chore: files changed frontend/src/components/app-shell.tsx
senamakel 9525446
chore(frontend): update app shell
senamakel 74fc6e2
chore: update app shell
senamakel 990e1a7
chore: files changed frontend/src/components/app-shell.tsx
senamakel 15cfc93
chore: update api types
senamakel e17d57a
chore(task-approvals): update task approval handling
senamakel f666bb7
chore(frontend): update task card
senamakel 6c187ee
fix(runtime): resolve approval ownership in the queue projection (#1891)
sanil-23 f71141d
fix(runtime): resolve ownership only for parks whose run id is an att…
sanil-23 86bf801
fix(runtime): a failed owner lookup must not unlink a parked approval…
sanil-23 File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
When an approval's task link names card A but its
run_idbelongs to card B, this link-only join includes it on A;the_attempt_id_outranks_the_card_link_when_both_are_presentinsrc/server/ops/write_test.rsexplicitly proves that the host excludes this case from A's authoritative task detail. Unlike the previous read-only blocker display, the new board path passes these rows toApprovalRowwithonDecide, so an operator can now approve or decline B's request from A's card. The board needs an authoritative ownership projection (or equivalent host-provided filtering) before exposing decision controls rather than relying solely onapprovalsForTask.Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You are right, and this contradicts an argument I made on the sibling thread, so let me withdraw that explicitly rather than quietly.
I fixed the ownership asymmetry on the detail screen and said the board could keep the looser join because "the cost of getting it wrong is lower: a card that says it is blocked and disables Resume, rather than a surface offering a decision". That was true of #883's read-only row. It stopped being true the moment this PR put Approve on the card, which is the whole change — so the justification I gave was for the code I was replacing, not the code I was writing.
I checked the test you cite rather than take it on trust.
the_attempt_id_outranks_the_card_link_when_both_are_present(src/server/ops/write_test.rs:6278) parksappr-elsewhereunderrun-c— an attempt att-other— stampedTaskLink::Task { id: "t-1" }, and asserts it must not appear ont-1.approval_owner(src/server/ops/tasks.rs:1862) resolves the attempt first and falls back to the link only when there is norun_id. SoapprovalsForTaskreally can attribute an approval to the wrong card, and this PR makes that a resolvable request rather than a misleading label.The console cannot close this on its own.
ApprovalSummarycarries no attempt id for a task-linked park —workflow_run_idis stamped only for unlinked parks precisely becauseEffect::run_idalso carries task-attempt ids that must not be read as workflow runs — andapproval_ownerneedstask_runs, which is per-card state the board does not have. Re-reading task detail per card is the N-reads-per-poll cost #883 exists to avoid.What would close it is the queue projection resolving the owner itself: for a parked approval carrying a
run_id, look up that run's card (RunRecordnames one) and project the resolved owner inApprovalSummary.taskinstead of the raw park link. ThenapprovalsForTaskbecomes authoritative for every consumer, and #883's existing blocked row — which has the same latent misattribution today, read-only — gets correct as a side effect.That is a host change and this PR is frontend-only, so I am checking on scope before expanding it rather than either shipping the decision surface as it stands or quietly dropping the feature. I will follow up here with which way it goes.