Problem
When reviewing Gerrit change 955915 (VNC proxy ssl.wrap_socket → SSLContext migration), the agent consistently flags load_cert_chain(keyfile=None, certfile=None) as a blocker bug — even after multiple rounds of instruction improvements.
The false positive persists because the agent fails to trace the full activation path:
RFBAuthSchemeVeNCrypt is only instantiated when CONF.vnc.auth_schemes includes "vencrypt" (see auths.py:28-49)
- When vencrypt is enabled, the config docs require client certs to be configured
- Therefore
None only reaches load_cert_chain through operator misconfiguration, not a valid code path
The agent checks callers and config options but does not connect the two: it sees vencrypt_client_key has no default (so None is "valid") without realizing that the class is gated by a feature toggle that requires those certs when active.
How to reproduce
- Start a Nova Review session
- Run
/code-review 955915
- The agent will flag
load_cert_chain(keyfile=None, certfile=None) as a blocker
Sessions tested
What we tried (PR #16)
- Elevated "prefer loud failure over silent security degradation" to a top-level rule in
rules.md
- Added context inheritance to agent personas so subagents see workflow rules and knowledge files
- Made nova-core invocation mandatory for every review
- Added the loud-failure principle to both nova-core and nova-coresec agents
- Added "verify reachability before flagging bugs" rule with 3 mandatory steps
- Strengthened the rule to require connecting activation path to config dependencies
Each iteration got closer but the agent still fails to complete the full chain: feature toggle → class instantiation → config prerequisites → None is misconfiguration, not a bug.
Root cause hypothesis
The activation path for VeNCrypt is indirect enough (config option → factory class → class map → method call) that the agent either doesn't follow far enough or doesn't connect the config dependency back. The instructions tell it what to do but the reasoning chain is too long for the agent to reliably execute in practice.
Possible next steps
- Add a worked example in rules.md showing the full reasoning chain for a config-gated feature
- Investigate whether a dedicated "reachability analysis" subagent with focused tooling would be more reliable
- Consider structured output for reachability checks (force the agent to fill in: feature toggle, activation path, config prerequisites, conclusion)
Related to #14
Problem
When reviewing Gerrit change 955915 (VNC proxy ssl.wrap_socket → SSLContext migration), the agent consistently flags
load_cert_chain(keyfile=None, certfile=None)as a blocker bug — even after multiple rounds of instruction improvements.The false positive persists because the agent fails to trace the full activation path:
RFBAuthSchemeVeNCryptis only instantiated whenCONF.vnc.auth_schemesincludes"vencrypt"(seeauths.py:28-49)Noneonly reachesload_cert_chainthrough operator misconfiguration, not a valid code pathThe agent checks callers and config options but does not connect the two: it sees
vencrypt_client_keyhas no default (soNoneis "valid") without realizing that the class is gated by a feature toggle that requires those certs when active.How to reproduce
/code-review 955915load_cert_chain(keyfile=None, certfile=None)as a blockerSessions tested
session-b8aaf3fe-0a00-4b7c-8d8d-2f668d0a6f2a— first attempt with PR fix: add context checks to prevent false-positive code reviews #15 improvementssession-9bb02f5a-cc5c-4507-81cc-ad7ae45c361d— with PR fix: elevate security-degradation principle to a top-level review rule #16 (loud-failure rule + context inheritance)session-892a8050-fa62-47b9-b6bb-8b5f502f580d— with mandatory nova-core + reachability verificationsession-03ceb4e1-d7c5-4554-a3dd-562e84cd3246— with config interdependency connection ruleWhat we tried (PR #16)
rules.mdEach iteration got closer but the agent still fails to complete the full chain: feature toggle → class instantiation → config prerequisites → None is misconfiguration, not a bug.
Root cause hypothesis
The activation path for VeNCrypt is indirect enough (config option → factory class → class map → method call) that the agent either doesn't follow far enough or doesn't connect the config dependency back. The instructions tell it what to do but the reasoning chain is too long for the agent to reliably execute in practice.
Possible next steps
Related to #14