[{"data":1,"prerenderedAt":3151},["ShallowReactive",2],{"docs-navigation":3,"docs\u002Fdocs\u002Freference\u002Fsessions":194,"docs\u002Fdocs\u002Freference\u002Fsessions-surround":3146},[4],{"title":5,"path":6,"stem":7,"children":8},"Docs","\u002Fdocs","docs",[9,13,35,129,149,154],{"title":10,"path":6,"stem":11,"icon":12},"Overview","docs\u002Findex","i-lucide-house",{"title":14,"icon":15,"path":16,"stem":17,"children":18,"page":34},"Quickstart","i-lucide-rocket","\u002Fdocs\u002Fquickstart","docs\u002F1.quickstart",[19,24,29],{"title":20,"path":21,"stem":22,"icon":23},"Local","\u002Fdocs\u002Fquickstart\u002Flocal","docs\u002F1.quickstart\u002F1.local","i-lucide-laptop",{"title":25,"path":26,"stem":27,"icon":28},"Self-hosted","\u002Fdocs\u002Fquickstart\u002Fself-hosted","docs\u002F1.quickstart\u002F2.self-hosted","i-lucide-server",{"title":30,"path":31,"stem":32,"icon":33},"Cloud","\u002Fdocs\u002Fquickstart\u002Fcloud","docs\u002F1.quickstart\u002F3.cloud","i-lucide-cloud",false,{"title":36,"path":37,"stem":38,"children":39,"icon":41},"Harnesses","\u002Fdocs\u002Fharnesses","docs\u002F2.harnesses\u002Findex",[40,42,47,51,55,59,63,67,71,76,80,84,89,93,97,101,105,109,113,117,121,125],{"title":36,"path":37,"stem":38,"icon":41},"i-lucide-plug",{"title":43,"path":44,"stem":45,"icon":46},"Claude Code","\u002Fdocs\u002Fharnesses\u002Fclaude-code","docs\u002F2.harnesses\u002F1.claude-code","i-lucide-terminal",{"title":48,"path":49,"stem":50,"icon":46},"Devin","\u002Fdocs\u002Fharnesses\u002Fdevin","docs\u002F2.harnesses\u002F10.devin",{"title":52,"path":53,"stem":54,"icon":46},"Kiro","\u002Fdocs\u002Fharnesses\u002Fkiro","docs\u002F2.harnesses\u002F11.kiro",{"title":56,"path":57,"stem":58,"icon":46},"Cline","\u002Fdocs\u002Fharnesses\u002Fcline","docs\u002F2.harnesses\u002F12.cline",{"title":60,"path":61,"stem":62,"icon":46},"Amp","\u002Fdocs\u002Fharnesses\u002Famp","docs\u002F2.harnesses\u002F13.amp",{"title":64,"path":65,"stem":66,"icon":46},"VS Code","\u002Fdocs\u002Fharnesses\u002Fvscode","docs\u002F2.harnesses\u002F14.vscode",{"title":68,"path":69,"stem":70,"icon":46},"Gemini CLI","\u002Fdocs\u002Fharnesses\u002Fgemini-cli","docs\u002F2.harnesses\u002F15.gemini-cli",{"title":72,"path":73,"stem":74,"icon":75},"OpenClaw","\u002Fdocs\u002Fharnesses\u002Fopenclaw","docs\u002F2.harnesses\u002F16.openclaw","i-lucide-puzzle",{"title":77,"path":78,"stem":79,"icon":75},"Hermes Agent","\u002Fdocs\u002Fharnesses\u002Fhermes","docs\u002F2.harnesses\u002F17.hermes",{"title":81,"path":82,"stem":83,"icon":75},"NanoClaw","\u002Fdocs\u002Fharnesses\u002Fnanoclaw","docs\u002F2.harnesses\u002F18.nanoclaw",{"title":85,"path":86,"stem":87,"icon":88},"skills.sh (`npx skills`)","\u002Fdocs\u002Fharnesses\u002Fskills-sh","docs\u002F2.harnesses\u002F19.skills-sh","i-lucide-store",{"title":90,"path":91,"stem":92,"icon":46},"Codex CLI","\u002Fdocs\u002Fharnesses\u002Fcodex","docs\u002F2.harnesses\u002F2.codex",{"title":94,"path":95,"stem":96,"icon":88},"Claude Code plugin marketplace","\u002Fdocs\u002Fharnesses\u002Fclaude-code-marketplace","docs\u002F2.harnesses\u002F20.claude-code-marketplace",{"title":98,"path":99,"stem":100,"icon":88},"Codex plugin marketplace","\u002Fdocs\u002Fharnesses\u002Fcodex-marketplace","docs\u002F2.harnesses\u002F21.codex-marketplace",{"title":102,"path":103,"stem":104,"icon":46},"Cursor","\u002Fdocs\u002Fharnesses\u002Fcursor","docs\u002F2.harnesses\u002F3.cursor",{"title":106,"path":107,"stem":108,"icon":46},"OpenCode V1","\u002Fdocs\u002Fharnesses\u002Fopencode-v1","docs\u002F2.harnesses\u002F4.opencode-v1",{"title":110,"path":111,"stem":112,"icon":46},"OpenCode 2","\u002Fdocs\u002Fharnesses\u002Fopencode-v2","docs\u002F2.harnesses\u002F5.opencode-v2",{"title":114,"path":115,"stem":116,"icon":46},"Oh My Pi (omp)","\u002Fdocs\u002Fharnesses\u002Fomp","docs\u002F2.harnesses\u002F6.omp",{"title":118,"path":119,"stem":120,"icon":46},"Pi","\u002Fdocs\u002Fharnesses\u002Fpi","docs\u002F2.harnesses\u002F7.pi",{"title":122,"path":123,"stem":124,"icon":46},"Copilot CLI","\u002Fdocs\u002Fharnesses\u002Fcopilot","docs\u002F2.harnesses\u002F8.copilot",{"title":126,"path":127,"stem":128,"icon":46},"Antigravity","\u002Fdocs\u002Fharnesses\u002Fantigravity","docs\u002F2.harnesses\u002F9.antigravity",{"title":130,"icon":131,"path":132,"stem":133,"children":134,"page":34},"Concepts","i-lucide-lightbulb","\u002Fdocs\u002Fconcepts","docs\u002F3.concepts",[135,140,145],{"title":136,"path":137,"stem":138,"icon":139},"Reports","\u002Fdocs\u002Fconcepts\u002Freports","docs\u002F3.concepts\u002F1.reports","i-lucide-file-text",{"title":141,"path":142,"stem":143,"icon":144},"Triage","\u002Fdocs\u002Fconcepts\u002Ftriage","docs\u002F3.concepts\u002F2.triage","i-lucide-list-checks",{"title":146,"path":147,"stem":148,"icon":41},"Model and harness independence","\u002Fdocs\u002Fconcepts\u002Fmodel-and-harness-independence","docs\u002F3.concepts\u002F3.model-and-harness-independence",{"title":150,"path":151,"stem":152,"icon":153},"Security","\u002Fdocs\u002Fsecurity","docs\u002F4.security","i-lucide-shield-check",{"title":155,"path":156,"stem":157,"children":158,"icon":160},"Reference","\u002Fdocs\u002Freference","docs\u002F5.reference\u002Findex",[159,161,166,171,174,179,184,189],{"title":155,"path":156,"stem":157,"icon":160},"i-lucide-book-open",{"title":162,"path":163,"stem":164,"icon":165},"API","\u002Fdocs\u002Freference\u002Fapi","docs\u002F5.reference\u002F1.api","i-lucide-braces",{"title":167,"path":168,"stem":169,"icon":170},"Operations","\u002Fdocs\u002Freference\u002Foperate","docs\u002F5.reference\u002F2.operate","i-lucide-settings",{"title":150,"path":172,"stem":173,"icon":153},"\u002Fdocs\u002Freference\u002Fsecurity","docs\u002F5.reference\u002F3.security",{"title":175,"path":176,"stem":177,"icon":178},"Session logs","\u002Fdocs\u002Freference\u002Fsessions","docs\u002F5.reference\u002F4.sessions","i-lucide-history",{"title":180,"path":181,"stem":182,"icon":183},"Releases","\u002Fdocs\u002Freference\u002Freleases","docs\u002F5.reference\u002F5.releases","i-lucide-tags",{"title":185,"path":186,"stem":187,"icon":188},"Client installation","\u002Fdocs\u002Freference\u002Fagent-install","docs\u002F5.reference\u002F6.agent-install","i-lucide-download",{"title":190,"path":191,"stem":192,"icon":193},"Stack installation","\u002Fdocs\u002Freference\u002Fagent-install-stack","docs\u002F5.reference\u002F7.agent-install-stack","i-lucide-container",{"id":195,"title":175,"body":196,"description":3139,"extension":3140,"meta":3141,"navigation":3142,"path":176,"seo":3143,"stem":177,"verified":3144,"__hash__":3145},"docs\u002Fdocs\u002F5.reference\u002F4.sessions.md",{"type":197,"value":198,"toc":3116},"minimark",[199,361,383,424,436,440,517,536,563,574,603,614,635,640,651,677,723,726,961,972,989,1004,1015,1017,1084,1087,1262,1265,1357,1359,1457,1461,1538,1541,1629,1632,1652,1662,1684,1687,1706,1709,1713,1889,1935,1939,1942,2111,2153,2157,2186,2199,2203,2209,2275,2278,2537,2553,2557,2560,2656,2706,2735,2739,2742,2746,2798,2823,2915,2956,3006,3010,3018,3109,3112],[200,201,206],"pre",{"className":202,"code":203,"language":204,"meta":205,"style":205},"language-bash shiki shiki-themes github-light github-light github-dark","agentfeedback sessions status                         # stores, counts per state, the saved selection\nagentfeedback sessions list --unprocessed             # new and changed sessions\nagentfeedback sessions digest --unprocessed --json    # bounded, scrubbed events; records the digest watermark\nagentfeedback submit friction --stdin --context-from claude-code:\u003Csession id>#\u003Cspan> \u003C report.json\nagentfeedback sessions mark claude-code:\u003Csession id> --outcome filed --ref \u003Cuid>\n","bash","",[207,208,209,229,246,264,320],"code",{"__ignoreMap":205},[210,211,214,218,222,225],"span",{"class":212,"line":213},"line",1,[210,215,217],{"class":216},"snPdu","agentfeedback",[210,219,221],{"class":220},"sIIMD"," sessions",[210,223,224],{"class":220}," status",[210,226,228],{"class":227},"sCsY4","                         # stores, counts per state, the saved selection\n",[210,230,232,234,236,239,243],{"class":212,"line":231},2,[210,233,217],{"class":216},[210,235,221],{"class":220},[210,237,238],{"class":220}," list",[210,240,242],{"class":241},"sBjJW"," --unprocessed",[210,244,245],{"class":227},"             # new and changed sessions\n",[210,247,249,251,253,256,258,261],{"class":212,"line":248},3,[210,250,217],{"class":216},[210,252,221],{"class":220},[210,254,255],{"class":220}," digest",[210,257,242],{"class":241},[210,259,260],{"class":241}," --json",[210,262,263],{"class":227},"    # bounded, scrubbed events; records the digest watermark\n",[210,265,267,269,272,275,278,281,284,288,291,294,298,301,304,306,309,312,314,317],{"class":212,"line":266},4,[210,268,217],{"class":216},[210,270,271],{"class":220}," submit",[210,273,274],{"class":220}," friction",[210,276,277],{"class":241}," --stdin",[210,279,280],{"class":241}," --context-from",[210,282,283],{"class":220}," claude-code:",[210,285,287],{"class":286},"s8jYJ","\u003C",[210,289,290],{"class":220},"session",[210,292,293],{"class":220}," i",[210,295,297],{"class":296},"sxrX7","d",[210,299,300],{"class":286},">",[210,302,303],{"class":220},"#",[210,305,287],{"class":286},[210,307,308],{"class":220},"spa",[210,310,311],{"class":296},"n",[210,313,300],{"class":286},[210,315,316],{"class":286}," \u003C",[210,318,319],{"class":220}," report.json\n",[210,321,323,325,327,330,332,334,336,338,340,342,345,348,351,353,356,358],{"class":212,"line":322},5,[210,324,217],{"class":216},[210,326,221],{"class":220},[210,328,329],{"class":220}," mark",[210,331,283],{"class":220},[210,333,287],{"class":286},[210,335,290],{"class":220},[210,337,293],{"class":220},[210,339,297],{"class":296},[210,341,300],{"class":286},[210,343,344],{"class":241}," --outcome",[210,346,347],{"class":220}," filed",[210,349,350],{"class":241}," --ref",[210,352,316],{"class":286},[210,354,355],{"class":220},"ui",[210,357,297],{"class":296},[210,359,360],{"class":286},">\n",[362,363,364,367,368,371,372,377,378,382],"p",{},[207,365,366],{},"agentfeedback sessions"," reads the session logs a coding-agent harness keeps\non disk, on demand and read-only, so an agent can turn what went wrong in a\npast session into feedback. The policy of the config file's ",[207,369,370],{},"[collect]","\ntable is applied per session, by its recorded working directory, before the\nlog is opened. Digesting and marking store only watermarks; ",[373,374,376],"a",{"href":375},"#push","Push","\nuploads eligible, scrubbed transcripts to a configured server whose\norganisation enables processing, manually or through the ",[373,379,381],{"href":380},"#automatic-sweep","automatic sweep",".",[362,384,385,386,389,390,393,394,397,398,401,402,405,406,410,411,414,415,418,419,423],{},"Session state always lives in the data-directory database\n(",[207,387,388],{},"${XDG_DATA_HOME:-~\u002F.local\u002Fshare}\u002Fagentfeedback\u002Fagentfeedback.db","), in local\nand in remote mode. ",[207,391,392],{},"sessions status"," also reads the configured server's\nsession policy, subject to its cache and backoff, and prints the org's\nprocessing status (",[207,395,396],{},"capture"," in JSON). Listing, digesting and marking do\ntheir own work locally; eligible CLI invocations can also trigger the sweep.\n",[207,399,400],{},"submit"," and ",[207,403,404],{},"sessions push"," send their respective content to the server.\nSee ",[373,407,409],{"href":408},"\u002Fdocs\u002Freference\u002Foperate#session-policy-settings","Session policy settings",".\nUse ",[207,412,413],{},"agentfeedback config"," or ",[207,416,417],{},"config set sessions.quiet 10m"," to change this\nmachine's quiet interval. The menu shows organisation policy and repository\nrestrictions read-only; changing a setting never grants capture permission.\nSee ",[373,420,422],{"href":421},"\u002Fdocs\u002Freference\u002Foperate#machine-settings","Machine settings"," for all editable keys.",[362,425,426,427,431,432,435],{},"Server authentication is separate from collection permission. The four\n",[373,428,430],{"href":429},"\u002Fdocs\u002Freference\u002Foperate#authenticate-a-client","onboarding sources"," (paste key, email\ndevice login, agent self-enrolment, stdin enrolment token) and explicit\n",[207,433,434],{},"agentfeedback login"," reauthentication do not enable capture or relax\nrepository restrictions. A changed key invalidates credential-scoped cached\npolicy; the server's current policy still governs uploads. Keep keys,\ntokens, device codes, verification URLs and claim URLs out of session logs.",[437,438,376],"h2",{"id":439},"push",[200,441,443],{"className":202,"code":442,"language":204,"meta":205,"style":205},"agentfeedback sessions push claude-code:\u003Csession-id> --json\nagentfeedback sessions push --due --limit 10 --json\nagentfeedback sessions push codex:\u003Csession-id> --since 2026-01-01T00:00:00Z --dry-run --json\n",[207,444,445,468,487],{"__ignoreMap":205},[210,446,447,449,451,454,456,458,461,463,465],{"class":212,"line":213},[210,448,217],{"class":216},[210,450,221],{"class":220},[210,452,453],{"class":220}," push",[210,455,283],{"class":220},[210,457,287],{"class":286},[210,459,460],{"class":220},"session-i",[210,462,297],{"class":296},[210,464,300],{"class":286},[210,466,467],{"class":241}," --json\n",[210,469,470,472,474,476,479,482,485],{"class":212,"line":231},[210,471,217],{"class":216},[210,473,221],{"class":220},[210,475,453],{"class":220},[210,477,478],{"class":241}," --due",[210,480,481],{"class":241}," --limit",[210,483,484],{"class":241}," 10",[210,486,467],{"class":241},[210,488,489,491,493,495,498,500,502,504,506,509,512,515],{"class":212,"line":248},[210,490,217],{"class":216},[210,492,221],{"class":220},[210,494,453],{"class":220},[210,496,497],{"class":220}," codex:",[210,499,287],{"class":286},[210,501,460],{"class":220},[210,503,297],{"class":296},[210,505,300],{"class":286},[210,507,508],{"class":241}," --since",[210,510,511],{"class":220}," 2026-01-01T00:00:00Z",[210,513,514],{"class":241}," --dry-run",[210,516,467],{"class":241},[362,518,519,520,523,524,527,528,531,532,535],{},"Push supports Claude Code (",[207,521,522],{},"claude-code-jsonl","), Codex (",[207,525,526],{},"codex-rollout","),\nOpenCode V1 and 2 (",[207,529,530],{},"opencode-virtual-log",") and Cursor\n(",[207,533,534],{},"cursor-agent-transcript",", storage only). It sends the whole complete-line\nrevision, not the digest or only new entries. The revision is the decimal\nsource byte count. An unfinished last line is excluded; changes during\ncapture defer the upload.",[362,537,538,539,542,543,546,547,550,551,554,555,558,559,562],{},"The configured server must enable processing. Collection rules and every\nrecorded repository's ",[207,540,541],{},"[sessions] push = false"," veto apply before export.\nUnreadable, unsupported, unknown-project, disabled and denied sessions do\nnot upload. The last entry must be at or after this machine first observed\nenabled policy; ",[207,544,545],{},"--since"," explicitly replaces that cutoff. ",[207,548,549],{},"--due"," selects\nquiet sessions oldest-last-entry first, up to ",[207,552,553],{},"--limit"," (default\n",[207,556,557],{},"sessions.push_batch","); named references bypass quiet time, not safety checks.\nThe run respects ",[207,560,561],{},"sessions.push_budget"," and ten-second request timeouts.",[362,564,565,566,569,570,573],{},"All transcript text is scrubbed before hashing or splitting into parts of\nat most 4 MiB, at line boundaries where possible. JSON string values are\ndecoded for scrubbing, including escaped credentials; multiline private\nkeys are redacted across records. Capture processes records incrementally,\nretaining bounded scrubbed output rather than the whole raw transcript.\nIndividual records still require record-sized decoding buffers. The\nassembled canonical envelope must fit the server's size cap; there is no\nseparate raw-source size cap. Uploads resume acknowledged parts and complete\nas one ",[207,567,568],{},"kind: session"," submission. An unchanged successful revision is\n",[207,571,572],{},"replayed"," without sending parts again.",[362,575,576,577,580,581,580,583,586,587,590,591,594,595,598,599,602],{},"Outcomes are ",[207,578,579],{},"pushed",", ",[207,582,572],{},[207,584,585],{},"skipped"," with a reason, ",[207,588,589],{},"deferred",",\n",[207,592,593],{},"suspended",", or ",[207,596,597],{},"error",". Dry runs report ",[207,600,601],{},"dry-run",", revision, byte and part\ncounts, and at most 2 KiB of scrubbed preview; they discover policy but send\nno transcript. A named session that cannot be pushed makes the command exit",[604,605,606],"ol",{},[607,608,609,610,613],"li",{},"A 429 suspends the run and policy until retry is allowed; network and\nserver failures leave it for a later invocation. A begin conflict is\n",[207,611,612],{},"replay_mismatch"," and is not retried at that source size.",[362,615,616,619,620,623,624,627,628,631,632,634],{},[207,617,618],{},"sessions_pushed"," stores only upload metadata and outcomes, scoped to the\ndestination, organisation, credential and consent period, separately from\ndigest watermarks. ",[207,621,622],{},"session_manifests"," retains the initial scrubbed upload\nmetadata and partition size while an upload is pending, so retries do not\nchange identity when repository facts or file timestamps change. Current\ncollection rules and repository vetoes still apply before each request.\nPending metadata is removed on completion, terminal rejection, a new\nrevision or a changed consent scope. Transcript text and previews are never\npersisted to the database, cache, log or spool. ",[207,625,626],{},"too_large"," is not retried unless the source\nshrinks or rotates, or the server's cap grows. ",[207,629,630],{},"sessions list"," shows the\npushed revision; ",[207,633,392],{}," shows pushed, pending and skipped counts\nand the last push time for the current scope.",[636,637,639],"h3",{"id":638},"automatic-sweep","Automatic sweep",[362,641,642,643,646,647,650],{},"In remote mode, existing turn-end hooks and eligible CLI invocations can\nlaunch a detached, short-lived ",[207,644,645],{},"agentfeedback sessions push --due --json",".\nThe trigger reads only cached policy matching the destination and credential;\nit makes no network request. Previously enabled consent can retry after a\ntransient policy error or an elapsed ",[207,648,649],{},"Retry-After",". A changed credential,\nauthorization failure, disabled or unsupported policy cannot revive consent.\nThe upload child always refreshes policy before uploading.",[362,652,653,654,401,657,659,660,663,664,580,666,401,669,672,673,676],{},"Commands that open a validated remote API client can trigger the sweep,\nincluding ",[207,655,656],{},"mcp",[207,658,355],{}," startup. Commands with no such client, and the\ndiagnostic ",[207,661,662],{},"doctor",", explicit ",[207,665,404],{},[207,667,668],{},"flush",[207,670,671],{},"ingest"," paths, do\nnot. Existing turn-end ",[207,674,675],{},"hook"," handling triggers after its bounded flush.\nNo new hook registrations, resident daemon or scheduler are installed.",[362,678,679,680,683,684,687,688,691,692,694,695,401,697,699,700,703,704,706,707,710,711,714,715,718,719,722],{},"A nonblocking ",[207,681,682],{},"push.lock",", inherited by the child, allows at most one sweep\nat a time. ",[207,685,686],{},"push.last-started"," throttles launches by ",[207,689,690],{},"sessions.quiet",".\nAn abandoned run can be retried after ",[207,693,561],{}," plus one minute\nonce the operating system has released its lock; an old timestamp never\npermits bypassing a still-running child's lock. Malformed, zero or future\nstart timestamps are repaired only after acquiring the lock. The parent\nlaunches its own running executable, not a PATH lookup, and does not wait\nfor uploads; the whole hook trigger shares the hook's deadline.\nEach child applies the quiet-session selection,\n",[207,696,557],{},[207,698,561],{}," described above and exits.\nThe cache's owner-only ",[207,701,702],{},"push.last-run.json"," records start and finish times,\npushed, replayed, skipped, deferred and error counts, and any suspension\ndeadline. ",[207,705,662],{}," prints it as ",[207,708,709],{},"last push","; both ",[207,712,713],{},"doctor --json"," and\n",[207,716,717],{},"sessions status --json"," expose it as ",[207,720,721],{},"last_push",". It contains no transcript\ntext, credentials or session identifiers.",[437,724,36],{"id":725},"harnesses",[727,728,729,748],"table",{},[730,731,732],"thead",{},[733,734,735,739,742,745],"tr",{},[736,737,738],"th",{},"Harness",[736,740,741],{},"Reader",[736,743,744],{},"Store (moved by)",[736,746,747],{},"Working directory, checked before the session is opened",[749,750,751,784,819,854,890,937],"tbody",{},[733,752,753,759,763,777],{},[754,755,756],"td",{},[207,757,758],{},"claude-code",[754,760,761],{},[207,762,522],{},[754,764,765,768,769,772,773,776],{},[207,766,767],{},"\u003Cconfig dir>\u002Fprojects\u002F\u003Cencoded launch directory>\u002F\u003Csession id>.jsonl"," (",[207,770,771],{},"$CLAUDE_CONFIG_DIR",", else ",[207,774,775],{},"~\u002F.claude",")",[754,778,779,780,783],{},"the encoded project directory name, before; each entry's ",[207,781,782],{},"cwd",", after",[733,785,786,791,795,809],{},[754,787,788],{},[207,789,790],{},"codex",[754,792,793],{},[207,794,526],{},[754,796,797,401,800,768,803,772,806,776],{},[207,798,799],{},"\u003Ccodex home>\u002Fsessions\u002FYYYY\u002FMM\u002FDD\u002Frollout-*.jsonl",[207,801,802],{},"\u003Ccodex home>\u002Farchived_sessions\u002Frollout-*.jsonl",[207,804,805],{},"$CODEX_HOME",[207,807,808],{},"~\u002F.codex",[754,810,811,812,815,816,783],{},"the ",[207,813,814],{},"session_meta"," first line, read alone, before; ",[207,817,818],{},"turn_context",[733,820,821,826,831,842],{},[754,822,823],{},[207,824,825],{},"copilot",[754,827,828],{},[207,829,830],{},"copilot-events",[754,832,833,768,836,772,839,776],{},[207,834,835],{},"\u003Ccopilot home>\u002Fsession-state\u002F\u003Csession id>\u002Fevents.jsonl",[207,837,838],{},"$COPILOT_HOME",[207,840,841],{},"~\u002F.copilot",[754,843,844,847,848,401,851,783],{},[207,845,846],{},"workspace.yaml"," beside the log, before; ",[207,849,850],{},"session.start",[207,852,853],{},"session.context_changed",[733,855,856,861,866,877],{},[754,857,858],{},[207,859,860],{},"gemini-cli",[754,862,863],{},[207,864,865],{},"gemini-cli-jsonl",[754,867,868,768,871,772,874,776],{},[207,869,870],{},"\u003Cgemini dir>\u002Ftmp\u002F\u003Cproject>\u002Fchats\u002Fsession-*.jsonl",[207,872,873],{},"$GEMINI_CLI_HOME\u002F.gemini",[207,875,876],{},"~\u002F.gemini",[754,878,879,882,883,886,887,783],{},[207,880,881],{},"\u003Cproject>\u002F.project_root",", before; the metadata line's ",[207,884,885],{},"directories",", which the log records only for sub-agents and ",[207,888,889],{},"\u002Fdir add",[733,891,892,897,902,927],{},[754,893,894],{},[207,895,896],{},"opencode-v1",[754,898,899],{},[207,900,901],{},"opencode-sqlite",[754,903,904,907,908,911,912,401,915,918,919,768,921,772,924,776],{},[207,905,906],{},"$OPENCODE_DB"," (a relative one under ",[207,909,910],{},"\u003Cdata home>\u002Fopencode","), else ",[207,913,914],{},"opencode.db",[207,916,917],{},"opencode-*.db"," in ",[207,920,910],{},[207,922,923],{},"$XDG_DATA_HOME",[207,925,926],{},"~\u002F.local\u002Fshare",[754,928,929,930,933,934,783],{},"the session row's ",[207,931,932],{},"directory",", before; each assistant message's ",[207,935,936],{},"path.cwd",[733,938,939,944,949,956],{},[754,940,941],{},[207,942,943],{},"opencode-v2",[754,945,946],{},[207,947,948],{},"opencode-v2-sqlite",[754,950,951,952,955],{},"the same databases, read only when they have a ",[207,953,954],{},"session_v2"," table",[754,957,929,958,960],{},[207,959,932],{},", before",[362,962,963,964,967,968,971],{},"OpenCode V1 session references use ",[207,965,966],{},"opencode-v1:\u003Cid>",". The input alias\n",[207,969,970],{},"opencode:\u003Cid>"," resolves and marks the same session. Existing local session\nstate migrates to the canonical name without resetting processed progress;\nsaved harness selections accept the alias too. The store paths, SQLite\nreader format, detector version and finding idempotency keys remain unchanged:\nretrying a previously filed span still uses its original key.",[362,973,974,975,977,978,980,981,983,984,986,987,382],{},"OpenCode 2 (checked with 2.2.6) stores sessions in a different schema in the\nsame database files, and migrates a V1 database in place: it adds its own\nrows with the same session ids and keeps V1's tables. A database with a\n",[207,976,954],{}," table is therefore read only by ",[207,979,943],{},"; the V1 reader\nskips it, so a session is never listed under both names. Sessions migrated\nthis way are listed once, as ",[207,982,943],{},", and their V1 state does not\ncarry over: they read as new, so a scan files their findings again under new\nkeys and ",[207,985,404],{}," uploads them again under ",[207,988,943],{},[362,990,991,992,995,996,999,1000,1003],{},"A directory variable that is not an absolute path is ignored. A store\ndirectory that cannot be listed, or a session file whose directory entry\ncannot be read, is named in the store's ",[207,993,994],{},"problems"," and its sessions are not\nlisted; a watermark row whose file it hides is ",[207,997,998],{},"unreadable",", not ",[207,1001,1002],{},"absent",". A\nrecorded working directory that is not an absolute path is ignored, as if not\nrecorded. Every reader takes a result's status from the harness's own record\nwhere there is one and otherwise from fixed texts of the harness, matched\nliterally, so a reworded denial or abort message in a new harness release is\nmissed: Claude Code and OpenCode read it as a plain error; Codex as ok\nunless an exit code says otherwise; Gemini CLI as an error, or as\ninterrupted on a cancelled call; Copilot CLI takes denials and aborts from\nrecords, not texts.",[362,1005,1006,1007,1010,1011,1014],{},"A session is named by its ref, ",[207,1008,1009],{},"\u003Charness>:\u003Csession id>","; an event of a\ndigest adds ",[207,1012,1013],{},"#\u003Cspan>",", the reader's id of the log entry that carries it\n(per reader below).",[636,1016,43],{"id":758},[1018,1019,1020,1030,1049,1074],"ul",{},[607,1021,1022,1023,1026,1027,382],{},"Span: the entry's ",[207,1024,1025],{},"uuid","; a tool call's span is that of the assistant\nentry carrying its ",[207,1028,1029],{},"tool_use",[607,1031,1032,1033,1036,1037,1040,1041,1044,1045,1048],{},"Prompt: a ",[207,1034,1035],{},"user"," entry with text that is not ",[207,1038,1039],{},"isMeta"," and carries no\n",[207,1042,1043],{},"tool_result","; one starting ",[207,1046,1047],{},"[Request interrupted by user"," is an interrupt.",[607,1050,1051,1052,1055,1056,414,1059,1062,1063,1066,1067,1069,1070,1073],{},"Results: ",[207,1053,1054],{},"is_error"," makes a result fail; it is denied when it contains\n",[207,1057,1058],{},"The user doesn't want to proceed with this tool use",[207,1060,1061],{},"has been denied",", interrupted when ",[207,1064,1065],{},"toolUseResult.interrupted"," is true or it\ncontains ",[207,1068,1047],{},". The log records no exit code: the\ndigest reads it from an ",[207,1071,1072],{},"Exit code N"," first line.",[607,1075,1076,1077,1080,1081,382],{},"Not read: subdirectories of a project directory, sub-agent transcripts\namong them. The encoding turns every byte outside ",[207,1078,1079],{},"[A-Za-z0-9]"," into ",[207,1082,1083],{},"-",[636,1085,1086],{"id":790},"Codex",[1018,1088,1089,1115,1134,1204,1231],{},[607,1090,1091,1092,1095,1096,1099,1102,1103,1106,1107,1110,1111,1114],{},"Span: the call's ",[207,1093,1094],{},"call_id","; a prompt from an ",[207,1097,1098],{},"item_completed",[207,1100,1101],{},"UserMessage"," item, its item ",[207,1104,1105],{},"id","; any other entry ",[207,1108,1109],{},"L\u003Coffset>",", its line's\nbyte offset. A rewritten rollout changes ",[207,1112,1113],{},"L"," spans.",[607,1116,1117,1118,1121,1122,401,1125,1121,1127,1129,1130,1133],{},"Prompt: ",[207,1119,1120],{},"event_msg"," ",[207,1123,1124],{},"user_message",[207,1126,1098],{},[207,1128,1101],{},", never\n",[207,1131,1132],{},"response_item"," user messages, which also carry injected context.",[607,1135,1136,1137,1140,1141,1144,1145,580,1148,580,1151,414,1154,1157,1158,1160,1161,1164,1165,414,1168,1171,1172,1175,1176,1179,1180,768,1182,590,1185,1188,1189,414,1192,1195,1196,1199,1200,1203],{},"Results: the first output line of a call is its result. A legacy result\n(",[207,1138,1139],{},"function_call_output"," text) is classified from the text Codex writes,\nnever the command's output: the header lines before the first line that\nis exactly ",[207,1142,1143],{},"Output:",". An exit code of 0 there is ok. Otherwise ",[207,1146,1147],{},"exec command rejected by user",[207,1149,1150],{},"patch rejected by user",[207,1152,1153],{},"rejected by configuration",[207,1155,1156],{},"automatic approval review denied the action"," in the\nheader is denied (without an ",[207,1159,1143],{}," line, only when the text starts\nwith it), a line starting ",[207,1162,1163],{},"aborted by user"," interrupted, and a non-zero\nexit code in a ",[207,1166,1167],{},"Process exited with code N",[207,1169,1170],{},"Exit code: N"," header an\nerror. The oldest form (",[207,1173,1174],{},"{\"output\", \"metadata\"}",") is classified by its\n",[207,1177,1178],{},"metadata.exit_code"," alone. A later ",[207,1181,1098],{},[207,1183,1184],{},"failed",[207,1186,1187],{},"declined","), ",[207,1190,1191],{},"patch_apply_end",[207,1193,1194],{},"mcp_tool_call_end"," refines the status,\nand the exit code when it records one; one that changes the status moves\nthe call's result to its line, so an incremental digest reports it. A\n",[207,1197,1198],{},"turn_aborted"," with reason ",[207,1201,1202],{},"interrupted"," interrupts every call still\nwithout a result.",[607,1205,1206,1207,1209,1210,1212,1213,1216,1217,1220,1221,1224,1225,1227,1228,1230],{},"Metadata: the ",[207,1208,814],{}," first line is read alone, one byte at a\ntime, nothing past its newline, at most 1 MiB. When it is longer, is not\n",[207,1211,814],{}," or does not decode, and the policy has ",[207,1214,1215],{},"deny_paths"," or\n",[207,1218,1219],{},"opt_in_only",", the session is ",[207,1222,1223],{},"denied"," without being read (\"the session\nmetadata could not be read, so the policy could not be checked\"); without\nsuch a policy it is read and checked by its recorded working directories.\nThe read checks its first line again: a ",[207,1226,782],{}," other than the one the gate\nchecked makes the session ",[207,1229,998],{}," (\"the session changed since its\npolicy was checked\").",[607,1232,1233,1234,1237,1238,1241,1242,1245,1246,1249,1250,401,1253,1256,1257,1259,1260,382],{},"Not read: a compressed rollout (",[207,1235,1236],{},".jsonl.zst",", listed ",[207,1239,1240],{},"unsupported-format","),\nand the ",[207,1243,1244],{},"history_base"," prefix of a paginated rollout, kept in another file.\nThe session id is the file name after ",[207,1247,1248],{},"rollout-\u003Ctime>-",", without the\nextension; a session id in both ",[207,1251,1252],{},"sessions",[207,1254,1255],{},"archived_sessions"," is\nlisted from ",[207,1258,1252],{},", the other named in ",[207,1261,994],{},[636,1263,122],{"id":1264},"copilot-cli",[1018,1266,1267,1276,1285,1336],{},[607,1268,1269,1270,1272,1273,382],{},"Span: the event ",[207,1271,1105],{},"; a tool call's span is that of its\n",[207,1274,1275],{},"tool.execution_start",[607,1277,1117,1278,1281,1282,1284],{},[207,1279,1280],{},"user.message"," with source ",[207,1283,1035],{}," (or none) that is not an\nautopilot continuation.",[607,1286,1287,1288,1291,1292,414,1295,1297,1298,1301,1302,414,1304,1307,1308,1311,1312,1315,1316,1319,1320,1323,1324,1327,1328,1331,1332,1335],{},"Results: the first ",[207,1289,1290],{},"tool.execution_complete"," of a call: error code\n",[207,1293,1294],{},"rejected",[207,1296,1223],{}," is denied; success with no exit code or exit code 0\nis ok; anything else, success with a non-zero exit code included, is an\nerror. The exit code is ",[207,1299,1300],{},"shellExecution.exitCode",", else, for a shell call\n(tool ",[207,1303,204],{},[207,1305,1306],{},"powershell",", a start with ",[207,1309,1310],{},"shellToolInfo",", or a complete\nwith ",[207,1313,1314],{},"shellExecution","), the closing ",[207,1317,1318],{},"completed with exit code N"," line.\n",[207,1321,1322],{},"permission.completed"," with a ",[207,1325,1326],{},"denied-"," kind denies a call without a\nresult, with ",[207,1329,1330],{},"cancelled"," interrupts it; one after the result changes\nnothing. ",[207,1333,1334],{},"abort"," interrupts every call without a result.",[607,1337,1338,1339,1342,1343,1346,1347,1350,1351,1353,1354,1356],{},"Not read: events with an ",[207,1340,1341],{},"agentId"," (sub-agents), the ",[207,1344,1345],{},"session-store.db","\nindex and the legacy flat transcripts. Only a top-level ",[207,1348,1349],{},"cwd:"," scalar (or\nthe JSON member ",[207,1352,782],{},") of ",[207,1355,846],{}," is read, and only from a\nregular file of at most 64 KiB.",[636,1358,68],{"id":860},[1018,1360,1361,1367,1384,1428,1435],{},[607,1362,1363,1364,1366],{},"Span: the message ",[207,1365,1105],{},". A message written again under its id updates its\nentry in place: a rewrite of an already-digested message updates its text\nor model without reporting it again. A call's result is the first line\nthat records it in a terminal status.",[607,1368,1032,1369,1371,1372,1375,1376,1379,1380,1383],{},[207,1370,1035],{}," message with text, not only function responses, not\nstarting with ",[207,1373,1374],{},"\u003Csession_context>",", and not a slash command (a first word\nmatching ",[207,1377,1378],{},"\u002F[A-Za-z][A-Za-z0-9_-]*",", so ",[207,1381,1382],{},"\u002Fhome\u002Fu\u002Fx fix this"," is a prompt).",[607,1385,1386,1387,1389,1390,1392,1393,414,1396,1399,1400,1403,1404,580,1407,590,1410,580,1413,414,1416,1419,1420,1423,1424,1427],{},"Results: status ",[207,1388,597],{}," is an error, ",[207,1391,1330],{}," interrupted; ",[207,1394,1395],{},"[Operation Cancelled] Reason: User denied execution.",[207,1397,1398],{},"Tool execution denied by policy."," is denied. Gemini CLI records no exit code: a ",[207,1401,1402],{},"run_shell_command","\nresult whose trailer (the final lines starting ",[207,1405,1406],{},"Error: ",[207,1408,1409],{},"Exit Code: ",[207,1411,1412],{},"Signal: ",[207,1414,1415],{},"Background PIDs: ",[207,1417,1418],{},"Process Group PGID: ",") has an ",[207,1421,1422],{},"Exit Code: N"," line (N not 0) is an error with that exit code, one with a\n",[207,1425,1426],{},"Signal:"," line an error without; lines the command printed are not read.",[607,1429,1430,1431,1434],{},"Working directory: ",[207,1432,1433],{},".project_root"," is read only from a regular file of at\nmost 4 KiB, and not at all when collection is disabled.",[607,1436,1437,1438,1441,1442,1445,1446,1448,1449,1452,1453,1456],{},"Not read: ",[207,1439,1440],{},"chats\u002F\u003Cparent session id>\u002F"," subdirectories (sub-agents), and\n",[207,1443,1444],{},"session-*.json"," single-document sessions of releases before v0.39.0,\nlisted ",[207,1447,1240],{},". A ",[207,1450,1451],{},"$patch"," record is not applied, and\nmessages a ",[207,1454,1455],{},"$rewindTo"," removes are kept: they happened.",[636,1458,1460],{"id":1459},"opencode","OpenCode",[1018,1462,1463,1466,1469,1489,1508],{},[607,1464,1465],{},"Span: the message id of a prompt, the part id of a tool call.",[607,1467,1468],{},"Prompt: a user message's text parts that are neither synthetic nor\nignored; a user message counts once it has a part.",[607,1470,1471,1472,1475,1476,1479,1480,1482,1483,1485,1486,1048],{},"Results: a ",[207,1473,1474],{},"completed"," tool part is ok unless ",[207,1477,1478],{},"metadata.exit"," is a\nnon-zero integer (an error with that exit code), or null with the shell\ntool's abort note (interrupted) or timeout note (an error). An ",[207,1481,597],{}," part\nis interrupted when aborted, denied when the user or a rule refused it or a\nquestion was dismissed, else an error. A ",[207,1484,1478],{}," of 1.0 is exit\ncode 1. An assistant message ended by\n",[207,1487,1488],{},"MessageAbortedError",[607,1490,1491,1492,1495,1496,1499,1500,1502,1503,1505,1506,382],{},"Not read: child sessions (",[207,1493,1494],{},"parent_id"," set: sub-agents). A session is laid\nout as a virtual append-only log, one record per message then per part, so\noffsets, sizes and watermarks work as for a file. A record holds only the\nfields that are final once the row is complete, so OpenCode's later\nrewrites (a user message's summary, a tool part's compaction time) do not\nchange it. A user message without parts, an assistant message not\ncompleted, or a tool part not finished, ends it like a final line without\nits newline, and the session's mtime is its ",[207,1497,1498],{},"time_updated",". A session id\nin two databases is listed from the first, the other named in ",[207,1501,994],{},".\nA session whose ",[207,1504,932],{}," changed since it was listed is ",[207,1507,998],{},[607,1509,1510,1511,1514,1515,1518,1519,1522,1523,414,1526,1528,1529,1531,1532,1534,1535,382],{},"Open: never written, and never opened ",[207,1512,1513],{},"mode=ro"," (SQLite opens and creates\nthe ",[207,1516,1517],{},"-shm"," file read-write even then): always ",[207,1520,1521],{},"immutable=1",", so no lock is\ntaken and no ",[207,1524,1525],{},"-wal",[207,1527,1517],{}," file is opened or created. The database file\nand its ",[207,1530,1525],{}," are checked (existence, size, mtime) before and after the\nread; a change discards the read and reads once more, and a second change\nmakes it ",[207,1533,998],{}," (\"the database changed during the read\"). Rows still\nonly in OpenCode's write-ahead log are not seen until OpenCode checkpoints\nthem into the database file, at the latest when it exits; the session\nthen reads as ",[207,1536,1537],{},"appended",[636,1539,110],{"id":1540},"opencode-2",[1018,1542,1543,1572,1583,1588,1606,1624],{},[607,1544,1545,1546,580,1548,1551,1552,580,1554,580,1557,580,1560,1563,1564,1567,1568,1571],{},"Store: tables ",[207,1547,954],{},[207,1549,1550],{},"session_message"," (one row per message, typed\n",[207,1553,1035],{},[207,1555,1556],{},"assistant",[207,1558,1559],{},"system",[207,1561,1562],{},"idle"," and others, ordered by ",[207,1565,1566],{},"seq",") and\n",[207,1569,1570],{},"session_part"," when present; opened, checked and retried as for V1.",[607,1573,1574,1575,1578,1579,1582],{},"Span: the message id of a prompt, ",[207,1576,1577],{},"\u003Cmessage id>\u002F\u003Cindex>"," of a tool call\nembedded in an assistant message, ",[207,1580,1581],{},"\u003Cmessage id>\u002F\u003Cordinal>"," of a part row.",[607,1584,1032,1585,1587],{},[207,1586,1035],{}," message with non-empty text.",[607,1589,1590,1591,1593,1594,1597,1598,1600,1601,1603,1604,1048],{},"Results: a tool is ",[207,1592,1474],{}," (ok, unless ",[207,1595,1596],{},"state.metadata.exit"," is a\nnon-zero integer: an error with that exit code) or ",[207,1599,597],{}," (an error; the\n2.2.6 samples show no abort or denial text to classify). An ",[207,1602,1562],{}," row with\noutcome ",[207,1605,1202],{},[607,1607,1608,1609,1612,1613,1616,1617,1620,1621,1623],{},"Layout: a virtual append-only log, one record per message then per part,\neach holding only fields final once complete; an assistant message without\n",[207,1610,1611],{},"time.completed",", or with a streaming or running tool, ends it.\nA file a tool returned is recorded without its inline ",[207,1614,1615],{},"data:"," content (its\ntype, name and MIME type stay). A session moved to another directory\n(",[207,1618,1619],{},"location-switched",") records both directories, and both are checked\nagainst the ",[207,1622,370],{}," rules.",[607,1625,1491,1626,1628],{},[207,1627,1494],{}," set).",[636,1630,102],{"id":1631},"cursor",[362,1633,1634,1635,580,1638,401,1641,1644,1645,1648,1649,1651],{},"Hook-indexed listing and capture are supported; semantic digests are not.\n",[207,1636,1637],{},"postToolUseFailure",[207,1639,1640],{},"stop",[207,1642,1643],{},"sessionEnd"," record the conversation id,\nabsolute transcript path beneath the home directory, workspace roots and\nreported cwd in the existing owner-only session counters cache (seven-day retention).\n",[207,1646,1647],{},"install cursor"," wires all three events; ",[207,1650,1643],{}," is fire-and-forget.\nNo transcript is opened by the hook.",[362,1653,1654,1655,1658,1659,1661],{},"Listing and push apply collection policy and repository upload vetoes to every\nrecorded workspace root and the reported cwd before opening the transcript.\nThe first root supplies the displayed project. Missing or invalid roots are\n",[207,1656,1657],{},"unknown-project","; symlinks (including ancestor components) and nonregular\nfiles are refused. A symlinked home or ancestor therefore prevents capture.\nOnly complete lines are captured, labelled ",[207,1660,534],{}," for\nboth IDE and CLI sessions. Transcript mtime supplies the capture timestamps;\ntool counts and model metadata are unavailable.\nAutomatic mixed-harness digests skip Cursor without opening its transcripts.\nAfter seven days without a hook update, cache pruning removes the transcript\npointer; the transcript remains untouched but is no longer discoverable until\nanother hook indexes it.",[362,1663,1664,1665,714,1671,1676,1677,580,1680,1683],{},"Verification is documentation-based, using the official\n",[373,1666,1670],{"href":1667,"rel":1668},"https:\u002F\u002Fcursor.com\u002Fdocs\u002Fhooks",[1669],"nofollow","hooks contract",[373,1672,1675],{"href":1673,"rel":1674},"https:\u002F\u002Fcursor.com\u002Fdocs\u002Fcli\u002Fchangelog",[1669],"CLI changelog",", checked 2026-11-10,\nplus synthetic IDE and CLI fixtures. No installed Cursor version was\nlive-verified. The CLI changelog's Claude Code-compatible JSONL claim does\nnot establish digest compatibility; both surfaces remain storage-only.\nThe IDE format lacks tool results, timestamps, call ids and cwd. The\nundocumented SQLite\u002Fprotobuf stores (",[207,1678,1679],{},"store.db",[207,1681,1682],{},"state.vscdb",") are not read.",[636,1685,126],{"id":1686},"antigravity",[362,1688,1689,1690,1693,1694,1697,1698,1701,1702,1705],{},"Not read. ",[207,1691,1692],{},"transcript.jsonl"," under ",[207,1695,1696],{},"\u003Capp data dir>\u002Fbrain\u002F\u003Cconversation id>\u002F.system_generated\u002Flogs\u002F"," records steps with a status but no working\ndirectory or call ids; its directory differs per product surface, it is\nrewritten on compaction, and versions before agy 1.2.4 omit failed steps.\n",[207,1699,1700],{},"conversations\u002F*.pb"," are encrypted and the ",[207,1703,1704],{},"*.db"," files undocumented.",[362,1707,1708],{},"Devin: no documented local session store; not read (best effort).",[437,1710,1712],{"id":1711},"commands","Commands",[727,1714,1715,1728],{},[730,1716,1717],{},[733,1718,1719,1722,1725],{},[736,1720,1721],{},"Command",[736,1723,1724],{},"Flags",[736,1726,1727],{},"What",[749,1729,1730,1778,1799,1831,1852,1865],{},[733,1731,1732,1736,1750],{},[754,1733,1734],{},[207,1735,630],{},[754,1737,1738,580,1741,580,1744,580,1747],{},[207,1739,1740],{},"--harness H",[207,1742,1743],{},"--since T",[207,1745,1746],{},"--unprocessed",[207,1748,1749],{},"--json",[754,1751,1752,1753,1755,1756,580,1759,580,1762,580,1765,1768,1769,1771,1772,401,1775],{},"every session with its state; ",[207,1754,545],{}," keeps sessions whose last entry is at or after T (RFC 3339 or ",[207,1757,1758],{},"30m",[207,1760,1761],{},"12h",[207,1763,1764],{},"7d",[207,1766,1767],{},"2w","); ",[207,1770,1746],{}," keeps ",[207,1773,1774],{},"new",[207,1776,1777],{},"changed",[733,1779,1780,1785,1792],{},[754,1781,1782],{},[207,1783,1784],{},"sessions digest \u003Charness:id>...",[754,1786,1787,580,1790],{},[207,1788,1789],{},"--allow-unknown-project",[207,1791,1749],{},[754,1793,1794,1795,1798],{},"the digest of the named sessions; a ",[207,1796,1797],{},"processed"," session named here is digested whole again",[733,1800,1801,1806,1817],{},[754,1802,1803],{},[207,1804,1805],{},"sessions digest --unprocessed",[754,1807,1808,580,1810,580,1813,580,1815],{},[207,1809,1740],{},[207,1811,1812],{},"--limit N",[207,1814,1789],{},[207,1816,1749],{},[754,1818,1819,1820,401,1822,1824,1825,1827,1828,1830],{},"the digest of the ",[207,1821,1774],{},[207,1823,1777],{}," sessions (and the ",[207,1826,1657],{}," ones with ",[207,1829,1789],{},"), oldest last entry first, at most N (0: no limit)",[733,1832,1833,1838,1849],{},[754,1834,1835],{},[207,1836,1837],{},"sessions mark \u003Charness:id>...",[754,1839,1840,580,1843,1846,1847],{},[207,1841,1842],{},"--outcome filed|nothing|skipped",[207,1844,1845],{},"--ref UID"," (repeatable), ",[207,1848,1749],{},[754,1850,1851],{},"records the outcome and the uids filed; all refs or none; a session not digested yet is refused, and so is a uid not in the submission uid form (an RFC 9562 UUID, 8-4-4-4-12 hex)",[733,1853,1854,1858,1862],{},[754,1855,1856],{},[207,1857,392],{},[754,1859,1860],{},[207,1861,1749],{},[754,1863,1864],{},"per harness: the store location and state, counts per session state; the saved selection",[733,1866,1867,1872,1882],{},[754,1868,1869],{},[207,1870,1871],{},"sessions status --set-selection",[754,1873,1874,1846,1876,580,1878,580,1880],{},[207,1875,1740],{},[207,1877,1743],{},[207,1879,1812],{},[207,1881,1749],{},[754,1883,1884,1885,1888],{},"saves the processor's selection (",[207,1886,1887],{},"since"," is kept as written), then prints the status",[362,1890,1891,1892,1894,1895,1898,1899,1902,1903,580,1906,1909,1910,1912,1913,414,1915,1917,1918,1920,1921,1923,1924,1927,1928,1930,1931,1934],{},"Without ",[207,1893,1749],{}," the output is a table (",[207,1896,1897],{},"list","), readable text with the\nnotice first (",[207,1900,1901],{},"digest",") or a summary (",[207,1904,1905],{},"status",[207,1907,1908],{},"mark","). ",[207,1911,630],{},"\nnames on stderr a store that is ",[207,1914,998],{},[207,1916,1240],{},", and\neach of its ",[207,1919,994],{},", always; an ",[207,1922,1002],{}," store only when ",[207,1925,1926],{},"--harness"," names\nits harness. ",[207,1929,1901],{}," exits 1\nwhen sessions were requested and none could be digested; its JSON then names\neach in ",[207,1932,1933],{},"errors",". A wrong command line exits 2.",[437,1936,1938],{"id":1937},"states","States",[362,1940,1941],{},"Precedence, first match wins:",[727,1943,1944,1954],{},[730,1945,1946],{},[733,1947,1948,1951],{},[736,1949,1950],{},"State",[736,1952,1953],{},"Meaning",[749,1955,1956,1988,2025,2038,2051,2062,2071,2080,2102],{},[733,1957,1958,1963],{},[754,1959,1960],{},[207,1961,1962],{},"disabled",[754,1964,1965,1968,1969,1972,1973,1975,1976,1978,1979,1981,1982,1984,1985,1987],{},[207,1966,1967],{},"[collect] disabled",", or a recorded working directory is switched off (also by its repository's ",[207,1970,1971],{},".agentfeedback.toml","). Readers with store metadata (Codex's first line, Copilot's ",[207,1974,846],{},", Gemini CLI's ",[207,1977,1433],{},", OpenCode's session row) apply the whole policy, the repository's ",[207,1980,1971],{}," included, to that directory before the session is opened; Claude Code opens the file unless the user's ",[207,1983,1967],{}," is set and finds a repository's ",[207,1986,1962],{}," after the read, from the recorded working directory",[733,1989,1990,1994],{},[754,1991,1992],{},[207,1993,1223],{},[754,1995,1996,1997,2000,2001,2003,2004,2007,2008,2010,2011,2013,2014,2017,2018,2021,2022,2024],{},"the working directory checked before the open (",[373,1998,36],{"href":1999},"#harnesses","), or a recorded one, lies within a ",[207,2002,1215],{}," entry, or outside every ",[207,2005,2006],{},"opt_in_paths"," entry with ",[207,2009,1219],{},"; each entry matches as written and with its symbolic links resolved, without case on macOS and Windows, and a filesystem root matches every directory; the file is not opened when the directory checked before the open matches. Claude Code's encoded name loses the path's separators, so its pre-open gate is exact for ",[207,2012,1215],{}," but may over-deny a sibling whose encoded name shares the prefix (",[207,2015,2016],{},"\u002Fa\u002Fb-c"," under a ",[207,2019,2020],{},"\u002Fa\u002Fb"," entry), and approximate for ",[207,2023,2006],{},": such a sibling is opened, then refused once its recorded working directory is read",[733,2026,2027,2031],{},[754,2028,2029],{},[207,2030,998],{},[754,2032,2033,2034,2037],{},"opening or reading the file failed (",[207,2035,2036],{},"reason"," says why)",[733,2039,2040,2044],{},[754,2041,2042],{},[207,2043,1240],{},[754,2045,2046,2047,2050],{},"no complete line parses as an entry of the reader's format, or the session is a compressed Codex rollout or a legacy Gemini CLI ",[207,2048,2049],{},".json"," session; as a store state, an OpenCode database without the expected tables and columns",[733,2052,2053,2057],{},[754,2054,2055],{},[207,2056,1657],{},[754,2058,2059,2060],{},"the log records no working directory, so no policy can be checked; digested only with ",[207,2061,1789],{},[733,2063,2064,2068],{},[754,2065,2066],{},[207,2067,1002],{},[754,2069,2070],{},"a watermark row whose file is gone",[733,2072,2073,2077],{},[754,2074,2075],{},[207,2076,1774],{},[754,2078,2079],{},"no watermark row, or one never marked",[733,2081,2082,2086],{},[754,2083,2084],{},[207,2085,1777],{},[754,2087,2088,2089,1121,2091,2093,2094,2097,2098,2101],{},"the file differs from the marked watermark: ",[207,2090,2036],{},[207,2092,1537],{}," (larger; digested from the marked size), ",[207,2095,2096],{},"truncated"," (smaller) or ",[207,2099,2100],{},"rotated"," (different first line); the last two are digested from the start",[733,2103,2104,2108],{},[754,2105,2106],{},[207,2107,1797],{},[754,2109,2110],{},"the file's complete-line size and first-line hash equal the marked watermark",[362,2112,2113,2114,414,2116,2118,2119,580,2122,580,2125,580,2128,1216,2131,2134,2135,401,2137,2139,2140,580,2143,580,2145,401,2147,2149,2150,382],{},"A recorded working directory that no longer exists gets the user rules only;\nthe repository file cannot be read and is skipped. A session refused after\nthe read (",[207,2115,1962],{},[207,2117,1223],{}," by a recorded working directory) is listed\nwith nothing read from the file: no ",[207,2120,2121],{},"project",[207,2123,2124],{},"cwds",[207,2126,2127],{},"start",[207,2129,2130],{},"end",[207,2132,2133],{},"counts",". ",[207,2136,1897],{},[207,2138,1905],{}," scrub ",[207,2141,2142],{},"path",[207,2144,2121],{},[207,2146,2124],{},[207,2148,994],{},"\nwith the formats of ",[207,2151,2152],{},"submit --scrub",[437,2154,2156],{"id":2155},"watermark","Watermark",[362,2158,2159,2160,2162,2163,2165,2166,2168,2169,2171,2172,2174,2175,414,2177,2179,2180,2182,2183,2185],{},"Only complete lines count: a final line without its newline is neither\nparsed nor counted, so a session still being written is digested up to its\nlast complete entry. ",[207,2161,1901],{}," records, per digested session, the\nsize it covered, the SHA-256 of the first line, the file's mtime and the\ntime; ",[207,2164,1908],{}," copies that digest watermark into the marked one. The size\ncovered is the complete-line size, or, when the digest is ",[207,2167,2096],{},", the\noffset that completes the first event it left out: under the cap, events\nare kept in the order their prompt or result line completes them, so the\nwatermark always lies past every kept event and the next digest reports the\nrest. A retry is kept with the failed call it repeats, so a pair split by\nthe cap may not be reported. The mtime is recorded but does not decide the\nstate. A crash after ",[207,2170,1901],{}," and before ",[207,2173,1908],{}," leaves the\nsession ",[207,2176,1774],{},[207,2178,1777],{},", and the next run digests it again from the last\nmark; a crash after ",[207,2181,1908],{}," loses nothing. ",[207,2184,1908],{}," records the watermark of the\nsession's latest digest, so run one triage at a time per machine: a second\nrun digesting the same session in between moves the watermark the first one\nmarks.",[362,2187,2188,2189,768,2191,2193,2194,580,2196,2198],{},"The store is taken as append-only. A file larger than the marked size with\nthe same first line is ",[207,2190,1777],{},[207,2192,1537],{},"), and the next digest starts at\nthe marked size; a rewrite that keeps the first line and is the same size or\nlarger is not detected (a larger one is read as an append). Truncation or a\nrewritten first line start it over (",[207,2195,2096],{},[207,2197,2100],{},").",[437,2200,2202],{"id":2201},"digest-format","Digest format",[362,2204,2205,2208],{},[207,2206,2207],{},"sessions digest --json"," prints one object; the MCP tool answers with the\nsame object.",[727,2210,2211,2220],{},[730,2212,2213],{},[733,2214,2215,2218],{},[736,2216,2217],{},"Member",[736,2219,1727],{},[749,2221,2222,2232,2242,2252,2265],{},[733,2223,2224,2229],{},[754,2225,2226],{},[207,2227,2228],{},"notice",[754,2230,2231],{},"the provider-boundary notice below",[733,2233,2234,2239],{},[754,2235,2236],{},[207,2237,2238],{},"detector_version",[754,2240,2241],{},"version of the digest rules; it enters the key of a submission filed from a digest",[733,2243,2244,2249],{},[754,2245,2246],{},[207,2247,2248],{},"sessions[]",[754,2250,2251],{},"one digest per session, below",[733,2253,2254,2259],{},[754,2255,2256],{},[207,2257,2258],{},"errors[]",[754,2260,2261,2264],{},[207,2262,2263],{},"{ref, state, message}"," per session refused or not found",[733,2266,2267,2272],{},[754,2268,2269],{},[207,2270,2271],{},"deferred[]",[754,2273,2274],{},"refs left out to keep the run under its cap; they keep their watermark and come next run",[362,2276,2277],{},"Each session:",[727,2279,2280,2288],{},[730,2281,2282],{},[733,2283,2284,2286],{},[736,2285,2217],{},[736,2287,1727],{},[749,2289,2290,2306,2315,2324,2335,2345,2358,2367,2399,2476,2489,2499,2527],{},[733,2291,2292,2303],{},[754,2293,2294,580,2297,580,2300],{},[207,2295,2296],{},"ref",[207,2298,2299],{},"harness",[207,2301,2302],{},"session_id",[754,2304,2305],{},"the session",[733,2307,2308,2312],{},[754,2309,2310],{},[207,2311,2121],{},[754,2313,2314],{},"the first recorded working directory",[733,2316,2317,2321],{},[754,2318,2319],{},[207,2320,782],{},[754,2322,2323],{},"the working directory of the last entry that records one",[733,2325,2326,2332],{},[754,2327,2328,580,2330],{},[207,2329,2127],{},[207,2331,2130],{},[754,2333,2334],{},"first and last entry time, UTC with milliseconds",[733,2336,2337,2342],{},[754,2338,2339],{},[207,2340,2341],{},"model",[754,2343,2344],{},"the model of the last entry that names one (an assistant entry; for Codex the turn context)",[733,2346,2347,2352],{},[754,2348,2349],{},[207,2350,2351],{},"from_offset",[754,2353,2354,2355,2357],{},"byte offset the digest starts at (0, or the marked size when ",[207,2356,1537],{},"); an incremental digest also reports a tool call made before it whose result line lies at or after it",[733,2359,2360,2364],{},[754,2361,2362],{},[207,2363,2096],{},[754,2365,2366],{},"events were left out to stay under the session cap",[733,2368,2369,2373],{},[754,2370,2371],{},[207,2372,2133],{},[754,2374,2375,580,2378,580,2381,580,2384,580,2387,580,2390,580,2393,2396,2397],{},[207,2376,2377],{},"entries",[207,2379,2380],{},"prompts",[207,2382,2383],{},"tool_calls",[207,2385,2386],{},"tool_errors",[207,2388,2389],{},"interrupts",[207,2391,2392],{},"denials",[207,2394,2395],{},"unparsed"," (complete lines that are not an entry), from ",[207,2398,2351],{},[733,2400,2401,2406],{},[754,2402,2403],{},[207,2404,2405],{},"events[]",[754,2407,2408,2409,580,2411,768,2413,1188,2416,580,2419,768,2422,414,2425,2428,2429,2432,2433,580,2436,2439,2440,768,2442,580,2444,580,2446,1188,2448,768,2451,580,2454,580,2457,580,2459,1188,2461,2464,2465,2467,2468,2471,2472,2475],{},"prompts and tool calls that did not succeed, in log order of the prompt or the call: ",[207,2410,210],{},[207,2412,2296],{},[207,2414,2415],{},"\u003Charness>:\u003Cid>#\u003Cspan>",[207,2417,2418],{},"at",[207,2420,2421],{},"type",[207,2423,2424],{},"prompt",[207,2426,2427],{},"tool_call","); a prompt has ",[207,2430,2431],{},"summary"," (its first non-empty line); a tool call has ",[207,2434,2435],{},"tool",[207,2437,2438],{},"args_digest"," (a digest of the command, or of the input when there is no command), ",[207,2441,1905],{},[207,2443,597],{},[207,2445,1223],{},[207,2447,1202],{},[207,2449,2450],{},"error_class",[207,2452,2453],{},"exit",[207,2455,2456],{},"tool_error",[207,2458,1223],{},[207,2460,1202],{},[207,2462,2463],{},"exit_code"," (the exit code the harness records, else an ",[207,2466,1072],{}," first line of the result), ",[207,2469,2470],{},"excerpt"," of the result, and ",[207,2473,2474],{},"self"," (true when the call is agentfeedback's own command, by the same rule the hook uses; such a failure is rarely friction about the project)",[733,2477,2478,2483],{},[754,2479,2480],{},[207,2481,2482],{},"retries[]",[754,2484,2485,2488],{},[207,2486,2487],{},"{span, of_span, tool, args_digest}",": a call repeating an earlier failed one with the same tool and arguments",[733,2490,2491,2496],{},[754,2492,2493],{},[207,2494,2495],{},"denials[]",[754,2497,2498],{},"spans of the denied tool calls",[733,2500,2501,2506],{},[754,2502,2503],{},[207,2504,2505],{},"flagged[]",[754,2507,2508,2511,2512,580,2515,580,2518,580,2521,580,2524],{},[207,2509,2510],{},"{span, phrase}",": prompts with a phrase such as ",[207,2513,2514],{},"still failing",[207,2516,2517],{},"doesn't work",[207,2519,2520],{},"wrong",[207,2522,2523],{},"why did you",[207,2525,2526],{},"again",[733,2528,2529,2534],{},[754,2530,2531],{},[207,2532,2533],{},"final_excerpt",[754,2535,2536],{},"the last assistant text",[362,2538,2539,2540,2542,2543,2545,2546,768,2548,2552],{},"Caps: a summary is at most 160 bytes, an excerpt 240; one session's digest is\nat most 64 KiB (the events completed first that fit are kept, listed in log\norder, ",[207,2541,2096],{}," set, and the watermark stops at the first one left out); one\nrun is at most 256 KiB (later sessions go to ",[207,2544,589],{},"). Every string is\nscrubbed with the formats of ",[207,2547,2152],{},[373,2549,2551],{"href":2550},"\u002Fdocs\u002Freference\u002Fsecurity#what-gets-stored","security.md",")\nbefore it is sized or cut.",[437,2554,2556],{"id":2555},"labelled-corpus-and-known-limits","Labelled corpus and known limits",[362,2558,2559],{},"The digest reports facts; the model that reads it judges which failures are\nfriction. What it shows for each kind of failure:",[727,2561,2562,2572],{},[730,2563,2564],{},[733,2565,2566,2569],{},[736,2567,2568],{},"Class",[736,2570,2571],{},"What the digest shows",[749,2573,2574,2589,2607,2619,2633,2646],{},[733,2575,2576,2579],{},[754,2577,2578],{},"genuine friction (a wrong doc, a missing flag, a stale config)",[754,2580,2581,2582,2584,2585,1121,2587],{},"a ",[207,2583,2427],{}," event, ",[207,2586,1905],{},[207,2588,597],{},[733,2590,2591,2604],{},[754,2592,2593,2594,580,2597,2600,2601,776],{},"expected failure (a probe meant to fail: ",[207,2595,2596],{},"test -f",[207,2598,2599],{},"grep"," without a match, ",[207,2602,2603],{},"git diff --exit-code",[754,2605,2606],{},"exactly the same as genuine friction: the digest cannot tell them apart",[733,2608,2609,2612],{},[754,2610,2611],{},"cancellation (the user interrupted)",[754,2613,2614,1121,2616,2618],{},[207,2615,1905],{},[207,2617,1202],{},", a status of its own",[733,2620,2621,2624],{},[754,2622,2623],{},"denial (the user rejected the call)",[754,2625,2626,1121,2628,2630,2631],{},[207,2627,1905],{},[207,2629,1223],{},", and the span in ",[207,2632,2495],{},[733,2634,2635,2638],{},[754,2636,2637],{},"repeat (the same failing call again)",[754,2639,2581,2640,2642,2643,2645],{},[207,2641,2482],{}," entry, only when the tool and the ",[207,2644,2438],{}," match exactly",[733,2647,2648,2651],{},[754,2649,2650],{},"self-noise (agentfeedback's own failing command)",[754,2652,2653,2655],{},[207,2654,2474],{}," true: marked, not dropped",[362,2657,2658,2660,2661,580,2664,580,2667,580,2670,580,2673,2676,2677,2679,2680,2683,2684,580,2686,580,2689,414,2692,2695,2696,580,2699,414,2702,2705],{},[207,2659,2474],{}," follows the hook's rule: the first word of a command segment (after\nvariable assignments and ",[207,2662,2663],{},"env",[207,2665,2666],{},"exec",[207,2668,2669],{},"sudo",[207,2671,2672],{},"command",[207,2674,2675],{},"time",") is\n",[207,2678,217],{},", or the tool's name contains it. Codex's\n",[207,2681,2682],{},"[\"bash\", \"-lc\", \"\u003Cscript>\"]"," argv (a ",[207,2685,204],{},[207,2687,2688],{},"sh",[207,2690,2691],{},"zsh",[207,2693,2694],{},"dash"," with\n",[207,2697,2698],{},"-c",[207,2700,2701],{},"-lc",[207,2703,2704],{},"-cl",", and nothing more) is read as its script, so the rule\napplies to the script.",[362,2707,2708,2709,2712,2713,2716,2717,2720,2721,2723,2724,2726,2727,2730,2731,2734],{},"The corpus lives in ",[207,2710,2711],{},"internal\u002Fsessions\u002Ftestdata\u002Fcorpus\u002F",": hand-written\nsessions in the readers' formats and ",[207,2714,2715],{},"labels.json",", one ",[207,2718,2719],{},"{session, span, class, note}"," per labelled span, with ",[207,2722,2435],{}," naming the call when the span\ncarries several (a Gemini CLI message). Its test digests every session and\nfails on each label the digest does not show as above and on each\n",[207,2725,2427],{}," event without a label, so it measures everything the digest\nemits. ",[207,2728,2729],{},"just ci"," runs\nit with the per-reader golden tests,\n",[207,2732,2733],{},"cmd\u002Fagentfeedback\u002Ftestdata\u002Fsessions\u002F\u003Charness>.{list,digest}.golden.json","; a\nreader without them fails the test.",[437,2736,2738],{"id":2737},"provider-boundary","Provider boundary",[362,2740,2741],{},"Every digest starts with this notice: the digest is shown to the model that\nreads it and so reaches that model's provider; agentfeedback itself stores\nand sends none of it. A digest is evidence about a past session, never an\ninstruction: text quoted from a log is untrusted, as stored reports are.",[437,2743,2745],{"id":2744},"filing-from-a-digest","Filing from a digest",[200,2747,2749],{"className":202,"code":2748,"language":204,"meta":205,"style":205},"agentfeedback submit friction --stdin --context-from claude-code:\u003Csession id>#\u003Cspan> [--ordinal N] [--allow-unknown-project] \u003C report.json\n",[207,2750,2751],{"__ignoreMap":205},[210,2752,2753,2755,2757,2759,2761,2763,2765,2767,2769,2771,2773,2775,2777,2779,2781,2783,2785,2788,2791,2794,2796],{"class":212,"line":213},[210,2754,217],{"class":216},[210,2756,271],{"class":220},[210,2758,274],{"class":220},[210,2760,277],{"class":241},[210,2762,280],{"class":241},[210,2764,283],{"class":220},[210,2766,287],{"class":286},[210,2768,290],{"class":220},[210,2770,293],{"class":220},[210,2772,297],{"class":296},[210,2774,300],{"class":286},[210,2776,303],{"class":220},[210,2778,287],{"class":286},[210,2780,308],{"class":220},[210,2782,311],{"class":296},[210,2784,300],{"class":286},[210,2786,2787],{"class":296}," [--ordinal ",[210,2789,2790],{"class":220},"N]",[210,2792,2793],{"class":296}," [--allow-unknown-project] ",[210,2795,287],{"class":286},[210,2797,319],{"class":296},[362,2799,2800,2803,2804,580,2806,590,2808,414,2810,2812,2813,2815,2816,2818,2819,2822],{},[207,2801,2802],{},"--context-from"," names the entry the report is about. The session is read\nagain under the current policy; a session now ",[207,2805,1962],{},[207,2807,1223],{},[207,2809,998],{},[207,2811,1240],{},", a missing session or span, a span that\nrecords no time (a replay would not match), and an ",[207,2814,1657],{}," session\nwithout ",[207,2817,1789],{}," are refused and nothing is filed. It works\nwith flags or with ",[207,2820,2821],{},"--stdin",". It sets, over anything stdin gives:",[1018,2824,2825,2842,2857,2871],{},[607,2826,2827,2830,2831,2834,2835,2837,2838,2841],{},[207,2828,2829],{},"key",": ",[207,2832,2833],{},"session-scan-"," and the SHA-256 hex of harness, session id, span,\nordinal and ",[207,2836,2238],{},", joined by NUL bytes; ",[207,2839,2840],{},"--ordinal"," (default 1)\nnumbers several findings at one span.",[607,2843,2844,2847,2848,2850,2851,2853,2854,2856],{},[207,2845,2846],{},"occurred_at",": the entry's time; ",[207,2849,2299],{},": the session's harness;\n",[207,2852,2341],{},": the model of the last assistant entry at or before the span, and\nno ",[207,2855,2341],{}," at all when there is none (never the configured or collected\none).",[607,2858,2859,2861,2862,2864,2865,2867,2868,2870],{},[207,2860,2121],{}," and the collected context: collected in the session's working\ndirectory with an empty environment, when that directory still exists and\nthe ",[207,2863,370],{}," rules still allow it; when it is gone, ",[207,2866,2121],{}," is its base\nname and nothing is collected. The working directory and environment of the\nprocess that runs ",[207,2869,400],{}," are never read.",[607,2872,2873,1121,2876,580,2879,768,2882,2830,2885,580,2888,590,2891,580,2894,580,2897,580,2900,2903,2904,401,2907,2910,2911,2914],{},[207,2874,2875],{},"context.origin",[207,2877,2878],{},"session-scan",[207,2880,2881],{},"context.detector",[207,2883,2884],{},"\u003Creader>\u002F1",[207,2886,2887],{},"claude-code-jsonl\u002F1",[207,2889,2890],{},"codex-rollout\u002F1",[207,2892,2893],{},"copilot-events\u002F1",[207,2895,2896],{},"gemini-cli-jsonl\u002F1",[207,2898,2899],{},"opencode-sqlite\u002F1",[207,2901,2902],{},"opencode-v2-sqlite\u002F1","),\n",[207,2905,2906],{},"context.session_id",[207,2908,2909],{},"context.session_harness",", over the collected and\nstdin context; ",[207,2912,2913],{},"--context key=value"," still goes over all of them.",[362,2916,2917,580,2920,580,2923,401,2925,2928,2929,2931,2932,2935,2936,2938,2939,2941,2942,2945,2946,2949,2950,2953,2954,382],{},[207,2918,2919],{},"--key",[207,2921,2922],{},"--project",[207,2924,1926],{},[207,2926,2927],{},"--model"," together with\n",[207,2930,2802],{}," are a usage error. ",[207,2933,2934],{},"machine"," resolves as for every\nsubmission. Origin ",[207,2937,2878],{}," turns scrubbing on, and a body filed with\n",[207,2940,2802],{}," is always scrubbed, even when ",[207,2943,2944],{},"--context origin=...","\nreplaces the origin. Filing the same report\nagain replays: outcome ",[207,2947,2948],{},"duplicate",", exit 0. Different content under the same\nkey is outcome ",[207,2951,2952],{},"mismatch"," (the server's 409), exit 1: file a second finding\nat that span with the next ",[207,2955,2840],{},[362,2957,2958,2959,2962,2963,2966,2967,2970,2971,2974,2975,2978,2979,2981,2982,2985,2986,2989,2990,2992,2993,2995,2996,2998,2999,3001,3002,3005],{},"Over MCP, ",[207,2960,2961],{},"submit_feedback"," of ",[207,2964,2965],{},"agentfeedback mcp"," takes ",[207,2968,2969],{},"context_from","\n(",[207,2972,2973],{},"\u003Charness>:\u003Csession id>#\u003Cspan>",") and ",[207,2976,2977],{},"ordinal"," (default 1): the other\narguments are what ",[207,2980,2821],{}," would read, ",[207,2983,2984],{},"kind"," is required, and the body\nis the one ",[207,2987,2988],{},"submit \u003Ckind> --stdin --context-from \u003Cref> --ordinal \u003Cn>"," builds,\nso the same report filed both ways is one row (the second filing is a\nduplicate). An ",[207,2991,1657],{}," session is refused: admitting it is a\nhuman's decision, ",[207,2994,1789],{}," on the CLI. A refused call is a\nvalidation error on ",[207,2997,2969],{}," with the CLI's message. In remote mode\nthe body is built on this machine and forwarded to the server's\n",[207,3000,2961],{},"; the HTTP ",[207,3003,3004],{},"\u002Fmcp"," never takes these arguments.",[437,3007,3009],{"id":3008},"mcp-tools","MCP tools",[362,3011,3012,3014,3015,3017],{},[207,3013,2965],{}," (stdio) serves three more tools over the same database\nand policy, in local and in remote mode (the session state stays in the\ndata-directory database either way); the HTTP ",[207,3016,3004],{}," never serves them.",[727,3019,3020,3033],{},[730,3021,3022],{},[733,3023,3024,3027,3030],{},[736,3025,3026],{},"Tool",[736,3028,3029],{},"Arguments",[736,3031,3032],{},"CLI",[749,3034,3035,3055,3087],{},[733,3036,3037,3042,3051],{},[754,3038,3039],{},[207,3040,3041],{},"sessions_list",[754,3043,3044,580,3046,580,3048],{},[207,3045,2299],{},[207,3047,1887],{},[207,3049,3050],{},"unprocessed",[754,3052,3053],{},[207,3054,630],{},[733,3056,3057,3062,3078],{},[754,3058,3059],{},[207,3060,3061],{},"sessions_digest",[754,3063,3064,414,3067,3069,3070,580,3072,3075,3076,776],{},[207,3065,3066],{},"refs[]",[207,3068,3050],{},"; ",[207,3071,2299],{},[207,3073,3074],{},"limit"," (with ",[207,3077,3050],{},[754,3079,3080,3083,3084,3086],{},[207,3081,3082],{},"sessions digest"," (records the watermark, so not read-only); ",[207,3085,1789],{}," is a human's decision and has no argument",[733,3088,3089,3094,3104],{},[754,3090,3091],{},[207,3092,3093],{},"sessions_mark",[754,3095,3096,580,3098,580,3101],{},[207,3097,3066],{},[207,3099,3100],{},"outcome",[207,3102,3103],{},"uids[]",[754,3105,3106],{},[207,3107,3108],{},"sessions mark",[362,3110,3111],{},"Unknown, repeated or mistyped arguments are refused with a validation error,\nas for the other tools. Their results reach the provider of the model that\ncalls them.",[3113,3114,3115],"style",{},"html pre.shiki code .snPdu, html code.shiki .snPdu{--shiki-light:#6F42C1;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sIIMD, html code.shiki .sIIMD{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sBjJW, html code.shiki .sBjJW{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s8jYJ, html code.shiki .s8jYJ{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sxrX7, html code.shiki .sxrX7{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}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 .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":205,"searchDepth":231,"depth":231,"links":3117},[3118,3121,3131,3132,3133,3134,3135,3136,3137,3138],{"id":439,"depth":231,"text":376,"children":3119},[3120],{"id":638,"depth":248,"text":639},{"id":725,"depth":231,"text":36,"children":3122},[3123,3124,3125,3126,3127,3128,3129,3130],{"id":758,"depth":248,"text":43},{"id":790,"depth":248,"text":1086},{"id":1264,"depth":248,"text":122},{"id":860,"depth":248,"text":68},{"id":1459,"depth":248,"text":1460},{"id":1540,"depth":248,"text":110},{"id":1631,"depth":248,"text":102},{"id":1686,"depth":248,"text":126},{"id":1711,"depth":231,"text":1712},{"id":1937,"depth":231,"text":1938},{"id":2155,"depth":231,"text":2156},{"id":2201,"depth":231,"text":2202},{"id":2555,"depth":231,"text":2556},{"id":2737,"depth":231,"text":2738},{"id":2744,"depth":231,"text":2745},{"id":3008,"depth":231,"text":3009},"`agentfeedback sessions` reads the session logs a coding-agent harness keeps on disk, on demand and read-only, so an agent can turn what went wrong in a past…","md",{},{"title":175,"icon":178},{"title":175,"description":3139},null,"H-vvTFwfTAcbMowfyQSh8z4jF6CF6SFwQZYQ9F1N1jQ",[3147,3149],{"title":150,"path":172,"stem":173,"description":3148,"icon":153,"children":-1},"By default AgentFeedback is one binary and one database owned by one OS user on one machine, with nothing listening (The client on a machine).",{"title":180,"path":181,"stem":182,"description":3150,"icon":183,"children":-1},"Source releases are annotated, immutable `vMAJOR.MINOR.PATCH` tags, with `-rc.N` pre-releases before a stable one (Tags): patch for compatible fixes, docs and…",1794388868361]