Repository navigation
Netwise - Arsh update #5 #175
Description
Netwise — Arsh update #5
Follows #153. Sprint 4 closed yesterday. Nothing is outstanding on my side, and this time the queue is the whole update — fourteen pull requests are open, every one of them is green against current main, and thirteen of them merge together. What they are waiting on is reviews, and I cannot give them to my own.
main 735a4b9 391 tests · ruff clean
open 14 PRs (12 mine), 14 issues
merged this morning #167 (Samika), #169 (Ankeet)
The queue, measured against M-1's own test
An approval later than the last commit. Nothing recalled, nothing inferred:
CURRENT #130 #148 #149 #150 #151 #154 #162 #173
STALE #146 #160
NO REVIEW #165 #166 #168 #174
What I need, from whom, in one line each
| PR | Who | What |
|---|---|---|
| #160 | @patelankeet2 or @shubhamkataria2005 | One re-approval. This is the blocker for eight others. |
| #146 | @SamikaPerera | Your CHANGES_REQUESTED — both items now fixed |
| #174 | @SamikaPerera | Your CHANGES_REQUESTED — coverage gap now closed |
| #165 #166 #168 | anyone | First look, all small |
#160 first if you only do one. It ratifies M-1 in the record, and the eight CURRENT PRs above are held behind it by my own undertaking, not by anything technical.
Its approval went stale because I pushed a correction after it — which is M-1 applying to the PR that ratifies M-1, and is the right outcome rather than an annoyance.
I ran the whole queue against current main rather than trusting old ticks
This is the check whose absence turned main red twice. Every green tick on these was earned against a main that no longer exists.
Each branch, merged onto 735a4b9 individually:
#130 391 #146 400 #148 391 #149 409 #150 391 #151 391 #154 391
#160 391 #162 397 #165 391 #166 391 #168 391 #173 416 #174 394
All thirteen non-conflicting ones merged together:
449 passed · ruff All checks passed
One real conflict, found before anyone hit it at the button: #174 collides with #162 in tests/test_preflight.py — both append to it. Order is #162, then #174 rebases. Clean against the other twelve.
The two that merged this morning, and why
#169 — @patelankeet2. Verified two ways rather than by reading the diff.
Coverage, because a narrow regex that matches nothing is a safeguard that never fires — swept every fixture, not the handy one:
rtr-us5-insecure PC-001 PC-002 PC-003 FORBIDS covered
rtr-us5-messy PC-004 PC-005 REQUIRES covered
5/5
That number is what decided it. When I looked at #145 I measured that three of the five policy findings use the FORBIDS wording my own earlier fix did not touch — PC-001 was simply the first case @SamikaPerera happened to observe while rating for #90, not the only one. Ankeet's pattern covers both shapes. The half I left open is closed.
Mutation, inverting the branch that decides which side gets which verb: 4 failed, 387 passed. Restored: 391 passed.
#167 — @SamikaPerera. Two current approvals, docs only, and it carries the PC-001 inversion record that started #145.
Both were merged together off main first and tested as a combination before either went in.
#146 — three people asked, and I did not read the threads
@shubhamkataria2005 raised the duplicate-id gap on 16 August. @patelankeet2 repeated it on 17. @SamikaPerera made it a CHANGES_REQUESTED on 19. Fixed in 82051f8, using his exact demonstration:
['AC-001', 'PC-000', 'RT-001', 'PC-000', 'AC-002', 'RK-001']
duplicates: True
the seven tests that existed -> 7 passed, 1 deselected
with the new test -> 1 failed, 7 passed
whole suite -> 1 failed, 378 passed
Two PC-000, and nothing in 379 tests noticed — sitting inside the pull request whose stated justification is that this file has already drifted once without anyone noticing.
It asserts against pipeline.duplicate_id_findings(), the guard the product actually runs, rather than a re-implementation. Shubham's suggestion and the better half of it: #84 is why that distinction is not pedantic.
Also corrected: @SamikaPerera's v0.1.0 claim, flagged three times, re-derived from the tags rather than copied from his comment.
Why it took three asks: I did not read the review threads on my own open PRs for two days. Same failure that had me reporting "2 of 4" on #160 while the branch in front of me said four. Reading my own PRs is now first in my working order rather than last.
#174 — @SamikaPerera found a coverage gap and he was right
Quoting him: "Removing that fix entirely still passes all 386 tests here, because Docker is down on this machine."
Reproduced by stopping the container:
batfish up fix removed -> 1 failed caught
batfish down fix removed -> 12 passed NO coverage
CI has no Docker and no Batfish — so on CI, the one place it most needed to hold, the test was a no-op that read as coverage. I missed it because Batfish was running every time I ran the mutation, having written "run the mutation under more than one environment" into my own working standard the day before.
Fixed with a test that reaches the mechanism directly and needs no Batfish at all. Now:
batfish up fix removed -> 2 failed
batfish down fix removed -> 1 failed, 1 skipped
His cost objection is addressed too: skipping before running the subprocesses rather than after cut the batfish-down case by about 17 seconds, which is CI's case and was the expensive one returning nothing.
#93 — measured, and its own precondition is wrong
It says "between sprints, not during one". Sprint 4 ended yesterday, so by that test today qualifies. The queue disagrees:
ruff format would rewrite 31 files
files also touched by an open PR 3 (#146 #162 #174)
An empty queue is the real precondition, not the calendar. Full measurement, including the rule-set sizes (E,W,F = 98 findings, E,W,F,I,B,UP,SIM = 325) and a proposal to split it in two, is on #93.
I also posted a correction there: my first run reported zero collisions, which was a bug in my measuring script — lstrip("ab/") strips characters, so a/ai/explain.py became i/explain.py and no filename matched. "Zero collisions, safe to proceed" came within one paste of being posted as fact.
What is not mine and is waiting
- Decision request: the five policy-format questions — five letters, one sitting (#87) #159 — @SamikaPerera @patelankeet2 @shubhamkataria2005, the five policy-format letters. Policy loader: the refusals first, to the five answers on #159 (#87) #173 implements the refusal paths and is approved and current; the format itself still needs the sitting.
- The converter's limits are restated in three documents instead of read from one place #155 — @patelankeet2, the converter's limits restated in three documents. Correct the PF Sense limits — stale in two of three places, and it reached a status update #154 corrects two of them, which treats the symptom; The converter's limits are restated in three documents instead of read from one place #155 is the cure.
- Explanations are regenerated on every /api/findings call #92 — unassigned. Explanations regenerate on every
/api/findingscall.
Everything on my side is committed, pushed, integration-tested and boarded. The only thing standing between fourteen green pull requests and main is a review, and #160 is the one that unlocks the rest.
Activity
ARSH871-bot commentedon Aug 20, 2026
Update since posting — one more PR, and two issues measured. Keeping this thread accurate rather than letting it go stale the way everything else in this project does when a fact lives in two places.
#176 — @SamikaPerera's #172 fixed the file, not the property
Found by trying to run
tools/stranger_config.pywhile re-measuring the #87 gap for the report. It died before measuring anything:Same bug #172 fixed in
preflight.py, still live in a second file for as long as it had been fixed in the first:tests/test_tools_invocation.pynow enumeratestools/*.pyrather than naming a script, so the next tool added is covered on the day it lands. Mutation caught in both Batfish states. 397 passed, 2 skipped.Worth saying plainly: the tool that measures the largest gap in the product could not be run one of its two documented ways, and nobody noticed.
#92 measured — and the bigger cost is not the one the issue names
But
/api/findingsalso re-runs the whole Batfish pipeline, 3.61s median, every hit — and that costs the same whether or not Ollama is installed, which on CI and on every demo machine makes it the entire observable cost.loadFindings()runs at script load (app.js:559), so every page load pays it, not just an explicit rescan.The issue's cache-key warning is now demonstrated rather than asserted:
AC-001andAC-002are used by bothrtr-us5-insecureandrtr-us5-messy, so an id-keyed cache would show one network's explanation on the other's finding.I also threw away a number I had already written up — "the fallback costs 2s per card" turned out to be this machine refusing any closed loopback port in 2.036s, including ports nothing has ever listened on. Details on #92.
@patelankeet2 @SamikaPerera it sits across both your layers; I measured it rather than took it.
#93 measured
31 files reformatted, colliding with 3 open PRs. An empty queue is its real precondition, not the calendar. Full numbers on #93, including a correction to my own first run.
Queue, unchanged where it matters
#160 is still the one that releases eight of them. #146's two outstanding items are both fixed now and it needs @SamikaPerera's re-look.
ARSH871-bot commentedon Aug 28, 2026
Two days to the client demo, and the queue has turned over completely since
this thread was written. Short update, one ask.
That merge means the demo now shows things it could not on the 20th: a user's
own policy actually changing the findings (#181), a report you can download
(#233), and propose-a-change on screen (#253). Ollama is also installed and
working on the demo machine — findings render real model-written
explanations rather than deterministic fallback text.
The one ask: #260, before Thursday
@SamikaPerera @patelankeet2 @shubhamkataria2005 — one of you, not all three.
It is the only open PR that changes something the client will read during the
demo. Rehearsing beat 6 in a real browser yesterday:
The message denies the policy is applied. The next click applies it. #181
landed that morning; the sentence did not move.
Two tests were holding the false sentence in place — and the frontend one
asserted a string that lived in its own fixture, so it compared the harness to
itself. That is the part worth a second pair of eyes, more than the message.
I have deliberately NOT asked for review on my other two (#259 docs, #248
.gitignore). They can wait until after Thursday. If you have time for onething from me this week, make it #260.
What I have done rather than asked for
Per #249, where I measured that I author 61% of PRs and give 24% of reviews:
independently — coverage matches exactly at every size, and I confirmed the
numbers survive Wire the policy loader to a check, so #87's gap actually moves #181, which changed the very line that computes
covered.Three mutations, three caught.
and survived three mutations. The problem is an integration one neither PR
could see alone: he added a 5th parameter to
renderFinding(), andrenderImpact()from the merged Dashboard UI for propose-a-change (#232): the full response, with pushback that cannot be missed #253 still calls it with four, so thepropose pane renders
id="undefined"twice and two links to#undefined.identical results on three fixtures, but the pin's contract is that client
and container versions MATCH, and the container is still on 2025.07.07.
Pull the image first, then bump.
Two things needing a decision, not a review
Findings that can leave the screen: HTML and CSV export #233 and Dashboard UI for propose-a-change (#232): the full response, with pushback that cannot be missed #253 landed under it. All three conflicts are additive, not
semantic; details are on the PR. It was clean against the
mainit wasapproved on, so nothing went wrong on your side.
netwise-wardendoes not exist.I proposed defer until after Thursday, with the reason on the issue:
the demo machine autostarts Ollama and the model persists on disk, so it
cannot reach the broken state. Object by Wednesday midday or that is the
decision.
One more thing, which I am not fixing today
CONTRIBUTING.md(§6, §744) and.github/CODEOWNERSboth still say the repois private and that branch protection needs GitHub Pro. Measured:
#246 corrected that claim in
CLAUDE.mdand #251 in M-2. Two files weremissed — one fact in four places, two updated. It feeds directly into #245,
which is still an open decision, so I would rather it be settled there than
patched quietly by me now.
ARSH871-bot commentedon Aug 31, 2026
Since this morning: six more merged, three reviews given, my queue is empty.
Merged
#202#259#248#260#261— plus#254and#257from your side.Twelve since the 28th, taking
mainfrom 702 to 987 tests. I have zero openPRs, which is the first time that has been true this month.
Thank you all three for turning #260 around — it was the only thing that
changed what the client reads on Thursday, and it went from unreviewed to
merged in a few hours once I asked for one of you by name rather than all
three. That is worth remembering as the pattern that works.
Reviews given
an interface being NAT-generated, leaving an ACL that fails open against
PF Sense's fail-closed default — you had already handled with a named
refusal. Three mutations, three caught. Then end to end: the NAT rule's
translated addresses appear nowhere in the output, and what survives parses
cleanly in real Batfish.
and empty evidence — checked all four before approving, because remediation
is prescriptive in a way
explain()is not. One non-blocking note:remediate_with_source()has no status guard of its own, so the safety sitsentirely at one caller. And your conflict resolution has an ordering decision
in it — remediation ends up outside business-context escalation.
the conflict is your own Business-context risk scoring: escalate severity by asset criticality (#237) #254 moving under you, and a sixth harness now
exists that Report export UI: the download control for #222 #262 does not know about. Eleven lines fixes it —
988 passed / 25 errorsbecomes1013 passed / 0 errors. Do not resolvethe conflict by concatenating both sides; I tried, and it left one unclosed
because they share a trailing brace pair.
Two decisions still open, both with deadlines
found" while its own card says nothing was checked. Proposed option 1, fix
after Thursday. Deadline Wednesday midday.
same deadline.
Neither has had a reply. If nobody objects they are decided as proposed.
One correction to something I said this morning
I told you #254 was conflicting. @SamikaPerera rebased it and it merged at
09:40 — while I was mid-batch, which moved
mainunder a combination I hadalready tested. I re-tested #260 and #261 on the new
mainbefore merging,because #254 touches
web/main.pyand so does #260. Worth flagging as thething to watch: a batch tested at one commit is not tested at the next.
Filed
#266,#267(a generated document that went stale within hours of landing,and why the CI check we proposed for it would be permanently red),
#258.All unassigned, none urgent before Thursday.
ARSH871-bot commentedon Aug 31, 2026
Sprint 5 cannot close this week. Proposing we close it at what it achieved
and move the remainder, rather than let it drift a third week.
Object by Wednesday midday; silence is agreement. Same pattern as #234 and
#266.
Measured, not felt
Nine issues remain in Sprint 5. Every one has been idle 4-7 days, and the
only movement this week came from work that was not in the sprint:
Five of nine are unassigned. An unassigned issue in an overdue sprint is
not late work; it is work nobody started.
What can realistically close
Closes #195, so itcloses on merge. That is one.
blocked it. Possible, not certain.
That is 34/43 → 36/43 at best. Seven would still be open on a sprint that
ended five days ago.
The proposal
closes at 84% honestly is worth more than one held open until it reads
100%, and Sprints 3 and 4 both closed at 100% because they were scoped to
what fitted.
goes from 11 open to 17, which is a real cost and the reason for point 3.
through two sprints without being started, because it is not a sprint-sized
item — it is "two of three checks ignore a user policy", and finishing it
means rewiring
access_controlandrouting. Putting it in a third sprintit cannot finish is exactly how it has drifted this far. It belongs in
Phase 1, alongside the capabilities it actually blocks.
And the part of this that is mine
Sprint 5 was mine to run. Two things I would do differently:
docs/work-distribution.mdsays an issue without an assignee "is a note, not an assignment", and I wrote that sentence.docs/sprint1/throughsprint4/each have one, written inside the sprint. Sprint 3's entry boasts that it was written the day after rather than reconstructed later, and that practice has now lapsed twice. If we close Sprint 5 this week I will write its record before closing it, not after.@patelankeet2 @shubhamkataria2005 @SamikaPerera — object to any of the three
points and it changes. Silence by Wednesday midday and I will re-milestone
accordingly.
ARSH871-bot commentedon Aug 31, 2026
Superseded by #274 — Netwise Arsh update #6, posted just now.
Eleven days of work since this thread, and the queue has turned over completely: 62 PRs merged, the AI's second direction (#13/#14) landed, a user's own policy now reaches a check (#181), and the client's own vendor produces a real finding for the first time (#216).
Leaving this open rather than closing it — the decisions still running have their deadlines here, and moving them would break the links people already have.
ARSH871-bot commentedon Aug 31, 2026
Wednesday-midday deadline has passed with no objections visible. Executed the Sprint 5 proposal recorded here and in #273: moved #80, #92, #93, #185, #191, and #227 to Sprint 6; removed #87 from sprint planning; closed the Sprint 5 milestone. #78 remains as the one open issue still attached to the now-closed milestone, matching the proposal rather than silently moving the blocked client item.