Repository navigation
Audit fixes: server log, visible answers, wording, accessibility, rename/detach, key file and request boundary, result card - #74
Merged
Conversation
added 9 commits
November 12, 2026 08:00
When a command ended with an unexpected exception, the server returned "internal command failure" and kept no record of it, so a beta report could only be investigated by reproducing it. The bus now writes one record per failure (method, operation id, project id, exception chain, short call path), and serve/desktop write warnings to the console and to <workspace>/logs/thoth.log (1 MB, 3 old files). Request string values, token shaped strings and text past 300 characters are removed from the record. The screen shows the operation id with an internal failure so a report can be matched to the log line. Background indexing and dense scoring failures still do not block requests but are now recorded once per place. A cancel request with a non-JSON body returns 400 instead of 500.
With no model connected, the question area took 39-48% of the window and the latest answer showed 22 px at 1440x900 and nothing at smaller sizes; the same notice appeared twice in the page. The question area now folds the model and effort choices when there is nothing to choose, keeps one notice, opens a conversation at the start of the latest answer, names the send button "Send" with the reason it is off (title and aria-describedby), and outlines the question box on focus.
Four English labels that were not in the translation tables (Workspace, PROJECTS, RESEARCH WORKSTATION, LOCAL) and two more found by a new scan are now translated. One word is used for the workspace (작업 공간) and for evidence text (근거 원문); fourteen sentences that used internal terms are rewritten; an unexpected server failure is shown in the screen language with its operation id; joined sentences, spaces between Japanese and Chinese sentences, and Korean em dashes are fixed; long help text is split into sentences. A wording test scans the translation tables for the banned words and the hard-coded labels.
Work tabs now point aria-controls at the panel they show (role=tabpanel with the same id), the faint text colour rises from 4.28:1 to 5.8:1 contrast, five elements that had an aria-label without a role get one, 21 failure and success notices are announced as alert or status, progress bars have names and the answer check table has proper rows. axe (WCAG 2.x A/AA) reports no violation on 13 screens, down from three kinds on all seven screens checked before.
Projects and conversations can be renamed from their menus, and a connected source can be detached after a confirmation that says every existing answer in the project will need review. Archiving, stopping a research run and detaching use one in-app confirmation dialog instead of window.confirm. The screen shows a conversation's display_name, counts only attached sources, and marks evidence from a detached source as detached. No server change.
The API key file is written to a temporary file, flushed and swapped in, and a key file that cannot be read is no longer overwritten: registering another key is refused with a message instead of silently dropping the stored keys. On Windows the key file gets a current-user-only ACL; the ACL code of the provider profiles moves to one shared module unchanged. Changing requests are accepted only from the server's own origin and the Vite dev origins on port 5173 (more local origins through THOTH_ALLOWED_ORIGINS). Local responses send frame-ancestors 'none', X-Frame-Options, nosniff and no-referrer. The local-actor check uses the list of read queries instead of a substring of the method name, and staging a file for a project that does not exist returns 404 once the workspace is open.
The result card repeated its conclusion status up to four times and used the word "check" for two different counts, so "needs check 0" sat above six "still to check" lines. The card now states the conclusion status and the answer check count once, names the judgement's own unchecked conditions separately with one line of explanation, keeps one "technical details" disclosure at the end of the review section, omits the next-action row when the stored value is NONE, and labels action cards "low risk" and "can run without approval" instead of two near-identical phrases. No unchecked or held reason is removed; a test compares the reasons before and after.
… ACL shape On the GitHub Windows runner the key-file ACL test saw four explicit entries (the user, SYSTEM, Administrators, OWNER RIGHTS) that come from the DACL Python 3.13 gives a 0o700 pytest folder, where the test expected exactly one. The test now checks the property that matters: protected, no inherited entry, full control for the current user, and no other trustee except SYSTEM, Administrators and OWNER RIGHTS. make_private also removes twelve broad groups (Everyone, Users, Authenticated Users, ...) if they are set explicitly, in the same icacls call; SYSTEM and Administrators are kept.
On the runner the current user is the built-in Administrator, which icacls /save writes as the alias LA while the test named it by its full SID. The test now turns SDDL aliases into SIDs before comparing, and the decision moves into a pure function with OS-independent tests, including the runner's exact SDDL.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
First part of the post-beta audit fixes, made in seven batches.
Server log for unexpected failures
<workspace>/logs/thoth.logunder its operation id. Request strings, token-shaped values and anything past 300 characters are left out of the log.Answer stays visible without a model
Wording
Accessibility
Rename and detach
Key file and request boundary
Result card
Validation: CI ran 7,163 tests with 0 failures. The web suite, axe and mutation checks ran for each batch.