[{"data":1,"prerenderedAt":110},["ShallowReactive",2],{"journal-\u002Fjournal\u002Fmove-retain-revoke":3},{"id":4,"title":5,"body":6,"date":97,"description":98,"draft":99,"extension":100,"meta":101,"navigation":102,"path":103,"seo":104,"stem":105,"tags":106,"__hash__":109},"journal\u002Fjournal\u002Fmove-retain-revoke.md","Move, Retain, Revoke: Modelling a Reassignment",{"type":7,"value":8,"toc":88},"minimark",[9,13,16,21,24,27,30,33,37,40,43,46,49,53,56,59,63,66,69,72,75,79,82,85],[10,11,12],"p",{},"\"Let an administrator reassign work from one grader to another\" reads like a one-field update. Change the assignee, save, done.",[10,14,15],{},"It took me a while building assessment features to understand why that framing produces systems nobody trusts six months later.",[17,18,20],"h2",{"id":19},"a-reassignment-is-three-operations","A reassignment is three operations",[10,22,23],{},"When work moves between people, the things attached to it don't all behave the same way.",[10,25,26],{},"Some move. Outstanding work belongs to whoever holds it now. Some stay. Work already completed by the previous person happened, and it stays theirs. Some stop. Access they had by virtue of the assignment shouldn't survive it.",[10,28,29],{},"Treat reassignment as one field update and you've implicitly chosen \"everything moves\", which quietly reattributes completed work to someone who didn't do it. In assessment that isn't a data-integrity nit. It's a record claiming one person graded something another person graded.",[10,31,32],{},"Naming the three behaviours separately in the model, instead of deriving them from a single status change, is what stops it.",[17,34,36],{"id":35},"archive-and-reissue","Archive and reissue",[10,38,39],{},"The bigger shift was giving up on updating records.",[10,41,42],{},"Editing in place is the natural instinct. The assignment exists, its owner changed, change its owner. The problem is the previous state is now gone. Six months later someone asks why a particular person had access in March, and the honest answer is the system can't tell you.",[10,44,45],{},"Archiving the old record and issuing a new one costs a little storage and answers that question forever. History becomes a sequence of facts that were true for a period, rather than one row that's been true in several different ways with no record of which.",[10,47,48],{},"That matters most where the outcome affects someone's assessment. \"The system says X\" only reassures if the system can also say what it said before, and when it changed.",[17,50,52],{"id":51},"record-the-fact-once","Record the fact once",[10,54,55],{},"An operational detail that caused real bugs. These changes get applied by a sweep over affected items, and sweeps run more than once. On retry, on a related change, on a later reassignment touching overlapping work.",[10,57,58],{},"If the sweep records \"this was retained\" every run, the activity feed fills with duplicates describing the same fact, and a reader can't tell whether something happened three times or was checked three times. The difference between an event and a state observation has to be explicit, or the audit trail turns into noise. A noisy audit trail is functionally the same as none.",[17,60,62],{"id":61},"healing-a-partial-freeze","Healing a partial freeze",[10,64,65],{},"The related problem is freezing a worksheet at a point in time, capturing what was there when it was submitted so later edits to the source don't retroactively change what someone was assessed on.",[10,67,68],{},"The naive version stamps it frozen, then copies the content. Anything failing between those two steps leaves a record marked frozen whose content was never captured. It looks complete and it's empty, which is the worst state to be in because nothing will ever flag it.",[10,70,71],{},"Claim the freeze stamp after the copy succeeds and a failed run leaves the record visibly unfrozen, so the next run picks it up and finishes. Same two operations, reversed, and the failure mode changes from silent corruption to a retry.",[10,73,74],{},"Same instinct as counting an email as delivered rather than handed off. Make the record reflect completed work, not the intent to do it.",[17,76,78],{"id":77},"the-through-line","The through-line",[10,80,81],{},"All of these are one idea from different angles. Write down what happened, not just what's currently true.",[10,83,84],{},"A current-state-only model is smaller, faster to build, and perfectly adequate right up to the first time someone asks about the past. In a product where the data affects someone's grade, their placement or their record, that question isn't hypothetical. It's the entire reason an institution trusts you with it.",[10,86,87],{},"The cost is a few more rows and some care about ordering. What you get is the ability to answer honestly when it matters, which for this kind of software is most of the product.",{"title":89,"searchDepth":90,"depth":90,"links":91},"",2,[92,93,94,95,96],{"id":19,"depth":90,"text":20},{"id":35,"depth":90,"text":36},{"id":51,"depth":90,"text":52},{"id":61,"depth":90,"text":62},{"id":77,"depth":90,"text":78},"2026-08-19","Reassigning a grader sounds like changing one field. It isn't, and the difference between editing a record and archiving it is the difference between a system you can audit and one you can only apologise for.",false,"md",{},true,"\u002Fjournal\u002Fmove-retain-revoke",{"title":5,"description":98},"journal\u002Fmove-retain-revoke",[107,108],"engineering","modelling","83dYW8f16EkQ-IG-7KC36d-UGOCu81InfiWrqIail3w",1787915616666]