Repository navigation
Conversation
…pec 213 S0) Pins what the UI answers before the rules behind it move in the next slice: status, Location, flashes, log lines, events and history for the comment and restore routes, and the constraints of the six write forms. No src change. With TASK_BOARD_CHARACTERIZE_DIR set the tests also write the pages with ids and dates masked, so two checkouts on one vendor can be compared byte by byte.
… 213 S1) A write path other than the UI's forms must apply the same rules, so they leave the controller and the form types: TaskCommentPolicy, TaskManager::restore() and Validation\TaskConstraints. tests/Functional/Characterization from the previous commit is unchanged and passes, and the rendered pages are byte-identical. Adds what the UI does not have and the API will need, with no caller yet: TaskBoardEraser::eraseTask() (leaf-first, so PreRemove keeps every minute; refuses a task that follows a provider), TaskBoardEditor, TaskManager::archive(), TaskDependencyManager::findBetween(), TaskFormData::fromTask().
HecFranco
changed the base branch from
test/213-s0-ui-characterization
to
main
November 7, 2026 21:07
…d-moves # Conflicts: # docs/CHANGELOG.md # docs/UPGRADING.md
…audit IA) IA-M1: eraseTask() handed the host no stored-file refs. After an unlink the sync's attachment rows outlive the link (GWd-M1), so the files were never named again; on SQLite the rows stayed orphaned. The refs of the subtree are read first, passed per task in TaskErasedEvent, and the rows removed. Proof test ported from the auditor; run on SQLite and PostgreSQL 16. IA-I1: TaskBoardManageController keeps $syncLimits in its place, deprecated and ignored, so positional arguments do not move in a minor release. Also takes main (2.1.1) and the 1G PHPUnit ceiling the coverage report needs.
This was referenced Nov 7, 2026
Contributor
Author
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
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
Summary
Second slice of spec 213. Stacked on #67. No behaviour change for hosts; audit status re-verification pending.
A write path other than the UI's forms must apply the same rules, so they get one home. Only
TaskBoardManageControllerand six form types change.Service\TaskCommentPolicyrestoreTask()TaskManager::restore(), throwingTaskReopenRefusedExceptionValidation\TaskConstraintsFlash, redirect, panel fragment, status and log calls stay in the controller.
TaskBoardConnectionControlleris untouched.Also removes the controller's
$syncLimitsargument:TaskManageralready gets the sameSyncLimitCheckerInterfaceby autowiring (the restore characterization tests, withTestSyncLimitChecker, prove it).New, no caller yet (the UI has no equivalent):
TaskBoardEraser::eraseTask(),TaskBoardEditor,TaskManager::archive(),TaskDependencyManager::findBetween(),TaskFormData::fromTask(),BOARD_UPDATED.Proof that the UI's output stayed the same
tests/Functional/Characterizationfrom test(ui): characterize UI writes before spec 213 moves them #67 is unchanged and passes:git diff f7ea333 -- tests/Functional/Characterizationis empty.For the auditor
eraseTask():parent_idisON DELETE CASCADE, so it erases leaf-first through Doctrine;testEraseTaskRemovesTheSubtreeLeafFirstAndKeepsEveryMinutecovers time on a child and a grandchild.eraseTask()emitsTaskErasedEventwith no storage refs: a task with stored provider files follows a provider, so it is refused.TaskManager::update()(column change without completion sync or reopen limit) is deliberately not touched here.Gates run locally
Full PHPUnit, PHPStan, cs-check.
Not for merge until the coordinator's audit step.
Audit IA fixes
eraseTask()names the stored files of the subtree in eachTaskErasedEventand removes their rows. Proof testSyncEraseTaskRefsTest(ported from the auditor), run on SQLite and PostgreSQL 16; it fails without the fix.$syncLimitsis back in its place, deprecated and ignored;TaskBoardManageControllerSignatureTestpins the 2.1 constructor order.main(2.1.1, fix(index): one New board, always primary, Views buttons at the end #68) and the 1G PHPUnit ceiling, which this branch now needs too.