The portal's job, account, debt, other-income and expense edits are true PATCHes
Each endpoint now merges the request over the stored row (shared library patch* methods), so changing a job's title no longer fails on the NOT NULL employment t...
Talk It Through no longer 500s when the portal sends no flow
Set.of(...).contains(null) throws, so a request without a flow hint (the funnel before a purpose is chosen) answered 500. Found by a live probe after deploy. fl...
No read-only transaction around multi-read views; retry the edge routing read
YugabyteDB answered the edge's routing read with 'Restart read required' β a restart-read cannot be retried mid-transaction. Each read now runs as its own state...
Accept-gate refusal no longer says both a note and a status are needed
The requirement is per market now.
A failed request tells the caller to try again, not what the exception said
25 controllers returned e.getMessage() to the browser, which can name tables, columns and internal hosts. They now answer with a plain 'please try again' and lo...
Editing the IP address or TrustedForm link counts as editing contact info
The store sync schedule tells Spring which constructor to use
With a second (test) constructor and no @Autowired, the new pod failed to start: "No default constructor found". The running pods were untouched.
A staff vendor-document upload files under the requirement's document type
ImageService refuses a LOAN image without an ImgDocType, and uploadLoanDocument passed none (the doc type's name went into the description), so every staff vend...
Outbreak alerts reach the platform owner; import and rate-sheet detections name the member
Every platform operator holds MANAGE_PLATFORM_ANTIVIRUS only implicitly (owner floor), so the explicit holder list was empty and an outbreak told nobody. Recipi...
Stamp a vendor on every credit pull so a reseller order saves
Connection.VENDOR is NOT NULL; a reseller key (Xactus, Credit Plus, MeridianLink, CBC Innovis, Factual Data) mapped to no ConnectionVendor, so the pull ran and ...
Keep ThemeBackgroundController's CRLF line endings (completes 73e6499c)
Accept the phone's session, like every session endpoint
SIE5. **************** read only the BFF's X-OTK session, so KamoMobile (api.<org> with X-***-Token) got 401 and could not share a preference with the web β the...
A cancelled run is waiting on the newer push, not a failure
Forgejo reports a run a newer push cancelled as failure / "Has been cancelled", and with several sessions pushing that is most runs. It now stays in flight (QUE...
The applications list reads scalar pipeline rows
The list behind /commerce hydrated the URLA graph to fill a twenty-column row. It now uses the shared AppMortgageSummaryReader, and the parse test guards the re...
A dead status cancels due callbacks, and a stage offers only live loan statuses
A paused seat grants nothing; the Apps screen says how an app can be had
A paused subscription's licenses stay assigned, ready for the resume, and grant nothing. Each app an organization lacks now carries how to get it: an add-on, a ...
Automated and approved loan moves answer to the linked-loan rule
One LinkedLoanRule now decides for stage moves and for loan milestones. With no person a loan linked to an external LOS does not move. A review approval moves o...
Keep DKIM verified on a sweep, as SPF is
dkim_verified only moved when an owner reopened the DKIM card. It now decides whose name an org's mail carries, so a published record has to count by itself.
Forget an invoice's expired card payment page
An abandoned Stripe Checkout page (it expires unpaid after 24 hours) stayed on the invoice for good, so the invoice looked mid-payment: it could not be updated ...
Mark the adverse-action clock's Spring constructor, so SecurityService boots
With a second (test) constructor and neither marked, Spring looked for a no-argument one and the new pods crashlooped; the older pods kept serving.
Pricing, capital and servicing policy tabs load before a first version is published
GET **************** built its body with Map.of("active", <active or null>, "history", ...). Map.of refuses null, so for any organization that had not published...
An edit never creates an older loan in the external MLOS
Any successful write under /mortgage-apps/{uid} queues an outbound sync, and a loan with no link was then created in the provider whatever its age β so editing ...
An empty PKCE pair is no PKCE, so Google Home can link without it
kamo-login forwards parameters the client did not send as empty strings; the authorize check took "" as a challenge and told Google (require_pkce off, sends no ...
Name the status endpoints' caller lookup so the endpoint ratchet sees it
The endpoint ratchet sees the patient-SMS relay's internal-auth guard
**************** flagged **************** and .receipt (29e22ca7) as endpoints that resolve no session. They are server-to-server (VOIPService -> SecurityServic...
An order may be a teammate's proven email or a request they confirmed in Kamo
The Tool Plane now verifies orders given by a teammate's own email (email:<folder>/<uid> or the wake's email:<mailbox>|<folder>|<uid>) and by a request the memb...
A generated personality keeps everything the SI already holds
Only an earlier generation's items, named by id and still marked as drafted, are replaced; a configure-assistant draft or a person's item stays, and a generated...
Never push a stage to the external MLOS that the sync itself wrote
The Arive import walks a loan through Kamo's pipeline one step at a time; the 20s sync tick saw each half-walked status as a Kamo change and sent it to Arive, r...
Never send exception text (SQL included) to the browser
BaseLosController.error() put e.getMessage() in every 500 body; the pipeline page showed a full JDBC statement. The exception now goes to the log under a short ...
Pipeline reads retry on a Yugabyte read restart instead of failing the page
"We couldn't load the pipeline (JDBC β¦ Restart read required)" appeared at random while the Arive import was writing loans. The deal and loan list reads are pur...
Retry the import's progress write on a Yugabyte read restart
The first live import stalled at RUNNING after page 1: saving the connection loads the org's domains, Yugabyte answered 40001, and the failure write hit the sam...
Billing write service starts again β the constructor keeps its @Autowired
The terminology commit inserted the code-checker field between @Autowired and the constructor, so the annotation moved onto the field and Spring found three una...
Room-and-start passes the request so visit grants are audited with the caller
The owners' invoice link opens on the workspace host the org can actually reach
Built internal.<domain> by hand, which OrgDomainRuleGuardTest forbids: an org whose own domain is not finished would get a link to a host that answers nothing. ...
The billing job takes each subscription and invoice in its own transaction
Its first run raised Harmony's October invoice and lost it when one audit insert failed, because the whole prepare step was one transaction.
Catalog edits reach only the caller's organization; own-order callers cannot comp or price themselves
Every update and delete of a subscription plan, price, feature, add-on, bundle, volume discount, promotion or agreement template now checks that the row belongs...
Creating a MORTGAGE market gives the organization its lender profile at once
A MORTGAGE market's lender profile (and its five config rows) was only created by the boot-time self-heal, so a market created while SecurityService was running...
The endpoint ratchet sees @RequireRight; the org-graph ratchet allows two read-only hits (SITP TPGUARD)
**************** flagged the TP02 billing and commerce-invoice relays. Not a hole: every commerce-invoice handler carries @RequireRight (TenantRightInterceptor ...
Staff can delete a never-received mortgage application; a received one answers 409 (SITP TP21FU)
DELETE **************** went through AppMortgageService.delete, which 500'd for every application (borrower satellite rows left behind). The shared library now ...
Every clinical audit row names its patient; pick up the shared-lib audit and updated_at fixes (SITP TP23FU)
Production phi_access_log rows from the clinical audit methods carried no purpose, basis or patient: the shared PhiAccessRecorder dropped them while stamping th...
Starting a clinical note no longer fails on updated_at (SITP TP23 live smoke)
ClinicalBaseEntity.updated_at is NOT NULL and defaulted by the database on INSERT only (insertable = false), so a note just inserted holds null in memory and th...
Booking an appointment no longer fails on an untyped null in the conflict check (SITP TP23 live smoke)
findConflicts' (:excludeId IS NULL OR a.uid <> :excludeId) with a null UUID is an untyped parameter on Postgres/Yugabyte ('could not determine data type of para...
Like what you see shipping?
All of it arrives in your workspace on its own. Start on the free plan and read this page again in a month.
