Repository navigation
Full scan: 28 fixes across security, imports, transactions, accounts, budget and routes - #3
Merged
Merged
Conversation
…owed A principal of -5,000 beside 15,000 of interest added up to a 10,000 payment and raised the debt; a 2,00,000 instalment against 1,00,000 floored the outstanding at nil while the loan account went into credit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016zXWwzys3K4XksLh3rrcKu
…onth An empty budget_id wrote NULL onto a budget account, taking its balance out of every budget's Ready to Assign; statement and due days of 45, -3 or 2.5 were stored as typed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016zXWwzys3K4XksLh3rrcKu
Filed to the household's Reconciliation envelope, bringing a fixed deposit up by 100 to the bank's figure lowered Ready to Assign by 100. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016zXWwzys3K4XksLh3rrcKu
…ve fees A dated net worth statement read the latest valuation whatever its date, so a September revaluation landed in June's snapshot. A purchase with negative fees was booked below what the units cost. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016zXWwzys3K4XksLh3rrcKu
A called-even amount is spent from an envelope with no transaction behind it, so an envelope that held nothing and had nothing filed to it could be deleted while even_calls still named it. The engine stopped reading it and the giving budget's identity was out by the amount from that month on. Without a remap the delete is now refused; with one the calls follow it, and undoing the delete brings them back. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016zXWwzys3K4XksLh3rrcKu
…ains The Act tests those bands on total income excluding 111A, 112A and 112 gains; income over ₹2 crore only because of them takes 15%. Testing total income put ₹1.5 crore of salary plus a ₹1 crore 111A gain in the 25% band. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016zXWwzys3K4XksLh3rrcKu
…s envelope These reports filtered on the account's visibility only, so spending on a household-visible account in Ravi's own budget, filed to his own envelope, reached Priya's /reports tag chart and heatmap and her FIRE living costs. They now use hiddenTransactionSql, the account and the envelope, like Query and the registers. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016zXWwzys3K4XksLh3rrcKu
A doubly-Flate-compressed stream of a few hundred bytes inflated without limit, and a page could list it any number of times: a sub-kilobyte upload or Gmail statement attachment held the server for minutes and asked for gigabytes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016zXWwzys3K4XksLh3rrcKu
An object value reached node:sqlite as named parameters and threw: a 500 and a fault row per request from the public /demo/enter. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016zXWwzys3K4XksLh3rrcKu
…e impersonating, login CSRF - A removed member's API token still read and wrote everything; the allow-list now applies to tokens as it does to sessions. - Minting a token while viewing as another member created a permanent credential of theirs; refused. - The OAuth/OIDC state is bound to the starting browser by a cookie, so a callback link cannot sign somebody else into the sender's account. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016zXWwzys3K4XksLh3rrcKu
…ceholder reference is no reference Two identical orders in one file with an auto-approving rule failed the whole import on a foreign key (the second row named the first's review item as the transaction it duplicated). And a "-" or all-zero Ref No cell made different rows one event by the strong tier, so the later row was 'upgraded' into nothing and dropped. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016zXWwzys3K4XksLh3rrcKu
`staged` includes auto-approved rows, so an all-auto-approved import read "1 to review, 1 auto-approved" and opened an empty Review. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016zXWwzys3K4XksLh3rrcKu
Every such row of one amount was the same event to the strong dedupe tier. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016zXWwzys3K4XksLh3rrcKu
planCasImport took the first holding of the instrument anywhere in the household, so Ravi's folio of a fund Priya holds privately was recorded in her private account. It now looks only at holdings the importer can see, preferring the chosen destination's own. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016zXWwzys3K4XksLh3rrcKu
purgeDeleted ran one DELETE over every expired row, and an imported line approved from Review and then deleted is still named by its staged row. The foreign key failed the whole statement on every housekeeping tick, so no deleted transaction was ever purged again and the steps after it never ran. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016zXWwzys3K4XksLh3rrcKu
…ad edit dates guardCheckpoints broke confirmed checkpoints before the edit, add or delete ran, so a change then refused (lines over the total, spending with no envelope, a load-bearing delete) left a checkpoint broken over a balance nothing had moved. The break now happens in the change's own transaction. The edit route read an unparseable date as 'keep the old one' and answered 'Saved.' over the dropped change; it now refuses it as every other date field does. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016zXWwzys3K4XksLh3rrcKu
…name a private account on the other leg updateTransaction rewrote the partner leg's amount and date whenever either was posted, and the edit form posts both on every save. An imported transfer's legs carry their own statements' dates, so a memo edit on the card side moved the bank side out of its reconciled period with no question asked. The partner now moves only when the value actually changes, and the edit route guards the partner's checkpoint from the partner's own date. createTransfer wrote 'Transfer from <other account>' on each leg, so the household leg of a transfer with a private account named that account in the other member's register, transaction page, Search and CSV export. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016zXWwzys3K4XksLh3rrcKu
/schedules?days= went straight through Number(): 'abc' was a 500 (Invalid time value), -5 or an empty value read 'the next -1/0 days', and two million days overflowed the chart's stack after five seconds. Nonsense now falls back to 60 days, and a horizon past ten years is a 422. The Cards page's 'Pay it off' link carried the balance in paise and /transfer never read it, so the form opened empty. The link now carries rupees and the transfer form fills them in. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016zXWwzys3K4XksLh3rrcKu
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016zXWwzys3K4XksLh3rrcKu
Owner
Author
|
The GitHub's hosted AI scanner stopped before it read any file. It failed while opening its model session: On #1 the API refused to re-run this kind of check ( The PR's own checks on Generated by Claude Code |
flaxvin
marked this pull request as ready for review
September 27, 2026 15:21
febin92
added a commit
that referenced
this pull request
Sep 27, 2026
The fixers updated the docs finding by finding; this pass catches what they left stale elsewhere, and the website, which nothing had touched. - website/api.html: status codes (403 for a read-only token, 422 for a reused idempotency key with a new body, 404 for a missing or hidden id), the real /query parameters, /import/map and its date-order choice, the PDF upload field, transfer fees, the token deny-list, and more. - website/guides.html: three target kinds, fill-from-last-month, moves between budgets refused, import date order and Dr/Cr files, recording a card payment from Review, rules as the form really writes them, schedules recorded when marked paid, investments and tax changes, sessions as an absolute lifetime. - demo and privacy pages: the demo resets on every wake and is re-seeded every Wednesday; sign-in is a password, OIDC or Google. - docs: the error table (Missing is a 404, JSON errors), token rules, PDF decompression cap, privacy guards, rule amounts, screens, data model, testing counts; index updated. - home page test count to 2,117; sitemap lastmod for the changed pages. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
febin92
pushed a commit
that referenced
this pull request
Oct 5, 2026
Full scan: 28 fixes across security, imports, transactions, accounts, budget and routes
febin92
added a commit
that referenced
this pull request
Oct 5, 2026
The fixers updated the docs finding by finding; this pass catches what they left stale elsewhere, and the website, which nothing had touched. - website/api.html: status codes (403 for a read-only token, 422 for a reused idempotency key with a new body, 404 for a missing or hidden id), the real /query parameters, /import/map and its date-order choice, the PDF upload field, transfer fees, the token deny-list, and more. - website/guides.html: three target kinds, fill-from-last-month, moves between budgets refused, import date order and Dr/Cr files, recording a card payment from Review, rules as the form really writes them, schedules recorded when marked paid, investments and tax changes, sessions as an absolute lifetime. - demo and privacy pages: the demo resets on every wake and is re-seeded every Wednesday; sign-in is a password, OIDC or Google. - docs: the error table (Missing is a 404, JSON errors), token rules, PDF decompression cap, privacy guards, rule amounts, screens, data model, testing counts; index updated. - home page test count to 2,117; sitemap lastmod for the changed pages. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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.
Summary
A full scan of the app in six parallel audits: security, imports, transactions, accounts/loans/assets, the budget engine, and every route. Each defect below was reproduced with a test that fails on
main, then fixed at the cause. The combined branch is clean on typecheck and passes 2117/2117 tests (main has 2076).Three problems matter most:
Findings (most severe first)
/export.json)/import/pdf,/portfolio/casand the email fetchpathayam_oauthcookie must match the statePOST /tokensminted a never-expiring token for the impersonated memberhiddenTransactionSqlin reports andenvelopeSpendBetweenbudget_idon account edit dropped the account out of every budget31-02-2026kept the old date and said "Saved."/schedules?days=abcreturned 500;?days=2000000took about 5 s, then 500/transferignored it, so the form opened emptyCoverage and what was clean
safePathredirects, session cookie flags and re-checking on every request, password lockout parity, OIDC issuer/audience/email_verified, output escaping, CSV formula guard, attachment handling, CSP/HSTS/no-store, production gates on dev and demo modes.Not in this PR (decisions or follow-ups)
op=oneOfand a string value would 500 later imports.POST /portfolio/refreshcan block for about 55 s when the price providers are unreachable.🤖 Generated with Claude Code
https://claude.ai/code/session_016zXWwzys3K4XksLh3rrcKu
Generated by Claude Code