feat(engine): compact answers; a reply cut off at the output ceiling drops no work and never ends COMPLETE #114

Open
james.maes wants to merge 10 commits from feat/compact-answers-and-output-ceiling into develop
pull from: feat/compact-answers-and-output-ceiling
10 Commits
Author SHA1 Message Date
james.maes 4bf102cd4a Merge branch 'feat/one-card-for-a-set' into feat/compact-answers-and-output-ceiling
maven / build (push) Successful in 8m32s
build / maven (push) Successful in 8m32s
2026-11-15 05:42:34 -06:00
james.maesandClaude Fable 5.2 298b75c5ff test: a provider row's output cap is read with the floor in code
Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
2026-11-15 05:42:34 -06:00
james.maesandClaude Fable 5.2 18e893b835 fix(process): a card shows all a screen says; a screen that says more than a card shows is not passed
maven / build (push) Successful in 9m20s
build / maven (push) Successful in 9m20s
The first card showed the first 300 characters of a screen's text and then
passed the screen. It now shows the whole text (up to 2,000 characters), and
a screen whose text is longer is one the card did not show in full: the run
stops there.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
2026-11-15 05:42:27 -06:00
james.maes 540ad0371d Merge branch 'feat/one-card-for-a-set' into feat/compact-answers-and-output-ceiling 2026-11-15 05:31:49 -06:00
james.maes d6bfe77c78 Merge branch 'fix/render-widget-follows-data-access' into feat/one-card-for-a-set
# Conflicts:
#	CHANGELOG.md
#	UPGRADE.md
2026-11-15 05:31:32 -06:00
james.maesandClaude Fable 5.2 50845aa99b fix(tools): render_widget follows the assistant's data access; no widget is rendered until a host allows it
maven / build (push) Successful in 8m50s
build / maven (push) Successful in 8m56s
A widget is code of the application and can show rows of any table, so
render_widget could hand a model the rows of a table the assistant may not
read. The tool now refuses, before the application is asked, every widget
the host did not allow by name (withAllowedWidgetNames, empty by default),
one it hid, and one that reads a table the assistant may not read
(new: withWidgetTables).

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
2026-11-15 05:30:57 -06:00
james.maesandClaude Fable 5.2 15de0db565 feat(engine): compact answers; a reply cut off at the output ceiling drops no work and never ends COMPLETE
A reply that stopped at the output ceiling is read like any other: the tool
calls it had completely formed run, the one it was still writing (its last
part) and any whose input a provider could not read never do and get an
error result that says so. The answer goes on by itself at most
maxOutputContinuations times, each a model call under every limit of any
other; after that it ends INCOMPLETE, never COMPLETE, says what was done and
what was not, and stays in the conversation so that 'continue' goes on.

A provider row lowers the output ceiling of one reply only down to
minOutputTokensPerRequest; it never raises the ceiling the code configured.

An answer shows a record once and at most maxRecordCardsPerTurn record cards
and maxRecordChipsPerTurn record links; a confirmation card is never left
out. The system prompt asks for one proposal for a set and compact answers.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
2026-11-15 05:29:56 -06:00
james.maesandClaude Fable 5.2 47d3e34f8c docs(process): the design of one confirmation for a set; the card's records and what they were, in the API
docs/one-card-for-a-set.md is the design and the safety argument for parts A
to D; README, UPGRADE, CHANGELOG and the agent notes follow it. UI API
extension assistant 1.11.0 (additive): AssistantActionV1.recordCount,
records and recordsBefore for a run over a set.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
2026-11-15 05:28:55 -06:00
james.maesandClaude Fable 5.2 583f8f1f9d test: the existing security tests follow 'no card for what cannot happen'
A person the application refuses is refused before a card where the
application says so beforehand; the confirm-time refusal (a permission that
goes between the card and the confirmation) keeps its tests, with the UI's
own status and message. The tool-set file changes in one description
(run_process), replaced as text.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
2026-11-15 05:23:13 -06:00
james.maesandClaude Fable 5.2 11fc143e6d feat(process): one confirmation runs a set to its end, within what its card showed; no card for a change the person may not make
A confirmed run_process goes through the process's own init and step
operations as the person and passes a screen for them only when it shows
nothing their card did not: its text and inputs were on the card with the
values the process has now, and a review counts exactly the records of the
card and, with every record validated first, has no warning and no error.
Anything else comes back to the person with a new card and nothing stored.

The set is frozen by primary key and by one digest over its records as the
person read them; a set that changed is not run. The card keeps what the
records were (how many, a sample of 20) and lists the whole set by name.

The assistant no longer creates a job: when the application itself hands the
work to a background job, the job is the person's, it is waited for, and its
outcome (rows done, failed and why) is the card's. A job the application
created waiting is cancelled and the run reported as not done.

A change to records of a table is proposed only to a person the application
lets make it (what it tells their own screens); otherwise they are told so
and there is no card.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
2026-11-15 05:09:34 -06:00