Repository navigation
Conversation
The engine starts as @costexplorer/core: the cost record schema aligned to the FOCUS columns, money math that adds in micro-dollars, and the Finding contract with ranking. The app stays at the repository root and packages live beside it. Vitest runs the package tests with a 90% coverage threshold. Lint keeps React and Next.js out of the engine packages. Claude-Session: https://claude.ai/code/session_01WTtRZcdke1yYdYUAanaf7V
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
This branch was successfully deployed
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.
Why
The engine has to exist as packages a command-line tool and a worker can run, separate from the Next.js app. This adds the workspace and the first package, which every later package depends on: the shape of a cost line, the shape of a finding and the money math.
Scope
pnpm-workspace.yamlgainspackages/*. The app stays at the repository root.packages/core(@costexplorer/core, private for now):costRecordSchema, the subset of the FinOps FOCUS columns the analyzers will use, in camelCase.findingSchemaandFinding, the public contract from the plan, withrankFindingsandtotalMonthlySavingUsd.sumUsd,monthlyFromHourly,floorToCentsandHOURS_PER_MONTH.packages/*/src/**/*.test.tsinsidepnpm testand fails under 90% coverage.pnpm typecheckalso runs each package's owntsc. Packages usetsconfig.packages.json, which allows only syntax Node can run without a build.react,react-domandnextimports in every package except a futurepackages/ui.README.md,CONTRIBUTING.md, the guardrails table and the audit are updated.Stacked on #2. Merge #1 and #2 first.
Tradeoffs
Three things in the plan were left out on purpose. Each has a row under "Not adopted" in
docs/engineering-practices.mdsaying when to adopt it.apps/web. It rewrites every check, the feature map and the agent instructions, and no engine code needs it.AGENTS.mddoes not mentionpackages/yet. That file changes only in a pull request of its own, so it is a follow-up.Savings are ranked by dollars alone. Whether confidence should affect the order is a product call, left for review.
Verification
VERIFIED.
pnpm verifyon Node 24.21.0.Each new check was watched failing:
ERROR: Coverage for branches (88.88%) does not meet global threshold (90%)with one comparator branch untested.src/zz.ts(1,14): error TS2322: Type 'string' is not assignable to type 'number'.with a bad file added and removed.scripts/checks/lint-boundaries.test.mjs.https://claude.ai/code/session_01WTtRZcdke1yYdYUAanaf7V