[{"data":1,"prerenderedAt":638},["ShallowReactive",2],{"docs-nav":3,"docs-\u002Fdocs\u002Fsessions":78},[4,9,13,16,21,26,30,34,38,42,46,50,53,58,62,66,69,74],{"path":5,"title":6,"navTitle":6,"group":7,"order":8},"\u002Fdocs\u002Fcommands","Other commands","Guide",999,{"path":10,"title":11,"navTitle":12,"group":7,"order":8},"\u002Fdocs\u002Fcompaction","Context and compaction","Context & compaction",{"path":14,"title":15,"navTitle":15,"group":7,"order":8},"\u002Fdocs\u002Fconfiguration","Configuration",{"path":17,"title":18,"navTitle":18,"group":19,"order":20},"\u002Fdocs\u002Fenvironment","Environment variables","Reference",11,{"path":22,"title":23,"navTitle":23,"group":24,"order":25},"\u002Fdocs\u002Fflags","Flag reference","CLI",8,{"path":27,"title":28,"navTitle":28,"group":7,"order":29},"\u002Fdocs","Introduction",1,{"path":31,"title":32,"navTitle":32,"group":7,"order":33},"\u002Fdocs\u002Finstallation","Installation",2,{"path":35,"title":36,"navTitle":36,"group":19,"order":37},"\u002Fdocs\u002Fproviders","Providers",10,{"path":39,"title":40,"navTitle":40,"group":7,"order":41},"\u002Fdocs\u002Fquickstart","Quickstart",3,{"path":43,"title":44,"navTitle":45,"group":7,"order":8},"\u002Fdocs\u002Freleases","Releases and upgrading","Releases",{"path":47,"title":48,"navTitle":49,"group":7,"order":8},"\u002Fdocs\u002Frun","The run command","Running an audit",{"path":51,"title":52,"navTitle":52,"group":7,"order":8},"\u002Fdocs\u002Fsecurity","Security model",{"path":54,"title":55,"navTitle":56,"group":24,"order":57},"\u002Fdocs\u002Fsessions","Sessions and forking","Sessions",6,{"path":59,"title":60,"navTitle":61,"group":7,"order":8},"\u002Fdocs\u002Fskills-roles","Skills and roles","Skills & roles",{"path":63,"title":64,"navTitle":64,"group":19,"order":65},"\u002Fdocs\u002Ftools","Tool reference",12,{"path":67,"title":68,"navTitle":68,"group":7,"order":8},"\u002Fdocs\u002Ftroubleshooting","Troubleshooting",{"path":70,"title":71,"navTitle":72,"group":24,"order":73},"\u002Fdocs\u002Ftui","The interactive TUI","Interactive TUI",9,{"path":75,"title":76,"navTitle":77,"group":7,"order":8},"\u002Fdocs\u002Fweb-eval","Dashboard and evaluation","Dashboard & evaluation",{"id":79,"title":55,"body":80,"description":631,"extension":632,"group":24,"meta":633,"navTitle":56,"navigation":634,"order":57,"path":54,"seo":635,"stem":636,"__hash__":637},"docs\u002Fdocs\u002Fsessions.md",{"type":81,"value":82,"toc":622},"minimark",[83,87,96,101,112,119,133,143,154,158,177,183,194,204,208,266,277,283,289,299,332,336,396,402,412,416,419,449,455,470,477,480,495,499,502,579,590,594,618],[84,85,55],"h1",{"id":86},"sessions-and-forking",[88,89,90,91,95],"p",{},"Every run is a ",[92,93,94],"strong",{},"session",": an id, a target directory, a model, a title, and an ordered transcript of\nmessages. Findings, evidence, verdicts, memory and compaction journals all hang off that same\nsession. Nothing is thrown away when a run ends, which is what makes \"resume from memory\", the\nfifth invariant, mechanical rather than aspirational.",[97,98,100],"h2",{"id":99},"where-sessions-are-stored","Where sessions are stored",[102,103,109],"pre",{"className":104,"code":106,"language":107,"meta":108},[105],"language-text","~\u002F.locac\u002Fprojects\u002F\u003Crepo-name>-\u003Chash>\u002Fsessions.db\n","text","",[110,111,106],"code",{"__ignoreMap":108},[88,113,114,115,118],{},"A single SQLite file per target repository. The name is the target's directory name (sanitised,\ncapped at 32 characters) plus a 12-character prefix of the SHA-256 of its absolute path, so two\ncheckouts named ",[110,116,117],{},"api"," never collide.",[88,120,121,124,125,128,129,132],{},[110,122,123],{},"$LOCAC_HOME"," replaces ",[110,126,127],{},"~\u002F.locac"," if it is set. ",[110,130,131],{},"--db \u003Cpath>"," overrides the whole thing.",[134,135,136],"blockquote",{},[88,137,138,139,142],{},"The database lives ",[92,140,141],{},"outside"," the target repository on purpose. Sandboxed target code has write\naccess to the target root, and a session store the target can rewrite is a store you cannot trust\nto tell you what the last run found.",[88,144,145,146,149,150,153],{},"Older builds wrote to ",[110,147,148],{},"\u003Ctarget>\u002F.lecter\u002Fsessions.db",". If that file still exists, locac prints a\none-line pointer at startup and tells you how to open it explicitly with ",[110,151,152],{},"--db",". It never adopts it\nsilently, and that is exactly the file the move was designed to distrust.",[97,155,157],{"id":156},"listing-sessions","Listing sessions",[102,159,163],{"className":160,"code":161,"language":162,"meta":108,"style":108},"language-bash shiki shiki-themes vitesse-dark","locac sessions\n","bash",[110,164,165],{"__ignoreMap":108},[166,167,169,173],"span",{"class":168,"line":29},"line",[166,170,172],{"class":171},"sCK9x","locac",[166,174,176],{"class":175},"s7rlk"," sessions\n",[102,178,181],{"className":179,"code":180,"language":107,"meta":108},[105],"2f1c9b40-...  2026-07-31T09:41:12.004Z  audit the archive extraction path\n9a05e7d1-...  2026-07-30T18:02:55.881Z  (untitled)\n",[110,182,180],{"__ignoreMap":108},[88,184,185,186,189,190,193],{},"One line per session: ",[92,187,188],{},"id",", last-updated timestamp in ISO-8601 UTC, then the title. Sessions are\nlisted most-recently-updated first. Titles default to the first 80 characters of the opening prompt,\nor ",[110,191,192],{},"interactive"," when the run started with no prompt.",[88,195,196,199,200,203],{},[110,197,198],{},"locac sessions --db \u003Cpath>"," reads a different database; ",[110,201,202],{},"--cwd \u003Cdir>"," picks the per-project database\nfor another target.",[97,205,207],{"id":206},"continuing-and-resuming","Continuing and resuming",[102,209,211],{"className":160,"code":210,"language":162,"meta":108,"style":108},"locac -c \"now check the sibling handlers\"    # the most recently used session\nlocac resume \u003Csession-id> \"…\"                # a specific session\n",[110,212,213,235],{"__ignoreMap":108},[166,214,215,217,221,225,228,231],{"class":168,"line":29},[166,216,172],{"class":171},[166,218,220],{"class":219},"sXjYR"," -c",[166,222,224],{"class":223},"sNJcY"," \"",[166,226,227],{"class":175},"now check the sibling handlers",[166,229,230],{"class":223},"\"",[166,232,234],{"class":233},"sux-A","    # the most recently used session\n",[166,236,237,239,242,246,249,253,256,258,261,263],{"class":168,"line":33},[166,238,172],{"class":171},[166,240,241],{"class":175}," resume",[166,243,245],{"class":244},"s_wWq"," \u003C",[166,247,248],{"class":175},"session-i",[166,250,252],{"class":251},"sNpkn","d",[166,254,255],{"class":244},">",[166,257,224],{"class":223},[166,259,260],{"class":175},"…",[166,262,230],{"class":223},[166,264,265],{"class":233},"                # a specific session\n",[88,267,268,271,272,276],{},[110,269,270],{},"-c"," picks the first row of the session list: the most recently ",[273,274,275],"em",{},"updated"," session for this target.\nWith no prompt on a real terminal it opens that session in the TUI, idle, with the prior transcript\nrepainted; off a TTY a prompt is required:",[102,278,281],{"className":279,"code":280,"language":107,"meta":108},[105],"continue needs a prompt (or --tui): locac -c \"\u003Cprompt>\"\n",[110,282,280],{"__ignoreMap":108},[88,284,285,288],{},[110,286,287],{},"resume"," needs both an id and a prompt. Resuming loads the full history, appends your message, and\nre-drives the loop over the whole transcript, so findings, scratchpad and memory from the earlier\nturns are all still in scope.",[88,290,291,292,294,295,298],{},"All model and run flags work on ",[110,293,287],{},", which is how you raise a budget after an exit code ",[110,296,297],{},"2",":",[102,300,302],{"className":160,"code":301,"language":162,"meta":108,"style":108},"locac resume \u003Csession-id> \"continue where you stopped\" --max-tokens 4000000\n",[110,303,304],{"__ignoreMap":108},[166,305,306,308,310,312,314,316,318,320,323,325,328],{"class":168,"line":29},[166,307,172],{"class":171},[166,309,241],{"class":175},[166,311,245],{"class":244},[166,313,248],{"class":175},[166,315,252],{"class":251},[166,317,255],{"class":244},[166,319,224],{"class":223},[166,321,322],{"class":175},"continue where you stopped",[166,324,230],{"class":223},[166,326,327],{"class":219}," --max-tokens",[166,329,331],{"class":330},"sxA9i"," 4000000\n",[97,333,335],{"id":334},"renaming-and-deleting","Renaming and deleting",[102,337,339],{"className":160,"code":338,"language":162,"meta":108,"style":108},"locac sessions rename \u003Cid> a clearer title for this audit\nlocac sessions delete \u003Cid>\n",[110,340,341,378],{"__ignoreMap":108},[166,342,343,345,348,351,353,356,358,360,363,366,369,372,375],{"class":168,"line":29},[166,344,172],{"class":171},[166,346,347],{"class":175}," sessions",[166,349,350],{"class":175}," rename",[166,352,245],{"class":244},[166,354,355],{"class":175},"i",[166,357,252],{"class":251},[166,359,255],{"class":244},[166,361,362],{"class":175}," a",[166,364,365],{"class":175}," clearer",[166,367,368],{"class":175}," title",[166,370,371],{"class":175}," for",[166,373,374],{"class":175}," this",[166,376,377],{"class":175}," audit\n",[166,379,380,382,384,387,389,391,393],{"class":168,"line":33},[166,381,172],{"class":171},[166,383,347],{"class":175},[166,385,386],{"class":175}," delete",[166,388,245],{"class":244},[166,390,355],{"class":175},[166,392,252],{"class":251},[166,394,395],{"class":244},">\n",[88,397,398,401],{},[110,399,400],{},"rename"," takes the rest of the command line as the title, so quoting is optional.",[88,403,404,407,408,411],{},[110,405,406],{},"delete"," removes a ",[92,409,410],{},"leaf"," session only. A session that has been forked is the parent of its\nbranches, and deleting it would orphan them, so the delete is refused with an explanatory message\nand exit code 1.",[97,413,415],{"id":414},"forking","Forking",[88,417,418],{},"A fork branches a session at a transcript position and continues in the branch. The source session\nis untouched. The point of a fork is retrying a step differently, not throwing the first attempt\naway.",[102,420,422],{"className":160,"code":421,"language":162,"meta":108,"style":108},"locac fork \u003Csession-id> \u003Cseq>\n",[110,423,424],{"__ignoreMap":108},[166,425,426,428,431,433,435,437,439,441,444,447],{"class":168,"line":29},[166,427,172],{"class":171},[166,429,430],{"class":175}," fork",[166,432,245],{"class":244},[166,434,248],{"class":175},[166,436,252],{"class":251},[166,438,255],{"class":244},[166,440,245],{"class":244},[166,442,443],{"class":175},"se",[166,445,446],{"class":251},"q",[166,448,395],{"class":244},[102,450,453],{"className":451,"code":452,"language":107,"meta":108},[105],"Forked 2f1c9b40-… @seq 24 → 7be31c05-…\nResume it: locac resume 7be31c05-… \"\u003Cyour corrected next step>\"\n",[110,454,452],{"__ignoreMap":108},[88,456,457,458,461,462,465,466,469],{},"Message sequence numbers are contiguous from 0, so ",[110,459,460],{},"\u003Cseq>"," is simply the index of the last message\nyou want to keep: messages ",[110,463,464],{},"0..seq"," are copied and everything after is dropped. The boundary is then\npulled back to the last ",[92,467,468],{},"balanced"," point: a fork must never copy a tool call whose tool result was\nleft behind, because every request such a transcript makes is rejected as a bad request and the\nsession becomes permanently unresumable. So the branch may keep slightly fewer messages than you\nasked for, and the number in the fork's own title is the boundary that was actually used.",[88,471,472,473,476],{},"The new session records its lineage, parent id and copied boundary, which is what lets\n",[110,474,475],{},"sessions delete"," refuse to orphan a branch.",[88,478,479],{},"Use a fork when a run went down a wrong path and you want to re-decide from a known-good point\nwithout re-doing the reconnaissance that led there.",[88,481,482,483,486,487,490,491,494],{},"Inside the TUI, ",[110,484,485],{},"\u002Ffork"," opens a picker of the branchable turns and switches the live session to the\nnew branch in place; ",[110,488,489],{},"\u002Fresume"," switches back to the original. Once a project has forks of forks,\n",[110,492,493],{},"\u002Ftree"," is the picker to reach for: same list, but each session is drawn under the one it branched\nfrom, so you can see which attempt a branch came out of before you resume it.",[97,496,498],{"id":497},"session-state-in-the-tui","Session state in the TUI",[88,500,501],{},"Five slash commands move the live session while the TUI is open:",[503,504,505,518],"table",{},[506,507,508],"thead",{},[509,510,511,515],"tr",{},[512,513,514],"th",{},"Command",[512,516,517],{},"Effect",[519,520,521,532,541,550,559,569],"tbody",{},[509,522,523,529],{},[524,525,526],"td",{},[110,527,528],{},"\u002Fnew",[524,530,531],{},"Start a fresh session with the same target, model and provider",[509,533,534,538],{},[524,535,536],{},[110,537,489],{},[524,539,540],{},"Pick an existing session and repaint its transcript",[509,542,543,547],{},[524,544,545],{},[110,546,493],{},[524,548,549],{},"The same picker, drawn as the fork tree — children indented under their parent",[509,551,552,556],{},[524,553,554],{},[110,555,485],{},[524,557,558],{},"Branch the live session at a picked turn and continue in the branch",[509,560,561,566],{},[524,562,563],{},[110,564,565],{},"\u002Fname \u003Ctitle>",[524,567,568],{},"Retitle the live session",[509,570,571,576],{},[524,572,573],{},[110,574,575],{},"\u002Fsession",[524,577,578],{},"Print the live session's id, message count, tokens and cost",[88,580,581,582,585,586,589],{},"Each of the first three detaches the compaction journal, because a ",[110,583,584],{},"recall seq=\u003CN>"," marker only\npoints at a real message while the conversation on screen ",[273,587,588],{},"is"," the persisted session. After a swap\nor a renumbering fork it would name a row in the wrong transcript.",[97,591,593],{"id":592},"next","Next",[88,595,596,599,600,603,604,603,607,603,610,613,614,617],{},[597,598,6],"a",{"href":5}," covers ",[110,601,602],{},"config",", ",[110,605,606],{},"skills",[110,608,609],{},"web",[110,611,612],{},"eval"," and ",[110,615,616],{},"selftest",".",[619,620,621],"style",{},"html pre.shiki code .sCK9x, html code.shiki .sCK9x{--shiki-default:#80A665}html pre.shiki code .s7rlk, html code.shiki .s7rlk{--shiki-default:#C98A7D}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sXjYR, html code.shiki .sXjYR{--shiki-default:#C99076}html pre.shiki code .sNJcY, html code.shiki .sNJcY{--shiki-default:#C98A7D77}html pre.shiki code .sux-A, html code.shiki .sux-A{--shiki-default:#758575DD}html pre.shiki code .s_wWq, html code.shiki .s_wWq{--shiki-default:#CB7676}html pre.shiki code .sNpkn, html code.shiki .sNpkn{--shiki-default:#DBD7CAEE}html pre.shiki code .sxA9i, html code.shiki .sxA9i{--shiki-default:#4C9A91}",{"title":108,"searchDepth":41,"depth":41,"links":623},[624,625,626,627,628,629,630],{"id":99,"depth":33,"text":100},{"id":156,"depth":33,"text":157},{"id":206,"depth":33,"text":207},{"id":334,"depth":33,"text":335},{"id":414,"depth":33,"text":415},{"id":497,"depth":33,"text":498},{"id":592,"depth":33,"text":593},"How locac stores a run, how to list, continue, resume, rename and delete sessions, and how forking lets you retry a step without losing the first attempt.","md",{},true,{"title":55,"description":631},"docs\u002Fsessions","gcPw9OGZadcVk9WYdqCi1Bzn1h0aw80CwukuHJfnURU",1786794387656]