
Claude Code와 Codex를 위한 워크스페이스
명령, 파일, diff가 모두 그대로 보입니다. 그래서 에이전트가 쓰는 코드를 이해할 수 있습니다.
2024년부터 Kiryl Kazlovich가 매일 직접 쓰면서 다듬고 있습니다.
Find the rounding calls
Each line is rounded before tax, and the rounded lines are added up. I’ll round once, on the total.
Run the checkout tests
The total is now rounded once. All 14 checkout tests pass.
Opus 5.5 · High reasoning
Check the rounding change in cart-total.ts…
The cart total is correct now. taxTotal still rounds each line.
One gap: tax-total.ts still rounds each line…
I sent the gap to the fix session.

Each line is rounded before the sum. I will round once, after tax.
The total is rounded once. All 14 checkout tests pass.
Check the rounding change in cart-total.ts…
One gap: tax-total.ts still rounds each line…
taxTotal rounds each line, as the cart did. I will round once, on the total.
The tax is rounded once, on the total. All 19 tests pass.
The tax path is fixed. Check tax-total.ts again…
세션마다 에이전트 선택
Claude Code나 Codex로 세션을 시작하세요. 두 에이전트는 같은 프로젝트에서 동시에 작업할 수 있고, 사이드바 하나에 모든 세션이 나열됩니다.
I’ll trace how the cart total is rounded.
Find the rounding calls
Each line is rounded before tax, and the rounded lines are added up. I’ll round once, on the total.
Run the checkout tests
The total is now rounded once. All 14 checkout tests pass.
Opus 5.5 · High reasoning
여러 Claude 계정과 ChatGPT 계정 사용
데스크톱에서 Claude 계정과 ChatGPT 구독을 추가하세요. 계정마다 한도가 표시됩니다. 다음 턴에 쓸 계정은 데스크톱에서 클릭 한 번, 휴대폰에서 탭 한 번으로 바꿉니다.
How the agents write their replies. Claude uses a change from your next message. Codex uses a change in new sessions. An older Codex session can change after Codex compacts its context.
How fast the weekly limit fills, from readings this desktop keeps.
- Peak day
- 286M
- Current streak
- 5 days
- Longest streak
- 12 days
- All time
- 21.4B
Each subscription is a ChatGPT account with its own limits. Sessions use the one in use.
How the agents write their replies. Claude uses a change from your next message. Codex uses a change in new sessions. An older Codex session can change after Codex compacts its context.
How fast the weekly limit fills, from readings this desktop keeps.
Every account reads the same Claude sessions. New turns run on the one in use.
에이전트가 작업하는 동안 모든 단계 표시
검색, 파일 읽기, 명령, 편집이 각각 스레드에 행으로 표시됩니다. 턴 도중에 메시지를 보내면 에이전트가 현재 단계를 마친 뒤 읽습니다. 메시지를 대기열에 넣어 다음 턴에 보낼 수도 있습니다.
refundTotal rounds each line, like the cart did. I’ll look at the receipt from the report first.
Run the refund tests
Run the refund tests
Refunds now use half-even rounding, the same as invoices.
What changed
refundTotalrounds once, on the sum of the lines.roundHalfEvenis the one helper for cart, refunds, and invoices.
Run all checkout tests
refundTotal rounds each line, like the cart did. I’ll look at the receipt from the report first.
Run the refund tests
Run the refund tests
Refunds now use half-even rounding, the same as invoices.
What changed
refundTotalrounds once, on the sum of the lines.roundHalfEvenis the one helper for cart, refunds, and invoices.
Run all checkout tests
채팅 옆에서 명령, 파일, diff 열기
행을 클릭하면 스레드 옆에 열립니다. 코드에는 구문 강조가 적용됩니다. Markdown과 HTML은 페이지로, CSV는 표로 표시되고, diff는 이전 줄과 새 줄을 보여 줍니다.
Run the checkout tests
Run the checkout tests
The summary page is docs/checkout-totals.html. The rule follows docs.taxlib.dev/rounding.
Rounding
Totals are rounded once, after tax. Use round() from the money module, never toFixed.
Half-even, to the cent
docs/checkout-totals.html
How checkout totals are calculated
Round once, on the total.
Some carts were off by a cent. Each line was rounded before tax, so small errors added up.
https://docs.taxlib.dev/rounding
Rounding rules
Round a monetary amount one time, at the end of the calculation. Rounding in the middle moves the result.
Invoices use half-even rounding. An amount that ends in exactly half a cent goes to the nearest even cent.
See Half-even rounding for the full table.
src/checkout/cart-total.ts
- 명령 출력명령 출력
- 코드코드
- MarkdownMarkdown
- HTMLHTML
- 웹 페이지웹 페이지
- DiffDiff
- 이미지이미지
- CSV
- 오디오
- 영상
- 폴더폴더
모든 서브에이전트 보기
에이전트가 서브에이전트나 워크플로를 시작하면 Agents 목록에 각각 모델, 토큰, 시간과 함께 표시됩니다. 워크플로는 단계도 표시합니다. 에이전트를 클릭하면 전체 스레드를 읽을 수 있습니다.
Review the cart totals in src/checkout/cart-total.ts. Report each defect with its line.
Review the tax path in src/checkout/tax-total.ts. Report each defect with its line.
Find the checkout paths that have no test. List each path.
Review the rounding fix in src/checkout, verify each finding, and run the tests
Review the rounding fix in src/checkout, verify each finding, and run the tests
Three subagents reviewed the fix. Hopper found that taxTotal() still rounds each line. Turing found that no test has tax on more than one line.
GPT 6 Astra · High reasoning
The review workflow is complete. Four agents ran in three phases. One finding holds: taxTotal() still rounds each line. An order with three lines can be off by one cent.
Review the tax path of the rounding fix in src/checkout. Report each finding with its line
Completed·Opus 5.5·high·118k tokens·9 tools·4 min·2 min ago
Run the tax tests
The review of the tax path is complete. It has one finding, and a new test fails on it.
What I found
Line rounding: src/checkout/tax-total.ts rounds each line in taxTotal(), then adds the lines. The cart rounds one time, after the sum.
Failing case: three lines of 0.336 give 1.02. The correct tax is 1.01.
Checks run
pnpm vitest run tax-total: 6 passed, 1 failed (the new case).
pnpm tsc --noEmit: passed.
세션이 서로 메시지를 보냅니다
Claude Code 세션이 Codex 세션에 변경 사항을 확인해 달라고 요청할 수 있습니다. 답변은 Claude Code 스레드에 도착합니다. 에이전트가 새 세션을 시작해 작업을 맡길 수도 있습니다.
Claude CodeFix checkout rounding
Both totals now use half-even rounding. I’ll ask the review session to check the change.
Both totals now use half-even rounding. I’ll ask the review session to check the change.
CodexReview rounding fix
GPT 6 Astra · High reasoning
GPT 6 Astra · High reasoning
휴대폰에서 세션을 제어하세요
iPhone 앱과 Android 앱은 데스크톱에서 실행 중인 세션을 엽니다. 휴대폰에서 타임라인을 읽고 다음 메시지를 보내세요.
- 13:00
Each line is rounded before the sum. I will round once, after tax.
cart-total.ts+9-4src/checkout/Run the checkout tests$pnpm test checkoutThe total is rounded once. All 14 checkout tests pass.
This sessionReview rounding fixSentCheck the rounding change in cart-total.ts…
Review rounding fixThis sessionOne gap: tax-total.ts still rounds each line…
Fix the tax path the same way.Read tax-total.tssrc/checkout/taxTotal rounds each line, as the cart did. I will round once, on the total.
tax-total.ts+12-5src/checkout/Run the tax tests$pnpm test taxThe tax is rounded once, on the total. All 19 tests pass.
This sessionReview rounding fixSentThe tax path is fixed. Check tax-total.ts again…
0:380:510:500:490:480:470:460:450:440:430:420:410:400:390:38세션 타임라인
실행 중인 세션의 모든 명령, 파일 변경, 메시지가 표시됩니다. 행을 탭하면 열립니다.
- 13:00
Each line is rounded before the sum. I will round once, after tax.
cart-total.ts+9-4src/checkout/Run the checkout tests$pnpm test checkoutThe total is rounded once. All 14 checkout tests pass.
This sessionReview rounding fixSentCheck the rounding change in cart-total.ts…
Review rounding fixThis sessionOne gap: tax-total.ts still rounds each line…
Fix the tax path the same way.Read tax-total.tssrc/checkout/taxTotal rounds each line, as the cart did. I will round once, on the total.
tax-total.ts+12-5src/checkout/Run the tax tests$pnpm test taxThe tax is rounded once, on the total. All 19 tests pass.
This sessionReview rounding fixSentThe tax path is fixed. Check tax-total.ts again…
0:52Loading sessionsMacBook ProMac StudioOffice PCTax label copyshop-web · 3dCoupon stacking ordershop-api · 1dTax rate lookupshop-api · 1dCart badge flickershop-web · 6mRefund path testsshop-api · 4hReview rounding fixshop-api · 2mNew SessionCreate in current projectFix checkout roundingshop-api · nowDictateEditSub-agentsQueueReviewProjectFilesChatChangesSettings세션 전환기
메뉴 버튼을 탭해 데스크톱과 세션을 선택하거나 새 세션을 시작하세요.
- 13:00Message agentDone
Use half-even rounding for tax too.
0:000:070:060:050:040:030:020:010:00Edit transcriptTranscribingDecoding your audio…Opus 5.5High받아쓰기
메시지를 말하세요. 텍스트를 확인한 뒤 보내세요.
- 13:00Chat SettingsDoneModelsReasoningFable 5.1Opus 5.5Sonnet 5Haiku 4.5LowMediumHighExtra HighMaxDefaultAccessPlan modeClaude reads and plans. It asks before itchanges files or runs commands.Accept editsClaude edits files without asking. It asksbefore it runs commands.Auto modeClaude’s safety check approves routineactions. Risky actions still ask.Bypass permissionsClaude runs every tool without asking.ModelsReasoningAstra 6Sol 5.6Terra 5.6Luna 5.6LowMediumHighExtra HighMaxUltraSpeedStandardStandard speed and credit usage.FastAbout 1.5x faster; uses more credits.AccessRead onlyInspect and explain without editing files.Full autoRun automatically within the project;broader access still requires approval.
Chat Settings
모델과 추론 수준을 표 하나에서 선택하세요. 그런 다음 에이전트의 액세스 수준을 선택하세요.
- 13:00Loading changes...fix/checkout-rounding161Lines133Added28Deleted10Files0Staged10Unstaged2Newsrccheckoutrefund-total.ts+12−5rounding.ts+18−7totals.ts+4−9ordersorder-summary.ts+3−3shared/moneyhalf-even.ts+22testscheckoutrefund-total.test.ts+31rounding.test.ts+24−2fixturesrefunds.json+16−1CHANGELOG.md+2package.json+1−1ProjectFilesChatChangesSettingsrefund-total.tssrc/checkout1@@ -1,4 +1,5 @@2import type { LineItem } from './totals';3−import { roundLine } from './rounding';4+import { orderTotal } from './rounding';5+import type { Refund } from '../orders/order-summary';67/** What a customer gets back for returned items. */8@@ -9,7 +10,13 @@ export function refundFor(9 items: LineItem[],10 returned: Set<string>,11−): number {12− return items13− .filter((item) => returned.has(item.sku))14− .reduce((sum, item) => sum + roundLine(item), 0);15+): Refund {16+ const back = items.filter((item) =>17+ returned.has(item.sku),18+ );19+ // Round once, on the total, as the order does.20+ const amount = orderTotal(back);21+ return {22+ amount,23+ lines: back.length,24+ };25}Donerounding.tssrc/checkout1@@ -1,8 +1,8 @@2import type { LineItem } from './totals';3+import { halfEven } from '../shared/money/half-even';45−const CENTS = 100;6−7−export function roundLine(amount: number): number {8− return Math.round(amount * CENTS) / CENTS;9+/** Amounts stay in minor units until the last step. */10+export function toMinor(amount: number): number {11+ return amount * 100;12}1314@@ -12,8 +12,19 @@ export function lineTotal(item: LineItem)15 const net = item.unitPrice * item.quantity;16− return roundLine(net * (1 + item.taxRate));17+ return net * (1 + item.taxRate);18}1920−export function orderTotal(items: LineItem[]): number {21− return items.reduce((sum, item) => sum + lineTotal(item), 0);22+/**23+ * Rounds once, on the total. Rounding each line24+ * first lost up to one cent per order.25+ */26+export function orderTotal(items: LineItem[]): number {27+ let sum = 0;28+ for (const item of items) {29+ sum += lineTotal(item);30+ }31+ return halfEven(toMinor(sum)) / 100;32}3334+export function refundTotal(items: LineItem[]): number {35+ return -orderTotal(items);36+}1 / 102 / 10
Changes 탭
프로젝트의 변경된 파일이 줄 수와 함께 표시됩니다. 파일을 탭하면 diff를 읽을 수 있습니다.
- 13:00ClaudeAnthropic · Max planwork@acme.devme@hey.comLimits5h3% left96% leftResets 11:40 AMResets 2:25 PMWeekly64% left58% leftResets Oct 7 at 2:00 PMResets Oct 6 at 8:30 AMWeekly · Fable82% left100% leftResets Oct 7 at 2:00 PMResets Oct 6 at 8:30 AMUsage over timeWeekly limit used36% now42% now100%50%0%ThuFri
The desktop keeps a reading each time it checks
the limits.Accountswork@acme.devThis computer, shared with other Claudeapps5h 3% · Weekly 64%Maxme@hey.comAdded in HB Code5h 96% · Weekly 58%MaxAdd Claude accounts on the desktop.
Claude한도와 계정
각 한도가 얼마나 남았는지 확인하세요. 다른 계정을 탭하면 다음 턴부터 그 계정을 사용합니다.
- 13:001:031:121:111:101:091:081:071:061:051:041:03Fix checkout roundingThis session
Check the rounding change in cart-total.ts…
Read cart-total.tssrc/checkout/$rg "Math.round" src/checkoutThe cart total is correct now. taxTotal still rounds each line.
CheckResultCart totalCorrectTax totalRounds each lineThis sessionFix checkout roundingSentOne gap: tax-total.ts still rounds each line…
I sent the gap to the fix session.
Task complete·1 min 12 sGPT 6 Astra · High reasoningAndroid의 타임라인
Android 앱도 같은 행을 보여 줍니다. 턴마다 Task complete 표시로 끝납니다.
- 13:00shop-webSessionsCart badge flicker12:54 PMTax label copyOct 6Cart drawer focus trapOct 6Product image lazy loadOct 5Search filter chipsOct 3Wishlist syncOct 2Price format in cartSep 30Checkout button stateSep 29ProjectFilesChatChangesSettings
Android의 Project 탭
프로젝트의 모든 세션이 목록 하나에 표시됩니다. 세션을 탭하면 열립니다.
- 13:00rounding.mddocs/checkoutDone
Checkout rounding
The cart and the tax round one time, on the total. The rule is in cart-total.ts.
Example order
LineAmountSubtotal$44.50Coupon VIP10-$4.45Tax$3.30Total$43.35Rule
- 1.Add the lines and the coupon.
- 2.Add the tax.
- 3.Round the result one time, to the cent.
1 of 4Android의 파일 미리 보기
파일 탭에서 프로젝트 파일을 여세요. Markdown은 서식이 적용된 텍스트로 표시됩니다.
HB Code가 두 에이전트에 추가하는 도구
Claude Code 세션과 Codex 세션 모두 이 도구를 씁니다. 필요한 것을 말하면 에이전트가 도구를 선택합니다.
- Create explainer videoThe cart rounding fixRendering frames: 630 / 1260Writing scenesCreating narrationRendering frames: 630 / 1260Checking framesRevision 1
The cart rounding fix
Rendering frames: 630 / 1260Writing scenesCreating narrationRendering frames: 630 / 1260Checking framesChecking frames
- Agent
- Claude
- Revision
- 1
- Scenes
- 4
- Video length
- 42.0 seconds
video-cart-rounding-fix.mp4ReviewThe total is rounded once, after tax
SubtotalTaxRound onceTotal00:18 / 00:421x설명 영상
에이전트가 요청 내용으로 30~120초 길이의 내레이션 영상을 만듭니다. 영상은 데스크톱과 휴대폰에서 재생됩니다.
- Open browser pageRounding rules — taxlib.devClick "Half-even rule"Rounding rules — taxlib.devExtracted pageHalf-even rule — taxlib.devRounding rulesHalf-even ruledocs.taxlib.dev/rounding/half-even
Rounding rules
Round a money value once, at the end of the calculation.
Rounding at every step can move a total by a cent.
Half-even rule
HB CodeClick “Half-even rule”Read the pageClick “Half-even rule”Read the pageHalf-even rule
A value exactly halfway between two cents goes to the even cent.
Over many totals, the rounding errors cancel out.
내 Chrome 브라우저
에이전트가 내 Chrome에서 웹을 검색하고, 페이지를 읽고, 클릭하고, 입력합니다. 페이지의 라벨에 각 동작의 이름이 표시됩니다.
- Explain the rounding fix as audio.Generate speechThe rounding fix, explained · SulafatThe total is rounded once, after tax.
The rounding fix, explained
Playing0:000:380:420:460:500:540:581:021:061:101:141:181:221:261:301:341:381:421:461:501:54/ 3:10음성
에이전트가 답변이나 설명을 오디오 파일로 만듭니다. 데스크톱이나 휴대폰에서 재생하세요.
- Get the setup steps from this tutorial.Extract video contextTutorial · YouTubeFind the steps to set up half-even rounding.
The video gives three steps:
- 1.Install the tax library. (02:10)
- 2.Set the rounding mode to half-even. (05:40)
- 3.Round the total one time, after tax. (09:15)
영상에서 만든 메모
에이전트가 YouTube 영상이나 녹화본에서 단계, 명령, 결정 사항을 가져옵니다.
- Mobile notificationRefund tests passAll 15 tests pass. The diff is ready for your review.
Friday, October 9
13:02
Refund tests passnowAll 15 tests pass. The diff is ready for your review.
휴대폰 알림
작업이 완료되거나, 실패하거나, 내 결정이 필요하면 에이전트가 휴대폰에 알림을 보냅니다.
설명 영상, 음성, 영상 메모는 내 Gemini API 키를 사용합니다. 브라우저 도구에는 Chrome용 HB Code Browser Bridge 확장 프로그램이 필요합니다. 휴대폰 알림에는 알림 설정과 연결된 휴대폰이 필요합니다.
매일 하는 작업을 위해 만들었습니다
HB Code는 Claude Code를 Anthropic의 Claude Agent SDK로 실행하고, Codex를 OpenAI Codex app-server의 자체 빌드로 실행합니다. 각 에이전트는 자체 기록과 자체 로그인을 유지합니다.
- 13:002 Queued MessagesDoneWaiting for desktopSendingAccepted
Add a test for zero-quantity lines.
Waiting for desktopSendingAcceptedThen run the checkout tests again.
메시지는 데스크톱을 기다립니다
휴대폰이 데스크톱에 연결되지 않으면 메시지는 휴대폰에서 기다립니다. 연결이 돌아오면 전송되고, 다시 시도해도 두 번 전송되지 않습니다.
New session
In shop-api. The agent stays fixed for the session.
Agent
CodexClaudeStart a new conversationOr continue a saved Claude conversation
Tax rounding notes12 min agoWhere does the tax path round a value?CancelStart Claude sessionContinue conversation저장된 대화 이어 가기
에이전트가 프로젝트 폴더에 저장한 대화에서 세션을 시작하세요. Claude Code에서는 터미널에서 나눈 대화도 포함됩니다. 다시 시작한 뒤에도 각 세션은 전체 기록과 함께 열립니다.
Color theme
Each theme has a light and a dark version. The change applies immediately.
HB CodeHB CodeGraphiteCatppuccinNordNordSolarizedGruvboxGruvboxRosé PineTokyo NightTokyo NightEverforestOne열 가지 색상 테마
테마마다 라이트 버전과 다크 버전이 있습니다. 휴대폰은 데스크톱에서 선택한 테마를 사용합니다.
- cart.tsAutosrc/checkout/cart.ts1import { round } from './money';23// Round once, after tax.4export function total(cart: Cart) {5 const net = sum(cart.lines);6 const tax = net * cart.taxRate;7 return round(net + tax, 2);8}910function sum(lines: Line[]) {11 return lines.reduce(addLine, 0);12}
명령과 파일의 구문 강조
명령에는 셸 구문 강조가 적용되고, 명령 안의 스크립트에는 그 언어의 구문 강조가 적용됩니다. 파일은 구문 강조, 줄 번호와 함께 열립니다.
HB Code 다운로드
Mac이나 Windows PC에는 데스크톱 앱을 설치하세요. 휴대폰에서 세션을 제어하려면 iPhone 앱이나 Android 앱을 설치하세요.
Mac 앱에는 macOS 12 이상의 Apple 실리콘 Mac(M1 이상)이 필요합니다.