<feed xmlns='http://www.w3.org/2005/Atom'>
<title>newos4/scripts/newos4-feedback-autoreview.py, branch main</title>
<subtitle>newOS4 - the browser terminal that runs WebX11 user spaces</subtitle>
<id>https://newos.webx11.duckdns.org/newos4/atom?h=main</id>
<link rel='self' href='https://newos.webx11.duckdns.org/newos4/atom?h=main'/>
<link rel='alternate' type='text/html' href='https://newos.webx11.duckdns.org/newos4/'/>
<updated>2026-11-02T19:05:14+00:00</updated>
<entry>
<title>feat(newos4): R5 stale-artefact rule + dashboard queues a decision once</title>
<updated>2026-11-02T19:05:14+00:00</updated>
<author>
<name>Agando</name>
<email>roduccomm@gmail.com</email>
</author>
<published>2026-11-02T19:05:14+00:00</published>
<link rel='alternate' type='text/html' href='https://newos.webx11.duckdns.org/newos4/commit/?id=cec2baad28213a296ae491330a3f7f8953a3fea1'/>
<id>urn:sha1:cec2baad28213a296ae491330a3f7f8953a3fea1</id>
<content type='text'>
Feedback queue triage 2026-11-02: 23 reports, 22 decided, 1 open -- and the open
one (RPT-20261029-115241, "[Terminal] Error in ShellModule.test: {\"silent\":true}")
was already fixed in v4.6.135 (4472c81, modules/core/terminal.js:1966) yet could
never be cleared by automation.

Root cause: identifiers() keeps only generic class names (Terminal, ShellModule),
both of which necessarily stay in the code, so R2 (every identifier absent) cannot
fire; R4 needs a stack and this report has none. A stack-less
"Class.method: {json}" console.error whose emitter gets *guarded* -- rather than
deleted -- therefore sits "awaiting decision" forever.

- newos4-feedback-autoreview.py: new R5 stale artefact -- auto report, no stack,
  every error count &lt;= 1, and nothing newer than STALE_DAYS=5 in
  data/debug/errors.json -&gt; resolve with the measured quiet_days as evidence.
  New --errors &lt;path&gt; knob so the rule can be run against fixtures.
  RED (pristine copy): "nothing provable (1 left for the operator)"
  GREEN (aged fixture): "resolve ... quiet 5.3d -- reopen if it recurs"
  NEG (live store 4.3d, and a report with count 21): both still refuse.
- admin/feedback.html: markDecided() patches the local snapshot, so a queued
  decision leaves the default "Awaiting only" list immediately instead of after
  the 10-minute sync rebuild. Measured cause of 3x approve on one plan in 3 min
  (10-30 16:03/16:05/16:05) and 6 items with duplicate rows.
- AGENTS.md: documents R5 and the fixture knob (also carries the already-live
  2026-11-02 cookie-notice paragraph that was pending in the tree).
</content>
</entry>
<entry>
<title>feat(feedback): autonomous first-pass reviewer — decide what is provable, leave the rest</title>
<updated>2026-10-26T13:50:54+00:00</updated>
<author>
<name>Agando</name>
<email>roduccomm@gmail.com</email>
</author>
<published>2026-10-26T13:50:54+00:00</published>
<link rel='alternate' type='text/html' href='https://newos.webx11.duckdns.org/newos4/commit/?id=b79d70926ae88a3b10a13e2e029bbb7f487b8cf4'/>
<id>urn:sha1:b79d70926ae88a3b10a13e2e029bbb7f487b8cf4</id>
<content type='text'>
The operator asked: "when I don't do anything, an agent can do it for me and I can just follow up
or steer it." This is that agent, deterministic (no LLM): same input, same decision, and every
reason is a grep or a commit hash that can be checked.

spaces/newos4/scripts/newos4-feedback-autoreview.py — rules, first match wins:
  R1 duplicate      same fingerprint already decided                     -&gt; resolve
  R2 already-fixed  identifiers absent from modules/**/*.js AND
                    `git log -S&lt;token&gt;` proves a commit removed them     -&gt; resolve
  R3 noise          fetch/abort/probe patterns                          -&gt; reject
  R4 still-present  auto report + stack + identifiers still in code     -&gt; approve (max 2/day)
  R5 plan / R6 user report                                             -&gt; never decided

Writes to the same append-only decisions.jsonl with actor=auto-reviewer, note + evidence; the
applier's last-wins rule means any operator click overrides an agent decision. Kill switch:
data/feedback/autonomy.json {"mode":"off"} (safe default, aggressive = cap 5).

Cron job e31ac58a559e, 07:40 and 19:40, no_agent, silent unless it decided something.

Fixture proof (6 cases, /tmp corpus, git repo with a real removal commit):
  RPT-A duplicate        -&gt; resolve (duplicate of already-decided RPT-B)
  RPT-C already-fixed    -&gt; resolve (goneFromCode removed from modules/ in fc4eaf3)
  RPT-D noise            -&gt; reject
  RPT-E still-present    -&gt; approve
  RPT-F user report      -&gt; SKIP
  RPT-G never existed    -&gt; SKIP   &lt;- caught the first draft, which called it "already fixed"
Live dry-run on the real corpus: "nothing provable (0 left for the operator, mode=safe)" and
`git log -S emptyTrash -- spaces/newos4/modules` resolves to 563a9be, i.e. the report I wrongly
approved by hand tonight would have been auto-resolved correctly.

Dashboard: agent-decided cards carry a 🤖 badge + the reason + "Any button below overrides it",
and the tab shows "🤖 feedback agent: N decided on its own in its last run (safe mode, M left for
you)".
</content>
</entry>
</feed>
