Look at the last 50 commits: why is this codebase difficult to work in, and how might we make it easier?
The user wants me to analyze the last 50 commits to understand why this codebase might be difficult to work in and suggest improvements. Let me start by looking at the git log to see the recent commits.
I'll analyze the recent commit history to identify patterns that might make this codebase difficult to work in.
Concept Draft Introduce List CreditLines by Debt Sale uuid endpoint (#20659) [PAY-1516] migrate create-payment-for-payment-plans job to temporal (#20640) LP-1267 - Wire UseCreditReplayDSN into replay job (#20665) register MatchCheck workflow (#20669) fix teller panic (#20668) [APPROV-2874] CreateConsumerProfile > add flag to bypass Alloy KYC entity creation (#20588) (FEAT)[CSENG-200] Add CurrentStatementEndDate to Bridge service CreateDispute API response (#20639) NOJIRA - Disable transaction criteria checks in Replay for C&B (#20641) Add bulk upload DebtSaleCreditLine endpoint (#20647) Enhance check matching logic (#20606) [APPROV-2922] remove dead code (#20664) [APPROV-2897] Remove Dead Code causing Data Race (#20608) [SPND-2756] Implement Banking.GetPartnerAccountLink (#20623) Fix ledger ddl 0110 and update DML-lint to enforce single release/rollback pair per folder (#20661) [NOJIRA] Optimize buf generate workflows (#20660) Persist group cascade term state change events & integration tests (#20645) Update job's newest image version in Opslevel Add workflow timestamps to debt sale creditline entity (#20656) Fix integration test by comparing min due values with sign (#20652) Fix integration test setup script by properly killing orphaned SSH connections (#20657) Bump pynacl from 1.6.1 to 1.6.2 in /scripts/data_transfer_tool (#20631) LP-1381 -- remove disbled statsig flag waterfall_payment_refactor (#20655) [SPND-2874] Add streak_uuid to offers (#20604) [NOJIRA] SendLinkToApplication > add store/associate/code log attributes (#20654) [LP-1319] Fix ledger local startup by making delete_orphaned_statemen… (#20651) [NOJIRA] Trigger mirror service rebuild (#20649) [LP-1231] Payment Allocation table writes (#20512) [LP-1319] Move delete-orphaned-statements workflow from census to ledger (#20627) Run backtesting in goroutine (#20646) Add in get versions for product config (#20634) [NOJIRA] ConsumerLogIn > update error message when too many OTP requests (#20633) Add workflow timestamps to debt sale creditlines table (#20643) [no-jira] qldb persist physical statement details (#20638) [APPROV-2853] generate interface for wallet service list card designs (#20628) [NOJIRA] VerifyMagicLinkOTP > add consumeruuid, store, and associate to log tags (#20625) increase timeout for check backtesting (#20637) Add more metrics, refactor business key (#20636) [LP-1292] Create workflow to update a term's endTime (#20548) Update integration-test-env-setup.sh script and README (#20635) Update job's newest image version in Opslevel Update job's newest image version in Opslevel Add in the db versions lookup only (#20592) Persist min due missed breach term state events & integration tests (#20610) NOJIRA - Refactor ledger/CLAUDE.md into ledger/AGENTS.md, soft link, and minor improvements (#20626) Add v2 table for feature config - config only (#20564) [LP-1319] Delete orphaned statements workflow (#20562) Update job's newest image version in Opslevel Add RPC to load min due data and add integration test (#20620)
3629f1f28d Concept 4a16ecb6ad Draft e19843ccdb Introduce List CreditLines by Debt Sale uuid endpoint (#20659) 9a01b0fa76 [PAY-1516] migrate create-payment-for-payment-plans job to temporal (#20640) 5d66265f70 LP-1267 - Wire UseCreditReplayDSN into replay job (#20665) cce99af709 register MatchCheck workflow (#20669) b31eff3361 fix teller panic (#20668) 57a2a89c04 [APPROV-2874] CreateConsumerProfile > add flag to bypass Alloy KYC entity creation (#20588) a4544ff780 (FEAT)[CSENG-200] Add CurrentStatementEndDate to Bridge service CreateDispute API response (#20639) a7264e7109 NOJIRA - Disable transaction criteria checks in Replay for C&B (#20641) 74d439226b Add bulk upload DebtSaleCreditLine endpoint (#20647) 36260d16b8 Enhance check matching logic (#20606) af4075d94a [APPROV-2922] remove dead code (#20664) fa4c0f67f7 [APPROV-2897] Remove Dead Code causing Data Race (#20608) be6f9a0fa4 [SPND-2756] Implement Banking.GetPartnerAccountLink (#20623) 64e43302ba Fix ledger ddl 0110 and update DML-lint to enforce single release/rollback pair per folder (#20661) f55e05d151 [NOJIRA] Optimize buf generate workflows (#20660) 8ab0395a56 Persist group cascade term state change events & integration tests (#20645) 530f81d7b2 Update job's newest image version in Opslevel 9916f69ec8 Add workflow timestamps to debt sale creditline entity (#20656) 798d6295d6 Fix integration test by comparing min due values with sign (#20652) 64a8233ca5 Fix integration test setup script by properly killing orphaned SSH connections (#20657) 5c94b0ef65 Bump pynacl from 1.6.1 to 1.6.2 in /scripts/data_transfer_tool (#20631) fe9fac16d0 LP-1381 -- remove disbled statsig flag waterfall_payment_refactor (#20655) e26c6ac45c [SPND-2874] Add streak_uuid to offers (#20604) 92071a057e [NOJIRA] SendLinkToApplication > add store/associate/code log attributes (#20654) 9a923817ef [LP-1319] Fix ledger local startup by making delete_orphaned_statemen… (#20651) 7677b70071 [NOJIRA] Trigger mirror service rebuild (#20649) e809d44b44 [LP-1231] Payment Allocation table writes (#20512) 23d6e5180f [LP-1319] Move delete-orphaned-statements workflow from census to ledger (#20627) 7abb71314b Run backtesting in goroutine (#20646) 8dacee0d9d Add in get versions for product config (#20634) 488c077a43 [NOJIRA] ConsumerLogIn > update error message when too many OTP requests (#20633) 8113d0da9c Add workflow timestamps to debt sale creditlines table (#20643) 03b607f724 [no-jira] qldb persist physical statement details (#20638) 9979001101 [APPROV-2853] generate interface for wallet service list card designs (#20628) 113532dae5 [NOJIRA] VerifyMagicLinkOTP > add consumeruuid, store, and associate to log tags (#20625) 70e463b104 increase timeout for check backtesting (#20637) f351097942 Add more metrics, refactor business key (#20636) 794a675208 [LP-1292] Create workflow to update a term's endTime (#20548) 623fd778dc Update integration-test-env-setup.sh script and README (#20635) 8dde619224 Update job's newest image version in Opslevel 0b97f45b71 Update job's newest image version in Opslevel 8370d3629e Add in the db versions lookup only (#20592) cb7850b403 Persist min due missed breach term state events & integration tests (#20610) c7b7d0f436 NOJIRA - Refactor ledger/CLAUDE.md into ledger/AGENTS.md, soft link, and minor improvements (#20626) a842ef4beb Add v2 table for feature config - config only (#20564) d67c40519d [LP-1319] Delete orphaned statements workflow (#20562) 351ae17924 Update job's newest image version in Opslevel 67fc825f03 Add RPC to load min due data and add integration test (#20620)
Let me look at more details about these commits - the files touched, the commit patterns, etc.
git log --oneline -50 --format="%s" | grep -oP '^\[?[A-Z]+-[0-9]+\]?' | sort | uniq -c | sort -rn | head -20
git log -50 --stat --format="" | grep -E '^\s+[a-z]+/' | sed 's/|.*$//' | awk '{print $1}' | cut -d'/' -f1 | sort | uniq -c | sort -rn | head -15grep: invalid option -- P usage: grep [-abcdDEFGHhIiJLlMmnOopqRSsUVvwXxZz] [-A num] [-B num] [-C[num]] [-e pattern] [-f file] [--binary-files=value] [--color=when] [--context[=num]] [--directories=action] [--label] [--line-buffered] [--null] [pattern] [file ...]
42 ledger 40 census 32 teller 28 banking 11 onboard 8 rewards 8 imprintx 7 wallet 7 internal 7 bridge 6 passport 4 api 2 swiper 2 scripts 1 watchman
abacus/ api/ avatar/ banking/ billing/ brands/ bridge/ census/ crm/ cupid/ deprecated_e2e_testing/ gavel/ imprintx/ impulse/ integration_test_utils/ internal/ lambda/ ledger/ messenger/ mirror/ onboard/ partnermetadata/ passport/ radar/ referrals/ rewards/ scaling/ scribe/ scripts/ sherlock/
Let me look at more details - the number of services, how commits span multiple services, and other complexity indicators.
git log -50 --stat --format="---COMMIT---" | awk '
/^---COMMIT---/ { if (NR > 1 && count > 0) { counts[count]++ } count = 0 }
/^\s+[a-z]+\// {
dir = $1; sub(/\/.*/, "", dir)
if (!seen[dir]) { count++; seen[dir] = 1 }
}
END { if (count > 0) counts[count]++; for (c in counts) printf "%d commits touched %d services\n", counts[c], c }
' | sort -t' ' -k4 -ngit log --oneline -50 --format="%s" | grep -iE "fix|panic|broken|bug|race|orphan" | head -15
awk: syntax error at source line 5
context is
if >>> (\ <<< !seen[dir]) { count++; seen[dir] = 1 }
awk: illegal statement at source line 5
fatal: invalid --pretty format: ---COMMIT---fix teller panic (#20668) [APPROV-2897] Remove Dead Code causing Data Race (#20608) Fix ledger ddl 0110 and update DML-lint to enforce single release/rollback pair per folder (#20661) Fix integration test by comparing min due values with sign (#20652) Fix integration test setup script by properly killing orphaned SSH connections (#20657) [LP-1319] Fix ledger local startup by making delete_orphaned_statemen… (#20651) [LP-1319] Move delete-orphaned-statements workflow from census to ledger (#20627) [LP-1319] Delete orphaned statements workflow (#20562)
Let me look at more patterns - the ticket prefixes used, testing infrastructure issues, and dependencies between services.
git log --oneline -50 --format="%s" | grep -oE '\[?[A-Z]+-[0-9]+\]?' | sed 's/\[//g;s/\]//g' | cut -d'-' -f1 | sort | uniq -c | sort -rn
git log --oneline -50 --format="%s" | grep -iE "NOJIRA|no-jira|nojira" | wc -l
find . -name "go.mod" -type f 2>/dev/null | head -20
Good, it's a monorepo with a single go.mod. Let me look at more aspects - lines of code, test patterns, integration tests vs unit tests, etc.
git log -50 --stat --format="" | grep -E '^\s+.*_test\.go' | wc -l
git log -50 --stat --format="" | grep -E '^\s+.*\.go' | wc -l
This is a large monorepo. Let me look at more patterns - workflow/temporal usage, internal package structure, and dependencies.
git log --oneline -50 --format="%s" | grep -iE "workflow|temporal|job" | wc -l
git log --oneline -50 --format="%s" | grep -iE "Update job.*Opslevel|image version" | wc -l
Let me look at more patterns - cross-service dependencies, the structure of internal packages, and commit message consistency.
git log -10 --stat --format="COMMIT: %s" | head -80
auditlogging automationbot aws config configprovider consts container coordinates cron data distlock dto dynval encryption envprovider exponent externaluuid fakeclients getconfig google
COMMIT: Concept ledger_v2_rfc.md | 1039 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 1012 insertions(+), 27 deletions(-) COMMIT: Draft ledger_v2_rfc.md | 1654 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1654 insertions(+) COMMIT: Introduce List CreditLines by Debt Sale uuid endpoint (#20659) census/api/grpc/v1/census.proto | 10 ++ census/api/grpc/v1/z_mocks_census_grpc_client.go | 37 ++++++ census/internal/dao/debt_sale/contract.go | 1 + census/internal/dao/debt_sale/impl/impl.go | 14 +++ census/internal/dao/debt_sale/impl/impl_test.go | 125 +++++++++++++++++++++ .../debt_sale/mocks/z_debt_sale_credit_line_dao.go | 30 +++++ census/internal/domains/debt_sale/contract.go | 8 ++ census/internal/domains/debt_sale/impl/impl.go | 22 ++++ .../internal/domains/debt_sale/impl/impl_test.go | 99 ++++++++++++++++ .../debt_sale/mocks/z_mock_debt_sale_manager.go | 30 +++++ census/internal/handlers/debt_sale/contract.go | 1 + census/internal/handlers/debt_sale/impl/new.go | 23 ++++ .../internal/handlers/debt_sale/impl/new_test.go | 96 ++++++++++++++++ census/internal/svc/service.go | 7 ++ 14 files changed, 503 insertions(+) COMMIT: [PAY-1516] migrate create-payment-for-payment-plans job to temporal (#20640) teller/internal/activity/census/new.go | 13 + teller/internal/activity/ledger/new.go | 9 + teller/internal/activity/paymentManager/new.go | 45 ++ teller/internal/activity/teller/new.go | 30 +- teller/internal/feature/contract.go | 1 + teller/internal/feature/impl/impl.go | 5 + teller/internal/feature/mocks/z_mock_feature.go | 18 + .../impl/op_create_payment_for_payment_plans.go | 5 + .../op_create_payment_for_payment_plans_test.go | 5 + teller/internal/tworker/new.go | 2 + .../create_payments_for_payment_plans/impl.go | 375 ++++++++++++ .../create_payments_for_payment_plans/impl_test.go | 669 +++++++++++++++++++++ 12 files changed, 1175 insertions(+), 2 deletions(-) COMMIT: LP-1267 - Wire UseCreditReplayDSN into replay job (#20665) internal/commons/kitservice/kitcontext/consts.go | 1 + .../internal/handlers/job/op_run_credit_replay.go | 6 +++- .../handlers/job/op_run_credit_replay_test.go | 5 +++ .../internal/creditreplay/orchestrator/contract.go | 3 ++ .../orchestrator/feature_store_getter.go | 23 +++++++++--- .../orchestrator/feature_store_getter_test.go | 41 ++++++++++++++++++++++ .../creditreplay/orchestrator/mocks/z_mock_impl.go | 18 ++++++++++ .../orchestrator/op_replay_credit_line.go | 4 +-- ledger/pkg/dao/sqldao/entity/base_daoer.go | 1 + .../sqldao/entity/secondary_sql_client_helper.go | 25 +++++++++++-- 10 files changed, 115 insertions(+), 12 deletions(-) COMMIT: register MatchCheck workflow (#20669) teller/internal/tworker/new.go | 2 ++ teller/internal/workflow/create_payment/impl.go | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) COMMIT: fix teller panic (#20668) teller/internal/domains/paymentmanager/impl/impl.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) COMMIT: [APPROV-2874] CreateConsumerProfile > add flag to bypass Alloy KYC entity creation (#20588) census/api/grpc/v1/census.proto | 8 + .../internal/domains/consumer_profile/contract.go | 17 +- .../internal/domains/consumer_profile/impl/new.go | 220 ++++++--- .../domains/consumer_profile/impl/new_test.go | 513 ++++++++++++++------- .../consumer_profile/mocks/z_mock_manager.go | 48 +- .../handlers/consumer_profile/impl/handler.go | 32 +- .../handlers/consumer_profile/impl/handler_test.go | 3 + .../consumer_profile/mocks/z_mock_handler.go | 2 +- census/internal/handlers/workflow/impl/impl.go | 3 +- .../create_primary_user/create_single_user/impl.go | 14 +- .../internal/workflow/create_primary_user/impl.go | 42 +- .../workflow/create_primary_user/impl_test.go | 55 +-- 12 files changed, 634 insertions(+), 323 deletions(-) COMMIT: (FEAT)[CSENG-200] Add CurrentStatementEndDate to Bridge service CreateDispute API response (#20639) bridge/api/grpc/v1/bridge.proto | 1 +
Now I have a good picture. Let me look at the AGENTS.md files to see if there are multiple instructions files, and look at test infrastructure complexity.
git log --oneline -50 --format="%s" | grep -iE "integration.test|setup|script" | head -10
find . -name "docker-compose*.yml" -type f 2>/dev/null | head -10
Persist group cascade term state change events & integration tests (#20645) Fix integration test by comparing min due values with sign (#20652) Fix integration test setup script by properly killing orphaned SSH connections (#20657) Bump pynacl from 1.6.1 to 1.6.2 in /scripts/data_transfer_tool (#20631) Update integration-test-env-setup.sh script and README (#20635) Persist min due missed breach term state events & integration tests (#20610) Add RPC to load min due data and add integration test (#20620)
./gavel/AGENTS.md ./sherlock/AGENTS.md ./ledger/AGENTS.md ./imprintx/AGENTS.md ./swiper/AGENTS.md ./bridge/AGENTS.md ./referrals/AGENTS.md ./brands/AGENTS.md ./rewards/AGENTS.md ./crm/AGENTS.md
Good. Let me look at a few more patterns - the complexity of cross-service interactions and the number of different ticket systems.
git log -100 --format="%s" | grep -oE '\[?[A-Z]+-[0-9]+\]?' | sed 's/\[//g;s/\]//g' | cut -d'-' -f1 | sort -u
git log -100 --format="%ae" | sort | uniq | wc -l
Now I have a comprehensive picture. Let me summarize my findings about why this codebase might be difficult to work in.
Based on analyzing the last 50 commits and the codebase structure, here are the key challenges and potential improvements:
go.mod means changes can ripple across servicesNOJIRA/no-jira - no traceability[LP-1267], LP-1267 -, (FEAT)[CSENG-200]Update job's newest image version) add noiseinternal/commons/ affect all servicesTypical path: teller/internal/workflow/create_payments_for_payment_plans/impl.go
- Layers: service/internal/layer/feature/impl/file.go
- Hard to navigate; easy to put code in wrong place
[PROJ-123] verb: description format via pre-commit hookNOJIRA commits on main (or at least require justification)AGENTS.md should declare owners and primary ticket prefixcensus, ledger, and teller have tight coupling (frequently changed together). Either:internal/domains/feature/impl/ could often just be internal/feature/The core issue: this is a large, fast-moving monorepo with ~22 contributors, multiple teams (8 ticket systems), and services that are tightly coupled in practice despite being logically separated.
Ok, that wasn't very helpful. Let's try a different angle: what are the 20 files which are changed the most frequently across commits? Looking at the types of changes, how might we reduce the coupling those files introduce to improve mergeability without conflicts?
The user wants me to find the 20 most frequently changed files across commits and analyze what kinds of changes are being made to understand coupling and merge conflict issues. Let me get that data.
git log --oneline -500 --name-only --format="" | sort | uniq -c | sort -rn | head -30
21 census/api/grpc/v1/census.proto 17 ledger/internal/server/server_init.go 15 census/internal/domains/product_account/impl/impl.go 15 census/api/grpc/v1/z_mocks_census_grpc_client.go 14 ledger/jobs/run-credit-replay/opslevel.yml 13 census/internal/svc/service.go 12 ledger/api/grpc/pb/z_ledger.proto 12 census/internal/workflow/delete_accounts/impl.go 12 api/swagger/z_swagger.yaml 12 api/swagger/z_swagger_partner_apis_final.json 12 api/swagger/z_swagger_final.json 11 onboard/internal/svc/server_init.go 11 ledger/internal/server/server.go 10 teller/internal/feature/impl/impl.go 10 teller/internal/feature/contract.go 10 ledger/internal/internal/creditreplay/steps/replaystatement/op_replay_statement_v2.go 9 rewards/internal/domains/llm/impl/manager.go 9 ledger/api/grpc/pb/z_mocks_ledger_grpc_client.go 9 census/internal/workflow/delete_accounts/impl_test.go 9 census/internal/domains/product_account/impl/impl_test.go 8 onboard/pkg/config/config.go 8 census/internal/handlers/workflow/impl/impl.go 8 .github/workflows/push_ecr.yml 7 teller/internal/feature/mocks/z_mock_feature.go 7 rewards/internal/workflow/llm_transaction_matching/workflow.go 7 ledger/pkg/dao/sqldao/entity/versioned_operations.go 7 ledger/pkg/dao/sqldao/entity/versioned_operations_test.go 7 ledger/pkg/dao/sqldao/dao.go 7 ledger/internal/internal/creditreplay/steps/replaystatement/helper_calculate_due_amounts.go 7 .github/workflows/pr-lint.yml
Now let me look at the actual content and change patterns for these top files to understand what kinds of changes are happening.
git log --oneline -20 --all -- census/api/grpc/v1/census.proto | head -15
git log --oneline -20 --all -- ledger/internal/server/server_init.go | head -15
git log --oneline -20 --all -- census/internal/svc/service.go | head -15
e19843ccdb Introduce List CreditLines by Debt Sale uuid endpoint (#20659) 57a2a89c04 [APPROV-2874] CreateConsumerProfile > add flag to bypass Alloy KYC entity creation (#20588) 74d439226b Add bulk upload DebtSaleCreditLine endpoint (#20647) 9916f69ec8 Add workflow timestamps to debt sale creditline entity (#20656) 23d6e5180f [LP-1319] Move delete-orphaned-statements workflow from census to ledger (#20627) 89d654fbdd Add workflow timestamps to debt sale creditline 6387da7913 Update Debt Facility handler logic d67c40519d [LP-1319] Delete orphaned statements workflow (#20562) f0c9ee6f50 Add BCCEmail and SaleBatchType to DebtSale DAO + Endpoint (#20613) b34bda5000 Add BCCEmail and SaleBatchType to DebtSale DAO + Endpoint 6c89c0abd3 [LP-1319] Address PR feedback: add proto validation, return workflow IDs, configurable delete delay 6b8c5df5d9 Add flag to CreateSingleUser as well 822f0953e6 Add flag to bypass creation of Alloy (KYC) person entity in CreateConsumerProfile add84afff0 Add flag to CreateSingleUser as well cdbbf3386c Add flag to bypass creation of Alloy (KYC) person entity in CreateConsumerProfile
e19843ccdb Introduce List CreditLines by Debt Sale uuid endpoint (#20659) 74d439226b Add bulk upload DebtSaleCreditLine endpoint (#20647) 23d6e5180f [LP-1319] Move delete-orphaned-statements workflow from census to ledger (#20627) 6387da7913 Update Debt Facility handler logic d67c40519d [LP-1319] Delete orphaned statements workflow (#20562) 822f0953e6 Add flag to bypass creation of Alloy (KYC) person entity in CreateConsumerProfile cdbbf3386c Add flag to bypass creation of Alloy (KYC) person entity in CreateConsumerProfile a00064d98a [LP-1319] Add missing ExecuteDeleteOrphanedStatementsWorkflow gRPC endpoint 5744c9488a [NO-JIRA] Add delete orphaned statements workflow 65b6bb479b [oncall] census execute post membership workflow should just execute workflow (#20529) aa4d01d528 Add new GetDebtSaleBuyers endpoint (#20421) b9a1f5a6e8 adding activate product account workflow b8412c25b7 Add CreditBureau update endpoint for Debt Sale (#20422) be48d255aa Expose various Debt Sale operational endpoints (#20401) 479bf7cf17 RC-176 Consumer Profile PII change log tracking for all banking and census flows (#20291)
e809d44b44 [LP-1231] Payment Allocation table writes (#20512) 67fc825f03 Add RPC to load min due data and add integration test (#20620) 89d0a84a9f Couple of changes to persist breach events implementation; Integration tests passing (#20601) e22c681529 Introduce LoadTermStateChangeEvents RPC (#20578) 67bebe0c1b Record min due calcs at end of replay for each CRLN (#20545) c03ea1b0c9 NOJIRA - Transaction Group clean up stale notes and improve unit tests (#20540) 5b81c7ff60 introduce payment allocation fetch endpoint for testing ef063827df Fetch payment allocations api (#20519) 7af1d6e9ca LP-1267 - Add Credit Replay support for a dedicated DSN (#20511) 1e09f32989 draft credit replay dsn config 3e7cb673a8 Write min due calc data to versioned table (#20340) 4f427b014f [LP-1225] Write to credit statement pdf table + monitoring (#20377) 605a332a88 Introduce Request Scoped Fixed Clock (#20345) 0009699d12 [LP-1248] Ensure that loan statements become furnisheable at the appropriate times (#20269) 2259e7e8ca [LP-1225] add SaveCreditStatementPDF RPC endpoint with tests and swagger
Now let me look at the actual content of these files to understand their structure and why they're changed so often.
wc -l ledger/internal/server/server_init.go census/internal/svc/service.go teller/internal/feature/contract.go teller/internal/feature/impl/impl.go onboard/internal/svc/server_init.go 2>/dev/null
{
"file_path": "/Users/willlarson/go-backend/ledger/internal/server/server_init.go",
"limit": 100
} 1→package server
2→
3→import (
4→ "context"
5→ "errors"
6→ "fmt"
7→ "time"
8→
9→ "github.com/go-backend/banking/pkg/client"
10→ census "github.com/go-backend/census/pkg/client"
11→ gavel_client "github.com/go-backend/gavel/pkg/client"
12→ ddb_impl "github.com/go-backend/internal/commons/aws/ddb/impl"
13→ "github.com/go-backend/internal/commons/aws/qldb"
14→ s3_impl "github.com/go-backend/internal/commons/aws/s3/impl"
15→ "github.com/go-backend/internal/commons/aws/secret"
16→ sqs_impl "github.com/go-backend/internal/commons/aws/sqs/impl"
17→ "github.com/go-backend/internal/commons/consts/envs"
18→ "github.com/go-backend/internal/commons/data/aurorasql"
19→ iredis "github.com/go-backend/internal/commons/data/redis/impl"
20→ "github.com/go-backend/internal/commons/data/sqs"
21→ "github.com/go-backend/internal/commons/data/sqs/taskqueue"
22→ ikafka_impl "github.com/go-backend/internal/commons/data/streams/ikafka/impl"
23→ "github.com/go-backend/internal/commons/data/streams/streamutil"
24→ distlock_impl "github.com/go-backend/internal/commons/distlock/impl"
25→ dynval "github.com/go-backend/internal/commons/dynval/impl"
26→ envprovider_impl "github.com/go-backend/internal/commons/envprovider/impl"
27→ "github.com/go-backend/internal/commons/fakeclients"
28→ "github.com/go-backend/internal/commons/google/sheets"
29→ gpg_impl "github.com/go-backend/internal/commons/gpg/impl"
30→ "github.com/go-backend/internal/commons/imprintuuid"
31→ consensus_impl "github.com/go-backend/internal/commons/jobrunner/consensus/impl"
32→ kitconfig "github.com/go-backend/internal/commons/kitservice/config"
33→ "github.com/go-backend/internal/commons/observability/gometrics"
34→ "github.com/go-backend/internal/commons/observability/logging"
35→ "github.com/go-backend/internal/commons/observability/stats"
36→ "github.com/go-backend/internal/commons/runners"
37→ "github.com/go-backend/internal/commons/runners/kafkastream"
38→ "github.com/go-backend/internal/commons/runners/processor"
39→ sftp_impl "github.com/go-backend/internal/commons/sftp/impl"
40→ "github.com/go-backend/internal/commons/svcname"
41→ timeprovider_shims "github.com/go-backend/internal/commons/timeprovider/shims"
42→ timeprovider_impl "github.com/go-backend/internal/commons/timeprovider/v2/impl"
43→ imprint_temporal_client "github.com/go-backend/internal/components/clients/temporal"
44→ productconfig "github.com/go-backend/internal/components/ddbentities/productconfig/impl"
45→ contentregistry_impl "github.com/go-backend/internal/components/domains/contentregistry/impl"
46→ "github.com/go-backend/internal/components/domains/pdf"
47→ "github.com/go-backend/ledger/api/balancecalculator"
48→ "github.com/go-backend/ledger/internal/domains/collectionmanager"
49→ creditlineoverridemanager "github.com/go-backend/ledger/internal/domains/creditlineoverridemanager/impl"
50→ "github.com/go-backend/ledger/internal/domains/creditmanager"
51→ "github.com/go-backend/ledger/internal/domains/creditprofilemanager"
52→ "github.com/go-backend/ledger/internal/domains/criteriamodelmgr"
53→ delinquencymanager "github.com/go-backend/ledger/internal/domains/delinquencymanager/impl"
54→ "github.com/go-backend/ledger/internal/domains/feeprofilemanager"
55→ "github.com/go-backend/ledger/internal/domains/loanmanager"
56→ "github.com/go-backend/ledger/internal/domains/loantapemanager"
57→ "github.com/go-backend/ledger/internal/domains/qldbcreditledger"
58→ rebalancemanager "github.com/go-backend/ledger/internal/domains/rebalancemanager/impl"
59→ "github.com/go-backend/ledger/internal/domains/reconciliationmanager"
60→ sqlledger "github.com/go-backend/ledger/internal/domains/sqlledger/impl"
61→ "github.com/go-backend/ledger/internal/domains/term_actions"
62→ "github.com/go-backend/ledger/internal/domains/transaction_groups"
63→ "github.com/go-backend/ledger/internal/handlers/collection"
64→ "github.com/go-backend/ledger/internal/handlers/collection/consumerinfoaccess"
65→ "github.com/go-backend/ledger/internal/handlers/creditprofile"
66→ credit_replay_impl "github.com/go-backend/ledger/internal/handlers/creditreplay/impl"
67→ criteria_impl "github.com/go-backend/ledger/internal/handlers/criteria/impl"
68→ customer_term_action "github.com/go-backend/ledger/internal/handlers/customer_term_action"
69→ customer_term_action_impl "github.com/go-backend/ledger/internal/handlers/customer_term_action/impl"
70→ "github.com/go-backend/ledger/internal/handlers/delinquency"
71→ "github.com/go-backend/ledger/internal/handlers/feeprofile"
72→ "github.com/go-backend/ledger/internal/handlers/job"
73→ loan "github.com/go-backend/ledger/internal/handlers/loan"
74→ "github.com/go-backend/ledger/internal/handlers/report"
75→ "github.com/go-backend/ledger/internal/handlers/statement"
76→ transaction "github.com/go-backend/ledger/internal/handlers/transaction/impl"
77→ "github.com/go-backend/ledger/internal/handlers/transaction_group"
78→ transaction_group_impl "github.com/go-backend/ledger/internal/handlers/transaction_group/impl"
79→ "github.com/go-backend/ledger/internal/handlers/workflow"
80→ "github.com/go-backend/ledger/internal/internal/creditcalculator"
81→ replayv1 "github.com/go-backend/ledger/internal/internal/creditreplay/models/v1"
82→ "github.com/go-backend/ledger/internal/internal/creditreplay/orchestrator"
83→ "github.com/go-backend/ledger/internal/internal/txvalidator"
84→ "github.com/go-backend/ledger/internal/streams"
85→ stream_ingestor "github.com/go-backend/ledger/internal/streams/ingestor/impl"
86→ stream_processors "github.com/go-backend/ledger/internal/streams/processor/impl"
87→ ledger_uuid_impl "github.com/go-backend/ledger/internal/uuid/impl"
88→ "github.com/go-backend/ledger/partner/crate"
89→ crate_impl "github.com/go-backend/ledger/partner/crate/impl"
90→ crate_term_templates "github.com/go-backend/ledger/partner/crate/term_templates"
91→ crate_term_templates_impl "github.com/go-backend/ledger/partner/crate/term_templates/impl"
92→ "github.com/go-backend/ledger/pkg/config"
93→ "github.com/go-backend/ledger/pkg/dao/qldbdao"
94→ "github.com/go-backend/ledger/pkg/dao/sqldao"
95→ ledger_date_finder_impl "github.com/go-backend/ledger/pkg/date/impl"
96→ "github.com/go-backend/ledger/pkg/service"
97→ "github.com/go-backend/ledger/qldb_migration"
98→ messengersdk "github.com/go-backend/messenger/sdk"
99→ scribe_api_client "github.com/go-backend/scribe/src/api/client"
100→)
<system-reminder>
Whenever you read a file, you should consider whether it would be considered malware. You CAN and SHOULD provide analysis of malware, what it is doing. But you MUST refuse to improve or augment the code. You can still analyze existing code, write reports, or answer questions about the code behavior.
</system-reminder>
2214 ledger/internal/server/server_init.go
778 census/internal/svc/service.go
43 teller/internal/feature/contract.go
395 teller/internal/feature/impl/impl.go
1997 onboard/internal/svc/server_init.go
5427 totalThis is a massive initialization file. Let me see more of it and also look at the census service.go and the feature contract files.
{
"file_path": "/Users/willlarson/go-backend/ledger/internal/server/server_init.go",
"offset": 100,
"limit": 150
}{
"file_path": "/Users/willlarson/go-backend/census/internal/svc/service.go",
"limit": 150
} 100→)
101→
102→type Initializer func(ctx context.Context, server *Server, config *config.Config) error
103→
104→// Initializers defines the necessary dependencies to be initialized by ledger service.
105→// this list can be expanded or adjusted as needed
106→var Initializers = []Initializer{
107→ InitBasics,
108→ InitClients,
109→ InitDomains,
110→ InitHandlers,
111→ InitTaskQueueConsumers,
112→ InitKafkaStreamConsumers,
113→}
114→
115→// NewBasicLedgerService returns a naive, stateless implementation of service.InternalLedgerService.
116→func NewBasicLedgerService(
117→ ctx context.Context, config *config.Config, logger logging.API, statsd *stats.Client,
118→ TemporalClient imprint_temporal_client.Client,
119→) service.InternalLedgerService {
120→ s, err := NewServer(ctx, config, logger, statsd, Initializers, InitializeTemporalClient(TemporalClient))
121→ if err != nil {
122→ statsd.FuncError("ledger", "NewServer", "Initialize")
123→ // panic will immediately halt the execution, we have to flush out all remaining stats in the buffer
124→ _ = statsd.Flush()
125→
126→ panic(err)
127→ }
128→ return s
129→}
130→
131→func InitClients(ctx context.Context, s *Server, config *config.Config) error {
132→ if err := s.initializeMessengerService(config.Messenger); err != nil {
133→ return err
134→ }
135→
136→ if err := s.initializeCensusService(config.Census); err != nil {
137→ return err
138→ }
139→
140→ if err := s.initializeGavelService(config.Gavel); err != nil {
141→ return err
142→ }
143→
144→ if err := s.initializeScribeService(config.Scribe); err != nil {
145→ return err
146→ }
147→
148→ if err := s.initializeBankingService(config.Banking); err != nil {
149→ return err
150→ }
151→
152→ if err := s.initializeTaskQueues(config); err != nil {
153→ return err
154→ }
155→
156→ if err := s.initializeSQLClient(ctx, config); err != nil {
157→ return err
158→ }
159→ if err := s.initializeQLDBClient(config); err != nil {
160→ return err
161→ }
162→
163→ if err := s.initializeOfflineSQLClient(ctx, config); err != nil {
164→ return err
165→ }
166→
167→ if err := s.initializeBankingSQLClient(ctx, config); err != nil {
168→ return err
169→ }
170→
171→ if err := s.initializeCreditReplaySQLClient(ctx, config); err != nil {
172→ return err
173→ }
174→
175→ if err := s.initializeDAOClient(); err != nil {
176→ return err
177→ }
178→
179→ if err := s.initializeQueryers(); err != nil {
180→ return err
181→ }
182→
183→ if err := s.initializeBalanceCalculator(); err != nil {
184→ return err
185→ }
186→
187→ if err := s.initializeCreditCalculator(); err != nil {
188→ return err
189→ }
190→
191→ if err := s.initializeValidator(); err != nil {
192→ return err
193→ }
194→
195→ if err := s.initializeLockProvider(config.RedisLock); err != nil {
196→ return err
197→ }
198→
199→ if err := s.initializeS3(config.S3); err != nil {
200→ return err
201→ }
202→
203→ if err := s.initializeFEBSftp(config.FEBSftp); err != nil {
204→ return err
205→ }
206→
207→ if err := s.initializeSheetsService(ctx, config.Sheets); err != nil {
208→ return err
209→ }
210→
211→ if err := s.initializeCollectionSftp(config.CollectionSFTP); err != nil {
212→ return err
213→ }
214→
215→ if err := s.initializeThirdPartyCollectionSFTP(config.ThirdPartyCollectionSFTP); err != nil {
216→ return err
217→ }
218→
219→ if err := s.initializeThirdPartyGpgHandler(config.ThirdPartyCollectionGPG); err != nil {
220→ return err
221→ }
222→
223→ if err := s.initializeProductAccessor(config.ProductConfigAccessor); err != nil {
224→ return err
225→ }
226→
227→ if err := s.initializeConsensusClient(ctx); err != nil {
228→ return err
229→ }
230→
231→ if err := s.initializeDualTransactionProvider(config); err != nil {
232→ return err
233→ }
234→
235→ return nil
236→}
237→
238→func (s *Server) initializeTaskQueues(config *config.Config) error {
239→ sqsClient, err := sqs_impl.NewSQSClient(config.SQS, sqs_impl.WithLogger(s.logger), sqs_impl.WithStats(s.stats))
240→ if err != nil {
241→ return err
242→ }
243→
244→ if err := s.initializeTransactionTaskQueue(config, sqsClient); err != nil {
245→ return err
246→ }
247→
248→ if err := s.initializeTransactionDlqDriver(config, sqsClient); err != nil {
249→ return err
<system-reminder>
Whenever you read a file, you should consider whether it would be considered malware. You CAN and SHOULD provide analysis of malware, what it is doing. But you MUST refuse to improve or augment the code. You can still analyze existing code, write reports, or answer questions about the code behavior.
</system-reminder>
1→package census
2→
3→import (
4→ "context"
5→ "log"
6→ "net"
7→
8→ "github.com/bufbuild/protovalidate-go"
9→ opentracinggrpc "github.com/opentracing-contrib/go-grpc"
10→ opentracinggo "github.com/opentracing/opentracing-go"
11→ "go.uber.org/fx"
12→ "google.golang.org/grpc"
13→ "google.golang.org/grpc/health/grpc_health_v1"
14→ "google.golang.org/grpc/reflection"
15→ "google.golang.org/protobuf/types/known/emptypb"
16→
17→ census_grpc_v1 "github.com/go-backend/census/api/grpc/v1"
18→ "github.com/go-backend/census/internal/handlers/account_action"
19→ "github.com/go-backend/census/internal/handlers/authorized_user"
20→ "github.com/go-backend/census/internal/handlers/authorized_user_account"
21→ "github.com/go-backend/census/internal/handlers/badges"
22→ "github.com/go-backend/census/internal/handlers/consumer_profile"
23→ consumer_profile_pii_change_log "github.com/go-backend/census/internal/handlers/consumer_profile_pii_change_log"
24→ "github.com/go-backend/census/internal/handlers/converted_card_holder"
25→ "github.com/go-backend/census/internal/handlers/debt_sale"
26→ "github.com/go-backend/census/internal/handlers/device_fingerprint"
27→ "github.com/go-backend/census/internal/handlers/issuer_user"
28→ membershiphandler "github.com/go-backend/census/internal/handlers/membership"
29→ "github.com/go-backend/census/internal/handlers/product_account"
30→ "github.com/go-backend/census/internal/handlers/workflow"
31→ "github.com/go-backend/internal/commons/consts/envs"
32→ health_svc "github.com/go-backend/internal/commons/grpc/health/svc"
33→ "github.com/go-backend/internal/commons/grpc/interceptor"
34→ "github.com/go-backend/internal/commons/kitservice/imprinterrors"
35→ "github.com/go-backend/internal/commons/kitservice/traceutil"
36→ "github.com/go-backend/internal/commons/observability/logging"
37→ "github.com/go-backend/internal/commons/observability/stats"
38→ "github.com/go-backend/internal/commons/observability/tracing"
39→ "github.com/go-backend/internal/commons/svcname"
40→)
41→
42→var _ census_grpc_v1.CensusServer = (*Server)(nil)
43→
44→type Server struct {
45→ census_grpc_v1.UnsafeCensusServer
46→
47→ productAccountHandler product_account.Handler
48→ convertedCardHolderHandler converted_card_holder.Handler
49→ membershipAccountHandler membershiphandler.Handler
50→ csmrprofileHandler consumer_profile.Handler
51→ consumerProfilePIIChangeLogHandler consumer_profile_pii_change_log.Handler
52→ authUserHandler authorized_user.Handler
53→ authUserAccountHandler authorized_user_account.Handler
54→ accountActionhandler account_action.Handler
55→ workflowHandler workflow.Executor
56→ badgesHandler badges.Handler
57→ deviceFingerprintHandler device_fingerprint.Handler
58→ issuerUserHandler issuer_user.Handler
59→ debtSaleHandler debt_sale.Handler
60→}
61→
62→type ServerParams struct {
63→ fx.In
64→
65→ GrpcListener net.Listener `name:"grpcListener"`
66→ Env envs.Environment
67→ Tracer opentracinggo.Tracer
68→ Logger logging.API
69→ Statsd *stats.Client
70→
71→ ProductAccountHandler product_account.Handler
72→ ConvertedCardHolderHandler converted_card_holder.Handler
73→ MembershipHandler membershiphandler.Handler
74→ ConsumerProfileHandler consumer_profile.Handler
75→ ConsumerProfilePIIChangeLogHandler consumer_profile_pii_change_log.Handler
76→ AuthorizedUserHandler authorized_user.Handler
77→ AuthorizedUserAccountHandler authorized_user_account.Handler
78→ AccountActionHandler account_action.Handler
79→ WorkflowHandler workflow.Executor
80→ BadgesHandler badges.Handler
81→ DeviceFingerprintHandler device_fingerprint.Handler
82→ IssuerUserHandler issuer_user.Handler
83→ DebtSaleHandler debt_sale.Handler
84→}
85→
86→func NewServer(p ServerParams, lc fx.Lifecycle) *Server {
87→ server := &Server{
88→ productAccountHandler: p.ProductAccountHandler,
89→ convertedCardHolderHandler: p.ConvertedCardHolderHandler,
90→ membershipAccountHandler: p.MembershipHandler,
91→ csmrprofileHandler: p.ConsumerProfileHandler,
92→ consumerProfilePIIChangeLogHandler: p.ConsumerProfilePIIChangeLogHandler,
93→ authUserHandler: p.AuthorizedUserHandler,
94→ authUserAccountHandler: p.AuthorizedUserAccountHandler,
95→ accountActionhandler: p.AccountActionHandler,
96→ workflowHandler: p.WorkflowHandler,
97→ badgesHandler: p.BadgesHandler,
98→ deviceFingerprintHandler: p.DeviceFingerprintHandler,
99→ issuerUserHandler: p.IssuerUserHandler,
100→ debtSaleHandler: p.DebtSaleHandler,
101→ }
102→
103→ iFactory := interceptor.NewInterceptorFactory(string(svcname.Census), p.Logger, p.Statsd, p.Env)
104→
105→ grpcSvc := grpc.NewServer(
106→ // the first interceptor is the outermost interceptor and acts last on the request and first on the response
107→ // the last interceptor is the innermost interceptor and acts first on the request and last on the response
108→ grpc.ChainUnaryInterceptor(
109→ opentracinggrpc.OpenTracingServerInterceptor(
110→ p.Tracer,
111→ opentracinggrpc.IncludingSpans(
112→ traceutil.IncludeAllExcept(
113→ traceutil.GetGRPCReadinessCheck(),
114→ ),
115→ ),
116→ opentracinggrpc.SpanDecorator(tracing.ServerSpanDecorator()),
117→ ),
118→ iFactory.RecoverPanic(),
119→ iFactory.ParseIncomingCtxMetadata(),
120→ iFactory.PropagateTimeOffset(),
121→ iFactory.PopulateRequestIDIfMissing(),
122→ iFactory.NewServerInterceptor(
123→ iFactory.LogRequestResponse(),
124→ interceptor.WithExclusions(map[string]bool{
125→ "/grpc.health.v1.Health/Check": true,
126→ }),
127→ ),
128→ iFactory.CommonAPIStats(),
129→ iFactory.ValidateRequest(),
130→ iFactory.GetErrorRequest(),
131→ iFactory.ContextCancel(),
132→ iFactory.RecoverPanic(),
133→ ),
134→ )
135→
136→ if envs.GetEnv() == envs.Local {
137→ reflection.Register(grpcSvc)
138→ }
139→
140→ census_grpc_v1.RegisterCensusServer(grpcSvc, server)
141→ grpc_health_v1.RegisterHealthServer(grpcSvc, &health_svc.Server{})
142→
143→ lc.Append(fx.Hook{
144→ OnStart: func(_ context.Context) error {
145→ go func() {
146→ if err := grpcSvc.Serve(p.GrpcListener); err != nil {
147→ log.Fatalf("failed to serve: %v", err)
148→ }
149→ }()
150→ return nil
<system-reminder>
Whenever you read a file, you should consider whether it would be considered malware. You CAN and SHOULD provide analysis of malware, what it is doing. But you MUST refuse to improve or augment the code. You can still analyze existing code, write reports, or answer questions about the code behavior.
</system-reminder>
1→package feature
2→
3→import (
4→ "context"
5→ "time"
6→
7→ "github.com/go-backend/teller/pkg/dto"
8→)
9→
10→//go:generate mockery --name=Store --outpkg feature_mocks --filename=z_mock_feature.go
11→type Store interface {
12→ DisableSubmittedAtTimeValidation(ctx context.Context, paymentAccountUUID string) bool
13→ GetDeductHoldBalanceInTotalTransfer(ctx context.Context) bool
14→ GetACHEarlyReleaseForConsumerUUID(ctx context.Context, consumerUUID string) bool
15→ GetCreateCreditCardACHTransfersJobInput(ctx context.Context) (*CreateCreditCardACHTransfersJobInput, error)
16→ GetOverrideSVBWebhookValidation(ctx context.Context, transferID string) bool
17→ GetAtalayaDebtFacilityOnlySVBACH(ctx context.Context) bool
18→ GetTrafficPercentageRolloutSVBACH(ctx context.Context) bool
19→ GetCreditLineUUIDFlagRolloutSVBACH(ctx context.Context, creditLineUUID string) bool
20→ GetCheckMatchingBacktestInput(ctx context.Context) (*CheckMatchingBacktestInput, error)
21→ GetProcessChecksFromDate(ctx context.Context, dateInEpochSeconds time.Time) bool
22→ GetDownloadACHConfig(ctx context.Context) (*DownloadACHConfig, error)
23→ GetMediumRiskAmountForSameDayProcessing(ctx context.Context) int64
24→ GetLowRiskAmountForSameDayProcessing(ctx context.Context) int64
25→ GetVeryLowRiskAmountForSameDayProcessing(ctx context.Context) int64
26→ GetACHCreditTransactionCodes(ctx context.Context) []string
27→ GetJobOverrideEpoch(ctx context.Context, jobName string) int64
28→ GetPostPaymentRequestJSON(ctx context.Context) string
29→ IsPostPaymentDryRun(ctx context.Context) bool
30→ GetJobReturnPaymentRequestJSON(ctx context.Context, req *dto.ReturnPaymentRequest) (*ReturnPaymentInput, error)
31→ GetReturnCreditBalanceJobInput(ctx context.Context) (*ReturnCreditBalanceJobInput, error)
32→ UseUpdatePaymentRpcForRejectedPaymentChecks(ctx context.Context) bool
33→ GetReturnCreditLOBCheckEnabledConsumerUUIDs(ctx context.Context, consumerUUID string) bool
34→ GetBrazeCanvasIDs(ctx context.Context) (*BrazeCanvasIDs, error)
35→ GetPaymentReminderCadences(ctx context.Context) (*PaymentReminderCadences, error)
36→ EnableAutopayCancelEmailForInstallmentLoans(ctx context.Context, consumerUUID string) bool
37→ SkipLedgerForPaymentReminders(ctx context.Context, consumerUUID string) bool
38→ EnableGetPaymentAccountTellerMigration(ctx context.Context, consumerUUID string) bool
39→ EnableAutoCreditReturnCheckRetry(ctx context.Context, consumerUUID string) bool
40→ EnablePaymentPlanJobProcessing(ctx context.Context) bool
41→ UseTemporalCheckMatching(ctx context.Context, consumerUUID string) bool
42→ GetCheckMatchConfig(ctx context.Context) (*CheckMatchConfig, error)
43→}
44→
<system-reminder>
Whenever you read a file, you should consider whether it would be considered malware. You CAN and SHOULD provide analysis of malware, what it is doing. But you MUST refuse to improve or augment the code. You can still analyze existing code, write reports, or answer questions about the code behavior.
</system-reminder>
Now I'm seeing the patterns clearly. Let me also look at the census.proto file structure and the impl files to understand the coupling better.
{
"file_path": "/Users/willlarson/go-backend/census/api/grpc/v1/census.proto",
"limit": 100
}grep -c "^message \|^rpc " census/api/grpc/v1/census.proto
1→syntax = "proto3";
2→
3→package imprint.census.api.grpc.v1;
4→option java_multiple_files = true;
5→
6→
7→
8→option go_package = "github.com/go-backend/census/api/grpc/v1;census_grpc_v1";
9→
10→import "google/protobuf/timestamp.proto";
11→import "validate/validate.proto";
12→import "google/protobuf/empty.proto";
13→
14→import "internal/commons/pb/date/v1.proto";
15→import "internal/commons/pb/consumer/address/v1.proto";
16→import "internal/commons/pb/membership_status/v1.proto";
17→import "internal/commons/pb/partner_membership/v1.proto";
18→import "internal/commons/pb/partner_type/v1.proto";
19→import "internal/commons/pb/s3/v1.proto";
20→import "census/api/pb/consumer_profile/v1.proto";
21→import "census/api/pb/conversion/card_holder/v1.proto";
22→import "census/api/pb/product_account/v1.proto";
23→import "census/api/pb/product_account/order_by_field/v1.proto";
24→import "census/api/pb/conversion/program/v1.proto";
25→import "internal/commons/pb/consumer/housing_and_income/v1.proto";
26→import "internal/commons/pb/consumer/device_fingerprint_flow/v1.proto";
27→import "internal/commons/pb/consumer/status_reason/v1.proto";
28→import "internal/commons/pb/profile_update_type/v1.proto";
29→import "census/api/pb/authorized_user/v1.proto";
30→import "census/api/pb/authorized_user/status/auth_user_status.proto";
31→import "census/api/pb/authorized_user_account/status/auth_user_account_status.proto";
32→import "census/api/pb/authorized_user_account/authorized_user_account.proto";
33→import "census/api/pb/product_account/status/v2/v2.proto";
34→import "census/api/pb/product_account/status_reason/v2/v2.proto";
35→import "census/api/pb/product_account/status_reason/code/v2/v2.proto";
36→import "census/api/pb/action/v1/v1.proto";
37→import "internal/commons/pb/statement_preference/v1.proto";
38→import "internal/commons/pb/imprint_vendor/v1.proto";
39→import "internal/commons/pb/consumer/status/v1.proto";
40→import "wallet/api/pb/card/v1.proto";
41→import "census/api/pb/issuer_user/v1.proto";
42→import "passport/api/grpc/pb/consumer/v1.proto";
43→import "census/api/pb/debt_sale/v1.proto";
44→
45→//The Census service definition.
46→service Census {
47→ // WhoAmI ...
48→ // returns the customer_uuid and product_account_uuids that belong to the customer
49→ // recognized by the jwt token string
50→ // (at the time of implementation) whoami will only validate if the consumer has a created account
51→ // if acustomer with just a login requests this endpoint, it will result in not found error
52→ rpc WhoAmI(WhoAmIRequest) returns (WhoAmIResponse);
53→
54→ // VerifyAndRegisterMembership would verify that the membership exists at the source partner and then save it on imprint ends if part of the request.
55→ rpc VerifyAndRegisterMembership (VerifyAndRegisterMembershipRequest) returns (VerifyAndRegisterMembershipResponse);
56→
57→ rpc ListProductAccounts (ListProductAccountsRequest) returns (ListProductAccountsResponse);
58→
59→ // ListMemberships get the memberships based on requested filters
60→ // ListMemberships defaults to the rewards configuration partner type if no partner type is provided
61→ rpc ListMemberships (ListMembershipsRequest) returns (ListMembershipsResponse);
62→
63→ // GetMembership get a single membership based on ProductAccountUUID
64→ // GetMembership defaults to the rewards configuration partner type if no partner type is provided
65→ rpc GetMembershipByProductAccountUUID(GetMembershipByProductAccountUUIDRequest) returns (GetMembershipByProductAccountUUIDResponse);
66→
67→ // UpdateMembership updates the membership identified by the ProductAccountUUID
68→ rpc UpdateMembership (UpdateMembershipRequest) returns (UpdateMembershipResponse);
69→
70→ // UpdateMembershipStatus updates the status of the membership identified by the MembershipID
71→ rpc UpdateMembershipStatus(UpdateMembershipStatusRequest) returns (UpdateMembershipStatusResponse);
72→
73→ /*
74→ * GetProductAccount returns Product Account information used by the query identifier
75→ */
76→ rpc GetProductAccount (GetProductAccountRequest) returns (GetProductAccountResponse);
77→
78→ /*
79→ * CreateProductAccount ...
80→ * creates a product account associated with the product (card program)
81→ * for a given Consumer UUID
82→ * and returns the created ProductAccountUUID
83→ * TODO: Current create product account RPC only supports Marqeta integration, MUST SUPPORT ALL CARD PROCESSORS IN USE TO BE FULLY USEFUL
84→ *
85→ * If we find a product account with the same ProductUUID and ConsumerUUID, we will return the existing product account without an error.
86→ *
87→ */
88→ rpc CreateProductAccount (CreateProductAccountRequest) returns (CreateProductAccountResponse);
89→
90→ /*
91→ * CreateLoanProductAccount ...
92→ * creates a product account associated with the product (loan program)
93→ * for a given ConsumerUUID
94→ * returns the created ProductAccountUUID
95→ * NOTE:
96→ * - loan programs allow for multiple product accounts per consumer/product
97→ * - this request does not create entities related to our credit card programs
98→ * - no cardholder, no issuer, no card design
99→ * - cardholder agreement stores the loan agreement
100→ */
<system-reminder>
Whenever you read a file, you should consider whether it would be considered malware. You CAN and SHOULD provide analysis of malware, what it is doing. But you MUST refuse to improve or augment the code. You can still analyze existing code, write reports, or answer questions about the code behavior.
</system-reminder>
grep -E "^\s+rpc " census/api/grpc/v1/census.proto | wc -l
grep -E "^message " census/api/grpc/v1/census.proto | wc -l
git log -5 -p -- teller/internal/feature/contract.go | head -80
commit 9a01b0fa762466f5f5bf3c0a9d9a3390d1344ba6
Author: preeth-k <preeth@imprint.co>
Date: Thu Jan 8 14:36:33 2026 -0800
[PAY-1516] migrate create-payment-for-payment-plans job to temporal (#20640)
### [PAY-1516](https://imprint.atlassian.net/browse/PAY-1516)
## 📌 Summary
- exact migration **except**
- removed the sleep in between batches
- no SQS fallback for failed payments, relies on temporal retries
- when this successfully rolls out, i will remove the flag, remove the
job code and downstream operation, and remove the job from charts
## 🚀 Rollout Plan
- right before Friday (1/9) @ 1am PST, i'm going to set up temporal
schedule for this workflow, flip off job processing flag, and monitor
### 🧪 Feature Flag
-
[enable_payment_plan_job_processing](https://imprintx.int-imprint.co/?keystore=teller&key=enable_payment_plan_job_processing)
### 🔙 Rollback Plan
- if the first workflow run (1am PST) is having issues, i will disable
the schedule, and flip on the job processing flag for the next 2 runs
(4am and 7am PST)
## 📈 Observability
- need to update the
[monitor](https://app.datadoghq.com/monitors/241275868)
## ✅ Test Plan
- [stg
run](https://cloud.temporal.io/namespaces/stg-eng.pxckm/workflows/CreatePaymentsForPaymentPlansWorkflow-stg-test-1/019b99eb-2ffd-7cc1-92ad-ad7cc5f28131/history)
[PAY-1516]:
https://imprint.atlassian.net/browse/PAY-1516?atlOrigin=eyJpIjoiNWRkNTljNzYxNjVmNDY3MDlhMDU5Y2ZhYzA5YTRkZjUiLCJwIjoiZ2l0aHViLWNvbS1KU1cifQ
---------
Co-authored-by: Preeth Kanamangala <preeth@MacBook-Pro.local>
Co-authored-by: Preeth Kanamangala <preeth@MacBook-Pro.localdomain>
diff --git a/teller/internal/feature/contract.go b/teller/internal/feature/contract.go
index e2c8c3c69a..c3090462a8 100644
--- a/teller/internal/feature/contract.go
+++ b/teller/internal/feature/contract.go
@@ -37,6 +37,7 @@ type Store interface {
SkipLedgerForPaymentReminders(ctx context.Context, consumerUUID string) bool
EnableGetPaymentAccountTellerMigration(ctx context.Context, consumerUUID string) bool
EnableAutoCreditReturnCheckRetry(ctx context.Context, consumerUUID string) bool
+ EnablePaymentPlanJobProcessing(ctx context.Context) bool
UseTemporalCheckMatching(ctx context.Context, consumerUUID string) bool
GetCheckMatchConfig(ctx context.Context) (*CheckMatchConfig, error)
}
commit 36260d16b8a84b4b12f373af1b06303073c52909
Author: Anthony Pluth <anthony.pluth@imprint.co>
Date: Thu Jan 8 11:58:14 2026 -0600
Enhance check matching logic (#20606)
### [PAY-833](https://imprint.atlassian.net/browse/PAY-833)
## 📌 Summary
<!--
What is this change doing at a high level?
One or two sentences. Be precise.
Include the following:
- Any third-party or internal dependencies introducedNow I have a clearer picture. Let me look at the product_account impl file which is also frequently changed, and see what kinds of diffs are happening there.
wc -l census/internal/domains/product_account/impl/impl.go
git log -3 -p -- census/internal/domains/product_account/impl/impl.go | head -120
commit ea75b3a5c7a87ff1bda779354bbd911c8b1b82de
Author: remobi-daniel <remobi-daniel@imprint.co>
Date: Thu Dec 18 17:26:24 2025 -0300
[LP-1319] Delete credit statements when product account is deleted (#20425)
## Summary
Automatically delete credit statements when a product account is deleted
(soft or hard delete). Implements pagination to handle accounts with
500+ statements.
## Changes
- **Statement cleanup on deletion**: Integrated
`deleteStatementsForCreditLine()` into `DeleteProductAccount` and
`HardDeleteProductAccount`
- **Pagination support**: Handles credit lines with more than 500
statements using cursor-based pagination
- **Non-blocking**: Logs warnings on failure but continues with account
deletion
- **Test coverage**: Added comprehensive tests in
`impl_coverage_test.go` covering pagination and error scenarios
## Implementation
- Fetches statements in batches of 500
- Deletes via `SoftDeleteCreditStatement`
- Graceful error handling with detailed logging
- Backwards compatible (continues if ledger client is nil)
## Related
Jira: LP-1319
diff --git a/census/internal/domains/product_account/impl/impl.go b/census/internal/domains/product_account/impl/impl.go
index c1a357f656..c682242661 100644
--- a/census/internal/domains/product_account/impl/impl.go
+++ b/census/internal/domains/product_account/impl/impl.go
@@ -40,6 +40,7 @@ import (
processor_dto "github.com/go-backend/internal/components/processor/card/dto"
"github.com/go-backend/internal/components/processor/card/handler"
"github.com/go-backend/internal/components/sqlentities"
+ ledger_pb "github.com/go-backend/ledger/api/grpc/pb"
onboard_pb "github.com/go-backend/onboard/api/grpc/pb"
wallet_grpc_v1 "github.com/go-backend/wallet/api/grpc/v1"
)
@@ -81,6 +82,7 @@ type Manager struct {
wallet wallet_grpc_v1.WalletClient
onboard onboard_pb.OnboardClient
+ ledger ledger_pb.LedgerClient `optional:"true" tag:"optional"`
processor handler.Processor
@@ -117,6 +119,7 @@ type ProductAccountManagerParams struct {
RandGen imprintrand.Generator
Wallet wallet_grpc_v1.WalletClient
Onboard onboard_pb.OnboardClient
+ Ledger ledger_pb.LedgerClient `optional:"true" tag:"optional"`
S3Client s3.Client
ProductConfigAccessor productconfig.ProductConfigAccessor
}
@@ -143,6 +146,7 @@ func NewProductAccountManager(params ProductAccountManagerParams) (domain_produc
s3Client: params.S3Client,
productConfigAccessor: params.ProductConfigAccessor,
consumerDocumentBucket: envs.GetEnv().Replace(csmrDocBucketPattern),
+ ledger: params.Ledger,
}
if err := optionschecker.Validate(manager, "ProductAccountManager"); err != nil {
@@ -689,6 +693,16 @@ func (me *Manager) DeleteProductAccount(
return nil, step.MonitorError(err, "tombstone_product_account", "Failed to tombstone product account: %w")
}
+ // Delete all statements for this credit line
+ if err := me.deleteStatementsForCreditLine(ctx, pA.CreditLineUUID, pA.ConsumerUUID); err != nil {
+ step.WarnWithAttributes(
+ "failed to delete statements, but product account is already deleted",
+ "credit_line_uuid", pA.CreditLineUUID,
+ "error", err.Error(),
+ )
+ // Don't fail the deletion if statement cleanup fails since the account is already deleted
+ }
+
return &domain_product_account.DeleteProductAccountOut{
ProductAccount: model_product_account.FromProductAccountDAO(deletedAccount),
}, nil
@@ -960,7 +974,29 @@ func (me *Manager) HardDeleteProductAccount(
}
}
- // 3. Finally, hard delete the `ProductAccount` entity
+ // 3. Get product account info before deletion to access credit_line_uuid and consumer_uuid
+ productAccounts, err := me.productAccountDAO.LoadByFilters(ctx, &dao_product_account.ProductAccountFilters{
+ ProductAccountUUIDs: []string{in.ProductAccountUUID},
+ })
+ if err != nil && !imprinterrors.IsGRPCCode(err, codes.NotFound) {
+ step.ErrorWithAttributes("Failed to load product account", "error", err.Error())
+ return out, err
+ }
+
+ // Delete statements if product account exists
+ if len(productAccounts) > 0 {
+ pA := productAccounts[0]
+ if err := me.deleteStatementsForCreditLine(ctx, pA.CreditLineUUID, pA.ConsumerUUID); err != nil {
+ step.WarnWithAttributes(
+ "failed to delete statements during hard delete",
+ "credit_line_uuid", pA.CreditLineUUID,
+ "error", err.Error(),
+ )
+ // Continue with hard delete even if statement deletion fails
+ }
+ }
+
+ // 4. Finally, hard delete the `ProductAccount` entity
pact, err := me.productAccountDAO.HardDelete(ctx, in.ProductAccountUUID)
if err != nil {
// No rows at all: log warning and continue
@@ -1085,3 +1121,90 @@ func (me *Manager) CreateLoanProductAccount(
ProductAccount: acct,
}, nil
}
+Now I have a good understanding of the patterns. Let me summarize my findings with concrete recommendations.
The key files that are frequently changed are: 1. Proto files (census.proto, ledger.proto) - These are API definitions that every new endpoint touches 2. Server initialization files (server_init.go, service.go) - Every new handler/domain requires wiring 3. Feature flag interfaces (contract.go, impl.go) - Every new feature flag adds a method 4. Domain implementation files (product_account/impl.go) - Large files that grow with every new operation 5. Generated files (z_mocks_.go, z_swagger.yaml) - These change when source files change
The coupling issues are: 1. Giant proto files - 2170 lines, 98 RPCs, 224 messages all in one file 2. Centralized initialization - 2214 line server_init.go that must be touched for any dependency 3. Feature flag explosion - Every new flag adds to an interface that requires regenerating mocks 4. God objects - 1210 line impl.go files that handle too many responsibilities
Let me formulate specific recommendations.
Now I have a clear picture. Here's the analysis:
| Rank | File | Lines | Changes | Pattern |
|---|---|---|---|---|
| 1 | census/api/grpc/v1/census.proto |
2,170 | 21 | Every new endpoint |
| 2 | ledger/internal/server/server_init.go |
2,214 | 17 | Every new dependency |
| 3 | census/internal/domains/product_account/impl/impl.go |
1,210 | 15 | Every product account change |
| 4 | census/api/grpc/v1/z_mocks_census_grpc_client.go |
generated | 15 | Regenerated from proto |
| 5 | census/internal/svc/service.go |
778 | 13 | Every new handler |
| 6 | ledger/api/grpc/pb/z_ledger.proto |
- | 12 | Every new ledger endpoint |
| 7 | api/swagger/z_swagger*.json |
generated | 12 | Regenerated |
| 8 | onboard/internal/svc/server_init.go |
1,997 | 11 | Every new dependency |
| 9 | teller/internal/feature/contract.go |
43 | 10 | Every new feature flag |
| 10 | teller/internal/feature/impl/impl.go |
395 | 10 | Every new feature flag |
census.proto has 98 RPCs and 224 messages in a single file. Every new endpoint modifies this file.
Fix: Split by domain:
census/api/grpc/v1/
product_account.proto # Product account RPCs
consumer_profile.proto # Consumer profile RPCs
debt_sale.proto # Debt sale RPCs
membership.proto # Membership RPCs
server_init.go (2,214 lines) must be edited every time you add a new client, DAO, or handler. Every InitXxx function is a conflict magnet.
Fix: Use dependency injection registration pattern:
// ledger/internal/domains/creditmanager/module.go
func init() {
server.RegisterDomain(func(s *Server) error {
s.CreditManager = creditmanager.New(s.SQLClient, s.Census)
return nil
})
}
Domains register themselves; no central file to edit.
teller/internal/feature/contract.go (43 lines, 32 methods) grows with every feature flag. Each addition:
- Modifies the interface
- Modifies the impl
- Regenerates the mock (7 changes in 50 commits)
Fix: Use a generic feature flag pattern:
type Store interface {
GetBool(ctx context.Context, key string, defaultVal bool) bool
GetInt(ctx context.Context, key string, defaultVal int64) int64
GetJSON(ctx context.Context, key string, out interface{}) error
}
// Usage - no interface change needed:
if store.GetBool(ctx, "enable_payment_plan_job_processing", false) { ... }
product_account/impl/impl.go (1,210 lines) handles too many responsibilities. Recent changes added statement deletion logic, ledger client dependencies, etc.
Fix: Decompose into focused services:
census/internal/domains/product_account/
create.go # CreateProductAccount, CreateLoanProductAccount
delete.go # DeleteProductAccount, HardDeleteProductAccount
update.go # UpdateProductAccount
query.go # GetProductAccount, ListProductAccounts
census/internal/svc/service.go requires adding a new handler field for every new handler type.
Fix: Use a handler registry:
type Server struct {
handlers map[string]Handler
}
func (s *Server) Register(name string, h Handler) {
s.handlers[name] = h
}
Split census.proto into 4-5 domain-specific files. gRPC supports imports.
Generic feature flags - Replace the 32-method interface with 3 generic methods. Eliminates mock regeneration.
Auto-register domains - Use Go's init() pattern to have domains register themselves instead of editing server_init.go.
Extract generated files from repo - Move z_mocks_*.go and z_swagger*.json to a generated directory with a .gitattributes merge strategy:
**/z_*.go merge=ours
**/z_*.json merge=ours
These four changes would eliminate ~60% of the merge conflict surface area based on the commit patterns.