Repository navigation
Milestone 1: CreditBoost thin end-to-end slice (Tasks 1-10) - #15
Merged
Merged
Conversation
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Also raises requires-python to >=3.12: numpy and xgboost both now require 3.12, so a 3.11 CI job would resolve an older ML stack than the shipped image. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
CNT_CHILDREN defaults to None rather than 0: an unanswered field must not be imputed at the API boundary, where the distinction cannot be recovered. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Beyond the plan: the mismatch error now names the first disagreeing index and values, an xgboost major-version check raises while tolerating patch drift and unparseable versions, and ArtifactError unifies the failure taxonomy. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The dependency-direction test checks creditboost.data/creditboost.train in sys.modules directly. The plan's sklearn proxy check was broken (xgboost pulls sklearn in regardless) and would have missed a guarded forbidden import. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Scopes xgboost-cpu to Linux so the image drops ~650MB of NVIDIA CUDA libraries unused by CPU inference; macOS keeps plain xgboost, which is the only variant shipping a wheel there. Scoring verified bit-exact. smoke.sh also asserts probability parses as a number in [0,1]. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Matrix is 3.12-only: numpy and xgboost both require >=3.12, so a 3.11 job
would resolve an older ML stack than the shipped image.
Image name is built from the lowercased owner plus a literal 'creditboost'.
The plan's ghcr.io/${{ github.repository }} resolves to a name with capitals,
which GHCR rejects, so every publish would have failed.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This was
linked to
issues
Sep 1, 2026
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Trained on the full 307,511-row Home Credit dataset. Validation ROC-AUC 0.7533 against a 0.70 floor, PR-AUC 0.2410, Brier 0.0680; 246,008 training rows, 318 trees. Calibration confirms the decision to omit scale_pos_weight: mean predicted probability 0.080394 against an actual positive rate of 0.080728. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- Serving emitted no application logs at all: nothing configured logging, so under uvicorn every INFO record was dropped and a credit decision left no audit trail. Adds structured JSON logging scoped to the creditboost logger. - The PII guard test inspected only getMessage(), so it could not fail; the fields it was meant to guard all travel via extra=. Now inspects real output. - The skew gate checked only the metadata sidecar, so an artifact with transposed feature_names inside model.json booted and then 500d per request. - The committed-artifact provenance assertion was vacuous against the Literal. - CLAUDE.md and README.md described a repo with no application code, and the macOS libomp prerequisite was undocumented. - Fairness invariants were asserted on source constants but never the artifact. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Owner
Author
ReviewTask level reviews were done between each commit with minor changes needed after certain tasks. A final branch-level review caught a number of issues that couldn't be properly observed at the task level reviews we did previously. CI returns clean for Merge approved. I'll begin planning Milestone 2. |
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.
Milestone 1: a thin end-to-end slice from Home Credit training data through an
XGBoost model to a containerised FastAPI scoring service published to GHCR.
Implements Tasks 1–10 of
docs/superpowers/plans/2026-08-30-creditboost-thin-slice.md.Task 11 (the credentialed production training run) is not included.
What's here
config.pyfeatures.pyschema.py/banding.pyartifact.pydata.py/train.pyserve/Dockerfile/smoke.sh101 tests, 99% coverage. The committed artifact is fixture-trained
(
provenance: "fixture") so everything here is verifiable without Kagglecredentials.
Deviations from the plan, and why
require ≥3.12, so a 3.11 job would resolve an older ML stack than the shipped
image and could fail loading an artifact serialised by xgboost 3.4.1.
ghcr.io/${{ github.repository }}resolves toa name containing capitals, which GHCR rejects — every publish would have
failed. Now built from the lowercased owner plus
creditboost, which is whatthe plan's own Task 11 verification step expects.
xgboost-cpuon Linux. Cuts ~650MB of NVIDIA CUDA libraries unused by CPUinference. Scoring verified bit-exact against the full build. macOS keeps
plain xgboost, the only variant shipping a wheel there.
CNT_CHILDRENdefaults toNone, not0. An unanswered field must not beimputed at the API boundary, where the distinction cannot be recovered.
assert 'sklearn' not in sys.moduleswas broken —import xgboostpulls sklearn in regardless. Nowchecks
creditboost.data/creditboost.traindirectly, which also catches aguarded import the original would have missed.
the first disagreeing index, an xgboost major-version check was added, and
ArtifactErrorunifies the failure taxonomy.Not included
Task 11 needs
data/application_train.csvfrom Kaggle (gitignored, never in CI)and will replace the fixture artifact with a production one.
🤖 Generated with Claude Code