You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This commit was created on GitHub.com and signed with GitHub’s verified signature.
Fixed
The crash that restarted the container is gone, and it was a version. The
parser core was tree-sitter 0.26 while every grammar wheel here is built against
0.25, and the mismatch showed up where the grammar's field tables are read: the tree
walk touched node fields through a stale view of the language and, under memory
pressure, the process died with SIGSEGV — Error 139 in the container, which no
Python except can catch and which arrives as a bare restart. Once the heap was
poisoned on purpose it reproduced every time (PYTHONMALLOC=malloc MALLOC_PERTURB_=165): six crashes in six runs on 0.26.0, none in eight on 0.25.2,
while plain parsing never crashed on either — which is what placed the fault in the
walk and not in the grammar. The core is held below 0.26 until the wheels move, and run_prod sets PYTHONFAULTHANDLER=1, so a crash of any kind now leaves a Python
stack in the container log instead of an exit code on its own.
A review of a large pull request is no longer cut off at thirty seconds. The AI
client shares this service's HTTP client, so HTTP_CLIENT_TIMEOUT — thirty seconds,
which is right for a Git host and wrong for a model reading a whole diff — applied to
the model as well, and the SDK's own retries spent three attempts of it before failing
with APITimeoutError on a fifty-eight-file pull request. An AI profile now takes its
own AI_PROVIDER_TIMEOUT, five minutes by default.
A model that fails to answer is asked again, visibly. The SDK's own retries are
silent and were capped at three attempts; an AI profile now says how many it wants
(AI_PROVIDER_RETRIES, four retries — five attempts — by default), every attempt is
logged with its reason, and the waits double with jitter, believing a Retry-After
when the host sends one. Only failures that carried no verdict are repeated: a model
that refused the answer is not asked five times for the same refusal. The SDK's own
retries are switched off, so the configured count is the count that happens — the
worst case is that count times AI_PROVIDER_TIMEOUT, which is why both are settings.
The probes around a changed file are fewer and quieter.deep finds the tests and
dependencies of a changed file by guessing paths and asking; for an icon, a font or an
image that guess is a family of names that cannot exist, and one brand-kit pull request
produced forty 404s for assets nobody reviews. A changed file that is data rather than
code is skipped now — the diff still carries it — and a 404 on a probe is logged at
debug level instead of as a warning, because for a probe a miss is an answer.
Changed
The prompts are English now, and a third smaller. Tokenizers spend noticeably more
of them on Russian Cyrillic than on the same content in English, and the instructions
travel with every review: 22 648 characters became 13 930, with the reviewer's criteria
stated once instead of twice across the two modes. The answer is still Russian — that
is what a person reads — and the rule saying so lives in the prompts themselves, with a
test that fails if a later edit drops it. Rereading them also produced two things worth
having: a review no longer spells out what the project's own linters and formatters
already enforce (formatting, import order, line length), because the pipeline reports
those and a review that repeats them is noise; and both modes now say plainly that a
change which is fine needs no comment at all. What was worth keeping was kept — the
diff handed to the model carries a line number on every line and the prompt tells it to
copy those numbers rather than count, which is what keeps a comment on the line it was
written about, and the data block stays fenced with an instruction to treat everything
inside it as material rather than as orders.