Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
2361 commits
Select commit Hold shift + click to select a range
e795f0c
🏕️ feat: Provision Native Code Workers (#15587)
danny-avila Sep 4, 2026
481c64b
🧃 fix: Decode Blob-Backed MCP Resources (#15601)
danny-avila Sep 4, 2026
3255288
🎖️ fix: Preserve Endpoint Approval Policy Precedence (#15604)
danny-avila Sep 4, 2026
2656f44
style(insights): use Click UI muted token for KPI labels and 32/12 pa…
danielclickh Sep 4, 2026
fddf7e3
🛻 feat: Route Bash Through Attached Workspaces (#15546)
danny-avila Sep 4, 2026
a21c794
🏷️ fix: Record the Media Type of Saved Images, Not the Declared One (…
danny-avila Sep 4, 2026
770238f
🔣 refactor: Replace Mongo Filters With Typed Criteria (#15580)
danny-avila Sep 4, 2026
64d807b
🏛️ refactor: Extract Engine-Neutral Tenant Policy (#15575)
danny-avila Sep 4, 2026
7d9db14
📓 feat: Author Files in Attached Workspaces (#15548)
danny-avila Sep 4, 2026
d21bffa
fix(insights): stop the KPI grid orphaning a card on its own row (#15…
danielclickh Sep 4, 2026
d07527f
style(insights): give panels their own surface in dark mode (#15552)
danielclickh Sep 4, 2026
09da878
🚰 fix: Throttle Shared Link Reads and Aggregate Audit Findings (#15605)
danny-avila Sep 4, 2026
c13990a
🍃 test: Restore Sweep Coverage of Typed-Criteria Methods (#15609)
danny-avila Sep 4, 2026
3200f01
🚫 fix: Decline to Name a Heif Container With Unreported Compression (…
danny-avila Sep 4, 2026
c302ae6
🪁 fix: Honor Endpoint Drop Params in Parameter Panels (#15610)
danny-avila Sep 4, 2026
84323d8
🛰️ fix: Repair BYOM Live Integration (#15613)
danny-avila Sep 4, 2026
fe30e3d
🪫 fix: Back Off Failed Retention Deletes (#15608)
danny-avila Sep 4, 2026
5e3cdd0
📮 fix: Consume an Invite Only Once the Account Exists (#15611)
danny-avila Sep 4, 2026
d9dfdeb
💫 style: Align the Phase Summary Rail and Simplify its Fold (#15619)
danny-avila Sep 4, 2026
a3f80e8
🗓️ fix: Classify Scheduled Run Duplicate Conflicts on DocumentDB (#15…
danny-avila Sep 4, 2026
3d085b2
🛰️ feat: Show BYOM Worker Readiness (#15618)
danny-avila Sep 4, 2026
57c52de
🛎️ fix: Start Code Environment Reconciliation After Mongo Connects (#…
danny-avila Sep 4, 2026
0003496
🩻 feat(insights): Scope Insights to Authorized Agents (#15549)
upman Sep 5, 2026
6733257
🧮 fix: Scale Code Environment Reconciliation (#15625)
danny-avila Sep 5, 2026
f174da6
📋 feat: Copy Messages as Rich Text (#15087)
berry-13 Sep 5, 2026
f4e967b
🩹 fix: Restore the Client Build by Parsing Single-Dollar Math via Mic…
berry-13 Sep 5, 2026
a9da01f
📐 fix: Keep the Live Slot Under a Phase Card One Row Tall (#15639)
danny-avila Sep 5, 2026
1c115cd
🐛 fix: improve sidebar title clarity and hover scrolling (#15644)
berry-13 Sep 5, 2026
8144574
♿ feat: High Contrast Light and Dark Appearance Modes (#15178)
berry-13 Sep 5, 2026
971e076
🎛 refactor: Replace Agent Skills Toggles With a Three-Way Mode Contro…
berry-13 Sep 6, 2026
54511b2
🧠 fix: Return 400 for Invalid Memory Keys (#14618)
mihidumh Sep 6, 2026
c9b9644
🔔 fix: Honor Toast Duration and Support Persistent Toasts (#15049)
jtodaroii Sep 6, 2026
aeac7a2
🪪 feat: Add Per-Agent Git Identity (#15628)
danny-avila Sep 6, 2026
b3b8986
🪠 fix: Unblock Failed OpenID Publication Flights (#15641)
danny-avila Sep 6, 2026
d812e2f
📏 style: Center Every Row Glyph on the Avatar's Axis (#15643)
danny-avila Sep 6, 2026
fdd5f9c
🖼️ fix: Precache PWA Icons and Let Them Refresh (#15654)
berry-13 Sep 6, 2026
85c90bf
✅ test: Prove Tenant Scoping at the Driver, Below the Engine Binding …
danny-avila Sep 6, 2026
de888cc
🎈 ci: Gate Page Loads Under Database Latency (#15646)
upman Sep 6, 2026
e2cee96
✅ test: Add the Portable Tenant-Isolation Contract (#15662)
danny-avila Sep 6, 2026
e1f2298
🗓️ fix: Surface a Run Now Scheduled Chat in the Sidebar (#15630)
danny-avila Sep 6, 2026
3e97463
🔭 feat: Tag Browser Diagnostics With Client Build IDs (#15656)
danny-avila Sep 6, 2026
9089d8c
🚮 fix: Require Sign-In After Missing OpenID Sessions (#15655)
danny-avila Sep 6, 2026
422f3a6
🧶 feat: Flatten Active Message Threads Behind a Flag (#15633)
danny-avila Sep 6, 2026
a5932cb
🎖️ perf: Promote Flat Thread Rendering to Default (#15660)
danny-avila Sep 6, 2026
0fa3134
🛅 feat: Add Agent File Management APIs (#15666)
danny-avila Sep 6, 2026
81154ad
🍋 feat: Add AMD Lemonade Provider Recognition and Branding (#15664)
berry-13 Sep 6, 2026
c9d208a
🧰 feat: Unify Tool Activity, Reasoning, Search, and Agent Workflows (…
berry-13 Sep 6, 2026
84851d8
🍃 fix: Serialize Index Builds and the Agent Edge Cleanup for Document…
danny-avila Sep 6, 2026
8f6efaf
🛂 feat: Add Configurable BYOM Enrollment Policy (#15673)
danny-avila Sep 6, 2026
f1a2176
🧺 fix: Discard Stale Session Tokens at OpenID Login (#15668)
danny-avila Sep 6, 2026
deda142
🗓️ fix: Refresh the Sidebar When a Scheduled Run Fires or Settles (#1…
danny-avila Sep 6, 2026
ebf7082
📫 fix: Surface Sandbox Artifact Delivery Failures (#15671)
danny-avila Sep 6, 2026
deb3dad
🫳 fix: Let the Composer Column Shrink Below a Queued Row's Text (#15665)
danny-avila Sep 6, 2026
dd51b9d
🪶 fix: Preserve Preset Prompt Insertion Behavior (#15672)
danny-avila Sep 6, 2026
4fdab5e
🥅 chore: Block DB Model APIs That Bypass Isolation (#15663)
danny-avila Sep 6, 2026
dcf417e
📏 style: Put the Grouped Thought on the Row Rail (#15674)
berry-13 Sep 6, 2026
87097e2
🎟️ fix: Preserve OpenID Logout Token Hints (#15653)
aeyeopsdev Sep 6, 2026
3f92853
🏠 fix: Route Standalone File Writes to BYOM Workers (#15675)
danny-avila Sep 6, 2026
abdb8f3
📣 fix: Surface Skill Creation Feedback (#15649)
aeyeopsdev Sep 6, 2026
a827f35
🛤️ fix: Align File Search Citation Paths (#15650)
aeyeopsdev Sep 6, 2026
bfaecf1
🫸 fix: Stop OAuth Sign-In After Binding Failure (#15652)
aeyeopsdev Sep 6, 2026
8a85df9
📜 feat: Add Skills Discovery and Authoring to the Management API (#15…
danny-avila Sep 6, 2026
942be5a
🧪 test: Verify Native BYOM File Reliability End to End (#15678)
danny-avila Sep 6, 2026
b181ef0
🪬 feat: Configure Langfuse Trace User Identity and Metadata (#15667)
danny-avila Sep 6, 2026
b5c5624
🕹 fix: Keep Composer Focus Off Clicked Controls So Menus Can Close (#…
danny-avila Sep 6, 2026
88116f7
🫠 fix: Surface Bedrock Content Filter Refusals (#15647)
aeyeopsdev Sep 6, 2026
6cd6be6
📍 fix: Pin Persisted Saves to Their Tenant (#15582)
danny-avila Sep 6, 2026
e504128
🫙 fix: Surface Document Extraction Failures (#15651)
aeyeopsdev Sep 6, 2026
0b9dc20
🧫 fix: Verify Early Stream Recovery (#15676)
danny-avila Sep 7, 2026
037cbf5
🧺 fix: Contain Conversation Import and Upload Failures (#15681)
dustinhealy Sep 7, 2026
644e33f
🗳️ feat: Define Conversation Code Approval Modes (#15685)
danny-avila Sep 7, 2026
c883e9e
🔦 chore: Drop `@lhci/cli` and Run Lighthouse 13 Directly (#15687)
danny-avila Sep 7, 2026
1aa86a9
🛬 fix: Land Early Steers on the Live Placeholder (#15692)
danny-avila Sep 7, 2026
ea3c61d
🪣 fix: Decode S3 Object Keys from URLs (#15426)
SGudbrandsson Sep 7, 2026
45bb99a
🥽 fix: Stop the DocumentDB Guard Flagging Mongoose's Document `$where…
danny-avila Sep 7, 2026
58de776
🗝️ refactor: Prefer the Recorded Storage Key for Every Download Strea…
danny-avila Sep 7, 2026
a3fc3b9
🚧 fix: Gate File Search and Run Code by Role (#15691)
danny-avila Sep 7, 2026
3f27726
🧶 feat: Thread Conversation Code Approval Through Requests (#15698)
danny-avila Sep 7, 2026
29971f1
🧺 fix: Skip Priming Denied File Search Resources (#15699)
danny-avila Sep 7, 2026
911b632
🧲 fix: Coalesce and Bound Code Environment Status Polls (#15701)
danny-avila Sep 7, 2026
dd5829e
🏰 fix: Enforce Platform Grants for Code Workers (#15700)
danny-avila Sep 7, 2026
e370ce4
🎒 fix: Bound Agent Attachment Context (#15694)
danny-avila Sep 7, 2026
4b3a6ea
🪧 feat: Surface Conversation Code Approval Modes (#15703)
danny-avila Sep 7, 2026
21c03b7
🕓 style: Move the Queued-Message Hint Into a Hover Tooltip on the Clo…
danny-avila Sep 7, 2026
601ed07
🫧 fix: Retire Cancelled MCP OAuth State (#15702)
danny-avila Sep 7, 2026
8fa5963
🧱 fix: Close MCP OAuth Teardown Races (#15716)
danny-avila Sep 7, 2026
f1bd854
🪫 fix: Recharge Direct OpenID MCP Bearer Sessions (#15704)
danny-avila Sep 8, 2026
3e2a6f3
🪗 feat: Compact Context in a Summarize-Only Turn (#15690)
danny-avila Sep 8, 2026
6f05678
🧐 feat: Restore Interactive Tool Approval Review (#15717)
danny-avila Sep 8, 2026
cdc3339
🪬 fix: Fence Agent Checkpoint Ownership and Cleanup Recovery (#15680)
dustinhealy Sep 8, 2026
5ca1093
🛫 feat: Enable Full Access for BYOM Coding (#15718)
danny-avila Sep 8, 2026
6a4d227
🏠 fix: Preserve Stateful Deployment Default (#15719)
danny-avila Sep 8, 2026
25fcd12
🏁 style: Align Streaming Elapsed Reading With Footer Start (#15720)
danny-avila Sep 8, 2026
6988921
💠 style: Unify Code Approval With Composer Controls (#15721)
danny-avila Sep 8, 2026
f50c40e
🧰 feat: Move Code Settings Into Run Code (#15722)
danny-avila Sep 8, 2026
1b51ec4
🩻 fix: Preserve Workspace Tool HTTP Diagnostics (#15723)
danny-avila Sep 8, 2026
1dfefc3
🪹 fix: Attach Ready OAuth MCP Servers With Empty Catalogs (#15727)
danny-avila Sep 8, 2026
ba12eaa
⛔ fix: Bind Tool Approvals to Generation Scope (#15724)
danny-avila Sep 8, 2026
968950a
🪫 fix: Gate Programmatic Bash on Stateful Worker Capabilities (#15726)
danny-avila Sep 8, 2026
5cd70ad
🫧 fix: Raise Nested Popovers Above Dialog Layers (#15738)
danny-avila Sep 8, 2026
ab6cde0
⏳ fix: Separate Temporary and General Chat Retention (#15734)
danny-avila Sep 8, 2026
2577324
🛄 fix: Clear MCP Connection State Before Catalog Refresh (#15741)
danny-avila Sep 8, 2026
3bff323
🧘 fix: Settle Stale Response Parts (#15743)
danny-avila Sep 8, 2026
57ebbe1
🟫 fix: Reject Invalid Hex Color Matches (#15744)
danny-avila Sep 8, 2026
ab52730
🫣 fix: Hide Scroll-to-Bottom Under Composer Panels (#15746)
danny-avila Sep 8, 2026
5020dbd
🪪 fix: Guard Null Avatar URLs in Social Login (#15747)
ncchinh Sep 8, 2026
fd229fe
👯 fix: Collapse Radix Layer Packages to One Copy (#15742)
danny-avila Sep 8, 2026
1a6410a
🧍 fix: Accommodate BYOM Queue and Execution Budgets (#15750)
danny-avila Sep 8, 2026
49b6e51
🧷 fix: Keep Ref Cleanup and Hold Consumer Handlers to the Frontmost D…
danny-avila Sep 8, 2026
639d606
🗝️ fix: Load User Keys on Resumed Requests (#15749)
danny-avila Sep 8, 2026
2dd7ca4
📐 docs: Set PR Description, Review and Completion Standards (#15753)
danny-avila Sep 8, 2026
49a3b71
🧱 docs: Hold Module Boundaries, Configurable Levers and Injected Depe…
danny-avila Sep 8, 2026
a353e11
🗳️ fix: Recover Durable Background Tool Receipts (#15752)
danny-avila Sep 8, 2026
e6376f6
👣 docs: Define CJS and Jotai Migration Triggers (#15756)
danny-avila Sep 9, 2026
ec15075
🚚 feat: Route Attachments and Provision Tools Lazily (#15763)
danny-avila Sep 9, 2026
0d85af0
🧫 chore: Keep Jest Specs Out of Tool Discovery (#15766)
danny-avila Sep 9, 2026
dad20b1
🛗 fix: Add Tenant Index Upgrade Migration (#15767)
danny-avila Sep 9, 2026
fed09da
📎 test: Verify Stateful Sandbox Upload Continuity (#14363)
danny-avila Sep 9, 2026
af6e97f
🏠 fix: Keep MCP Caches Fresh on Demand (#15765)
danny-avila Sep 9, 2026
fdaf4db
🔢 fix: Normalize PDF Citation Page Numbers (#15731)
easyicetrusty Sep 9, 2026
8da4ae7
🧿 fix: Patch gRPC xDS Denial of Service (#15769)
danny-avila Sep 9, 2026
c79f13b
📦 chore: bump npm audit packages and `@librechat/agents` to v3.8.5 (#…
danny-avila Sep 9, 2026
a8087ce
🏕️ feat: Select Attached Code Workspaces (#15768)
danny-avila Sep 9, 2026
2c07e28
🪴 fix: Restore Native Workspace Selection (#15771)
danny-avila Sep 9, 2026
b207530
🪡 fix: Thread Stop Into BYOM Commands (#15772)
danny-avila Sep 9, 2026
eaed216
🧵 test: Type BYOM Cancellation Mock (#15774)
danny-avila Sep 9, 2026
559fd7d
🪓 feat: Cancel Background Tool Invocations (#15773)
danny-avila Sep 9, 2026
66faf4c
🛑 fix: Preserve BYOM Foreground Cancellation Identity (#15777)
danny-avila Sep 9, 2026
9f311b8
🪔 feat: Expose Bounded Attached Bash Timeouts (#15776)
danny-avila Sep 9, 2026
23a96bd
🔐 fix: Send One Code API Authentication Method (#15781)
danny-avila Sep 9, 2026
6cb0499
🌳 fix: Guard Ambiguous BYOM Workspace Selection (#15785)
danny-avila Sep 9, 2026
3cab71c
🧷 ci: Await durable finalization in conversation-management mock e2e …
jtodaroii Sep 9, 2026
f0c9dee
🫆 fix: Preserve Durable Parents for Queued Turns (#15787)
danny-avila Sep 9, 2026
65bb64b
🛟 fix: Recover CodeAPI File Uploads After Throttling (#15784)
danny-avila Sep 9, 2026
ac2307b
🕳️ fix: Clear Nullable Queue Anchor (#15794)
danny-avila Sep 9, 2026
442d477
🛎️ fix: Preflight MCP Readiness for Scheduled Chats (#15782)
danny-avila Sep 10, 2026
6965f8e
🛂 fix: Back Off MCP OAuth Discovery (#15783)
danny-avila Sep 10, 2026
03a42d6
🎒 fix: Carry Subagent Identity Past Streaming (#15795)
dustinhealy Sep 10, 2026
b356c3d
🈳 fix: Treat Blank Mongo Index Settings as Unset (#15809)
Zsanz3 Sep 10, 2026
a785a61
📯 fix: Propagate Host Cancellation Into API Tools (#15812)
danny-avila Sep 10, 2026
d510b6f
🛖 fix: Restore Saved Attached Workspaces (#15811)
danny-avila Sep 10, 2026
e1cc080
🥅 fix: Keep Mobile Composer Actions In Bounds (#15825)
danny-avila Sep 10, 2026
e49cb79
🪢 fix: Keep One Code File per Sandbox Destination (#15817)
jomspk Sep 10, 2026
bee183e
🥼 feat: Expose BYOM Cancellation Diagnostics (#15810)
danny-avila Sep 10, 2026
0354db3
🔌 fix: Close Leaked HTTP Server in Server Specs (#15821)
jomspk Sep 10, 2026
523e800
🏷️ fix: Model-Agnostic Hint for Short Skill Descriptions (#15833)
L4XB Sep 11, 2026
e75835e
📌 feat: Unified Pinned Section With Sidebar Drag Interactions (#15057)
berry-13 Sep 11, 2026
afaf22f
🧊 fix: Withhold Rerun Controls on Compaction Turns (#15797)
berry-13 Sep 11, 2026
980f3ed
🩻 feat: improve agent filter controls for insights (#15807)
upman Sep 11, 2026
ab50601
🔠 fix: Name Artifact Downloads After Their Titles (#15836)
danny-avila Sep 11, 2026
e2f5772
🧮 feat: Surface Retained Tool-Message Context Usage (#15796)
berry-13 Sep 11, 2026
8f13845
📿 fix: Inspect Stored File Locators Per Message (#15841)
danny-avila Sep 11, 2026
1bea7e4
🧽 style: Composer, Welcome Screen and Context Panel Polish (#15838)
berry-13 Sep 12, 2026
767ee59
📴 fix: Stop Hidden Code Spinners (#15846)
danny-avila Sep 12, 2026
1ef4aa9
🏰 fix: Read OpenID Flight State From Mongo Primary (#15849)
danny-avila Sep 12, 2026
1d45f5b
🏡 feat: Remember Agent Workspace Defaults (#15843)
danny-avila Sep 12, 2026
7b71c3f
🥅 fix: Keep Tool Error Prefix Parsing In Bounds (#15857)
danny-avila Sep 12, 2026
fe351ee
🧨 fix: Defuse Skill and Artifact Parsing Backtracking (#15856)
danny-avila Sep 12, 2026
f3e2bf2
🧲 fix: Match Directory Users to Existing Principals (#15855)
danny-avila Sep 12, 2026
e7dea56
🧵 fix: Preserve Per-Message Inspection Budgets Through Provider Prepa…
danny-avila Sep 12, 2026
bd08a36
🔣 fix: Encode Images From Storage Keys (#15851)
Ricky-Hao Sep 12, 2026
5a2c4a0
🔐 fix: Stop an MCP Credential Refresh From Fencing Its Own Connection…
danny-avila Sep 12, 2026
5b4ec6b
🔎 feat: Filter and Sort the Sidebar Chats List (#15842)
berry-13 Sep 12, 2026
246e7e5
💠 fix: Paint Native Tool Verification Badges (#15862)
berry-13 Sep 12, 2026
fb13224
🧪 test: Restore Two Rotted Integration Suites and Run Every One in CI…
danny-avila Sep 12, 2026
ddd2dd8
🪢 fix: Recover a Failed MCP Server Once When Reinspections Overlap (#…
danny-avila Sep 12, 2026
037b033
📇 fix: Stop an MCP Credential Refresh From Fencing Its Own Catalog Re…
danny-avila Sep 12, 2026
f25242d
🦘 feat: Share Run-Scoped Files With Subagents (#15848)
usnavy13 Sep 13, 2026
7a83b8f
📟 feat: Record Safe Upstream Model Failures (#15800)
dustinhealy Sep 13, 2026
19eb249
🔠 feat: Render Safe Upstream Model Errors (#15837)
dustinhealy Sep 13, 2026
1163045
🖋️ feat: Seal Code Environment Choices Per Conversation (#15868)
danny-avila Sep 13, 2026
2e1ccbb
🪂 fix: Release Stalled MCP Catalog Recovery Without Dropping Refreshe…
danny-avila Sep 13, 2026
74fa60c
🔎 fix: Enforce WEB_SEARCH Role Permission on Agents (#15875)
danny-avila Sep 13, 2026
f43301f
🔭 feat: Conversation Trace Viewer (#15869)
danny-avila Sep 13, 2026
17c7b30
💤 fix: Preserve Dormant Workspace Bindings (#15877)
danny-avila Sep 13, 2026
3f2e477
🛬 fix: Land MCP OAuth Callbacks on Waiting Connections (#15876)
danny-avila Sep 13, 2026
e18606e
🚀 v0.8.8-rc3 (#15859)
danny-avila Sep 13, 2026
424d559
🫂 fix: Scope People Picker Searches to Permitted Types (#15878)
danny-avila Sep 13, 2026
e43fed2
🚄 perf: Linearize Conversation Import Lineage (#15881)
danny-avila Sep 13, 2026
9bf51fc
🧷 style: Sidebar Row Controls, Pinned Unpin Badge and Drag Rules (#15…
berry-13 Sep 13, 2026
9cf33cc
🧿 fix: Bind Login Flows to the Browser That Started Them (#15880)
danny-avila Sep 13, 2026
d6f8b2e
🏷️ fix: Keep a Configured Sender Label From Revealing the Model on Ho…
aruj0 Sep 13, 2026
696bcb6
🏦 fix: Reserve Credits for In-Flight Requests (#15879)
danny-avila Sep 13, 2026
566e0a8
🪢 fix: Withhold the Editor's Rerun Where No User Turn Can Be Replayed…
berry-13 Sep 13, 2026
1453258
🩹 ci: Invoke ESLint and Prettier Binaries Directly in Static Checks (…
danny-avila Sep 13, 2026
6e3295e
⏱️ ci: Cut the ESLint Config Sweep to the Rules That Can Regress (#15…
danny-avila Sep 13, 2026
c640d80
🪟 fix: Opaque Header Controls Over the Chat Gradient (#15894)
berry-13 Sep 13, 2026
f6335cb
💰 fix: Bill Stopped Agent Turns From Provider Usage (#15889)
danny-avila Sep 14, 2026
91e00bb
🧷 fix: Mark a Failed Compaction So Its Rerun Controls Stay Withheld (…
berry-13 Sep 14, 2026
8e6e6f0
🪧 fix: Emit the Configured-Footer Answer With the HTML Shell (#15886)
berry-13 Sep 14, 2026
e95e696
🧾 fix: Count the Tool Results a Tool-Limit Stop Retains (#15893)
berry-13 Sep 14, 2026
f3991f2
🔡 style: Size Image Tool Labels Like Every Other Activity Row (#15898)
danny-avila Sep 14, 2026
c2f3d0c
🎨 style: Color Image Tool Labels With the Activity Rows' Secondary Ro…
danny-avila Sep 14, 2026
854645f
🔁 feat: Retry OpenID Discovery After Startup Failures (#15899)
danny-avila Sep 14, 2026
14c5e8d
🧪 test: Wait for the Durable Task Input Before Reserving a Child Cont…
danny-avila Sep 14, 2026
3c39ea5
📐 fix: Accept Custom WIDTHxHEIGHT Sizes in OpenAI Image Tools (#15904)
danny-avila Sep 14, 2026
28cd3db
💉 chore: Upgrade `@azure/msal-node` to v5.6.0 (#15903)
danny-avila Sep 14, 2026
fa3dff1
🎖️ chore: Promote Helm Chart to 2.0.11 (#15905)
danny-avila Sep 14, 2026
7fe9a45
🧵 ci: Keep a Floor of Two Jest Workers in CI (#15819)
jomspk Sep 14, 2026
4216de4
🚛 fix: Move Sealed Chats to New Code Environments (#15902)
danny-avila Sep 14, 2026
7e05c48
👑 fix: Elect a Single Expired-File Sweeper (#15909)
danny-avila Sep 14, 2026
d8c953b
📜 style: Scroll the Sidebar as One Surface (#15914)
berry-13 Sep 14, 2026
b204216
🧷 fix: Keep a Failed Summary From Bounding the Conversation History (…
berry-13 Sep 14, 2026
345cf88
🍵 fix: Support Renewable MCP Credentials for Schedules (#15908)
danny-avila Sep 14, 2026
f077e8c
🗯️ fix: Give Failed Turns Actionable Guidance (#15896)
berry-13 Sep 14, 2026
27acf97
📫 fix: Route Azure Astra Through Responses API (#15845)
usnavy13 Sep 14, 2026
16faadb
🪧 feat: Unify Artifact Triggers as Tool Rows (#15915)
berry-13 Sep 14, 2026
b1f6f6d
👯 fix: Reject Duplicate Tool Approval Identities (#15933)
danny-avila Sep 14, 2026
ec1304f
🛅 fix: Preserve Agent Management Upload IDs (#15840)
dustinhealy Sep 14, 2026
b88d70b
🏮 docs: Relight the Helm AI Setup Link (#15808)
jrlprost Sep 14, 2026
2f8bc3d
🎞️ fix: Deliver Opted-In Custom Endpoint Media Safely (#15937)
danny-avila Sep 14, 2026
1396946
🪓 ci: Cull Stale Codegraph Select Runs (#15939)
danny-avila Sep 14, 2026
bc12fad
🕹️ feat: Run Declared Project Actions on Attached Workers (#15943)
danny-avila Sep 14, 2026
d9c5d1c
🔓 fix: Keep Code Approval Mode Selectable Mid-Run (#15938)
danny-avila Sep 14, 2026
e32e9f3
⬆️ chore: bump agents to 3.8.7 (#15947)
upman Sep 14, 2026
5e2a2c6
📖 fix: Preview Extracted Upload Text (#15946)
danny-avila Sep 15, 2026
2ffee7e
🪂 feat: Opt-In Text Fallback for Files No Tool Can Read (#15940)
danny-avila Sep 15, 2026
96cb5e7
🫴 fix: Preserve Queued Follow-Ups Through Handoff (#15942)
danny-avila Sep 15, 2026
dea7346
🧷 feat: Carry Ask User Answers Past Compaction (#15944)
danny-avila Sep 15, 2026
942c959
🧼 fix: Render Agent Description HTML Safely (#15951)
danny-avila Sep 15, 2026
80f93a4
🚚 ci: Make Image Publishing Owner-Agnostic Ahead of the Org Move (#15…
danny-avila Sep 15, 2026
1df4484
📊 chore: bump Helm chart to 2.0.12 (#15950)
danny-avila Sep 15, 2026
21a9edb
🪪 feat: Pass Schedule Identity to MCP Token Providers (#15962)
danny-avila Sep 15, 2026
ed95a9b
🍯 fix: Stop Approval Pauses From Unsealing Code Environments (#15963)
danny-avila Sep 15, 2026
e4f6b01
🧱 fix: Keep Streamed Content When a Turn Fails (#15961)
danny-avila Sep 15, 2026
c80f5a7
🪃 fix: Remember the Last Code Approval Mode (#15973)
lia-by-librechat[bot] Sep 15, 2026
385c6f8
⚗️ refactor: Separate Content, Tool, and Agent Types From the Assista…
lia-by-librechat[bot] Sep 15, 2026
0da30ed
👆 style: Thumb-Sized Send Button on Touch Devices (#15979)
lia-by-librechat[bot] Sep 16, 2026
35d5a70
🧦 fix: Restore OpenID Refresh After the Session Store TTL Expires (#1…
lia-by-librechat[bot] Sep 16, 2026
52293e1
📓 fix: Keep Typed Text When Starting a New Chat (#15985)
lia-by-librechat[bot] Sep 16, 2026
873330b
⏮️ fix: Keep the Last Keystrokes When a Run Finishes (#15987)
lia-by-librechat[bot] Sep 16, 2026
4d08bcf
⛓️ fix: Bind Programmatic Bash to Selected Workspaces (#15992)
danny-avila Sep 16, 2026
8fa56b0
🎚️ fix: Allow Opting Out of the MCP OAuth `resource` Parameter (#15982)
lia-by-librechat[bot] Sep 16, 2026
be54587
🪒 fix: Strip Cache-Bust Suffixes From Every Local File Read (#15991)
lia-by-librechat[bot] Sep 16, 2026
299dbc6
📖 Load Repository Instructions for Attached Workspaces (#16008)
danny-avila Sep 16, 2026
182cce5
🛎️ fix: Route Background Tool Handoffs (#15990)
danny-avila Sep 16, 2026
cacc148
🔅 style: Theme the Tool Approval Decision Fields (#16014)
lia-by-librechat[bot] Sep 16, 2026
3012a20
🪑 fix: Explain Workspace Capacity Timeouts (#16016)
danny-avila Sep 16, 2026
6d9f427
🏛️ fix: Resolve Global Access Roles for Tenant Owner Grants (#15986)
lia-by-librechat[bot] Sep 16, 2026
69f0dd2
🔌 feat: OpenAPI spec and docs for the public Agents API (#15928)
AtefBellaaj Sep 16, 2026
96eae2b
🖨️ fix: Regenerate the Agents OpenAPI Spec With `repositoryInstructio…
lia-by-librechat[bot] Sep 16, 2026
a26a670
📪 feat: Send Per-Request MCP Headers Without Hiding the Tool Catalog …
lia-by-librechat[bot] Sep 16, 2026
44af4d3
📖 fix: Verify Agents OpenAPI contracts and disable external reporting…
dustinhealy Sep 16, 2026
c153c40
🪜 feat: Trace Viewer Steps, Sequence Scale and Previews (#16009)
danny-avila Sep 16, 2026
9e83b10
📭 fix: Deliver Attachment Text Until a File Tool Holds It (#16027)
lia-by-librechat[bot] Sep 16, 2026
aa5945b
🌐 fix(locales): correct English setting descriptions (#16023)
simpleqt Sep 16, 2026
9633edc
🗣️ fix: Keep Provider Error Text on Unclassified Agent Failures (#16034)
berry-13 Sep 17, 2026
2452f49
🗼 fix: Serialize MCP OAuth Token Refresh Across Replicas (#15993)
lia-by-librechat[bot] Sep 17, 2026
12d7890
👛 fix: Drop Unread Credentials From MCP Domain Validation (#16035)
SpectralOne Sep 17, 2026
6d17402
perf: incremental splitMarkdownIntoBlocks for append-only streaming
berry-13 Sep 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
37 changes: 37 additions & 0 deletions .claude/skills/codebase-design/DEEPENING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# Deepening

How to deepen a cluster of shallow modules safely, given its dependencies. Assumes the vocabulary in [SKILL.md](SKILL.md) — **module**, **interface**, **seam**, **adapter**.

## Dependency categories

When assessing a candidate for deepening, classify its dependencies. The category determines how the deepened module is tested across its seam.

### 1. In-process

Pure computation, in-memory state, no I/O. Always deepenable — merge the modules and test through the new interface directly. No adapter needed.

### 2. Local-substitutable

Dependencies that have local test stand-ins (PGLite for Postgres, in-memory filesystem). Deepenable if the stand-in exists. The deepened module is tested with the stand-in running in the test suite. The seam is internal; no port at the module's external interface.

### 3. Remote but owned (Ports & Adapters)

Your own services across a network boundary (microservices, internal APIs). Define a **port** (interface) at the seam. The deep module owns the logic; the transport is injected as an **adapter**. Tests use an in-memory adapter. Production uses an HTTP/gRPC/queue adapter.

Recommendation shape: *"Define a port at the seam, implement an HTTP adapter for production and an in-memory adapter for testing, so the logic sits in one deep module even though it's deployed across a network."*

### 4. True external (Mock)

Third-party services (Stripe, Twilio, etc.) you don't control. The deepened module takes the external dependency as an injected port; tests provide a mock adapter.

## Seam discipline

- **One adapter means a hypothetical seam. Two adapters means a real one.** Don't introduce a port unless at least two adapters are justified (typically production + test). A single-adapter seam is just indirection.
- **Internal seams vs external seams.** A deep module can have internal seams (private to its implementation, used by its own tests) as well as the external seam at its interface. Don't expose internal seams through the interface just because tests use them.

## Testing strategy: replace, don't layer

- Old unit tests on shallow modules become waste once tests at the deepened module's interface exist — delete them.
- Write new tests at the deepened module's interface. The **interface is the test surface**.
- Tests assert on observable outcomes through the interface, not internal state.
- Tests should survive internal refactors — they describe behaviour, not implementation. If a test has to change when the implementation changes, it's testing past the interface.
44 changes: 44 additions & 0 deletions .claude/skills/codebase-design/DESIGN-IT-TWICE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
# Design It Twice

When the user wants to explore alternative interfaces for a chosen deepening candidate, use this parallel sub-agent pattern. Based on "Design It Twice" (Ousterhout) — your first idea is unlikely to be the best.

Uses the vocabulary in [SKILL.md](SKILL.md) — **module**, **interface**, **seam**, **adapter**, **leverage**.

## Process

### 1. Frame the problem space

Before spawning sub-agents, write a user-facing explanation of the problem space for the chosen candidate:

- The constraints any new interface would need to satisfy
- The dependencies it would rely on, and which category they fall into (see [DEEPENING.md](DEEPENING.md))
- A rough illustrative code sketch to ground the constraints — not a proposal, just a way to make the constraints concrete

Show this to the user, then immediately proceed to Step 2. The user reads and thinks while the sub-agents work in parallel.

### 2. Spawn sub-agents

Spawn 3+ sub-agents in parallel. Each must produce a **radically different** interface for the deepened module.

Prompt each sub-agent with a separate technical brief (file paths, coupling details, dependency category from [DEEPENING.md](DEEPENING.md), what sits behind the seam). The brief is independent of the user-facing problem-space explanation in Step 1. Give each agent a different design constraint:

- Agent 1: "Minimize the interface — aim for 1–3 entry points max. Maximise leverage per entry point."
- Agent 2: "Maximise flexibility — support many use cases and extension."
- Agent 3: "Optimise for the most common caller — make the default case trivial."
- Agent 4 (if applicable): "Design around ports & adapters for cross-seam dependencies."

Include both [SKILL.md](SKILL.md) vocabulary and CONTEXT.md vocabulary in the brief so each sub-agent names things consistently with the architecture language and the project's domain language.

Each sub-agent outputs:

1. Interface (types, methods, params — plus invariants, ordering, error modes)
2. Usage example showing how callers use it
3. What the implementation hides behind the seam
4. Dependency strategy and adapters (see [DEEPENING.md](DEEPENING.md))
5. Trade-offs — where leverage is high, where it's thin

### 3. Present and compare

Present designs sequentially so the user can absorb each one, then compare them in prose. Contrast by **depth** (leverage at the interface), **locality** (where change concentrates), and **seam placement**.

After comparing, give your own recommendation: which design you think is strongest and why. If elements from different designs would combine well, propose a hybrid. Be opinionated — the user wants a strong read, not a menu.
21 changes: 21 additions & 0 deletions .claude/skills/codebase-design/LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
MIT License

Copyright (c) 2026 Matt Pocock

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
114 changes: 114 additions & 0 deletions .claude/skills/codebase-design/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
---
name: codebase-design
description: Shared vocabulary for designing deep modules. Use when the user wants to design or improve a module's interface, find deepening opportunities, decide where a seam goes, make code more testable or AI-navigable, or when another skill needs the deep-module vocabulary.
---

# Codebase Design

Design **deep modules**: a lot of behaviour behind a small interface, placed at a clean seam, testable through that interface. Use this language and these principles wherever code is being designed or restructured. The aim is leverage for callers, locality for maintainers, and testability for everyone.

## Glossary

Use these terms exactly — don't substitute "component," "service," "API," or "boundary." Consistent language is the whole point.

**Module** — anything with an interface and an implementation. Deliberately scale-agnostic: a function, class, package, or tier-spanning slice. _Avoid_: unit, component, service.

**Interface** — everything a caller must know to use the module correctly: the type signature, but also invariants, ordering constraints, error modes, required configuration, and performance characteristics. _Avoid_: API, signature (too narrow — they refer only to the type-level surface).

**Implementation** — what's inside a module, its body of code. Distinct from **Adapter**: a thing can be a small adapter with a large implementation (a Postgres repo) or a large adapter with a small implementation (an in-memory fake). Reach for "adapter" when the seam is the topic; "implementation" otherwise.

**Depth** — leverage at the interface: the amount of behaviour a caller (or test) can exercise per unit of interface they have to learn. A module is **deep** when a large amount of behaviour sits behind a small interface, **shallow** when the interface is nearly as complex as the implementation.

**Seam** _(Michael Feathers)_ — a place where you can alter behaviour without editing in that place; the *location* at which a module's interface lives. Where to put the seam is its own design decision, distinct from what goes behind it. _Avoid_: boundary (overloaded with DDD's bounded context).

**Adapter** — a concrete thing that satisfies an interface at a seam. Describes *role* (what slot it fills), not substance (what's inside).

**Leverage** — what callers get from depth: more capability per unit of interface they learn. One implementation pays back across N call sites and M tests.

**Locality** — what maintainers get from depth: change, bugs, knowledge, and verification concentrate in one place rather than spreading across callers. Fix once, fixed everywhere.

## Deep vs shallow

**Deep module** = small interface + lots of implementation:

```
┌─────────────────────┐
│ Small Interface │ ← Few methods, simple params
├─────────────────────┤
│ │
│ Deep Implementation│ ← Complex logic hidden
│ │
└─────────────────────┘
```

**Shallow module** = large interface + little implementation (avoid):

```
┌─────────────────────────────────┐
│ Large Interface │ ← Many methods, complex params
├─────────────────────────────────┤
│ Thin Implementation │ ← Just passes through
└─────────────────────────────────┘
```

When designing an interface, ask:

- Can I reduce the number of methods?
- Can I simplify the parameters?
- Can I hide more complexity inside?

## Principles

- **Depth is a property of the interface, not the implementation.** A deep module can be internally composed of small, mockable, swappable parts — they just aren't part of the interface. A module can have **internal seams** (private to its implementation, used by its own tests) as well as the **external seam** at its interface.
- **The deletion test.** Imagine deleting the module. If complexity vanishes, it was a pass-through. If complexity reappears across N callers, it was earning its keep.
- **The interface is the test surface.** Callers and tests cross the same seam. If you want to test *past* the interface, the module is probably the wrong shape.
- **One adapter means a hypothetical seam. Two adapters means a real one.** Don't introduce a seam unless something actually varies across it.

## Designing for testability

Good interfaces make testing natural:

1. **Accept dependencies, don't create them.**

```typescript
// Testable
function processOrder(order, paymentGateway) {}

// Hard to test
function processOrder(order) {
const gateway = new StripeGateway();
}
```

2. **Return results, don't produce side effects.**

```typescript
// Testable
function calculateDiscount(cart): Discount {}

// Hard to test
function applyDiscount(cart): void {
cart.total -= discount;
}
```

3. **Small surface area.** Fewer methods = fewer tests needed. Fewer params = simpler test setup.

## Relationships

- A **Module** has exactly one **Interface** (the surface it presents to callers and tests).
- **Depth** is a property of a **Module**, measured against its **Interface**.
- A **Seam** is where a **Module**'s **Interface** lives.
- An **Adapter** sits at a **Seam** and satisfies the **Interface**.
- **Depth** produces **Leverage** for callers and **Locality** for maintainers.

## Rejected framings

- **Depth as ratio of implementation-lines to interface-lines** (Ousterhout): rewards padding the implementation. We use depth-as-leverage instead.
- **"Interface" as the TypeScript `interface` keyword or a class's public methods**: too narrow — interface here includes every fact a caller must know.
- **"Boundary"**: overloaded with DDD's bounded context. Say **seam** or **interface**.

## Going deeper

- **Deepening a cluster given its dependencies** — see [DEEPENING.md](DEEPENING.md): dependency categories, seam discipline, and replace-don't-layer testing.
- **Exploring alternative interfaces** — see [DESIGN-IT-TWICE.md](DESIGN-IT-TWICE.md): spin up parallel sub-agents to design the interface several radically different ways, then compare on depth, locality, and seam placement.
3 changes: 3 additions & 0 deletions .claude/skills/codebase-design/agents/openai.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
interface:
display_name: "Codebase Design"
short_description: "Vocabulary for deep-module design"
123 changes: 123 additions & 0 deletions .claude/skills/improve-codebase-architecture/HTML-REPORT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
# HTML Report Format

The architectural review is rendered as a single self-contained HTML file in the OS temp directory. Tailwind and Mermaid both come from CDNs. Mermaid handles graph-shaped diagrams reliably; hand-built divs and inline SVG handle the more editorial visuals (mass diagrams, cross-sections). Mix the two — don't lean on Mermaid for everything, it'll start to look generic.

## Scaffold

```html
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>Architecture review — {{repo name}}</title>
<script src="https://cdn.tailwindcss.com"></script>
<script type="module">
import mermaid from "https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs";
mermaid.initialize({ startOnLoad: true, theme: "neutral", securityLevel: "loose" });
</script>
<style>
/* small custom layer for things Tailwind doesn't cover cleanly:
dashed seam lines, hand-drawn-feeling arrow heads, etc. */
.seam { stroke-dasharray: 4 4; }
.leak { stroke: #dc2626; }
.deep { background: linear-gradient(135deg, #0f172a, #1e293b); }
</style>
</head>
<body class="bg-stone-50 text-slate-900 font-sans">
<main class="max-w-5xl mx-auto px-6 py-12 space-y-12">
<header>...</header>
<section id="candidates" class="space-y-10">...</section>
<section id="top-recommendation">...</section>
</main>
</body>
</html>
```

## Header

Repo name, date, and a compact legend: solid box = module, dashed line = seam, red arrow = leakage, thick dark box = deep module. No introduction paragraph — straight into the candidates.

## Candidate card

The diagrams carry the weight. Prose is sparse, plain, and uses the glossary terms (from the `/codebase-design` skill) without ceremony.

Each candidate is one `<article>`:

- **Title** — short, names the deepening (e.g. "Collapse the Order intake pipeline").
- **Badge row** — recommendation strength (`Strong` = emerald, `Worth exploring` = amber, `Speculative` = slate), plus a tag for the dependency category (`in-process`, `local-substitutable`, `ports & adapters`, `mock`).
- **Files** — monospaced list, `font-mono text-sm`.
- **Before / After diagram** — the centrepiece. Two columns, side by side. See patterns below.
- **Problem** — one sentence. What hurts.
- **Solution** — one sentence. What changes.
- **Wins** — bullets, ≤6 words each. e.g. "Tests hit one interface", "Pricing logic stops leaking", "Delete 4 shallow wrappers".
- **ADR callout** (if applicable) — one line in an amber-tinted box.

No paragraphs of explanation. If the diagram needs a paragraph to be understood, redraw the diagram.

## Diagram patterns

Pick the pattern that fits the candidate. Mix them. Don't make every diagram look the same — variety is part of the point.

### Mermaid graph (the workhorse for dependencies / call flow)

Use a Mermaid `flowchart` or `graph` when the point is "X calls Y calls Z, and look at the mess." Wrap it in a Tailwind-styled card so it doesn't feel parachuted in. Style with classDef to colour leakage edges red and the deep module dark. Sequence diagrams work well for "before: 6 round-trips; after: 1."

```html
<div class="rounded-lg border border-slate-200 bg-white p-4">
<pre class="mermaid">
flowchart LR
A[OrderHandler] --> B[OrderValidator]
B --> C[OrderRepo]
C -.leak.-> D[PricingClient]
classDef leak stroke:#dc2626,stroke-width:2px;
class C,D leak
</pre>
</div>
```

### Hand-built boxes-and-arrows (when Mermaid's layout fights you)

Modules as `<div>`s with borders and labels. Arrows as inline SVG `<line>` or `<path>` elements positioned absolutely over a relative container. Reach for this when you want the "after" diagram to feel like one thick-bordered deep module with greyed-out internals — Mermaid won't render that with the right weight.

### Cross-section (good for layered shallowness)

Stack horizontal bands (`h-12 border-l-4`) to show layers a call passes through. Before: 6 thin layers each doing nothing. After: 1 thick band labelled with the consolidated responsibility.

### Mass diagram (good for "interface as wide as implementation")

Two rectangles per module — one for interface surface area, one for implementation. Before: interface rectangle is nearly as tall as the implementation rectangle (shallow). After: interface rectangle is short, implementation rectangle is tall (deep).

### Call-graph collapse

Before: a tree of function calls rendered as nested boxes. After: the same tree collapsed into one box, with the now-internal calls shown faded inside it.

## Style guidance

- Lean editorial, not corporate-dashboard. Generous whitespace. Serif optional for headings (`font-serif` works well with stone/slate).
- Colour sparingly: one accent (emerald or indigo) plus red for leakage and amber for warnings.
- Keep diagrams ~320px tall so before/after sits comfortably side by side without scrolling.
- Use `text-xs uppercase tracking-wider` for module labels inside diagrams — they should read as schematic, not as UI.
- The only scripts are the Tailwind CDN and the Mermaid ESM import. The report is otherwise static — no app code, no interactivity beyond Mermaid's own rendering.

## Top recommendation section

One larger card. Candidate name, one sentence on why, anchor link to its card. That's it.

## Tone

Plain English, concise — but the architectural nouns and verbs come straight from the `/codebase-design` skill. Concision is not an excuse to drift.

**Use exactly:** module, interface, implementation, depth, deep, shallow, seam, adapter, leverage, locality.

**Never substitute:** component, service, unit (for module) · API, signature (for interface) · boundary (for seam) · layer, wrapper (for module, when you mean module).

**Phrasings that fit the style:**

- "Order intake module is shallow — interface nearly matches the implementation."
- "Pricing leaks across the seam."
- "Deepen: one interface, one place to test."
- "Two adapters justify the seam: HTTP in prod, in-memory in tests."

**Wins bullets** name the gain in glossary terms: *"locality: bugs concentrate in one module"*, *"leverage: one interface, N call sites"*, *"interface shrinks; implementation absorbs the wrappers"*. Don't write *"easier to maintain"* or *"cleaner code"* — those terms aren't in the glossary and don't earn their place.

No hedging, no throat-clearing, no "it's worth noting that…". If a sentence could be a bullet, make it a bullet. If a bullet could be cut, cut it. If a term isn't in the `/codebase-design` glossary, reach for one that is before inventing a new one.
Loading
Loading