{"Time":"2026-09-12T11:42:32.8768353+08:00","Action":"start","Package":"github.com/Wei-Shaw/sub2api/internal/service"} {"Time":"2026-09-12T11:42:34.8035575+08:00","Action":"start","Package":"github.com/Wei-Shaw/sub2api/internal/repository"} {"Time":"2026-09-12T11:42:34.8035575+08:00","Action":"start","Package":"github.com/Wei-Shaw/sub2api/internal/pkg/tlsfingerprint"} {"Time":"2026-09-12T11:42:34.8045548+08:00","Action":"start","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin"} {"Time":"2026-09-12T11:42:34.9889356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Output":"2026/09/12 03:42:34 Timezone initialized: UTC (UTC offset: +00:00)\n"} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestPreviewAntiDegradeOpenAI"} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestPreviewAntiDegradeOpenAI","Output":"=== RUN TestPreviewAntiDegradeOpenAI\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestPreviewAntiDegradeOpenAI","Output":"--- PASS: TestPreviewAntiDegradeOpenAI (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestPreviewAntiDegradeOpenAI","Elapsed":0} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestPreviewAntiDegradeAnthropic"} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestPreviewAntiDegradeAnthropic","Output":"=== RUN TestPreviewAntiDegradeAnthropic\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestPreviewAntiDegradeAnthropic","Output":"--- PASS: TestPreviewAntiDegradeAnthropic (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestPreviewAntiDegradeAnthropic","Elapsed":0} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestPreviewAntiDegradeNothingToDo"} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestPreviewAntiDegradeNothingToDo","Output":"=== RUN TestPreviewAntiDegradeNothingToDo\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestPreviewAntiDegradeNothingToDo","Output":"--- PASS: TestPreviewAntiDegradeNothingToDo (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestPreviewAntiDegradeNothingToDo","Elapsed":0} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestPreviewAntiDegradeAlreadyEnabled"} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestPreviewAntiDegradeAlreadyEnabled","Output":"=== RUN TestPreviewAntiDegradeAlreadyEnabled\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestPreviewAntiDegradeAlreadyEnabled","Output":"--- PASS: TestPreviewAntiDegradeAlreadyEnabled (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestPreviewAntiDegradeAlreadyEnabled","Elapsed":0} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyRevertAntiDegrade"} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyRevertAntiDegrade","Output":"=== RUN TestApplyRevertAntiDegrade\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyRevertAntiDegrade","Output":"--- PASS: TestApplyRevertAntiDegrade (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyRevertAntiDegrade","Elapsed":0} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestRevertAntiDegradeRejectsBadSnapshot"} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestRevertAntiDegradeRejectsBadSnapshot","Output":"=== RUN TestRevertAntiDegradeRejectsBadSnapshot\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestRevertAntiDegradeRejectsBadSnapshot","Output":"--- PASS: TestRevertAntiDegradeRejectsBadSnapshot (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestRevertAntiDegradeRejectsBadSnapshot","Elapsed":0} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccount_IsCodexCLIOnlyAppServerAllowed"} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccount_IsCodexCLIOnlyAppServerAllowed","Output":"=== RUN TestAccount_IsCodexCLIOnlyAppServerAllowed\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccount_IsCodexCLIOnlyAppServerAllowed/codex_cli_only_开_+_allow_app_server=true_→_true"} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccount_IsCodexCLIOnlyAppServerAllowed/codex_cli_only_开_+_allow_app_server=true_→_true","Output":"=== RUN TestAccount_IsCodexCLIOnlyAppServerAllowed/codex_cli_only_开_+_allow_app_server=true_→_true\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccount_IsCodexCLIOnlyAppServerAllowed/codex_cli_only_开_+_allow_app_server=true_→_true","Output":"--- PASS: TestAccount_IsCodexCLIOnlyAppServerAllowed/codex_cli_only_开_+_allow_app_server=true_→_true (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccount_IsCodexCLIOnlyAppServerAllowed/codex_cli_only_开_+_allow_app_server=true_→_true","Elapsed":0} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccount_IsCodexCLIOnlyAppServerAllowed/codex_cli_only_开_+_allow_app_server=false_→_false"} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccount_IsCodexCLIOnlyAppServerAllowed/codex_cli_only_开_+_allow_app_server=false_→_false","Output":"=== RUN TestAccount_IsCodexCLIOnlyAppServerAllowed/codex_cli_only_开_+_allow_app_server=false_→_false\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccount_IsCodexCLIOnlyAppServerAllowed/codex_cli_only_开_+_allow_app_server=false_→_false","Output":"--- PASS: TestAccount_IsCodexCLIOnlyAppServerAllowed/codex_cli_only_开_+_allow_app_server=false_→_false (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccount_IsCodexCLIOnlyAppServerAllowed/codex_cli_only_开_+_allow_app_server=false_→_false","Elapsed":0} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccount_IsCodexCLIOnlyAppServerAllowed/codex_cli_only_开_+_字段缺失_→_false"} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccount_IsCodexCLIOnlyAppServerAllowed/codex_cli_only_开_+_字段缺失_→_false","Output":"=== RUN TestAccount_IsCodexCLIOnlyAppServerAllowed/codex_cli_only_开_+_字段缺失_→_false\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccount_IsCodexCLIOnlyAppServerAllowed/codex_cli_only_开_+_字段缺失_→_false","Output":"--- PASS: TestAccount_IsCodexCLIOnlyAppServerAllowed/codex_cli_only_开_+_字段缺失_→_false (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccount_IsCodexCLIOnlyAppServerAllowed/codex_cli_only_开_+_字段缺失_→_false","Elapsed":0} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccount_IsCodexCLIOnlyAppServerAllowed/codex_cli_only_关_→_即便_allow_app_server=true_也_false"} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccount_IsCodexCLIOnlyAppServerAllowed/codex_cli_only_关_→_即便_allow_app_server=true_也_false","Output":"=== RUN TestAccount_IsCodexCLIOnlyAppServerAllowed/codex_cli_only_关_→_即便_allow_app_server=true_也_false\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccount_IsCodexCLIOnlyAppServerAllowed/codex_cli_only_关_→_即便_allow_app_server=true_也_false","Output":"--- PASS: TestAccount_IsCodexCLIOnlyAppServerAllowed/codex_cli_only_关_→_即便_allow_app_server=true_也_false (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccount_IsCodexCLIOnlyAppServerAllowed/codex_cli_only_关_→_即便_allow_app_server=true_也_false","Elapsed":0} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccount_IsCodexCLIOnlyAppServerAllowed","Output":"--- PASS: TestAccount_IsCodexCLIOnlyAppServerAllowed (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccount_IsCodexCLIOnlyAppServerAllowed","Elapsed":0} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBulkUpdateAccountsDoesNotPrewriteCodexSeed"} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBulkUpdateAccountsDoesNotPrewriteCodexSeed","Output":"=== RUN TestBulkUpdateAccountsDoesNotPrewriteCodexSeed\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBulkUpdateAccountsDoesNotPrewriteCodexSeed","Output":"--- PASS: TestBulkUpdateAccountsDoesNotPrewriteCodexSeed (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBulkUpdateAccountsDoesNotPrewriteCodexSeed","Elapsed":0} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestDuplicateAccountDoesNotCopyCodexFingerprintSeed"} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestDuplicateAccountDoesNotCopyCodexFingerprintSeed","Output":"=== RUN TestDuplicateAccountDoesNotCopyCodexFingerprintSeed\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestDuplicateAccountDoesNotCopyCodexFingerprintSeed","Output":"--- PASS: TestDuplicateAccountDoesNotCopyCodexFingerprintSeed (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestDuplicateAccountDoesNotCopyCodexFingerprintSeed","Elapsed":0} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccountServiceCreateAndUpdateCodexSeedLifecycle"} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccountServiceCreateAndUpdateCodexSeedLifecycle","Output":"=== RUN TestAccountServiceCreateAndUpdateCodexSeedLifecycle\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccountServiceCreateAndUpdateCodexSeedLifecycle","Output":"--- PASS: TestAccountServiceCreateAndUpdateCodexSeedLifecycle (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccountServiceCreateAndUpdateCodexSeedLifecycle","Elapsed":0} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1IdentityIsUniquePersistentAndDoesNotMergeThreads"} {"Time":"2026-09-12T11:42:34.9894557+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1IdentityIsUniquePersistentAndDoesNotMergeThreads","Output":"=== RUN TestMode1IdentityIsUniquePersistentAndDoesNotMergeThreads\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.9910162+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1IdentityIsUniquePersistentAndDoesNotMergeThreads","Output":"--- PASS: TestMode1IdentityIsUniquePersistentAndDoesNotMergeThreads (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.9910162+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1IdentityIsUniquePersistentAndDoesNotMergeThreads","Elapsed":0} {"Time":"2026-09-12T11:42:34.9910162+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1RuntimeRejectsConfigurationDrift"} {"Time":"2026-09-12T11:42:34.9910162+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1RuntimeRejectsConfigurationDrift","Output":"=== RUN TestMode1RuntimeRejectsConfigurationDrift\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.9910162+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1RuntimeRejectsConfigurationDrift","Output":"--- PASS: TestMode1RuntimeRejectsConfigurationDrift (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.9910162+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1RuntimeRejectsConfigurationDrift","Elapsed":0} {"Time":"2026-09-12T11:42:34.9910162+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1InvalidMarkerDoesNotDowngrade"} {"Time":"2026-09-12T11:42:34.9910162+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1InvalidMarkerDoesNotDowngrade","Output":"=== RUN TestMode1InvalidMarkerDoesNotDowngrade\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.9910162+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1InvalidMarkerDoesNotDowngrade","Output":"--- PASS: TestMode1InvalidMarkerDoesNotDowngrade (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.9910162+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1InvalidMarkerDoesNotDowngrade","Elapsed":0} {"Time":"2026-09-12T11:42:34.9910162+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1DifferentAccountsWithDuplicatedLegacyDeviceStillDiffer"} {"Time":"2026-09-12T11:42:34.9910162+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1DifferentAccountsWithDuplicatedLegacyDeviceStillDiffer","Output":"=== RUN TestMode1DifferentAccountsWithDuplicatedLegacyDeviceStillDiffer\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.9910162+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1DifferentAccountsWithDuplicatedLegacyDeviceStillDiffer","Output":"--- PASS: TestMode1DifferentAccountsWithDuplicatedLegacyDeviceStillDiffer (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.9910162+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1DifferentAccountsWithDuplicatedLegacyDeviceStillDiffer","Elapsed":0} {"Time":"2026-09-12T11:42:34.9910162+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1PartialAndBulkUpdatesCannotDisablePolicy"} {"Time":"2026-09-12T11:42:34.9910162+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1PartialAndBulkUpdatesCannotDisablePolicy","Output":"=== RUN TestMode1PartialAndBulkUpdatesCannotDisablePolicy\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.9915239+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1PartialAndBulkUpdatesCannotDisablePolicy","Output":"--- PASS: TestMode1PartialAndBulkUpdatesCannotDisablePolicy (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.9915239+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1PartialAndBulkUpdatesCannotDisablePolicy","Elapsed":0} {"Time":"2026-09-12T11:42:34.9915239+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1HTTPAndAccountTestUseSameTLSWithoutFallback"} {"Time":"2026-09-12T11:42:34.9915239+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1HTTPAndAccountTestUseSameTLSWithoutFallback","Output":"=== RUN TestMode1HTTPAndAccountTestUseSameTLSWithoutFallback\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.9915239+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1HTTPAndAccountTestUseSameTLSWithoutFallback","Output":"--- PASS: TestMode1HTTPAndAccountTestUseSameTLSWithoutFallback (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.9915239+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1HTTPAndAccountTestUseSameTLSWithoutFallback","Elapsed":0} {"Time":"2026-09-12T11:42:34.9915239+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1UsesExistingPluginRouting"} {"Time":"2026-09-12T11:42:34.9915239+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1UsesExistingPluginRouting","Output":"=== RUN TestMode1UsesExistingPluginRouting\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.9915239+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1UsesExistingPluginRouting","Output":"--- PASS: TestMode1UsesExistingPluginRouting (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.9915239+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1UsesExistingPluginRouting","Elapsed":0} {"Time":"2026-09-12T11:42:34.9920371+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1IntegrityPreservesReasoningToolsAndBudget"} {"Time":"2026-09-12T11:42:34.9920371+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1IntegrityPreservesReasoningToolsAndBudget","Output":"=== RUN TestMode1IntegrityPreservesReasoningToolsAndBudget\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.9925444+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1IntegrityPreservesReasoningToolsAndBudget","Output":"--- PASS: TestMode1IntegrityPreservesReasoningToolsAndBudget (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.9925444+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1IntegrityPreservesReasoningToolsAndBudget","Elapsed":0} {"Time":"2026-09-12T11:42:34.9925444+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardPreservesPayloadThroughNormalAndPassthrough"} {"Time":"2026-09-12T11:42:34.9925444+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardPreservesPayloadThroughNormalAndPassthrough","Output":"=== RUN TestMode1ForwardPreservesPayloadThroughNormalAndPassthrough\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.9925444+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardPreservesPayloadThroughNormalAndPassthrough/false"} {"Time":"2026-09-12T11:42:34.9925444+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardPreservesPayloadThroughNormalAndPassthrough/false","Output":"=== RUN TestMode1ForwardPreservesPayloadThroughNormalAndPassthrough/false\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.994086+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardPreservesPayloadThroughNormalAndPassthrough/false","Output":"--- PASS: TestMode1ForwardPreservesPayloadThroughNormalAndPassthrough/false (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.994086+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardPreservesPayloadThroughNormalAndPassthrough/false","Elapsed":0} {"Time":"2026-09-12T11:42:34.994086+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardPreservesPayloadThroughNormalAndPassthrough/true"} {"Time":"2026-09-12T11:42:34.994086+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardPreservesPayloadThroughNormalAndPassthrough/true","Output":"=== RUN TestMode1ForwardPreservesPayloadThroughNormalAndPassthrough/true\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.994086+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardPreservesPayloadThroughNormalAndPassthrough/true","Output":"2026/09/12 03:42:34 [OpenAI 自动透传] 命中自动透传分支: account=1 name=mode1 type=oauth model=gpt-5.2 stream=true\n"} {"Time":"2026-09-12T11:42:34.994086+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardPreservesPayloadThroughNormalAndPassthrough/true","Output":"--- PASS: TestMode1ForwardPreservesPayloadThroughNormalAndPassthrough/true (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.994086+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardPreservesPayloadThroughNormalAndPassthrough/true","Elapsed":0} {"Time":"2026-09-12T11:42:34.994086+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardPreservesPayloadThroughNormalAndPassthrough","Output":"--- PASS: TestMode1ForwardPreservesPayloadThroughNormalAndPassthrough (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.994086+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardPreservesPayloadThroughNormalAndPassthrough","Elapsed":0} {"Time":"2026-09-12T11:42:34.994086+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1V3MigrationPreservesOriginalSnapshotAndIdentity"} {"Time":"2026-09-12T11:42:34.994086+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1V3MigrationPreservesOriginalSnapshotAndIdentity","Output":"=== RUN TestMode1V3MigrationPreservesOriginalSnapshotAndIdentity\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.994086+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1V3MigrationPreservesOriginalSnapshotAndIdentity","Output":"--- PASS: TestMode1V3MigrationPreservesOriginalSnapshotAndIdentity (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.994086+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1V3MigrationPreservesOriginalSnapshotAndIdentity","Elapsed":0} {"Time":"2026-09-12T11:42:34.994086+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1InvalidVersionCanBeExplicitlyRestored"} {"Time":"2026-09-12T11:42:34.994086+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1InvalidVersionCanBeExplicitlyRestored","Output":"=== RUN TestMode1InvalidVersionCanBeExplicitlyRestored\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.994086+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1InvalidVersionCanBeExplicitlyRestored","Output":"--- PASS: TestMode1InvalidVersionCanBeExplicitlyRestored (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.994086+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1InvalidVersionCanBeExplicitlyRestored","Elapsed":0} {"Time":"2026-09-12T11:42:34.994086+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1V3StandardTransportWithTLSGloballyDisabled"} {"Time":"2026-09-12T11:42:34.994086+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1V3StandardTransportWithTLSGloballyDisabled","Output":"=== RUN TestMode1V3StandardTransportWithTLSGloballyDisabled\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.994086+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1V3StandardTransportWithTLSGloballyDisabled","Output":"--- PASS: TestMode1V3StandardTransportWithTLSGloballyDisabled (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.994086+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1V3StandardTransportWithTLSGloballyDisabled","Elapsed":0} {"Time":"2026-09-12T11:42:34.994086+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3"} {"Time":"2026-09-12T11:42:34.994086+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3","Output":"=== RUN TestMode1ForwardRegressionV2AndV3\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.994086+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v2/passthrough=false/body=0"} {"Time":"2026-09-12T11:42:34.994086+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v2/passthrough=false/body=0","Output":"=== RUN TestMode1ForwardRegressionV2AndV3/v2/passthrough=false/body=0\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.9957187+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v2/passthrough=false/body=0","Output":"--- PASS: TestMode1ForwardRegressionV2AndV3/v2/passthrough=false/body=0 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.9957187+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v2/passthrough=false/body=0","Elapsed":0} {"Time":"2026-09-12T11:42:34.9957187+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v2/passthrough=false/body=1"} {"Time":"2026-09-12T11:42:34.9957187+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v2/passthrough=false/body=1","Output":"=== RUN TestMode1ForwardRegressionV2AndV3/v2/passthrough=false/body=1\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.9967369+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v2/passthrough=false/body=1","Output":"--- PASS: TestMode1ForwardRegressionV2AndV3/v2/passthrough=false/body=1 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.9967369+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v2/passthrough=false/body=1","Elapsed":0} {"Time":"2026-09-12T11:42:34.9967369+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v2/passthrough=false/body=2"} {"Time":"2026-09-12T11:42:34.9967369+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v2/passthrough=false/body=2","Output":"=== RUN TestMode1ForwardRegressionV2AndV3/v2/passthrough=false/body=2\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.9967369+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v2/passthrough=false/body=2","Output":"2026/09/12 03:42:34 [OpenAI] Upstream model resolved: gpt-5.4-high -\u003e gpt-5.4 (account: , type: oauth, isCodexCLI: false)\n"} {"Time":"2026-09-12T11:42:34.9967369+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v2/passthrough=false/body=2","Output":"2026/09/12 03:42:34 [OpenAI] Normalized reasoning.effort: minimal -\u003e none (account: )\n"} {"Time":"2026-09-12T11:42:34.9982621+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v2/passthrough=false/body=2","Output":"--- PASS: TestMode1ForwardRegressionV2AndV3/v2/passthrough=false/body=2 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.9982621+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v2/passthrough=false/body=2","Elapsed":0} {"Time":"2026-09-12T11:42:34.9982621+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v2/passthrough=false/body=3"} {"Time":"2026-09-12T11:42:34.9982621+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v2/passthrough=false/body=3","Output":"=== RUN TestMode1ForwardRegressionV2AndV3/v2/passthrough=false/body=3\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.999788+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v2/passthrough=false/body=3","Output":"--- PASS: TestMode1ForwardRegressionV2AndV3/v2/passthrough=false/body=3 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:34.999788+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v2/passthrough=false/body=3","Elapsed":0} {"Time":"2026-09-12T11:42:34.999788+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v2/passthrough=false/body=4"} {"Time":"2026-09-12T11:42:34.999788+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v2/passthrough=false/body=4","Output":"=== RUN TestMode1ForwardRegressionV2AndV3/v2/passthrough=false/body=4\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0008193+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v2/passthrough=false/body=4","Output":"--- PASS: TestMode1ForwardRegressionV2AndV3/v2/passthrough=false/body=4 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0008193+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v2/passthrough=false/body=4","Elapsed":0} {"Time":"2026-09-12T11:42:35.0008193+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v2/passthrough=true/body=0"} {"Time":"2026-09-12T11:42:35.0013242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v2/passthrough=true/body=0","Output":"=== RUN TestMode1ForwardRegressionV2AndV3/v2/passthrough=true/body=0\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0013242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v2/passthrough=true/body=0","Output":"2026/09/12 03:42:35 [OpenAI 自动透传] 命中自动透传分支: account=1 name= type=oauth model=gpt-5.2 stream=true\n"} {"Time":"2026-09-12T11:42:35.0013242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v2/passthrough=true/body=0","Output":"--- PASS: TestMode1ForwardRegressionV2AndV3/v2/passthrough=true/body=0 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0013242+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v2/passthrough=true/body=0","Elapsed":0} {"Time":"2026-09-12T11:42:35.0013242+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v2/passthrough=true/body=1"} {"Time":"2026-09-12T11:42:35.0013242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v2/passthrough=true/body=1","Output":"=== RUN TestMode1ForwardRegressionV2AndV3/v2/passthrough=true/body=1\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0013242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v2/passthrough=true/body=1","Output":"2026/09/12 03:42:35 [OpenAI 自动透传] 命中自动透传分支: account=1 name= type=oauth model=gpt-5.2 stream=true\n"} {"Time":"2026-09-12T11:42:35.0013242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v2/passthrough=true/body=1","Output":"--- PASS: TestMode1ForwardRegressionV2AndV3/v2/passthrough=true/body=1 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0013242+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v2/passthrough=true/body=1","Elapsed":0} {"Time":"2026-09-12T11:42:35.0013242+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v2/passthrough=true/body=2"} {"Time":"2026-09-12T11:42:35.0013242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v2/passthrough=true/body=2","Output":"=== RUN TestMode1ForwardRegressionV2AndV3/v2/passthrough=true/body=2\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0013242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v2/passthrough=true/body=2","Output":"2026/09/12 03:42:35 [OpenAI 自动透传] 命中自动透传分支: account=1 name= type=oauth model=gpt-5.4-high stream=true\n"} {"Time":"2026-09-12T11:42:35.0013242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v2/passthrough=true/body=2","Output":"--- PASS: TestMode1ForwardRegressionV2AndV3/v2/passthrough=true/body=2 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0013242+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v2/passthrough=true/body=2","Elapsed":0} {"Time":"2026-09-12T11:42:35.0013242+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v2/passthrough=true/body=3"} {"Time":"2026-09-12T11:42:35.0013242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v2/passthrough=true/body=3","Output":"=== RUN TestMode1ForwardRegressionV2AndV3/v2/passthrough=true/body=3\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0013242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v2/passthrough=true/body=3","Output":"2026/09/12 03:42:35 [OpenAI 自动透传] 命中自动透传分支: account=1 name= type=oauth model=gpt-5.2 stream=true\n"} {"Time":"2026-09-12T11:42:35.0018389+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v2/passthrough=true/body=3","Output":"--- PASS: TestMode1ForwardRegressionV2AndV3/v2/passthrough=true/body=3 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0018389+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v2/passthrough=true/body=3","Elapsed":0} {"Time":"2026-09-12T11:42:35.0018389+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v2/passthrough=true/body=4"} {"Time":"2026-09-12T11:42:35.0018389+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v2/passthrough=true/body=4","Output":"=== RUN TestMode1ForwardRegressionV2AndV3/v2/passthrough=true/body=4\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0018389+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v2/passthrough=true/body=4","Output":"2026/09/12 03:42:35 [OpenAI 自动透传] 命中自动透传分支: account=1 name= type=oauth model=gpt-5.2 stream=true\n"} {"Time":"2026-09-12T11:42:35.0018389+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v2/passthrough=true/body=4","Output":"--- PASS: TestMode1ForwardRegressionV2AndV3/v2/passthrough=true/body=4 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0018389+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v2/passthrough=true/body=4","Elapsed":0} {"Time":"2026-09-12T11:42:35.0018389+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v3/passthrough=false/body=0"} {"Time":"2026-09-12T11:42:35.0018389+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v3/passthrough=false/body=0","Output":"=== RUN TestMode1ForwardRegressionV2AndV3/v3/passthrough=false/body=0\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.002847+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v3/passthrough=false/body=0","Output":"--- PASS: TestMode1ForwardRegressionV2AndV3/v3/passthrough=false/body=0 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0033651+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v3/passthrough=false/body=0","Elapsed":0} {"Time":"2026-09-12T11:42:35.0033651+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v3/passthrough=false/body=1"} {"Time":"2026-09-12T11:42:35.0033651+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v3/passthrough=false/body=1","Output":"=== RUN TestMode1ForwardRegressionV2AndV3/v3/passthrough=false/body=1\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0101585+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v3/passthrough=false/body=1","Output":"--- PASS: TestMode1ForwardRegressionV2AndV3/v3/passthrough=false/body=1 (0.01s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0101585+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v3/passthrough=false/body=1","Elapsed":0.01} {"Time":"2026-09-12T11:42:35.0101585+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v3/passthrough=false/body=2"} {"Time":"2026-09-12T11:42:35.0101585+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v3/passthrough=false/body=2","Output":"=== RUN TestMode1ForwardRegressionV2AndV3/v3/passthrough=false/body=2\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0106617+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v3/passthrough=false/body=2","Output":"2026/09/12 03:42:35 [OpenAI] Upstream model resolved: gpt-5.4-high -\u003e gpt-5.4 (account: , type: oauth, isCodexCLI: false)\n"} {"Time":"2026-09-12T11:42:35.0106617+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v3/passthrough=false/body=2","Output":"2026/09/12 03:42:35 [OpenAI] Normalized reasoning.effort: minimal -\u003e none (account: )\n"} {"Time":"2026-09-12T11:42:35.0111884+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v3/passthrough=false/body=2","Output":"--- PASS: TestMode1ForwardRegressionV2AndV3/v3/passthrough=false/body=2 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0111884+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v3/passthrough=false/body=2","Elapsed":0} {"Time":"2026-09-12T11:42:35.0111884+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v3/passthrough=false/body=3"} {"Time":"2026-09-12T11:42:35.0111884+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v3/passthrough=false/body=3","Output":"=== RUN TestMode1ForwardRegressionV2AndV3/v3/passthrough=false/body=3\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0127519+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v3/passthrough=false/body=3","Output":"--- PASS: TestMode1ForwardRegressionV2AndV3/v3/passthrough=false/body=3 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0127519+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v3/passthrough=false/body=3","Elapsed":0} {"Time":"2026-09-12T11:42:35.0127519+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v3/passthrough=false/body=4"} {"Time":"2026-09-12T11:42:35.0127519+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v3/passthrough=false/body=4","Output":"=== RUN TestMode1ForwardRegressionV2AndV3/v3/passthrough=false/body=4\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0137878+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v3/passthrough=false/body=4","Output":"--- PASS: TestMode1ForwardRegressionV2AndV3/v3/passthrough=false/body=4 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0137878+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v3/passthrough=false/body=4","Elapsed":0} {"Time":"2026-09-12T11:42:35.0137878+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v3/passthrough=true/body=0"} {"Time":"2026-09-12T11:42:35.0137878+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v3/passthrough=true/body=0","Output":"=== RUN TestMode1ForwardRegressionV2AndV3/v3/passthrough=true/body=0\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0137878+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v3/passthrough=true/body=0","Output":"2026/09/12 03:42:35 [OpenAI 自动透传] 命中自动透传分支: account=1 name= type=oauth model=gpt-5.2 stream=true\n"} {"Time":"2026-09-12T11:42:35.0137878+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v3/passthrough=true/body=0","Output":"--- PASS: TestMode1ForwardRegressionV2AndV3/v3/passthrough=true/body=0 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0137878+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v3/passthrough=true/body=0","Elapsed":0} {"Time":"2026-09-12T11:42:35.0137878+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v3/passthrough=true/body=1"} {"Time":"2026-09-12T11:42:35.0137878+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v3/passthrough=true/body=1","Output":"=== RUN TestMode1ForwardRegressionV2AndV3/v3/passthrough=true/body=1\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0137878+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v3/passthrough=true/body=1","Output":"2026/09/12 03:42:35 [OpenAI 自动透传] 命中自动透传分支: account=1 name= type=oauth model=gpt-5.2 stream=true\n"} {"Time":"2026-09-12T11:42:35.0137878+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v3/passthrough=true/body=1","Output":"--- PASS: TestMode1ForwardRegressionV2AndV3/v3/passthrough=true/body=1 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0137878+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v3/passthrough=true/body=1","Elapsed":0} {"Time":"2026-09-12T11:42:35.0137878+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v3/passthrough=true/body=2"} {"Time":"2026-09-12T11:42:35.0137878+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v3/passthrough=true/body=2","Output":"=== RUN TestMode1ForwardRegressionV2AndV3/v3/passthrough=true/body=2\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0137878+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v3/passthrough=true/body=2","Output":"2026/09/12 03:42:35 [OpenAI 自动透传] 命中自动透传分支: account=1 name= type=oauth model=gpt-5.4-high stream=true\n"} {"Time":"2026-09-12T11:42:35.0143005+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v3/passthrough=true/body=2","Output":"--- PASS: TestMode1ForwardRegressionV2AndV3/v3/passthrough=true/body=2 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0143005+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v3/passthrough=true/body=2","Elapsed":0} {"Time":"2026-09-12T11:42:35.0143005+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v3/passthrough=true/body=3"} {"Time":"2026-09-12T11:42:35.0143005+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v3/passthrough=true/body=3","Output":"=== RUN TestMode1ForwardRegressionV2AndV3/v3/passthrough=true/body=3\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0143005+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v3/passthrough=true/body=3","Output":"2026/09/12 03:42:35 [OpenAI 自动透传] 命中自动透传分支: account=1 name= type=oauth model=gpt-5.2 stream=true\n"} {"Time":"2026-09-12T11:42:35.0143005+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v3/passthrough=true/body=3","Output":"--- PASS: TestMode1ForwardRegressionV2AndV3/v3/passthrough=true/body=3 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0143005+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v3/passthrough=true/body=3","Elapsed":0} {"Time":"2026-09-12T11:42:35.0143005+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v3/passthrough=true/body=4"} {"Time":"2026-09-12T11:42:35.0143005+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v3/passthrough=true/body=4","Output":"=== RUN TestMode1ForwardRegressionV2AndV3/v3/passthrough=true/body=4\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0143005+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v3/passthrough=true/body=4","Output":"2026/09/12 03:42:35 [OpenAI 自动透传] 命中自动透传分支: account=1 name= type=oauth model=gpt-5.2 stream=true\n"} {"Time":"2026-09-12T11:42:35.0143005+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v3/passthrough=true/body=4","Output":"--- PASS: TestMode1ForwardRegressionV2AndV3/v3/passthrough=true/body=4 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0143005+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3/v3/passthrough=true/body=4","Elapsed":0} {"Time":"2026-09-12T11:42:35.0143005+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3","Output":"--- PASS: TestMode1ForwardRegressionV2AndV3 (0.02s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0143005+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1ForwardRegressionV2AndV3","Elapsed":0.02} {"Time":"2026-09-12T11:42:35.0143005+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccount_IsCodexCLIOnlyEnabled"} {"Time":"2026-09-12T11:42:35.0143005+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccount_IsCodexCLIOnlyEnabled","Output":"=== RUN TestAccount_IsCodexCLIOnlyEnabled\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0143005+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccount_IsCodexCLIOnlyEnabled/OpenAI_OAuth_开启"} {"Time":"2026-09-12T11:42:35.0143005+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccount_IsCodexCLIOnlyEnabled/OpenAI_OAuth_开启","Output":"=== RUN TestAccount_IsCodexCLIOnlyEnabled/OpenAI_OAuth_开启\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0143005+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccount_IsCodexCLIOnlyEnabled/OpenAI_OAuth_开启","Output":"--- PASS: TestAccount_IsCodexCLIOnlyEnabled/OpenAI_OAuth_开启 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0143005+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccount_IsCodexCLIOnlyEnabled/OpenAI_OAuth_开启","Elapsed":0} {"Time":"2026-09-12T11:42:35.0143005+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccount_IsCodexCLIOnlyEnabled/OpenAI_OAuth_关闭"} {"Time":"2026-09-12T11:42:35.0143005+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccount_IsCodexCLIOnlyEnabled/OpenAI_OAuth_关闭","Output":"=== RUN TestAccount_IsCodexCLIOnlyEnabled/OpenAI_OAuth_关闭\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0143005+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccount_IsCodexCLIOnlyEnabled/OpenAI_OAuth_关闭","Output":"--- PASS: TestAccount_IsCodexCLIOnlyEnabled/OpenAI_OAuth_关闭 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0143005+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccount_IsCodexCLIOnlyEnabled/OpenAI_OAuth_关闭","Elapsed":0} {"Time":"2026-09-12T11:42:35.0143005+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccount_IsCodexCLIOnlyEnabled/字段缺失默认关闭"} {"Time":"2026-09-12T11:42:35.0143005+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccount_IsCodexCLIOnlyEnabled/字段缺失默认关闭","Output":"=== RUN TestAccount_IsCodexCLIOnlyEnabled/字段缺失默认关闭\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0143005+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccount_IsCodexCLIOnlyEnabled/字段缺失默认关闭","Output":"--- PASS: TestAccount_IsCodexCLIOnlyEnabled/字段缺失默认关闭 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0143005+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccount_IsCodexCLIOnlyEnabled/字段缺失默认关闭","Elapsed":0} {"Time":"2026-09-12T11:42:35.0143005+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccount_IsCodexCLIOnlyEnabled/类型非法默认关闭"} {"Time":"2026-09-12T11:42:35.0143005+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccount_IsCodexCLIOnlyEnabled/类型非法默认关闭","Output":"=== RUN TestAccount_IsCodexCLIOnlyEnabled/类型非法默认关闭\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0143005+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccount_IsCodexCLIOnlyEnabled/类型非法默认关闭","Output":"--- PASS: TestAccount_IsCodexCLIOnlyEnabled/类型非法默认关闭 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0143005+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccount_IsCodexCLIOnlyEnabled/类型非法默认关闭","Elapsed":0} {"Time":"2026-09-12T11:42:35.0143005+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccount_IsCodexCLIOnlyEnabled/非_OAuth_账号始终关闭"} {"Time":"2026-09-12T11:42:35.0143005+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccount_IsCodexCLIOnlyEnabled/非_OAuth_账号始终关闭","Output":"=== RUN TestAccount_IsCodexCLIOnlyEnabled/非_OAuth_账号始终关闭\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0143005+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccount_IsCodexCLIOnlyEnabled/非_OAuth_账号始终关闭","Output":"--- PASS: TestAccount_IsCodexCLIOnlyEnabled/非_OAuth_账号始终关闭 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0143005+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccount_IsCodexCLIOnlyEnabled/非_OAuth_账号始终关闭","Elapsed":0} {"Time":"2026-09-12T11:42:35.0143005+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccount_IsCodexCLIOnlyEnabled","Output":"--- PASS: TestAccount_IsCodexCLIOnlyEnabled (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0143005+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccount_IsCodexCLIOnlyEnabled","Elapsed":0} {"Time":"2026-09-12T11:42:35.0148054+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestShouldRefreshOpenAICodexSnapshot"} {"Time":"2026-09-12T11:42:35.0148054+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestShouldRefreshOpenAICodexSnapshot","Output":"=== RUN TestShouldRefreshOpenAICodexSnapshot\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0148054+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestShouldRefreshOpenAICodexSnapshot","Output":"=== PAUSE TestShouldRefreshOpenAICodexSnapshot\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0148054+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestShouldRefreshOpenAICodexSnapshot"} {"Time":"2026-09-12T11:42:35.0148054+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestShouldRefreshOpenAICodexSnapshot_SparkShadowIgnoresWSv2"} {"Time":"2026-09-12T11:42:35.0148054+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestShouldRefreshOpenAICodexSnapshot_SparkShadowIgnoresWSv2","Output":"=== RUN TestShouldRefreshOpenAICodexSnapshot_SparkShadowIgnoresWSv2\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0148054+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestShouldRefreshOpenAICodexSnapshot_SparkShadowIgnoresWSv2","Output":"=== PAUSE TestShouldRefreshOpenAICodexSnapshot_SparkShadowIgnoresWSv2\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0148054+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestShouldRefreshOpenAICodexSnapshot_SparkShadowIgnoresWSv2"} {"Time":"2026-09-12T11:42:35.0148054+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestExtractOpenAICodexProbeUpdatesAccepts429WithCodexHeaders"} {"Time":"2026-09-12T11:42:35.0148054+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestExtractOpenAICodexProbeUpdatesAccepts429WithCodexHeaders","Output":"=== RUN TestExtractOpenAICodexProbeUpdatesAccepts429WithCodexHeaders\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0148054+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestExtractOpenAICodexProbeUpdatesAccepts429WithCodexHeaders","Output":"=== PAUSE TestExtractOpenAICodexProbeUpdatesAccepts429WithCodexHeaders\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0148054+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestExtractOpenAICodexProbeUpdatesAccepts429WithCodexHeaders"} {"Time":"2026-09-12T11:42:35.0148054+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccountUsageService_PersistOpenAICodexProbeSnapshotOnlyUpdatesExtra"} {"Time":"2026-09-12T11:42:35.0148054+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccountUsageService_PersistOpenAICodexProbeSnapshotOnlyUpdatesExtra","Output":"=== RUN TestAccountUsageService_PersistOpenAICodexProbeSnapshotOnlyUpdatesExtra\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0148054+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccountUsageService_PersistOpenAICodexProbeSnapshotOnlyUpdatesExtra","Output":"=== PAUSE TestAccountUsageService_PersistOpenAICodexProbeSnapshotOnlyUpdatesExtra\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0148054+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccountUsageService_PersistOpenAICodexProbeSnapshotOnlyUpdatesExtra"} {"Time":"2026-09-12T11:42:35.0148054+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccountUsageService_GetOpenAIUsage_DoesNotPromoteCodexExtraToRateLimit"} {"Time":"2026-09-12T11:42:35.0148054+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccountUsageService_GetOpenAIUsage_DoesNotPromoteCodexExtraToRateLimit","Output":"=== RUN TestAccountUsageService_GetOpenAIUsage_DoesNotPromoteCodexExtraToRateLimit\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0148054+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccountUsageService_GetOpenAIUsage_DoesNotPromoteCodexExtraToRateLimit","Output":"=== PAUSE TestAccountUsageService_GetOpenAIUsage_DoesNotPromoteCodexExtraToRateLimit\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0148054+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccountUsageService_GetOpenAIUsage_DoesNotPromoteCodexExtraToRateLimit"} {"Time":"2026-09-12T11:42:35.0148054+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexUsageProgressFromExtra_ZerosExpiredWindow"} {"Time":"2026-09-12T11:42:35.0148054+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexUsageProgressFromExtra_ZerosExpiredWindow","Output":"=== RUN TestBuildCodexUsageProgressFromExtra_ZerosExpiredWindow\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0148054+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexUsageProgressFromExtra_ZerosExpiredWindow","Output":"=== PAUSE TestBuildCodexUsageProgressFromExtra_ZerosExpiredWindow\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0148054+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexUsageProgressFromExtra_ZerosExpiredWindow"} {"Time":"2026-09-12T11:42:35.0148054+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAPIKeyAuthSnapshotGroupCodexModelsManifestRoundtrip"} {"Time":"2026-09-12T11:42:35.0148054+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAPIKeyAuthSnapshotGroupCodexModelsManifestRoundtrip","Output":"=== RUN TestAPIKeyAuthSnapshotGroupCodexModelsManifestRoundtrip\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0148054+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAPIKeyAuthSnapshotGroupCodexModelsManifestRoundtrip","Output":"--- PASS: TestAPIKeyAuthSnapshotGroupCodexModelsManifestRoundtrip (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0148054+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAPIKeyAuthSnapshotGroupCodexModelsManifestRoundtrip","Elapsed":0} {"Time":"2026-09-12T11:42:35.0153122+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestExtractContentModerationInput_OpenAIResponsesCodexPayloadUsesLastUserMessage"} {"Time":"2026-09-12T11:42:35.0153122+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestExtractContentModerationInput_OpenAIResponsesCodexPayloadUsesLastUserMessage","Output":"=== RUN TestExtractContentModerationInput_OpenAIResponsesCodexPayloadUsesLastUserMessage\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0153122+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestExtractContentModerationInput_OpenAIResponsesCodexPayloadUsesLastUserMessage","Output":"--- PASS: TestExtractContentModerationInput_OpenAIResponsesCodexPayloadUsesLastUserMessage (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0153122+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestExtractContentModerationInput_OpenAIResponsesCodexPayloadUsesLastUserMessage","Elapsed":0} {"Time":"2026-09-12T11:42:35.0153122+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestContentModerationCheck_OpenAIResponsesRecordsNonHitForCodexPayload"} {"Time":"2026-09-12T11:42:35.0153122+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestContentModerationCheck_OpenAIResponsesRecordsNonHitForCodexPayload","Output":"=== RUN TestContentModerationCheck_OpenAIResponsesRecordsNonHitForCodexPayload\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0168394+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestContentModerationCheck_OpenAIResponsesRecordsNonHitForCodexPayload","Output":"2026/09/12 03:42:35 INFO content_moderation.config_loaded user_id=1001 api_key_id=0 group_id=0 group_name=\"\" endpoint=/responses provider=openai protocol=openai_responses model=gpt-5.5 enabled=true mode=pre_block all_groups=true configured_group_ids=[] in_group_scope=true model_filter_type=all configured_models=[] in_model_scope=true sample_rate=100 api_key_count=1 pre_hash_check_enabled=false record_non_hits=true\n"} {"Time":"2026-09-12T11:42:35.0168394+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestContentModerationCheck_OpenAIResponsesRecordsNonHitForCodexPayload","Output":"2026/09/12 03:42:35 INFO content_moderation.input_extracted user_id=1001 api_key_id=0 group_id=0 endpoint=/responses protocol=openai_responses text_runes=16 image_count=0\n"} {"Time":"2026-09-12T11:42:35.0183399+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestContentModerationCheck_OpenAIResponsesRecordsNonHitForCodexPayload","Output":"2026/09/12 03:42:35 INFO content_moderation.audit_result user_id=1001 api_key_id=0 group_id=0 group_name=\"\" endpoint=/responses protocol=openai_responses mode=pre_block allow_block=true flagged=false blocked=false action=allow highest_category=sexual highest_score=0.01 latency_ms=1 queue_delay_ms=\u003cnil\u003e\n"} {"Time":"2026-09-12T11:42:35.0293927+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestContentModerationCheck_OpenAIResponsesRecordsNonHitForCodexPayload","Output":"--- PASS: TestContentModerationCheck_OpenAIResponsesRecordsNonHitForCodexPayload (0.01s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0293927+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestContentModerationCheck_OpenAIResponsesRecordsNonHitForCodexPayload","Elapsed":0.01} {"Time":"2026-09-12T11:42:35.0293927+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestContentModerationCheck_PreBlockBlocksCodexResponsesLatestUserInput"} {"Time":"2026-09-12T11:42:35.0293927+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestContentModerationCheck_PreBlockBlocksCodexResponsesLatestUserInput","Output":"=== RUN TestContentModerationCheck_PreBlockBlocksCodexResponsesLatestUserInput\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0298935+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestContentModerationCheck_PreBlockBlocksCodexResponsesLatestUserInput","Output":"2026/09/12 03:42:35 INFO content_moderation.config_loaded user_id=1001 api_key_id=0 group_id=0 group_name=\"\" endpoint=/responses provider=openai protocol=openai_responses model=gpt-5.5 enabled=true mode=pre_block all_groups=true configured_group_ids=[] in_group_scope=true model_filter_type=all configured_models=[] in_model_scope=true sample_rate=100 api_key_count=1 pre_hash_check_enabled=false record_non_hits=false\n"} {"Time":"2026-09-12T11:42:35.0298935+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestContentModerationCheck_PreBlockBlocksCodexResponsesLatestUserInput","Output":"2026/09/12 03:42:35 INFO content_moderation.input_extracted user_id=1001 api_key_id=0 group_id=0 endpoint=/responses protocol=openai_responses text_runes=21 image_count=0\n"} {"Time":"2026-09-12T11:42:35.0305146+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestContentModerationCheck_PreBlockBlocksCodexResponsesLatestUserInput","Output":"2026/09/12 03:42:35 INFO content_moderation.audit_result user_id=1001 api_key_id=0 group_id=0 group_name=\"\" endpoint=/responses protocol=openai_responses mode=pre_block allow_block=true flagged=true blocked=true action=block highest_category=sexual highest_score=0.9 latency_ms=0 queue_delay_ms=\u003cnil\u003e\n"} {"Time":"2026-09-12T11:42:35.0409598+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestContentModerationCheck_PreBlockBlocksCodexResponsesLatestUserInput","Output":"--- PASS: TestContentModerationCheck_PreBlockBlocksCodexResponsesLatestUserInput (0.01s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0409598+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestContentModerationCheck_PreBlockBlocksCodexResponsesLatestUserInput","Elapsed":0.01} {"Time":"2026-09-12T11:42:35.0416223+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations"} {"Time":"2026-09-12T11:42:35.0416223+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations","Output":"=== RUN TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0416223+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/top-level_image_gen_namespace_is_passive"} {"Time":"2026-09-12T11:42:35.0416223+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/top-level_image_gen_namespace_is_passive","Output":"=== RUN TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/top-level_image_gen_namespace_is_passive\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0416223+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/top-level_image_gen_namespace_is_passive","Output":"--- PASS: TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/top-level_image_gen_namespace_is_passive (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0416223+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/top-level_image_gen_namespace_is_passive","Elapsed":0} {"Time":"2026-09-12T11:42:35.0416223+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/responses_lite_additional_tools_image_gen_is_passive"} {"Time":"2026-09-12T11:42:35.0416223+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/responses_lite_additional_tools_image_gen_is_passive","Output":"=== RUN TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/responses_lite_additional_tools_image_gen_is_passive\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0416223+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/responses_lite_additional_tools_image_gen_is_passive","Output":"--- PASS: TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/responses_lite_additional_tools_image_gen_is_passive (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0416223+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/responses_lite_additional_tools_image_gen_is_passive","Elapsed":0} {"Time":"2026-09-12T11:42:35.0416223+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/legacy_adapter_flattened_image_gen_function_declaration_is_passive"} {"Time":"2026-09-12T11:42:35.0416223+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/legacy_adapter_flattened_image_gen_function_declaration_is_passive","Output":"=== RUN TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/legacy_adapter_flattened_image_gen_function_declaration_is_passive\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0416223+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/legacy_adapter_flattened_image_gen_function_declaration_is_passive","Output":"--- PASS: TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/legacy_adapter_flattened_image_gen_function_declaration_is_passive (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0416223+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/legacy_adapter_flattened_image_gen_function_declaration_is_passive","Elapsed":0} {"Time":"2026-09-12T11:42:35.0416223+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/native_image_generation_declaration_remains_explicit"} {"Time":"2026-09-12T11:42:35.0416223+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/native_image_generation_declaration_remains_explicit","Output":"=== RUN TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/native_image_generation_declaration_remains_explicit\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0416223+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/native_image_generation_declaration_remains_explicit","Output":"--- PASS: TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/native_image_generation_declaration_remains_explicit (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0416223+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/native_image_generation_declaration_remains_explicit","Elapsed":0} {"Time":"2026-09-12T11:42:35.0416223+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/native_image_generation_tool_choice_is_explicit"} {"Time":"2026-09-12T11:42:35.0416223+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/native_image_generation_tool_choice_is_explicit","Output":"=== RUN TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/native_image_generation_tool_choice_is_explicit\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0416223+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/native_image_generation_tool_choice_is_explicit","Output":"--- PASS: TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/native_image_generation_tool_choice_is_explicit (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0416223+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/native_image_generation_tool_choice_is_explicit","Elapsed":0} {"Time":"2026-09-12T11:42:35.0416223+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/image_gen_namespace_tool_choice_is_explicit"} {"Time":"2026-09-12T11:42:35.0416223+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/image_gen_namespace_tool_choice_is_explicit","Output":"=== RUN TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/image_gen_namespace_tool_choice_is_explicit\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.042133+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/image_gen_namespace_tool_choice_is_explicit","Output":"--- PASS: TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/image_gen_namespace_tool_choice_is_explicit (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.042133+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/image_gen_namespace_tool_choice_is_explicit","Elapsed":0} {"Time":"2026-09-12T11:42:35.042133+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/flattened_image_gen_function_tool_choice_is_explicit"} {"Time":"2026-09-12T11:42:35.042133+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/flattened_image_gen_function_tool_choice_is_explicit","Output":"=== RUN TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/flattened_image_gen_function_tool_choice_is_explicit\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.042133+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/flattened_image_gen_function_tool_choice_is_explicit","Output":"--- PASS: TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/flattened_image_gen_function_tool_choice_is_explicit (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.042133+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/flattened_image_gen_function_tool_choice_is_explicit","Elapsed":0} {"Time":"2026-09-12T11:42:35.042133+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/wrapped_image_gen_function_tool_choice_is_explicit"} {"Time":"2026-09-12T11:42:35.042133+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/wrapped_image_gen_function_tool_choice_is_explicit","Output":"=== RUN TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/wrapped_image_gen_function_tool_choice_is_explicit\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.042133+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/wrapped_image_gen_function_tool_choice_is_explicit","Output":"--- PASS: TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/wrapped_image_gen_function_tool_choice_is_explicit (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.042133+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/wrapped_image_gen_function_tool_choice_is_explicit","Elapsed":0} {"Time":"2026-09-12T11:42:35.042133+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/vision_input_is_not_image_generation"} {"Time":"2026-09-12T11:42:35.042133+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/vision_input_is_not_image_generation","Output":"=== RUN TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/vision_input_is_not_image_generation\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.042133+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/vision_input_is_not_image_generation","Output":"--- PASS: TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/vision_input_is_not_image_generation (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.042133+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/vision_input_is_not_image_generation","Elapsed":0} {"Time":"2026-09-12T11:42:35.042133+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/ordinary_function_declaration_is_not_image_generation"} {"Time":"2026-09-12T11:42:35.042133+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/ordinary_function_declaration_is_not_image_generation","Output":"=== RUN TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/ordinary_function_declaration_is_not_image_generation\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.042133+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/ordinary_function_declaration_is_not_image_generation","Output":"--- PASS: TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/ordinary_function_declaration_is_not_image_generation (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.042133+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/ordinary_function_declaration_is_not_image_generation","Elapsed":0} {"Time":"2026-09-12T11:42:35.042133+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/image_gen_function_call_history_is_not_current_intent"} {"Time":"2026-09-12T11:42:35.042133+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/image_gen_function_call_history_is_not_current_intent","Output":"=== RUN TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/image_gen_function_call_history_is_not_current_intent\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.042133+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/image_gen_function_call_history_is_not_current_intent","Output":"--- PASS: TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/image_gen_function_call_history_is_not_current_intent (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.042133+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/image_gen_function_call_history_is_not_current_intent","Elapsed":0} {"Time":"2026-09-12T11:42:35.042133+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/image_generation_call_history_is_not_current_intent"} {"Time":"2026-09-12T11:42:35.042133+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/image_generation_call_history_is_not_current_intent","Output":"=== RUN TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/image_generation_call_history_is_not_current_intent\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.042133+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/image_generation_call_history_is_not_current_intent","Output":"--- PASS: TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/image_generation_call_history_is_not_current_intent (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.042133+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations/image_generation_call_history_is_not_current_intent","Elapsed":0} {"Time":"2026-09-12T11:42:35.042133+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations","Output":"--- PASS: TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.042133+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsImageGenerationIntentForPlatform_GrokCodexDeclarations","Elapsed":0} {"Time":"2026-09-12T11:42:35.042133+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsOpenAICodexPlanGatedModelError"} {"Time":"2026-09-12T11:42:35.042133+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsOpenAICodexPlanGatedModelError","Output":"=== RUN TestIsOpenAICodexPlanGatedModelError\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.042133+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsOpenAICodexPlanGatedModelError/400_codex_plan_gated_detail_payload"} {"Time":"2026-09-12T11:42:35.042133+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsOpenAICodexPlanGatedModelError/400_codex_plan_gated_detail_payload","Output":"=== RUN TestIsOpenAICodexPlanGatedModelError/400_codex_plan_gated_detail_payload\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.042133+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsOpenAICodexPlanGatedModelError/400_codex_plan_gated_detail_payload","Output":"--- PASS: TestIsOpenAICodexPlanGatedModelError/400_codex_plan_gated_detail_payload (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.042133+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsOpenAICodexPlanGatedModelError/400_codex_plan_gated_detail_payload","Elapsed":0} {"Time":"2026-09-12T11:42:35.042133+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsOpenAICodexPlanGatedModelError/400_codex_plan_gated_error_message_payload"} {"Time":"2026-09-12T11:42:35.042133+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsOpenAICodexPlanGatedModelError/400_codex_plan_gated_error_message_payload","Output":"=== RUN TestIsOpenAICodexPlanGatedModelError/400_codex_plan_gated_error_message_payload\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.042133+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsOpenAICodexPlanGatedModelError/400_codex_plan_gated_error_message_payload","Output":"--- PASS: TestIsOpenAICodexPlanGatedModelError/400_codex_plan_gated_error_message_payload (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.042133+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsOpenAICodexPlanGatedModelError/400_codex_plan_gated_error_message_payload","Elapsed":0} {"Time":"2026-09-12T11:42:35.042133+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsOpenAICodexPlanGatedModelError/400_unrelated_invalid_request_does_not_match"} {"Time":"2026-09-12T11:42:35.042133+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsOpenAICodexPlanGatedModelError/400_unrelated_invalid_request_does_not_match","Output":"=== RUN TestIsOpenAICodexPlanGatedModelError/400_unrelated_invalid_request_does_not_match\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.042133+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsOpenAICodexPlanGatedModelError/400_unrelated_invalid_request_does_not_match","Output":"--- PASS: TestIsOpenAICodexPlanGatedModelError/400_unrelated_invalid_request_does_not_match (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.042133+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsOpenAICodexPlanGatedModelError/400_unrelated_invalid_request_does_not_match","Elapsed":0} {"Time":"2026-09-12T11:42:35.042133+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsOpenAICodexPlanGatedModelError/404_with_plan_gated_message_does_not_match"} {"Time":"2026-09-12T11:42:35.042133+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsOpenAICodexPlanGatedModelError/404_with_plan_gated_message_does_not_match","Output":"=== RUN TestIsOpenAICodexPlanGatedModelError/404_with_plan_gated_message_does_not_match\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.042133+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsOpenAICodexPlanGatedModelError/404_with_plan_gated_message_does_not_match","Output":"--- PASS: TestIsOpenAICodexPlanGatedModelError/404_with_plan_gated_message_does_not_match (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.042133+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsOpenAICodexPlanGatedModelError/404_with_plan_gated_message_does_not_match","Elapsed":0} {"Time":"2026-09-12T11:42:35.042133+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsOpenAICodexPlanGatedModelError/400_empty_body_does_not_match"} {"Time":"2026-09-12T11:42:35.042133+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsOpenAICodexPlanGatedModelError/400_empty_body_does_not_match","Output":"=== RUN TestIsOpenAICodexPlanGatedModelError/400_empty_body_does_not_match\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.042133+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsOpenAICodexPlanGatedModelError/400_empty_body_does_not_match","Output":"--- PASS: TestIsOpenAICodexPlanGatedModelError/400_empty_body_does_not_match (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.042133+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsOpenAICodexPlanGatedModelError/400_empty_body_does_not_match","Elapsed":0} {"Time":"2026-09-12T11:42:35.042133+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsOpenAICodexPlanGatedModelError","Output":"--- PASS: TestIsOpenAICodexPlanGatedModelError (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.042133+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsOpenAICodexPlanGatedModelError","Elapsed":0} {"Time":"2026-09-12T11:42:35.0426579+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildAgentAssertionMatchesCodexEnvelopeAndSignature"} {"Time":"2026-09-12T11:42:35.0426579+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildAgentAssertionMatchesCodexEnvelopeAndSignature","Output":"=== RUN TestBuildAgentAssertionMatchesCodexEnvelopeAndSignature\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0432358+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildAgentAssertionMatchesCodexEnvelopeAndSignature","Output":"--- PASS: TestBuildAgentAssertionMatchesCodexEnvelopeAndSignature (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0432358+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildAgentAssertionMatchesCodexEnvelopeAndSignature","Elapsed":0} {"Time":"2026-09-12T11:42:35.0432358+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestDecryptAgentTaskIDSupportsCodexSealedBoxResponse"} {"Time":"2026-09-12T11:42:35.0432358+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestDecryptAgentTaskIDSupportsCodexSealedBoxResponse","Output":"=== RUN TestDecryptAgentTaskIDSupportsCodexSealedBoxResponse\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestDecryptAgentTaskIDSupportsCodexSealedBoxResponse","Output":"--- PASS: TestDecryptAgentTaskIDSupportsCodexSealedBoxResponse (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestDecryptAgentTaskIDSupportsCodexSealedBoxResponse","Elapsed":0} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestProbeOpenAIAPIKeyResponsesSupportUsesCodexProbeHeaders"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestProbeOpenAIAPIKeyResponsesSupportUsesCodexProbeHeaders","Output":"=== RUN TestProbeOpenAIAPIKeyResponsesSupportUsesCodexProbeHeaders\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestProbeOpenAIAPIKeyResponsesSupportUsesCodexProbeHeaders","Output":"2026/09/12 03:42:35 probe_done: account_id=96 base_url=https://compat-upstream.example/v1 probe_model=gpt-5.4 status=200 supported=true\n"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestProbeOpenAIAPIKeyResponsesSupportUsesCodexProbeHeaders","Output":"--- PASS: TestProbeOpenAIAPIKeyResponsesSupportUsesCodexProbeHeaders (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestProbeOpenAIAPIKeyResponsesSupportUsesCodexProbeHeaders","Elapsed":0} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexOutboundVersionHasSingleSource"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexOutboundVersionHasSingleSource","Output":"=== RUN TestCodexOutboundVersionHasSingleSource\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexOutboundVersionHasSingleSource","Output":"--- PASS: TestCodexOutboundVersionHasSingleSource (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexOutboundVersionHasSingleSource","Elapsed":0} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestDetectCodexClientRestriction_NilSettingServiceFailsClosed"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestDetectCodexClientRestriction_NilSettingServiceFailsClosed","Output":"=== RUN TestDetectCodexClientRestriction_NilSettingServiceFailsClosed\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestDetectCodexClientRestriction_NilSettingServiceFailsClosed","Output":"--- PASS: TestDetectCodexClientRestriction_NilSettingServiceFailsClosed (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestDetectCodexClientRestriction_NilSettingServiceFailsClosed","Elapsed":0} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexClientRestrictionDetector_Detect"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexClientRestrictionDetector_Detect","Output":"=== RUN TestOpenAICodexClientRestrictionDetector_Detect\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexClientRestrictionDetector_Detect/未开启开关时绕过"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexClientRestrictionDetector_Detect/未开启开关时绕过","Output":"=== RUN TestOpenAICodexClientRestrictionDetector_Detect/未开启开关时绕过\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexClientRestrictionDetector_Detect/未开启开关时绕过","Output":"--- PASS: TestOpenAICodexClientRestrictionDetector_Detect/未开启开关时绕过 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexClientRestrictionDetector_Detect/未开启开关时绕过","Elapsed":0} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexClientRestrictionDetector_Detect/开启后_codex_cli_rs_命中"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexClientRestrictionDetector_Detect/开启后_codex_cli_rs_命中","Output":"=== RUN TestOpenAICodexClientRestrictionDetector_Detect/开启后_codex_cli_rs_命中\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexClientRestrictionDetector_Detect/开启后_codex_cli_rs_命中","Output":"--- PASS: TestOpenAICodexClientRestrictionDetector_Detect/开启后_codex_cli_rs_命中 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexClientRestrictionDetector_Detect/开启后_codex_cli_rs_命中","Elapsed":0} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexClientRestrictionDetector_Detect/开启后_codex_vscode_命中"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexClientRestrictionDetector_Detect/开启后_codex_vscode_命中","Output":"=== RUN TestOpenAICodexClientRestrictionDetector_Detect/开启后_codex_vscode_命中\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexClientRestrictionDetector_Detect/开启后_codex_vscode_命中","Output":"--- PASS: TestOpenAICodexClientRestrictionDetector_Detect/开启后_codex_vscode_命中 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexClientRestrictionDetector_Detect/开启后_codex_vscode_命中","Elapsed":0} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexClientRestrictionDetector_Detect/开启后_codex_app_命中"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexClientRestrictionDetector_Detect/开启后_codex_app_命中","Output":"=== RUN TestOpenAICodexClientRestrictionDetector_Detect/开启后_codex_app_命中\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexClientRestrictionDetector_Detect/开启后_codex_app_命中","Output":"--- PASS: TestOpenAICodexClientRestrictionDetector_Detect/开启后_codex_app_命中 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexClientRestrictionDetector_Detect/开启后_codex_app_命中","Elapsed":0} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexClientRestrictionDetector_Detect/开启后_originator_命中"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexClientRestrictionDetector_Detect/开启后_originator_命中","Output":"=== RUN TestOpenAICodexClientRestrictionDetector_Detect/开启后_originator_命中\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexClientRestrictionDetector_Detect/开启后_originator_命中","Output":"--- PASS: TestOpenAICodexClientRestrictionDetector_Detect/开启后_originator_命中 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexClientRestrictionDetector_Detect/开启后_originator_命中","Elapsed":0} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexClientRestrictionDetector_Detect/开启后非官方客户端拒绝"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexClientRestrictionDetector_Detect/开启后非官方客户端拒绝","Output":"=== RUN TestOpenAICodexClientRestrictionDetector_Detect/开启后非官方客户端拒绝\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexClientRestrictionDetector_Detect/开启后非官方客户端拒绝","Output":"--- PASS: TestOpenAICodexClientRestrictionDetector_Detect/开启后非官方客户端拒绝 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexClientRestrictionDetector_Detect/开启后非官方客户端拒绝","Elapsed":0} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexClientRestrictionDetector_Detect/开启_ForceCodexCLI_时允许通过"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexClientRestrictionDetector_Detect/开启_ForceCodexCLI_时允许通过","Output":"=== RUN TestOpenAICodexClientRestrictionDetector_Detect/开启_ForceCodexCLI_时允许通过\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexClientRestrictionDetector_Detect/开启_ForceCodexCLI_时允许通过","Output":"--- PASS: TestOpenAICodexClientRestrictionDetector_Detect/开启_ForceCodexCLI_时允许通过 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexClientRestrictionDetector_Detect/开启_ForceCodexCLI_时允许通过","Elapsed":0} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexClientRestrictionDetector_Detect","Output":"--- PASS: TestOpenAICodexClientRestrictionDetector_Detect (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexClientRestrictionDetector_Detect","Elapsed":0} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexClientRestrictionDetector_Detect_AllowedClients"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexClientRestrictionDetector_Detect_AllowedClients","Output":"=== RUN TestOpenAICodexClientRestrictionDetector_Detect_AllowedClients\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexClientRestrictionDetector_Detect_AllowedClients/未配置白名单时_Claude_Code_签名仍拒绝"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexClientRestrictionDetector_Detect_AllowedClients/未配置白名单时_Claude_Code_签名仍拒绝","Output":"=== RUN TestOpenAICodexClientRestrictionDetector_Detect_AllowedClients/未配置白名单时_Claude_Code_签名仍拒绝\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexClientRestrictionDetector_Detect_AllowedClients/未配置白名单时_Claude_Code_签名仍拒绝","Output":"--- PASS: TestOpenAICodexClientRestrictionDetector_Detect_AllowedClients/未配置白名单时_Claude_Code_签名仍拒绝 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexClientRestrictionDetector_Detect_AllowedClients/未配置白名单时_Claude_Code_签名仍拒绝","Elapsed":0} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexClientRestrictionDetector_Detect_AllowedClients/未开启_codex_cli_only_时直接绕过"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexClientRestrictionDetector_Detect_AllowedClients/未开启_codex_cli_only_时直接绕过","Output":"=== RUN TestOpenAICodexClientRestrictionDetector_Detect_AllowedClients/未开启_codex_cli_only_时直接绕过\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexClientRestrictionDetector_Detect_AllowedClients/未开启_codex_cli_only_时直接绕过","Output":"--- PASS: TestOpenAICodexClientRestrictionDetector_Detect_AllowedClients/未开启_codex_cli_only_时直接绕过 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexClientRestrictionDetector_Detect_AllowedClients/未开启_codex_cli_only_时直接绕过","Elapsed":0} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexClientRestrictionDetector_Detect_AllowedClients/全局白名单含_Claude_Code_签名_→_放行(whitelist)"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexClientRestrictionDetector_Detect_AllowedClients/全局白名单含_Claude_Code_签名_→_放行(whitelist)","Output":"=== RUN TestOpenAICodexClientRestrictionDetector_Detect_AllowedClients/全局白名单含_Claude_Code_签名_→_放行(whitelist)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexClientRestrictionDetector_Detect_AllowedClients/全局白名单含_Claude_Code_签名_→_放行(whitelist)","Output":"--- PASS: TestOpenAICodexClientRestrictionDetector_Detect_AllowedClients/全局白名单含_Claude_Code_签名_→_放行(whitelist) (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexClientRestrictionDetector_Detect_AllowedClients/全局白名单含_Claude_Code_签名_→_放行(whitelist)","Elapsed":0} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexClientRestrictionDetector_Detect_AllowedClients/全局白名单含_Claude_Code_+_非签名_→_403"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexClientRestrictionDetector_Detect_AllowedClients/全局白名单含_Claude_Code_+_非签名_→_403","Output":"=== RUN TestOpenAICodexClientRestrictionDetector_Detect_AllowedClients/全局白名单含_Claude_Code_+_非签名_→_403\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexClientRestrictionDetector_Detect_AllowedClients/全局白名单含_Claude_Code_+_非签名_→_403","Output":"--- PASS: TestOpenAICodexClientRestrictionDetector_Detect_AllowedClients/全局白名单含_Claude_Code_+_非签名_→_403 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexClientRestrictionDetector_Detect_AllowedClients/全局白名单含_Claude_Code_+_非签名_→_403","Elapsed":0} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexClientRestrictionDetector_Detect_AllowedClients/全局列表为空_+_账号未配_→_403"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexClientRestrictionDetector_Detect_AllowedClients/全局列表为空_+_账号未配_→_403","Output":"=== RUN TestOpenAICodexClientRestrictionDetector_Detect_AllowedClients/全局列表为空_+_账号未配_→_403\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexClientRestrictionDetector_Detect_AllowedClients/全局列表为空_+_账号未配_→_403","Output":"--- PASS: TestOpenAICodexClientRestrictionDetector_Detect_AllowedClients/全局列表为空_+_账号未配_→_403 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexClientRestrictionDetector_Detect_AllowedClients/全局列表为空_+_账号未配_→_403","Elapsed":0} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexClientRestrictionDetector_Detect_AllowedClients","Output":"--- PASS: TestOpenAICodexClientRestrictionDetector_Detect_AllowedClients (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexClientRestrictionDetector_Detect_AllowedClients","Elapsed":0} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexClientRestrictionMessage"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexClientRestrictionMessage","Output":"=== RUN TestCodexClientRestrictionMessage\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexClientRestrictionMessage/版本太低:带实际版本与最低要求"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexClientRestrictionMessage/版本太低:带实际版本与最低要求","Output":"=== RUN TestCodexClientRestrictionMessage/版本太低:带实际版本与最低要求\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexClientRestrictionMessage/版本太低:带实际版本与最低要求","Output":"--- PASS: TestCodexClientRestrictionMessage/版本太低:带实际版本与最低要求 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexClientRestrictionMessage/版本太低:带实际版本与最低要求","Elapsed":0} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexClientRestrictionMessage/版本太高:带实际版本与最高允许"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexClientRestrictionMessage/版本太高:带实际版本与最高允许","Output":"=== RUN TestCodexClientRestrictionMessage/版本太高:带实际版本与最高允许\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexClientRestrictionMessage/版本太高:带实际版本与最高允许","Output":"--- PASS: TestCodexClientRestrictionMessage/版本太高:带实际版本与最高允许 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexClientRestrictionMessage/版本太高:带实际版本与最高允许","Elapsed":0} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexClientRestrictionMessage/无法识别版本:保持原通用句"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexClientRestrictionMessage/无法识别版本:保持原通用句","Output":"=== RUN TestCodexClientRestrictionMessage/无法识别版本:保持原通用句\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexClientRestrictionMessage/无法识别版本:保持原通用句","Output":"--- PASS: TestCodexClientRestrictionMessage/无法识别版本:保持原通用句 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexClientRestrictionMessage/无法识别版本:保持原通用句","Elapsed":0} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexClientRestrictionMessage/未命中官方:保持原通用句"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexClientRestrictionMessage/未命中官方:保持原通用句","Output":"=== RUN TestCodexClientRestrictionMessage/未命中官方:保持原通用句\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexClientRestrictionMessage/未命中官方:保持原通用句","Output":"--- PASS: TestCodexClientRestrictionMessage/未命中官方:保持原通用句 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexClientRestrictionMessage/未命中官方:保持原通用句","Elapsed":0} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexClientRestrictionMessage","Output":"--- PASS: TestCodexClientRestrictionMessage (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexClientRestrictionMessage","Elapsed":0} {"Time":"2026-09-12T11:42:35.0438242+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexRequestBodyIdentityNamespaceIsStablePerOAuthAccount"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexRequestBodyIdentityNamespaceIsStablePerOAuthAccount","Output":"=== RUN TestCodexRequestBodyIdentityNamespaceIsStablePerOAuthAccount\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexRequestBodyIdentityNamespaceIsStablePerOAuthAccount","Output":"--- PASS: TestCodexRequestBodyIdentityNamespaceIsStablePerOAuthAccount (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexRequestBodyIdentityNamespaceIsStablePerOAuthAccount","Elapsed":0} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexAccountIdentityNamespaceUsesStableCredentialSource"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexAccountIdentityNamespaceUsesStableCredentialSource","Output":"=== RUN TestCodexAccountIdentityNamespaceUsesStableCredentialSource\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexAccountIdentityNamespaceUsesStableCredentialSource","Output":"--- PASS: TestCodexAccountIdentityNamespaceUsesStableCredentialSource (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexAccountIdentityNamespaceUsesStableCredentialSource","Elapsed":0} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexAccountIdentitySourceResolvesShadowAndOverwritesFailoverContext"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexAccountIdentitySourceResolvesShadowAndOverwritesFailoverContext","Output":"=== RUN TestCodexAccountIdentitySourceResolvesShadowAndOverwritesFailoverContext\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexAccountIdentitySourceResolvesShadowAndOverwritesFailoverContext","Output":"--- PASS: TestCodexAccountIdentitySourceResolvesShadowAndOverwritesFailoverContext (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexAccountIdentitySourceResolvesShadowAndOverwritesFailoverContext","Elapsed":0} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildOpenAIWSHeadersNamespacesCodexIdentityByOAuthAccount"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildOpenAIWSHeadersNamespacesCodexIdentityByOAuthAccount","Output":"=== RUN TestBuildOpenAIWSHeadersNamespacesCodexIdentityByOAuthAccount\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildOpenAIWSHeadersNamespacesCodexIdentityByOAuthAccount","Output":"--- PASS: TestBuildOpenAIWSHeadersNamespacesCodexIdentityByOAuthAccount (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildOpenAIWSHeadersNamespacesCodexIdentityByOAuthAccount","Elapsed":0} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildUpstreamRequestNamespacesCodexIdentityByOAuthAccount"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildUpstreamRequestNamespacesCodexIdentityByOAuthAccount","Output":"=== RUN TestBuildUpstreamRequestNamespacesCodexIdentityByOAuthAccount\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildUpstreamRequestNamespacesCodexIdentityByOAuthAccount","Output":"--- PASS: TestBuildUpstreamRequestNamespacesCodexIdentityByOAuthAccount (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildUpstreamRequestNamespacesCodexIdentityByOAuthAccount","Elapsed":0} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupCorrectsOfficialAstraStaleModalities"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupCorrectsOfficialAstraStaleModalities","Output":"=== RUN TestBuildCodexModelsManifestForGroupCorrectsOfficialAstraStaleModalities\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupCorrectsOfficialAstraStaleModalities","Output":"=== PAUSE TestBuildCodexModelsManifestForGroupCorrectsOfficialAstraStaleModalities\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupCorrectsOfficialAstraStaleModalities"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupPreservesCompatibleAstraTextOnlyMetadata"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupPreservesCompatibleAstraTextOnlyMetadata","Output":"=== RUN TestBuildCodexModelsManifestForGroupPreservesCompatibleAstraTextOnlyMetadata\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupPreservesCompatibleAstraTextOnlyMetadata","Output":"=== PAUSE TestBuildCodexModelsManifestForGroupPreservesCompatibleAstraTextOnlyMetadata\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupPreservesCompatibleAstraTextOnlyMetadata"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexFingerprintMode"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexFingerprintMode","Output":"=== RUN TestGetCodexFingerprintMode\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexFingerprintMode/nil_账号"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexFingerprintMode/nil_账号","Output":"=== RUN TestGetCodexFingerprintMode/nil_账号\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexFingerprintMode/nil_账号","Output":"--- PASS: TestGetCodexFingerprintMode/nil_账号 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexFingerprintMode/nil_账号","Elapsed":0} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexFingerprintMode/非_OAuth_账号"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexFingerprintMode/非_OAuth_账号","Output":"=== RUN TestGetCodexFingerprintMode/非_OAuth_账号\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexFingerprintMode/非_OAuth_账号","Output":"--- PASS: TestGetCodexFingerprintMode/非_OAuth_账号 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexFingerprintMode/非_OAuth_账号","Elapsed":0} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexFingerprintMode/OpenAI_setup_token"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexFingerprintMode/OpenAI_setup_token","Output":"=== RUN TestGetCodexFingerprintMode/OpenAI_setup_token\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexFingerprintMode/OpenAI_setup_token","Output":"--- PASS: TestGetCodexFingerprintMode/OpenAI_setup_token (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexFingerprintMode/OpenAI_setup_token","Elapsed":0} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexFingerprintMode/Anthropic_setup_token"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexFingerprintMode/Anthropic_setup_token","Output":"=== RUN TestGetCodexFingerprintMode/Anthropic_setup_token\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexFingerprintMode/Anthropic_setup_token","Output":"--- PASS: TestGetCodexFingerprintMode/Anthropic_setup_token (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexFingerprintMode/Anthropic_setup_token","Elapsed":0} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexFingerprintMode/无_extra_默认_off"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexFingerprintMode/无_extra_默认_off","Output":"=== RUN TestGetCodexFingerprintMode/无_extra_默认_off\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexFingerprintMode/无_extra_默认_off","Output":"--- PASS: TestGetCodexFingerprintMode/无_extra_默认_off (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexFingerprintMode/无_extra_默认_off","Elapsed":0} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexFingerprintMode/空值默认_off"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexFingerprintMode/空值默认_off","Output":"=== RUN TestGetCodexFingerprintMode/空值默认_off\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexFingerprintMode/空值默认_off","Output":"--- PASS: TestGetCodexFingerprintMode/空值默认_off (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexFingerprintMode/空值默认_off","Elapsed":0} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexFingerprintMode/非法值默认_off"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexFingerprintMode/非法值默认_off","Output":"=== RUN TestGetCodexFingerprintMode/非法值默认_off\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexFingerprintMode/非法值默认_off","Output":"--- PASS: TestGetCodexFingerprintMode/非法值默认_off (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexFingerprintMode/非法值默认_off","Elapsed":0} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexFingerprintMode/显式_off"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexFingerprintMode/显式_off","Output":"=== RUN TestGetCodexFingerprintMode/显式_off\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexFingerprintMode/显式_off","Output":"--- PASS: TestGetCodexFingerprintMode/显式_off (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexFingerprintMode/显式_off","Elapsed":0} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexFingerprintMode/device"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexFingerprintMode/device","Output":"=== RUN TestGetCodexFingerprintMode/device\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexFingerprintMode/device","Output":"--- PASS: TestGetCodexFingerprintMode/device (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexFingerprintMode/device","Elapsed":0} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexFingerprintMode/session"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexFingerprintMode/session","Output":"=== RUN TestGetCodexFingerprintMode/session\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexFingerprintMode/session","Output":"--- PASS: TestGetCodexFingerprintMode/session (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexFingerprintMode/session","Elapsed":0} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexFingerprintMode/full"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexFingerprintMode/full","Output":"=== RUN TestGetCodexFingerprintMode/full\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexFingerprintMode/full","Output":"--- PASS: TestGetCodexFingerprintMode/full (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexFingerprintMode/full","Elapsed":0} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexFingerprintMode","Output":"--- PASS: TestGetCodexFingerprintMode (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexFingerprintMode","Elapsed":0} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestResolveCodexFingerprintIDsFromRequest_ExplicitOff"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestResolveCodexFingerprintIDsFromRequest_ExplicitOff","Output":"=== RUN TestResolveCodexFingerprintIDsFromRequest_ExplicitOff\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestResolveCodexFingerprintIDsFromRequest_ExplicitOff","Output":"--- PASS: TestResolveCodexFingerprintIDsFromRequest_ExplicitOff (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestResolveCodexFingerprintIDsFromRequest_ExplicitOff","Elapsed":0} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestResolveCodexFingerprintIDsFromRequest_DefaultIsOff"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestResolveCodexFingerprintIDsFromRequest_DefaultIsOff","Output":"=== RUN TestResolveCodexFingerprintIDsFromRequest_DefaultIsOff\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestResolveCodexFingerprintIDsFromRequest_DefaultIsOff","Output":"--- PASS: TestResolveCodexFingerprintIDsFromRequest_DefaultIsOff (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestResolveCodexFingerprintIDsFromRequest_DefaultIsOff","Elapsed":0} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestResolveCodexFingerprintIDsFromRequest_ExplicitOptInHonored"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestResolveCodexFingerprintIDsFromRequest_ExplicitOptInHonored","Output":"=== RUN TestResolveCodexFingerprintIDsFromRequest_ExplicitOptInHonored\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestResolveCodexFingerprintIDsFromRequest_ExplicitOptInHonored/device"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestResolveCodexFingerprintIDsFromRequest_ExplicitOptInHonored/device","Output":"=== RUN TestResolveCodexFingerprintIDsFromRequest_ExplicitOptInHonored/device\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestResolveCodexFingerprintIDsFromRequest_ExplicitOptInHonored/device","Output":"--- PASS: TestResolveCodexFingerprintIDsFromRequest_ExplicitOptInHonored/device (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestResolveCodexFingerprintIDsFromRequest_ExplicitOptInHonored/device","Elapsed":0} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestResolveCodexFingerprintIDsFromRequest_ExplicitOptInHonored/session"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestResolveCodexFingerprintIDsFromRequest_ExplicitOptInHonored/session","Output":"=== RUN TestResolveCodexFingerprintIDsFromRequest_ExplicitOptInHonored/session\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestResolveCodexFingerprintIDsFromRequest_ExplicitOptInHonored/session","Output":"--- PASS: TestResolveCodexFingerprintIDsFromRequest_ExplicitOptInHonored/session (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestResolveCodexFingerprintIDsFromRequest_ExplicitOptInHonored/session","Elapsed":0} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestResolveCodexFingerprintIDsFromRequest_ExplicitOptInHonored/full"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestResolveCodexFingerprintIDsFromRequest_ExplicitOptInHonored/full","Output":"=== RUN TestResolveCodexFingerprintIDsFromRequest_ExplicitOptInHonored/full\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestResolveCodexFingerprintIDsFromRequest_ExplicitOptInHonored/full","Output":"--- PASS: TestResolveCodexFingerprintIDsFromRequest_ExplicitOptInHonored/full (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestResolveCodexFingerprintIDsFromRequest_ExplicitOptInHonored/full","Elapsed":0} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestResolveCodexFingerprintIDsFromRequest_ExplicitOptInHonored","Output":"--- PASS: TestResolveCodexFingerprintIDsFromRequest_ExplicitOptInHonored (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestResolveCodexFingerprintIDsFromRequest_ExplicitOptInHonored","Elapsed":0} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestResolveCodexFingerprintIDsFromRequest_EnabledModesRequireValidSeed"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestResolveCodexFingerprintIDsFromRequest_EnabledModesRequireValidSeed","Output":"=== RUN TestResolveCodexFingerprintIDsFromRequest_EnabledModesRequireValidSeed\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestResolveCodexFingerprintIDsFromRequest_EnabledModesRequireValidSeed/missing"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestResolveCodexFingerprintIDsFromRequest_EnabledModesRequireValidSeed/missing","Output":"=== RUN TestResolveCodexFingerprintIDsFromRequest_EnabledModesRequireValidSeed/missing\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestResolveCodexFingerprintIDsFromRequest_EnabledModesRequireValidSeed/missing","Output":"--- PASS: TestResolveCodexFingerprintIDsFromRequest_EnabledModesRequireValidSeed/missing (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestResolveCodexFingerprintIDsFromRequest_EnabledModesRequireValidSeed/missing","Elapsed":0} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestResolveCodexFingerprintIDsFromRequest_EnabledModesRequireValidSeed/missing_with_device_override"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestResolveCodexFingerprintIDsFromRequest_EnabledModesRequireValidSeed/missing_with_device_override","Output":"=== RUN TestResolveCodexFingerprintIDsFromRequest_EnabledModesRequireValidSeed/missing_with_device_override\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestResolveCodexFingerprintIDsFromRequest_EnabledModesRequireValidSeed/missing_with_device_override","Output":"--- PASS: TestResolveCodexFingerprintIDsFromRequest_EnabledModesRequireValidSeed/missing_with_device_override (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestResolveCodexFingerprintIDsFromRequest_EnabledModesRequireValidSeed/missing_with_device_override","Elapsed":0} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestResolveCodexFingerprintIDsFromRequest_EnabledModesRequireValidSeed/blank"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestResolveCodexFingerprintIDsFromRequest_EnabledModesRequireValidSeed/blank","Output":"=== RUN TestResolveCodexFingerprintIDsFromRequest_EnabledModesRequireValidSeed/blank\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestResolveCodexFingerprintIDsFromRequest_EnabledModesRequireValidSeed/blank","Output":"--- PASS: TestResolveCodexFingerprintIDsFromRequest_EnabledModesRequireValidSeed/blank (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestResolveCodexFingerprintIDsFromRequest_EnabledModesRequireValidSeed/blank","Elapsed":0} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestResolveCodexFingerprintIDsFromRequest_EnabledModesRequireValidSeed/uppercase"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestResolveCodexFingerprintIDsFromRequest_EnabledModesRequireValidSeed/uppercase","Output":"=== RUN TestResolveCodexFingerprintIDsFromRequest_EnabledModesRequireValidSeed/uppercase\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestResolveCodexFingerprintIDsFromRequest_EnabledModesRequireValidSeed/uppercase","Output":"--- PASS: TestResolveCodexFingerprintIDsFromRequest_EnabledModesRequireValidSeed/uppercase (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestResolveCodexFingerprintIDsFromRequest_EnabledModesRequireValidSeed/uppercase","Elapsed":0} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestResolveCodexFingerprintIDsFromRequest_EnabledModesRequireValidSeed/nil_uuid"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestResolveCodexFingerprintIDsFromRequest_EnabledModesRequireValidSeed/nil_uuid","Output":"=== RUN TestResolveCodexFingerprintIDsFromRequest_EnabledModesRequireValidSeed/nil_uuid\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestResolveCodexFingerprintIDsFromRequest_EnabledModesRequireValidSeed/nil_uuid","Output":"--- PASS: TestResolveCodexFingerprintIDsFromRequest_EnabledModesRequireValidSeed/nil_uuid (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestResolveCodexFingerprintIDsFromRequest_EnabledModesRequireValidSeed/nil_uuid","Elapsed":0} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestResolveCodexFingerprintIDsFromRequest_EnabledModesRequireValidSeed/non_string"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestResolveCodexFingerprintIDsFromRequest_EnabledModesRequireValidSeed/non_string","Output":"=== RUN TestResolveCodexFingerprintIDsFromRequest_EnabledModesRequireValidSeed/non_string\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestResolveCodexFingerprintIDsFromRequest_EnabledModesRequireValidSeed/non_string","Output":"--- PASS: TestResolveCodexFingerprintIDsFromRequest_EnabledModesRequireValidSeed/non_string (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestResolveCodexFingerprintIDsFromRequest_EnabledModesRequireValidSeed/non_string","Elapsed":0} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestResolveCodexFingerprintIDsFromRequest_EnabledModesRequireValidSeed","Output":"--- PASS: TestResolveCodexFingerprintIDsFromRequest_EnabledModesRequireValidSeed (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestResolveCodexFingerprintIDsFromRequest_EnabledModesRequireValidSeed","Elapsed":0} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintHeaders_OffMode"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintHeaders_OffMode","Output":"=== RUN TestApplyCodexFingerprintHeaders_OffMode\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintHeaders_OffMode","Output":"--- PASS: TestApplyCodexFingerprintHeaders_OffMode (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintHeaders_OffMode","Elapsed":0} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintHeaders_DeviceMode"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintHeaders_DeviceMode","Output":"=== RUN TestApplyCodexFingerprintHeaders_DeviceMode\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintHeaders_DeviceMode","Output":"--- PASS: TestApplyCodexFingerprintHeaders_DeviceMode (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintHeaders_DeviceMode","Elapsed":0} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintHeaders_SessionMode"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintHeaders_SessionMode","Output":"=== RUN TestApplyCodexFingerprintHeaders_SessionMode\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintHeaders_SessionMode","Output":"--- PASS: TestApplyCodexFingerprintHeaders_SessionMode (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintHeaders_SessionMode","Elapsed":0} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintHeaders_SessionMode_DifferentClients"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintHeaders_SessionMode_DifferentClients","Output":"=== RUN TestApplyCodexFingerprintHeaders_SessionMode_DifferentClients\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintHeaders_SessionMode_DifferentClients","Output":"--- PASS: TestApplyCodexFingerprintHeaders_SessionMode_DifferentClients (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintHeaders_SessionMode_DifferentClients","Elapsed":0} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintHeaders_FullMode"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintHeaders_FullMode","Output":"=== RUN TestApplyCodexFingerprintHeaders_FullMode\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintHeaders_FullMode","Output":"--- PASS: TestApplyCodexFingerprintHeaders_FullMode (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintHeaders_FullMode","Elapsed":0} {"Time":"2026-09-12T11:42:35.044362+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadata_OffMode"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadata_OffMode","Output":"=== RUN TestApplyCodexFingerprintClientMetadata_OffMode\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadata_OffMode","Output":"--- PASS: TestApplyCodexFingerprintClientMetadata_OffMode (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadata_OffMode","Elapsed":0} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadata_DeviceMode"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadata_DeviceMode","Output":"=== RUN TestApplyCodexFingerprintClientMetadata_DeviceMode\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadata_DeviceMode","Output":"--- PASS: TestApplyCodexFingerprintClientMetadata_DeviceMode (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadata_DeviceMode","Elapsed":0} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadata_SessionMode"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadata_SessionMode","Output":"=== RUN TestApplyCodexFingerprintClientMetadata_SessionMode\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadata_SessionMode","Output":"--- PASS: TestApplyCodexFingerprintClientMetadata_SessionMode (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadata_SessionMode","Elapsed":0} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadata_FullMode"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadata_FullMode","Output":"=== RUN TestApplyCodexFingerprintClientMetadata_FullMode\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadata_FullMode","Output":"--- PASS: TestApplyCodexFingerprintClientMetadata_FullMode (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadata_FullMode","Elapsed":0} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintPromptCacheKey_MapRawEquivalence"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintPromptCacheKey_MapRawEquivalence","Output":"=== RUN TestApplyCodexFingerprintPromptCacheKey_MapRawEquivalence\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintPromptCacheKey_MapRawEquivalence/session/default"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintPromptCacheKey_MapRawEquivalence/session/default","Output":"=== RUN TestApplyCodexFingerprintPromptCacheKey_MapRawEquivalence/session/default\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintPromptCacheKey_MapRawEquivalence/session/default","Output":"--- PASS: TestApplyCodexFingerprintPromptCacheKey_MapRawEquivalence/session/default (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintPromptCacheKey_MapRawEquivalence/session/default","Elapsed":0} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintPromptCacheKey_MapRawEquivalence/full/default"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintPromptCacheKey_MapRawEquivalence/full/default","Output":"=== RUN TestApplyCodexFingerprintPromptCacheKey_MapRawEquivalence/full/default\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintPromptCacheKey_MapRawEquivalence/full/default","Output":"--- PASS: TestApplyCodexFingerprintPromptCacheKey_MapRawEquivalence/full/default (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintPromptCacheKey_MapRawEquivalence/full/default","Elapsed":0} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintPromptCacheKey_MapRawEquivalence/explicit_override"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintPromptCacheKey_MapRawEquivalence/explicit_override","Output":"=== RUN TestApplyCodexFingerprintPromptCacheKey_MapRawEquivalence/explicit_override\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintPromptCacheKey_MapRawEquivalence/explicit_override","Output":"--- PASS: TestApplyCodexFingerprintPromptCacheKey_MapRawEquivalence/explicit_override (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintPromptCacheKey_MapRawEquivalence/explicit_override","Elapsed":0} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintPromptCacheKey_MapRawEquivalence","Output":"--- PASS: TestApplyCodexFingerprintPromptCacheKey_MapRawEquivalence (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintPromptCacheKey_MapRawEquivalence","Elapsed":0} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintPromptCacheKey_Negatives"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintPromptCacheKey_Negatives","Output":"=== RUN TestApplyCodexFingerprintPromptCacheKey_Negatives\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintPromptCacheKey_Negatives/missing_key_is_not_injected"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintPromptCacheKey_Negatives/missing_key_is_not_injected","Output":"=== RUN TestApplyCodexFingerprintPromptCacheKey_Negatives/missing_key_is_not_injected\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintPromptCacheKey_Negatives/missing_key_is_not_injected","Output":"--- PASS: TestApplyCodexFingerprintPromptCacheKey_Negatives/missing_key_is_not_injected (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintPromptCacheKey_Negatives/missing_key_is_not_injected","Elapsed":0} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintPromptCacheKey_Negatives/empty_key_preserved"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintPromptCacheKey_Negatives/empty_key_preserved","Output":"=== RUN TestApplyCodexFingerprintPromptCacheKey_Negatives/empty_key_preserved\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintPromptCacheKey_Negatives/empty_key_preserved","Output":"--- PASS: TestApplyCodexFingerprintPromptCacheKey_Negatives/empty_key_preserved (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintPromptCacheKey_Negatives/empty_key_preserved","Elapsed":0} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintPromptCacheKey_Negatives/whitespace-different_key_is_an_explicit_override"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintPromptCacheKey_Negatives/whitespace-different_key_is_an_explicit_override","Output":"=== RUN TestApplyCodexFingerprintPromptCacheKey_Negatives/whitespace-different_key_is_an_explicit_override\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintPromptCacheKey_Negatives/whitespace-different_key_is_an_explicit_override","Output":"--- PASS: TestApplyCodexFingerprintPromptCacheKey_Negatives/whitespace-different_key_is_an_explicit_override (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintPromptCacheKey_Negatives/whitespace-different_key_is_an_explicit_override","Elapsed":0} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintPromptCacheKey_Negatives/non-string_key_preserved"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintPromptCacheKey_Negatives/non-string_key_preserved","Output":"=== RUN TestApplyCodexFingerprintPromptCacheKey_Negatives/non-string_key_preserved\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintPromptCacheKey_Negatives/non-string_key_preserved","Output":"--- PASS: TestApplyCodexFingerprintPromptCacheKey_Negatives/non-string_key_preserved (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintPromptCacheKey_Negatives/non-string_key_preserved","Elapsed":0} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintPromptCacheKey_Negatives/missing_source_metadata_preserves_key"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintPromptCacheKey_Negatives/missing_source_metadata_preserves_key","Output":"=== RUN TestApplyCodexFingerprintPromptCacheKey_Negatives/missing_source_metadata_preserves_key\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintPromptCacheKey_Negatives/missing_source_metadata_preserves_key","Output":"--- PASS: TestApplyCodexFingerprintPromptCacheKey_Negatives/missing_source_metadata_preserves_key (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintPromptCacheKey_Negatives/missing_source_metadata_preserves_key","Elapsed":0} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintPromptCacheKey_Negatives/non-string_source_session_preserves_key"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintPromptCacheKey_Negatives/non-string_source_session_preserves_key","Output":"=== RUN TestApplyCodexFingerprintPromptCacheKey_Negatives/non-string_source_session_preserves_key\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintPromptCacheKey_Negatives/non-string_source_session_preserves_key","Output":"--- PASS: TestApplyCodexFingerprintPromptCacheKey_Negatives/non-string_source_session_preserves_key (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintPromptCacheKey_Negatives/non-string_source_session_preserves_key","Elapsed":0} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintPromptCacheKey_Negatives/non-object_source_metadata_preserves_key"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintPromptCacheKey_Negatives/non-object_source_metadata_preserves_key","Output":"=== RUN TestApplyCodexFingerprintPromptCacheKey_Negatives/non-object_source_metadata_preserves_key\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintPromptCacheKey_Negatives/non-object_source_metadata_preserves_key","Output":"--- PASS: TestApplyCodexFingerprintPromptCacheKey_Negatives/non-object_source_metadata_preserves_key (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintPromptCacheKey_Negatives/non-object_source_metadata_preserves_key","Elapsed":0} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintPromptCacheKey_Negatives/device_mode_preserves_key"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintPromptCacheKey_Negatives/device_mode_preserves_key","Output":"=== RUN TestApplyCodexFingerprintPromptCacheKey_Negatives/device_mode_preserves_key\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintPromptCacheKey_Negatives/device_mode_preserves_key","Output":"--- PASS: TestApplyCodexFingerprintPromptCacheKey_Negatives/device_mode_preserves_key (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintPromptCacheKey_Negatives/device_mode_preserves_key","Elapsed":0} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintPromptCacheKey_Negatives/off_mode_preserves_body"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintPromptCacheKey_Negatives/off_mode_preserves_body","Output":"=== RUN TestApplyCodexFingerprintPromptCacheKey_Negatives/off_mode_preserves_body\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintPromptCacheKey_Negatives/off_mode_preserves_body","Output":"--- PASS: TestApplyCodexFingerprintPromptCacheKey_Negatives/off_mode_preserves_body (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintPromptCacheKey_Negatives/off_mode_preserves_body","Elapsed":0} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintPromptCacheKey_Negatives","Output":"--- PASS: TestApplyCodexFingerprintPromptCacheKey_Negatives (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintPromptCacheKey_Negatives","Elapsed":0} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant","Output":"=== RUN TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant/device/object_with_extras"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant/device/object_with_extras","Output":"=== RUN TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant/device/object_with_extras\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant/device/object_with_extras","Output":"--- PASS: TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant/device/object_with_extras (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant/device/object_with_extras","Elapsed":0} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant/device/no_client_metadata"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant/device/no_client_metadata","Output":"=== RUN TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant/device/no_client_metadata\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant/device/no_client_metadata","Output":"--- PASS: TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant/device/no_client_metadata (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant/device/no_client_metadata","Elapsed":0} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant/device/non_object_value"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant/device/non_object_value","Output":"=== RUN TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant/device/non_object_value\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant/device/non_object_value","Output":"--- PASS: TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant/device/non_object_value (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant/device/non_object_value","Elapsed":0} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant/session/no_client_metadata"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant/session/no_client_metadata","Output":"=== RUN TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant/session/no_client_metadata\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant/session/no_client_metadata","Output":"--- PASS: TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant/session/no_client_metadata (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant/session/no_client_metadata","Elapsed":0} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant/session/non_object_value"} {"Time":"2026-09-12T11:42:35.0449466+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant/session/non_object_value","Output":"=== RUN TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant/session/non_object_value\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant/session/non_object_value","Output":"--- PASS: TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant/session/non_object_value (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant/session/non_object_value","Elapsed":0} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant/session/object_with_extras"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant/session/object_with_extras","Output":"=== RUN TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant/session/object_with_extras\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant/session/object_with_extras","Output":"--- PASS: TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant/session/object_with_extras (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant/session/object_with_extras","Elapsed":0} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant/full/object_with_extras"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant/full/object_with_extras","Output":"=== RUN TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant/full/object_with_extras\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant/full/object_with_extras","Output":"--- PASS: TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant/full/object_with_extras (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant/full/object_with_extras","Elapsed":0} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant/full/no_client_metadata"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant/full/no_client_metadata","Output":"=== RUN TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant/full/no_client_metadata\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant/full/no_client_metadata","Output":"--- PASS: TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant/full/no_client_metadata (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant/full/no_client_metadata","Elapsed":0} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant/full/non_object_value"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant/full/non_object_value","Output":"=== RUN TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant/full/non_object_value\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant/full/non_object_value","Output":"--- PASS: TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant/full/non_object_value (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant/full/non_object_value","Elapsed":0} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant","Output":"--- PASS: TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadataRaw_MatchesMapVariant","Elapsed":0} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadataRaw_PreservesUnrelatedFields"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadataRaw_PreservesUnrelatedFields","Output":"=== RUN TestApplyCodexFingerprintClientMetadataRaw_PreservesUnrelatedFields\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadataRaw_PreservesUnrelatedFields","Output":"--- PASS: TestApplyCodexFingerprintClientMetadataRaw_PreservesUnrelatedFields (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadataRaw_PreservesUnrelatedFields","Elapsed":0} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadataRaw_Noop"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadataRaw_Noop","Output":"=== RUN TestApplyCodexFingerprintClientMetadataRaw_Noop\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadataRaw_Noop","Output":"--- PASS: TestApplyCodexFingerprintClientMetadataRaw_Noop (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadataRaw_Noop","Elapsed":0} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestStageCodexFingerprintIDs_NilOverwritesPreviousAccount"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestStageCodexFingerprintIDs_NilOverwritesPreviousAccount","Output":"=== RUN TestStageCodexFingerprintIDs_NilOverwritesPreviousAccount\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestStageCodexFingerprintIDs_NilOverwritesPreviousAccount","Output":"--- PASS: TestStageCodexFingerprintIDs_NilOverwritesPreviousAccount (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestStageCodexFingerprintIDs_NilOverwritesPreviousAccount","Elapsed":0} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyStagedCodexFingerprintRejectsDifferentOAuthAccount"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyStagedCodexFingerprintRejectsDifferentOAuthAccount","Output":"=== RUN TestApplyStagedCodexFingerprintRejectsDifferentOAuthAccount\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyStagedCodexFingerprintRejectsDifferentOAuthAccount","Output":"--- PASS: TestApplyStagedCodexFingerprintRejectsDifferentOAuthAccount (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyStagedCodexFingerprintRejectsDifferentOAuthAccount","Elapsed":0} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyStagedCodexFingerprintHeaders_SkipsNonOAuthAccount"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyStagedCodexFingerprintHeaders_SkipsNonOAuthAccount","Output":"=== RUN TestApplyStagedCodexFingerprintHeaders_SkipsNonOAuthAccount\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyStagedCodexFingerprintHeaders_SkipsNonOAuthAccount","Output":"--- PASS: TestApplyStagedCodexFingerprintHeaders_SkipsNonOAuthAccount (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyStagedCodexFingerprintHeaders_SkipsNonOAuthAccount","Elapsed":0} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadataRaw_NonObjectBodyUntouched"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadataRaw_NonObjectBodyUntouched","Output":"=== RUN TestApplyCodexFingerprintClientMetadataRaw_NonObjectBodyUntouched\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadataRaw_NonObjectBodyUntouched","Output":"--- PASS: TestApplyCodexFingerprintClientMetadataRaw_NonObjectBodyUntouched (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexFingerprintClientMetadataRaw_NonObjectBodyUntouched","Elapsed":0} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnsureCodexIdentityHeaders"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnsureCodexIdentityHeaders","Output":"=== RUN TestEnsureCodexIdentityHeaders\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnsureCodexIdentityHeaders/补齐缺失身份头"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnsureCodexIdentityHeaders/补齐缺失身份头","Output":"=== RUN TestEnsureCodexIdentityHeaders/补齐缺失身份头\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnsureCodexIdentityHeaders/补齐缺失身份头","Output":"--- PASS: TestEnsureCodexIdentityHeaders/补齐缺失身份头 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnsureCodexIdentityHeaders/补齐缺失身份头","Elapsed":0} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnsureCodexIdentityHeaders/官方非_CLI_客户端身份同样被统一"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnsureCodexIdentityHeaders/官方非_CLI_客户端身份同样被统一","Output":"=== RUN TestEnsureCodexIdentityHeaders/官方非_CLI_客户端身份同样被统一\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnsureCodexIdentityHeaders/官方非_CLI_客户端身份同样被统一","Output":"--- PASS: TestEnsureCodexIdentityHeaders/官方非_CLI_客户端身份同样被统一 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnsureCodexIdentityHeaders/官方非_CLI_客户端身份同样被统一","Elapsed":0} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnsureCodexIdentityHeaders","Output":"--- PASS: TestEnsureCodexIdentityHeaders (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnsureCodexIdentityHeaders","Elapsed":0} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeaders"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeaders","Output":"=== RUN TestEnforceCodexIdentityHeaders\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeaders/TUI_身份"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeaders/TUI_身份","Output":"=== RUN TestEnforceCodexIdentityHeaders/TUI_身份\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeaders/TUI_身份","Output":"--- PASS: TestEnforceCodexIdentityHeaders/TUI_身份 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeaders/TUI_身份","Elapsed":0} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeaders/错配_originator"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeaders/错配_originator","Output":"=== RUN TestEnforceCodexIdentityHeaders/错配_originator\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeaders/错配_originator","Output":"--- PASS: TestEnforceCodexIdentityHeaders/错配_originator (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeaders/错配_originator","Elapsed":0} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeaders/官方_vscode_身份"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeaders/官方_vscode_身份","Output":"=== RUN TestEnforceCodexIdentityHeaders/官方_vscode_身份\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeaders/官方_vscode_身份","Output":"--- PASS: TestEnforceCodexIdentityHeaders/官方_vscode_身份 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeaders/官方_vscode_身份","Elapsed":0} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeaders/第三方客户端身份"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeaders/第三方客户端身份","Output":"=== RUN TestEnforceCodexIdentityHeaders/第三方客户端身份\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeaders/第三方客户端身份","Output":"--- PASS: TestEnforceCodexIdentityHeaders/第三方客户端身份 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeaders/第三方客户端身份","Elapsed":0} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeaders/浏览器型_UA(原浏览器兜底已被统一出口吸收)"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeaders/浏览器型_UA(原浏览器兜底已被统一出口吸收)","Output":"=== RUN TestEnforceCodexIdentityHeaders/浏览器型_UA(原浏览器兜底已被统一出口吸收)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeaders/浏览器型_UA(原浏览器兜底已被统一出口吸收)","Output":"--- PASS: TestEnforceCodexIdentityHeaders/浏览器型_UA(原浏览器兜底已被统一出口吸收) (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeaders/浏览器型_UA(原浏览器兜底已被统一出口吸收)","Elapsed":0} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeaders/UA_缺失"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeaders/UA_缺失","Output":"=== RUN TestEnforceCodexIdentityHeaders/UA_缺失\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeaders/UA_缺失","Output":"--- PASS: TestEnforceCodexIdentityHeaders/UA_缺失 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeaders/UA_缺失","Elapsed":0} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeaders/originator_override_的真实_TUI_客户端"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeaders/originator_override_的真实_TUI_客户端","Output":"=== RUN TestEnforceCodexIdentityHeaders/originator_override_的真实_TUI_客户端\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeaders/originator_override_的真实_TUI_客户端","Output":"--- PASS: TestEnforceCodexIdentityHeaders/originator_override_的真实_TUI_客户端 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeaders/originator_override_的真实_TUI_客户端","Elapsed":0} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeaders/陈旧客户端版本"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeaders/陈旧客户端版本","Output":"=== RUN TestEnforceCodexIdentityHeaders/陈旧客户端版本\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeaders/陈旧客户端版本","Output":"--- PASS: TestEnforceCodexIdentityHeaders/陈旧客户端版本 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeaders/陈旧客户端版本","Elapsed":0} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeaders","Output":"--- PASS: TestEnforceCodexIdentityHeaders (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeaders","Elapsed":0} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeadersWithAccountOverrideUA"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeadersWithAccountOverrideUA","Output":"=== RUN TestEnforceCodexIdentityHeadersWithAccountOverrideUA\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeadersWithAccountOverrideUA/官方形态覆写_UA_保留指纹但重建版本段"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeadersWithAccountOverrideUA/官方形态覆写_UA_保留指纹但重建版本段","Output":"=== RUN TestEnforceCodexIdentityHeadersWithAccountOverrideUA/官方形态覆写_UA_保留指纹但重建版本段\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeadersWithAccountOverrideUA/官方形态覆写_UA_保留指纹但重建版本段","Output":"--- PASS: TestEnforceCodexIdentityHeadersWithAccountOverrideUA/官方形态覆写_UA_保留指纹但重建版本段 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeadersWithAccountOverrideUA/官方形态覆写_UA_保留指纹但重建版本段","Elapsed":0} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeadersWithAccountOverrideUA/非官方形态覆写_UA_回退规范身份"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeadersWithAccountOverrideUA/非官方形态覆写_UA_回退规范身份","Output":"=== RUN TestEnforceCodexIdentityHeadersWithAccountOverrideUA/非官方形态覆写_UA_回退规范身份\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeadersWithAccountOverrideUA/非官方形态覆写_UA_回退规范身份","Output":"--- PASS: TestEnforceCodexIdentityHeadersWithAccountOverrideUA/非官方形态覆写_UA_回退规范身份 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeadersWithAccountOverrideUA/非官方形态覆写_UA_回退规范身份","Elapsed":0} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeadersWithAccountOverrideUA/陈旧覆写_UA_的版本段被重建"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeadersWithAccountOverrideUA/陈旧覆写_UA_的版本段被重建","Output":"=== RUN TestEnforceCodexIdentityHeadersWithAccountOverrideUA/陈旧覆写_UA_的版本段被重建\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeadersWithAccountOverrideUA/陈旧覆写_UA_的版本段被重建","Output":"--- PASS: TestEnforceCodexIdentityHeadersWithAccountOverrideUA/陈旧覆写_UA_的版本段被重建 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeadersWithAccountOverrideUA/陈旧覆写_UA_的版本段被重建","Elapsed":0} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeadersWithAccountOverrideUA/陈旧覆写_UA_跟随同步版本"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeadersWithAccountOverrideUA/陈旧覆写_UA_跟随同步版本","Output":"=== RUN TestEnforceCodexIdentityHeadersWithAccountOverrideUA/陈旧覆写_UA_跟随同步版本\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeadersWithAccountOverrideUA/陈旧覆写_UA_跟随同步版本","Output":"--- PASS: TestEnforceCodexIdentityHeadersWithAccountOverrideUA/陈旧覆写_UA_跟随同步版本 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeadersWithAccountOverrideUA/陈旧覆写_UA_跟随同步版本","Elapsed":0} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeadersWithAccountOverrideUA","Output":"--- PASS: TestEnforceCodexIdentityHeadersWithAccountOverrideUA (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeadersWithAccountOverrideUA","Elapsed":0} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeadersFollowsCanonicalResolver"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeadersFollowsCanonicalResolver","Output":"=== RUN TestEnforceCodexIdentityHeadersFollowsCanonicalResolver\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeadersFollowsCanonicalResolver","Output":"--- PASS: TestEnforceCodexIdentityHeadersFollowsCanonicalResolver (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeadersFollowsCanonicalResolver","Elapsed":0} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeadersRejectsInvalidCanonicalUA"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeadersRejectsInvalidCanonicalUA","Output":"=== RUN TestEnforceCodexIdentityHeadersRejectsInvalidCanonicalUA\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeadersRejectsInvalidCanonicalUA","Output":"--- PASS: TestEnforceCodexIdentityHeadersRejectsInvalidCanonicalUA (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeadersRejectsInvalidCanonicalUA","Elapsed":0} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexIdentityEnforcementZeroValueConfigKeepsItEnabled"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexIdentityEnforcementZeroValueConfigKeepsItEnabled","Output":"=== RUN TestCodexIdentityEnforcementZeroValueConfigKeepsItEnabled\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexIdentityEnforcementZeroValueConfigKeepsItEnabled","Output":"--- PASS: TestCodexIdentityEnforcementZeroValueConfigKeepsItEnabled (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexIdentityEnforcementZeroValueConfigKeepsItEnabled","Elapsed":0} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeaders_EnforcementDisabled"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeaders_EnforcementDisabled","Output":"=== RUN TestEnforceCodexIdentityHeaders_EnforcementDisabled\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeaders_EnforcementDisabled","Output":"--- PASS: TestEnforceCodexIdentityHeaders_EnforcementDisabled (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeaders_EnforcementDisabled","Elapsed":0} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeaders_EnforcementDisabledThirdPartyFallback"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeaders_EnforcementDisabledThirdPartyFallback","Output":"=== RUN TestEnforceCodexIdentityHeaders_EnforcementDisabledThirdPartyFallback\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeaders_EnforcementDisabledThirdPartyFallback","Output":"--- PASS: TestEnforceCodexIdentityHeaders_EnforcementDisabledThirdPartyFallback (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeaders_EnforcementDisabledThirdPartyFallback","Elapsed":0} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeadersIsIdempotent"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeadersIsIdempotent","Output":"=== RUN TestEnforceCodexIdentityHeadersIsIdempotent\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeadersIsIdempotent","Output":"--- PASS: TestEnforceCodexIdentityHeadersIsIdempotent (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeadersIsIdempotent","Elapsed":0} {"Time":"2026-09-12T11:42:35.0454648+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeaders_NoOriginatorIsNoop"} {"Time":"2026-09-12T11:42:35.0459852+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeaders_NoOriginatorIsNoop","Output":"=== RUN TestEnforceCodexIdentityHeaders_NoOriginatorIsNoop\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0459852+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeaders_NoOriginatorIsNoop","Output":"--- PASS: TestEnforceCodexIdentityHeaders_NoOriginatorIsNoop (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0459852+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnforceCodexIdentityHeaders_NoOriginatorIsNoop","Elapsed":0} {"Time":"2026-09-12T11:42:35.0459852+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeCodexClientVersion"} {"Time":"2026-09-12T11:42:35.0459852+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeCodexClientVersion","Output":"=== RUN TestNormalizeCodexClientVersion\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0459852+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeCodexClientVersion","Output":"--- PASS: TestNormalizeCodexClientVersion (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0459852+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeCodexClientVersion","Elapsed":0} {"Time":"2026-09-12T11:42:35.0459852+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexCLIUserAgent"} {"Time":"2026-09-12T11:42:35.0459852+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexCLIUserAgent","Output":"=== RUN TestBuildCodexCLIUserAgent\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0459852+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexCLIUserAgent","Output":"--- PASS: TestBuildCodexCLIUserAgent (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0459852+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexCLIUserAgent","Elapsed":0} {"Time":"2026-09-12T11:42:35.0459852+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexCanonicalUserAgentFollowsResolver"} {"Time":"2026-09-12T11:42:35.0459852+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexCanonicalUserAgentFollowsResolver","Output":"=== RUN TestCodexCanonicalUserAgentFollowsResolver\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0459852+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexCanonicalUserAgentFollowsResolver","Output":"--- PASS: TestCodexCanonicalUserAgentFollowsResolver (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0459852+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexCanonicalUserAgentFollowsResolver","Elapsed":0} {"Time":"2026-09-12T11:42:35.0459852+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexCanonicalUserAgentFallsBackWithoutResolver"} {"Time":"2026-09-12T11:42:35.0459852+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexCanonicalUserAgentFallsBackWithoutResolver","Output":"=== RUN TestCodexCanonicalUserAgentFallsBackWithoutResolver\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0459852+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexCanonicalUserAgentFallsBackWithoutResolver","Output":"--- PASS: TestCodexCanonicalUserAgentFallsBackWithoutResolver (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0459852+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexCanonicalUserAgentFallsBackWithoutResolver","Elapsed":0} {"Time":"2026-09-12T11:42:35.0459852+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAstraCodexToolCapabilitiesUseAccountScopeAndSharedDeclarations"} {"Time":"2026-09-12T11:42:35.0459852+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAstraCodexToolCapabilitiesUseAccountScopeAndSharedDeclarations","Output":"=== RUN TestAstraCodexToolCapabilitiesUseAccountScopeAndSharedDeclarations\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0459852+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAstraCodexToolCapabilitiesUseAccountScopeAndSharedDeclarations/official_fallback"} {"Time":"2026-09-12T11:42:35.0459852+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAstraCodexToolCapabilitiesUseAccountScopeAndSharedDeclarations/official_fallback","Output":"=== RUN TestAstraCodexToolCapabilitiesUseAccountScopeAndSharedDeclarations/official_fallback\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0459852+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAstraCodexToolCapabilitiesUseAccountScopeAndSharedDeclarations/official_fallback","Output":"--- PASS: TestAstraCodexToolCapabilitiesUseAccountScopeAndSharedDeclarations/official_fallback (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0459852+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAstraCodexToolCapabilitiesUseAccountScopeAndSharedDeclarations/official_fallback","Elapsed":0} {"Time":"2026-09-12T11:42:35.0459852+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAstraCodexToolCapabilitiesUseAccountScopeAndSharedDeclarations/custom_host_has_no_guessed_capability"} {"Time":"2026-09-12T11:42:35.0459852+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAstraCodexToolCapabilitiesUseAccountScopeAndSharedDeclarations/custom_host_has_no_guessed_capability","Output":"=== RUN TestAstraCodexToolCapabilitiesUseAccountScopeAndSharedDeclarations/custom_host_has_no_guessed_capability\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0459852+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAstraCodexToolCapabilitiesUseAccountScopeAndSharedDeclarations/custom_host_has_no_guessed_capability","Output":"--- PASS: TestAstraCodexToolCapabilitiesUseAccountScopeAndSharedDeclarations/custom_host_has_no_guessed_capability (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0459852+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAstraCodexToolCapabilitiesUseAccountScopeAndSharedDeclarations/custom_host_has_no_guessed_capability","Elapsed":0} {"Time":"2026-09-12T11:42:35.0459852+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAstraCodexToolCapabilitiesUseAccountScopeAndSharedDeclarations/missing_peer_capability"} {"Time":"2026-09-12T11:42:35.0459852+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAstraCodexToolCapabilitiesUseAccountScopeAndSharedDeclarations/missing_peer_capability","Output":"=== RUN TestAstraCodexToolCapabilitiesUseAccountScopeAndSharedDeclarations/missing_peer_capability\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0464944+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAstraCodexToolCapabilitiesUseAccountScopeAndSharedDeclarations/missing_peer_capability","Output":"--- PASS: TestAstraCodexToolCapabilitiesUseAccountScopeAndSharedDeclarations/missing_peer_capability (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0464944+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAstraCodexToolCapabilitiesUseAccountScopeAndSharedDeclarations/missing_peer_capability","Elapsed":0} {"Time":"2026-09-12T11:42:35.0464944+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAstraCodexToolCapabilitiesUseAccountScopeAndSharedDeclarations/implemented_chat_bridge"} {"Time":"2026-09-12T11:42:35.0464944+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAstraCodexToolCapabilitiesUseAccountScopeAndSharedDeclarations/implemented_chat_bridge","Output":"=== RUN TestAstraCodexToolCapabilitiesUseAccountScopeAndSharedDeclarations/implemented_chat_bridge\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0464944+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAstraCodexToolCapabilitiesUseAccountScopeAndSharedDeclarations/implemented_chat_bridge","Output":"--- PASS: TestAstraCodexToolCapabilitiesUseAccountScopeAndSharedDeclarations/implemented_chat_bridge (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0464944+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAstraCodexToolCapabilitiesUseAccountScopeAndSharedDeclarations/implemented_chat_bridge","Elapsed":0} {"Time":"2026-09-12T11:42:35.0470025+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAstraCodexToolCapabilitiesUseAccountScopeAndSharedDeclarations","Output":"--- PASS: TestAstraCodexToolCapabilitiesUseAccountScopeAndSharedDeclarations (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0470025+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAstraCodexToolCapabilitiesUseAccountScopeAndSharedDeclarations","Elapsed":0} {"Time":"2026-09-12T11:42:35.0470025+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAstraCodexToolCapabilitiesPreserveLiveNullAndFalse"} {"Time":"2026-09-12T11:42:35.0470025+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAstraCodexToolCapabilitiesPreserveLiveNullAndFalse","Output":"=== RUN TestAstraCodexToolCapabilitiesPreserveLiveNullAndFalse\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0480183+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAstraCodexToolCapabilitiesPreserveLiveNullAndFalse","Output":"--- PASS: TestAstraCodexToolCapabilitiesPreserveLiveNullAndFalse (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0480183+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAstraCodexToolCapabilitiesPreserveLiveNullAndFalse","Elapsed":0} {"Time":"2026-09-12T11:42:35.0480183+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesSyncedAccountMetadata"} {"Time":"2026-09-12T11:42:35.0480183+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesSyncedAccountMetadata","Output":"=== RUN TestBuildCodexModelsManifestForGroupUsesSyncedAccountMetadata\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0480183+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesSyncedAccountMetadata","Output":"=== PAUSE TestBuildCodexModelsManifestForGroupUsesSyncedAccountMetadata\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0480183+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesSyncedAccountMetadata"} {"Time":"2026-09-12T11:42:35.0480183+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesNoneForExplicitNonReasoningMetadata"} {"Time":"2026-09-12T11:42:35.0480183+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesNoneForExplicitNonReasoningMetadata","Output":"=== RUN TestBuildCodexModelsManifestForGroupUsesNoneForExplicitNonReasoningMetadata\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0480183+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesNoneForExplicitNonReasoningMetadata","Output":"=== PAUSE TestBuildCodexModelsManifestForGroupUsesNoneForExplicitNonReasoningMetadata\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0480183+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesNoneForExplicitNonReasoningMetadata"} {"Time":"2026-09-12T11:42:35.0480183+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupAdvertisesSearchOnlyForChatBridgeRoutes"} {"Time":"2026-09-12T11:42:35.0480183+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupAdvertisesSearchOnlyForChatBridgeRoutes","Output":"=== RUN TestBuildCodexModelsManifestForGroupAdvertisesSearchOnlyForChatBridgeRoutes\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0480183+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupAdvertisesSearchOnlyForChatBridgeRoutes","Output":"=== PAUSE TestBuildCodexModelsManifestForGroupAdvertisesSearchOnlyForChatBridgeRoutes\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0480183+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupAdvertisesSearchOnlyForChatBridgeRoutes"} {"Time":"2026-09-12T11:42:35.0480183+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexManifestSearchCapabilityPreservesUpstreamAndFailsClosed"} {"Time":"2026-09-12T11:42:35.0480183+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexManifestSearchCapabilityPreservesUpstreamAndFailsClosed","Output":"=== RUN TestCompleteAPIKeyCodexManifestSearchCapabilityPreservesUpstreamAndFailsClosed\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0480183+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexManifestSearchCapabilityPreservesUpstreamAndFailsClosed","Output":"=== PAUSE TestCompleteAPIKeyCodexManifestSearchCapabilityPreservesUpstreamAndFailsClosed\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0480183+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexManifestSearchCapabilityPreservesUpstreamAndFailsClosed"} {"Time":"2026-09-12T11:42:35.0480183+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupIntersectsSyncedAccountMetadata"} {"Time":"2026-09-12T11:42:35.0480183+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupIntersectsSyncedAccountMetadata","Output":"=== RUN TestBuildCodexModelsManifestForGroupIntersectsSyncedAccountMetadata\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0480183+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupIntersectsSyncedAccountMetadata","Output":"=== PAUSE TestBuildCodexModelsManifestForGroupIntersectsSyncedAccountMetadata\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0480183+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupIntersectsSyncedAccountMetadata"} {"Time":"2026-09-12T11:42:35.0480183+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupIntersectsDifferentMappedTargetsWithoutLeakingAlias"} {"Time":"2026-09-12T11:42:35.0480183+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupIntersectsDifferentMappedTargetsWithoutLeakingAlias","Output":"=== RUN TestBuildCodexModelsManifestForGroupIntersectsDifferentMappedTargetsWithoutLeakingAlias\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0480183+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupIntersectsDifferentMappedTargetsWithoutLeakingAlias","Output":"=== PAUSE TestBuildCodexModelsManifestForGroupIntersectsDifferentMappedTargetsWithoutLeakingAlias\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0480183+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupIntersectsDifferentMappedTargetsWithoutLeakingAlias"} {"Time":"2026-09-12T11:42:35.0480183+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupIntersectsTransientlyUnschedulableMappedAccounts"} {"Time":"2026-09-12T11:42:35.0480183+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupIntersectsTransientlyUnschedulableMappedAccounts","Output":"=== RUN TestBuildCodexModelsManifestForGroupIntersectsTransientlyUnschedulableMappedAccounts\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0480183+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupIntersectsTransientlyUnschedulableMappedAccounts","Output":"=== PAUSE TestBuildCodexModelsManifestForGroupIntersectsTransientlyUnschedulableMappedAccounts\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0480183+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupIntersectsTransientlyUnschedulableMappedAccounts"} {"Time":"2026-09-12T11:42:35.0480183+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupIgnoresPersistentlyDisabledMappedAccounts"} {"Time":"2026-09-12T11:42:35.0480183+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupIgnoresPersistentlyDisabledMappedAccounts","Output":"=== RUN TestBuildCodexModelsManifestForGroupIgnoresPersistentlyDisabledMappedAccounts\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0480183+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupIgnoresPersistentlyDisabledMappedAccounts","Output":"=== PAUSE TestBuildCodexModelsManifestForGroupIgnoresPersistentlyDisabledMappedAccounts\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0480183+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupIgnoresPersistentlyDisabledMappedAccounts"} {"Time":"2026-09-12T11:42:35.0480183+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupFallsBackToSchedulableWhenAvailabilityLookupFails"} {"Time":"2026-09-12T11:42:35.0480183+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupFallsBackToSchedulableWhenAvailabilityLookupFails","Output":"=== RUN TestBuildCodexModelsManifestForGroupFallsBackToSchedulableWhenAvailabilityLookupFails\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0480183+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupFallsBackToSchedulableWhenAvailabilityLookupFails","Output":"=== PAUSE TestBuildCodexModelsManifestForGroupFallsBackToSchedulableWhenAvailabilityLookupFails\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0480183+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupFallsBackToSchedulableWhenAvailabilityLookupFails"} {"Time":"2026-09-12T11:42:35.0480183+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupKeepsCrossPlatformAliasAmbiguityClosed"} {"Time":"2026-09-12T11:42:35.0480183+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupKeepsCrossPlatformAliasAmbiguityClosed","Output":"=== RUN TestBuildCodexModelsManifestForGroupKeepsCrossPlatformAliasAmbiguityClosed\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0480183+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupKeepsCrossPlatformAliasAmbiguityClosed","Output":"=== PAUSE TestBuildCodexModelsManifestForGroupKeepsCrossPlatformAliasAmbiguityClosed\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0480183+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupKeepsCrossPlatformAliasAmbiguityClosed"} {"Time":"2026-09-12T11:42:35.0480183+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupDoesNotAdvertiseNoneWhenAccountReasoningConflicts"} {"Time":"2026-09-12T11:42:35.0480183+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupDoesNotAdvertiseNoneWhenAccountReasoningConflicts","Output":"=== RUN TestBuildCodexModelsManifestForGroupDoesNotAdvertiseNoneWhenAccountReasoningConflicts\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0480183+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupDoesNotAdvertiseNoneWhenAccountReasoningConflicts","Output":"=== PAUSE TestBuildCodexModelsManifestForGroupDoesNotAdvertiseNoneWhenAccountReasoningConflicts\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0480183+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupDoesNotAdvertiseNoneWhenAccountReasoningConflicts"} {"Time":"2026-09-12T11:42:35.0480183+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAstraCodexToolCapabilitiesFollowAPIKeyAlias"} {"Time":"2026-09-12T11:42:35.0480183+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAstraCodexToolCapabilitiesFollowAPIKeyAlias","Output":"=== RUN TestAstraCodexToolCapabilitiesFollowAPIKeyAlias\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0485386+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAstraCodexToolCapabilitiesFollowAPIKeyAlias","Output":"--- PASS: TestAstraCodexToolCapabilitiesFollowAPIKeyAlias (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0485386+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAstraCodexToolCapabilitiesFollowAPIKeyAlias","Elapsed":0} {"Time":"2026-09-12T11:42:35.0485386+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAstraCodexToolCapabilitiesKeepAPIKeyResponsesLiteGuard"} {"Time":"2026-09-12T11:42:35.0485386+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAstraCodexToolCapabilitiesKeepAPIKeyResponsesLiteGuard","Output":"=== RUN TestAstraCodexToolCapabilitiesKeepAPIKeyResponsesLiteGuard\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0490448+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAstraCodexToolCapabilitiesKeepAPIKeyResponsesLiteGuard","Output":"--- PASS: TestAstraCodexToolCapabilitiesKeepAPIKeyResponsesLiteGuard (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0490448+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAstraCodexToolCapabilitiesKeepAPIKeyResponsesLiteGuard","Elapsed":0} {"Time":"2026-09-12T11:42:35.0490448+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexAliasFailoverMappingHonorsModelRouting"} {"Time":"2026-09-12T11:42:35.0490448+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexAliasFailoverMappingHonorsModelRouting","Output":"=== RUN TestCodexAliasFailoverMappingHonorsModelRouting\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0490448+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexAliasFailoverMappingHonorsModelRouting/no_routing_rule_still_fails_closed"} {"Time":"2026-09-12T11:42:35.0490448+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexAliasFailoverMappingHonorsModelRouting/no_routing_rule_still_fails_closed","Output":"=== RUN TestCodexAliasFailoverMappingHonorsModelRouting/no_routing_rule_still_fails_closed\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0490448+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexAliasFailoverMappingHonorsModelRouting/no_routing_rule_still_fails_closed","Output":"--- PASS: TestCodexAliasFailoverMappingHonorsModelRouting/no_routing_rule_still_fails_closed (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0490448+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexAliasFailoverMappingHonorsModelRouting/no_routing_rule_still_fails_closed","Elapsed":0} {"Time":"2026-09-12T11:42:35.0490448+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexAliasFailoverMappingHonorsModelRouting/routing_rule_resolves_the_alias"} {"Time":"2026-09-12T11:42:35.0490448+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexAliasFailoverMappingHonorsModelRouting/routing_rule_resolves_the_alias","Output":"=== RUN TestCodexAliasFailoverMappingHonorsModelRouting/routing_rule_resolves_the_alias\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0490448+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexAliasFailoverMappingHonorsModelRouting/routing_rule_resolves_the_alias","Output":"--- PASS: TestCodexAliasFailoverMappingHonorsModelRouting/routing_rule_resolves_the_alias (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0490448+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexAliasFailoverMappingHonorsModelRouting/routing_rule_resolves_the_alias","Elapsed":0} {"Time":"2026-09-12T11:42:35.0490448+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexAliasFailoverMappingHonorsModelRouting/routing_disabled_falls_back_to_failing_closed"} {"Time":"2026-09-12T11:42:35.0490448+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexAliasFailoverMappingHonorsModelRouting/routing_disabled_falls_back_to_failing_closed","Output":"=== RUN TestCodexAliasFailoverMappingHonorsModelRouting/routing_disabled_falls_back_to_failing_closed\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0490448+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexAliasFailoverMappingHonorsModelRouting/routing_disabled_falls_back_to_failing_closed","Output":"--- PASS: TestCodexAliasFailoverMappingHonorsModelRouting/routing_disabled_falls_back_to_failing_closed (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0490448+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexAliasFailoverMappingHonorsModelRouting/routing_disabled_falls_back_to_failing_closed","Elapsed":0} {"Time":"2026-09-12T11:42:35.0490448+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexAliasFailoverMappingHonorsModelRouting/routing_rule_for_another_alias_does_not_leak"} {"Time":"2026-09-12T11:42:35.0490448+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexAliasFailoverMappingHonorsModelRouting/routing_rule_for_another_alias_does_not_leak","Output":"=== RUN TestCodexAliasFailoverMappingHonorsModelRouting/routing_rule_for_another_alias_does_not_leak\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexAliasFailoverMappingHonorsModelRouting/routing_rule_for_another_alias_does_not_leak","Output":"--- PASS: TestCodexAliasFailoverMappingHonorsModelRouting/routing_rule_for_another_alias_does_not_leak (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexAliasFailoverMappingHonorsModelRouting/routing_rule_for_another_alias_does_not_leak","Elapsed":0} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexAliasFailoverMappingHonorsModelRouting","Output":"--- PASS: TestCodexAliasFailoverMappingHonorsModelRouting (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexAliasFailoverMappingHonorsModelRouting","Elapsed":0} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFilterCodexModelIDsForGroupOmitsWildcardKeys"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFilterCodexModelIDsForGroupOmitsWildcardKeys","Output":"=== RUN TestFilterCodexModelIDsForGroupOmitsWildcardKeys\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFilterCodexModelIDsForGroupOmitsWildcardKeys","Output":"=== PAUSE TestFilterCodexModelIDsForGroupOmitsWildcardKeys\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFilterCodexModelIDsForGroupOmitsWildcardKeys"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNewConfiguredCodexModelDescriptorUsesProviderMetadataAndSafeFallback"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNewConfiguredCodexModelDescriptorUsesProviderMetadataAndSafeFallback","Output":"=== RUN TestNewConfiguredCodexModelDescriptorUsesProviderMetadataAndSafeFallback\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNewConfiguredCodexModelDescriptorUsesProviderMetadataAndSafeFallback","Output":"=== PAUSE TestNewConfiguredCodexModelDescriptorUsesProviderMetadataAndSafeFallback\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNewConfiguredCodexModelDescriptorUsesProviderMetadataAndSafeFallback"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestUsesGPT6AstraInstructions"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestUsesGPT6AstraInstructions","Output":"=== RUN TestBuildCodexModelsManifestUsesGPT6AstraInstructions\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestUsesGPT6AstraInstructions","Output":"--- PASS: TestBuildCodexModelsManifestUsesGPT6AstraInstructions (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestUsesGPT6AstraInstructions","Elapsed":0} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestUsesSingleNoneReasoningChoiceForCustomModel"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestUsesSingleNoneReasoningChoiceForCustomModel","Output":"=== RUN TestBuildCodexModelsManifestUsesSingleNoneReasoningChoiceForCustomModel\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestUsesSingleNoneReasoningChoiceForCustomModel","Output":"=== PAUSE TestBuildCodexModelsManifestUsesSingleNoneReasoningChoiceForCustomModel\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestUsesSingleNoneReasoningChoiceForCustomModel"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestKeepsKnownReasoningChoices"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestKeepsKnownReasoningChoices","Output":"=== RUN TestBuildCodexModelsManifestKeepsKnownReasoningChoices\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestKeepsKnownReasoningChoices","Output":"=== PAUSE TestBuildCodexModelsManifestKeepsKnownReasoningChoices\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestKeepsKnownReasoningChoices"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestAdvertisesPriorityServiceTierForFastGPTModels"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestAdvertisesPriorityServiceTierForFastGPTModels","Output":"=== RUN TestBuildCodexModelsManifestAdvertisesPriorityServiceTierForFastGPTModels\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestAdvertisesPriorityServiceTierForFastGPTModels","Output":"=== PAUSE TestBuildCodexModelsManifestAdvertisesPriorityServiceTierForFastGPTModels\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestAdvertisesPriorityServiceTierForFastGPTModels"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestAdvertisesUltrafastServiceTierForSol"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestAdvertisesUltrafastServiceTierForSol","Output":"=== RUN TestBuildCodexModelsManifestAdvertisesUltrafastServiceTierForSol\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestAdvertisesUltrafastServiceTierForSol","Output":"=== PAUSE TestBuildCodexModelsManifestAdvertisesUltrafastServiceTierForSol\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestAdvertisesUltrafastServiceTierForSol"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestLeavesServiceTiersEmptyForOtherModels"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestLeavesServiceTiersEmptyForOtherModels","Output":"=== RUN TestBuildCodexModelsManifestLeavesServiceTiersEmptyForOtherModels\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestLeavesServiceTiersEmptyForOtherModels","Output":"=== PAUSE TestBuildCodexModelsManifestLeavesServiceTiersEmptyForOtherModels\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestLeavesServiceTiersEmptyForOtherModels"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestOmitsDedicatedImageModels"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestOmitsDedicatedImageModels","Output":"=== RUN TestBuildCodexModelsManifestOmitsDedicatedImageModels\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestOmitsDedicatedImageModels","Output":"=== PAUSE TestBuildCodexModelsManifestOmitsDedicatedImageModels\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestOmitsDedicatedImageModels"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupAdvertisesOfficialGrokResponsesImageInput"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupAdvertisesOfficialGrokResponsesImageInput","Output":"=== RUN TestBuildCodexModelsManifestForGroupAdvertisesOfficialGrokResponsesImageInput\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupAdvertisesOfficialGrokResponsesImageInput","Output":"=== PAUSE TestBuildCodexModelsManifestForGroupAdvertisesOfficialGrokResponsesImageInput\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupAdvertisesOfficialGrokResponsesImageInput"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupAdvertisesOfficialOpenAIResponsesImageInput"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupAdvertisesOfficialOpenAIResponsesImageInput","Output":"=== RUN TestBuildCodexModelsManifestForGroupAdvertisesOfficialOpenAIResponsesImageInput\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupAdvertisesOfficialOpenAIResponsesImageInput","Output":"=== PAUSE TestBuildCodexModelsManifestForGroupAdvertisesOfficialOpenAIResponsesImageInput\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupAdvertisesOfficialOpenAIResponsesImageInput"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities","Output":"=== RUN TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities","Output":"=== PAUSE TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupPrefersSyncedOpenAIImageCapabilities"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupPrefersSyncedOpenAIImageCapabilities","Output":"=== RUN TestBuildCodexModelsManifestForGroupPrefersSyncedOpenAIImageCapabilities\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupPrefersSyncedOpenAIImageCapabilities","Output":"=== PAUSE TestBuildCodexModelsManifestForGroupPrefersSyncedOpenAIImageCapabilities\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupPrefersSyncedOpenAIImageCapabilities"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesExplicitCompositeResponsesRouteModel"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesExplicitCompositeResponsesRouteModel","Output":"=== RUN TestBuildCodexModelsManifestForGroupUsesExplicitCompositeResponsesRouteModel\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesExplicitCompositeResponsesRouteModel","Output":"=== PAUSE TestBuildCodexModelsManifestForGroupUsesExplicitCompositeResponsesRouteModel\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesExplicitCompositeResponsesRouteModel"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesAccountMappingOwnershipAndMappedModel"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesAccountMappingOwnershipAndMappedModel","Output":"=== RUN TestBuildCodexModelsManifestForGroupUsesAccountMappingOwnershipAndMappedModel\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesAccountMappingOwnershipAndMappedModel","Output":"=== PAUSE TestBuildCodexModelsManifestForGroupUsesAccountMappingOwnershipAndMappedModel\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesAccountMappingOwnershipAndMappedModel"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesMappedTargetMetadataForCompositeAlias"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesMappedTargetMetadataForCompositeAlias","Output":"=== RUN TestBuildCodexModelsManifestForGroupUsesMappedTargetMetadataForCompositeAlias\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesMappedTargetMetadataForCompositeAlias","Output":"=== PAUSE TestBuildCodexModelsManifestForGroupUsesMappedTargetMetadataForCompositeAlias\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesMappedTargetMetadataForCompositeAlias"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesSafeFallbackForConflictingAliasTargets"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesSafeFallbackForConflictingAliasTargets","Output":"=== RUN TestBuildCodexModelsManifestForGroupUsesSafeFallbackForConflictingAliasTargets\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesSafeFallbackForConflictingAliasTargets","Output":"=== PAUSE TestBuildCodexModelsManifestForGroupUsesSafeFallbackForConflictingAliasTargets\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesSafeFallbackForConflictingAliasTargets"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupOmitsDedicatedMediaTargetAlias"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupOmitsDedicatedMediaTargetAlias","Output":"=== RUN TestBuildCodexModelsManifestForGroupOmitsDedicatedMediaTargetAlias\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupOmitsDedicatedMediaTargetAlias","Output":"=== PAUSE TestBuildCodexModelsManifestForGroupOmitsDedicatedMediaTargetAlias\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupOmitsDedicatedMediaTargetAlias"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupLoadsAccountsOnce"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupLoadsAccountsOnce","Output":"=== RUN TestBuildCodexModelsManifestForGroupLoadsAccountsOnce\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupLoadsAccountsOnce","Output":"=== PAUSE TestBuildCodexModelsManifestForGroupLoadsAccountsOnce\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupLoadsAccountsOnce"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesFallbackWhenTextOnlyPlatformHasNoSnapshot"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesFallbackWhenTextOnlyPlatformHasNoSnapshot","Output":"=== RUN TestBuildCodexModelsManifestForGroupUsesFallbackWhenTextOnlyPlatformHasNoSnapshot\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesFallbackWhenTextOnlyPlatformHasNoSnapshot","Output":"=== PAUSE TestBuildCodexModelsManifestForGroupUsesFallbackWhenTextOnlyPlatformHasNoSnapshot\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesFallbackWhenTextOnlyPlatformHasNoSnapshot"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupFallsBackWhenCapabilityLookupFails"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupFallsBackWhenCapabilityLookupFails","Output":"=== RUN TestBuildCodexModelsManifestForGroupFallsBackWhenCapabilityLookupFails\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupFallsBackWhenCapabilityLookupFails","Output":"=== PAUSE TestBuildCodexModelsManifestForGroupFallsBackWhenCapabilityLookupFails\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupFallsBackWhenCapabilityLookupFails"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMergeGroupConfiguredCodexModelsInjectsCurrentGroupAliases"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMergeGroupConfiguredCodexModelsInjectsCurrentGroupAliases","Output":"=== RUN TestMergeGroupConfiguredCodexModelsInjectsCurrentGroupAliases\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMergeGroupConfiguredCodexModelsInjectsCurrentGroupAliases","Output":"=== PAUSE TestMergeGroupConfiguredCodexModelsInjectsCurrentGroupAliases\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMergeGroupConfiguredCodexModelsInjectsCurrentGroupAliases"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildGroupConfiguredCodexModelsManifestUsesAdministratorConfiguration"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildGroupConfiguredCodexModelsManifestUsesAdministratorConfiguration","Output":"=== RUN TestBuildGroupConfiguredCodexModelsManifestUsesAdministratorConfiguration\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildGroupConfiguredCodexModelsManifestUsesAdministratorConfiguration","Output":"=== PAUSE TestBuildGroupConfiguredCodexModelsManifestUsesAdministratorConfiguration\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildGroupConfiguredCodexModelsManifestUsesAdministratorConfiguration"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildGroupConfiguredCodexModelsManifestExpandsSelectedModelCoveredByWildcardMapping"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildGroupConfiguredCodexModelsManifestExpandsSelectedModelCoveredByWildcardMapping","Output":"=== RUN TestBuildGroupConfiguredCodexModelsManifestExpandsSelectedModelCoveredByWildcardMapping\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildGroupConfiguredCodexModelsManifestExpandsSelectedModelCoveredByWildcardMapping","Output":"=== PAUSE TestBuildGroupConfiguredCodexModelsManifestExpandsSelectedModelCoveredByWildcardMapping\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildGroupConfiguredCodexModelsManifestExpandsSelectedModelCoveredByWildcardMapping"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildGroupConfiguredCodexModelsManifestIntersectsTransientlyUnschedulableMappedAccounts"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildGroupConfiguredCodexModelsManifestIntersectsTransientlyUnschedulableMappedAccounts","Output":"=== RUN TestBuildGroupConfiguredCodexModelsManifestIntersectsTransientlyUnschedulableMappedAccounts\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildGroupConfiguredCodexModelsManifestIntersectsTransientlyUnschedulableMappedAccounts","Output":"=== PAUSE TestBuildGroupConfiguredCodexModelsManifestIntersectsTransientlyUnschedulableMappedAccounts\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildGroupConfiguredCodexModelsManifestIntersectsTransientlyUnschedulableMappedAccounts"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildGroupConfiguredCodexModelsManifestIgnoresPersistentlyDisabledMappedAccounts"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildGroupConfiguredCodexModelsManifestIgnoresPersistentlyDisabledMappedAccounts","Output":"=== RUN TestBuildGroupConfiguredCodexModelsManifestIgnoresPersistentlyDisabledMappedAccounts\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildGroupConfiguredCodexModelsManifestIgnoresPersistentlyDisabledMappedAccounts","Output":"=== PAUSE TestBuildGroupConfiguredCodexModelsManifestIgnoresPersistentlyDisabledMappedAccounts\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildGroupConfiguredCodexModelsManifestIgnoresPersistentlyDisabledMappedAccounts"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildGroupConfiguredCodexModelsManifestFallsThroughWithoutConfiguration"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildGroupConfiguredCodexModelsManifestFallsThroughWithoutConfiguration","Output":"=== RUN TestBuildGroupConfiguredCodexModelsManifestFallsThroughWithoutConfiguration\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildGroupConfiguredCodexModelsManifestFallsThroughWithoutConfiguration","Output":"=== PAUSE TestBuildGroupConfiguredCodexModelsManifestFallsThroughWithoutConfiguration\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildGroupConfiguredCodexModelsManifestFallsThroughWithoutConfiguration"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMergeGroupConfiguredCodexModelsFiltersAutoReviewByDefault"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMergeGroupConfiguredCodexModelsFiltersAutoReviewByDefault","Output":"=== RUN TestMergeGroupConfiguredCodexModelsFiltersAutoReviewByDefault\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMergeGroupConfiguredCodexModelsFiltersAutoReviewByDefault","Output":"=== PAUSE TestMergeGroupConfiguredCodexModelsFiltersAutoReviewByDefault\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMergeGroupConfiguredCodexModelsFiltersAutoReviewByDefault"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMergeGroupConfiguredCodexModelsFiltersAccountMappedAutoReviewByDefault"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMergeGroupConfiguredCodexModelsFiltersAccountMappedAutoReviewByDefault","Output":"=== RUN TestMergeGroupConfiguredCodexModelsFiltersAccountMappedAutoReviewByDefault\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMergeGroupConfiguredCodexModelsFiltersAccountMappedAutoReviewByDefault","Output":"=== PAUSE TestMergeGroupConfiguredCodexModelsFiltersAccountMappedAutoReviewByDefault\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMergeGroupConfiguredCodexModelsFiltersAccountMappedAutoReviewByDefault"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMergeGroupConfiguredCodexModelsKeepsExplicitAutoReviewSelection"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMergeGroupConfiguredCodexModelsKeepsExplicitAutoReviewSelection","Output":"=== RUN TestMergeGroupConfiguredCodexModelsKeepsExplicitAutoReviewSelection\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMergeGroupConfiguredCodexModelsKeepsExplicitAutoReviewSelection","Output":"=== PAUSE TestMergeGroupConfiguredCodexModelsKeepsExplicitAutoReviewSelection\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMergeGroupConfiguredCodexModelsKeepsExplicitAutoReviewSelection"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMergeGroupConfiguredCodexModelsHonorsCustomListAndFinalETag"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMergeGroupConfiguredCodexModelsHonorsCustomListAndFinalETag","Output":"=== RUN TestMergeGroupConfiguredCodexModelsHonorsCustomListAndFinalETag\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMergeGroupConfiguredCodexModelsHonorsCustomListAndFinalETag","Output":"=== PAUSE TestMergeGroupConfiguredCodexModelsHonorsCustomListAndFinalETag\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMergeGroupConfiguredCodexModelsHonorsCustomListAndFinalETag"} {"Time":"2026-09-12T11:42:35.0495514+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError"} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError","Output":"=== RUN TestIsRetryableCodexModelsManifestTransportError\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/nil"} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/nil","Output":"=== RUN TestIsRetryableCodexModelsManifestTransportError/nil\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/nil","Output":"--- PASS: TestIsRetryableCodexModelsManifestTransportError/nil (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/nil","Elapsed":0} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/configuration_error"} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/configuration_error","Output":"=== RUN TestIsRetryableCodexModelsManifestTransportError/configuration_error\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/configuration_error","Output":"--- PASS: TestIsRetryableCodexModelsManifestTransportError/configuration_error (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/configuration_error","Elapsed":0} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/upstream_configuration_error"} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/upstream_configuration_error","Output":"=== RUN TestIsRetryableCodexModelsManifestTransportError/upstream_configuration_error\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/upstream_configuration_error","Output":"--- PASS: TestIsRetryableCodexModelsManifestTransportError/upstream_configuration_error (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/upstream_configuration_error","Elapsed":0} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/proxy_connection_configuration_error"} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/proxy_connection_configuration_error","Output":"=== RUN TestIsRetryableCodexModelsManifestTransportError/proxy_connection_configuration_error\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/proxy_connection_configuration_error","Output":"--- PASS: TestIsRetryableCodexModelsManifestTransportError/proxy_connection_configuration_error (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/proxy_connection_configuration_error","Elapsed":0} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/canceled_request"} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/canceled_request","Output":"=== RUN TestIsRetryableCodexModelsManifestTransportError/canceled_request\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/canceled_request","Output":"--- PASS: TestIsRetryableCodexModelsManifestTransportError/canceled_request (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/canceled_request","Elapsed":0} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/redirect_policy_error"} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/redirect_policy_error","Output":"=== RUN TestIsRetryableCodexModelsManifestTransportError/redirect_policy_error\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/redirect_policy_error","Output":"--- PASS: TestIsRetryableCodexModelsManifestTransportError/redirect_policy_error (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/redirect_policy_error","Elapsed":0} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/deadline_exceeded"} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/deadline_exceeded","Output":"=== RUN TestIsRetryableCodexModelsManifestTransportError/deadline_exceeded\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/deadline_exceeded","Output":"--- PASS: TestIsRetryableCodexModelsManifestTransportError/deadline_exceeded (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/deadline_exceeded","Elapsed":0} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/unexpected_EOF"} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/unexpected_EOF","Output":"=== RUN TestIsRetryableCodexModelsManifestTransportError/unexpected_EOF\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/unexpected_EOF","Output":"--- PASS: TestIsRetryableCodexModelsManifestTransportError/unexpected_EOF (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/unexpected_EOF","Elapsed":0} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/closed_connection"} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/closed_connection","Output":"=== RUN TestIsRetryableCodexModelsManifestTransportError/closed_connection\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/closed_connection","Output":"--- PASS: TestIsRetryableCodexModelsManifestTransportError/closed_connection (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/closed_connection","Elapsed":0} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/network_operation"} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/network_operation","Output":"=== RUN TestIsRetryableCodexModelsManifestTransportError/network_operation\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/network_operation","Output":"--- PASS: TestIsRetryableCodexModelsManifestTransportError/network_operation (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/network_operation","Elapsed":0} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/DNS_error"} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/DNS_error","Output":"=== RUN TestIsRetryableCodexModelsManifestTransportError/DNS_error\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/DNS_error","Output":"--- PASS: TestIsRetryableCodexModelsManifestTransportError/DNS_error (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/DNS_error","Elapsed":0} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/typed_HTTP2_GOAWAY"} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/typed_HTTP2_GOAWAY","Output":"=== RUN TestIsRetryableCodexModelsManifestTransportError/typed_HTTP2_GOAWAY\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/typed_HTTP2_GOAWAY","Output":"--- PASS: TestIsRetryableCodexModelsManifestTransportError/typed_HTTP2_GOAWAY (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/typed_HTTP2_GOAWAY","Elapsed":0} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/stdlib_HTTP2_GOAWAY"} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/stdlib_HTTP2_GOAWAY","Output":"=== RUN TestIsRetryableCodexModelsManifestTransportError/stdlib_HTTP2_GOAWAY\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/stdlib_HTTP2_GOAWAY","Output":"--- PASS: TestIsRetryableCodexModelsManifestTransportError/stdlib_HTTP2_GOAWAY (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/stdlib_HTTP2_GOAWAY","Elapsed":0} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/stdlib_HTTP2_refused_stream"} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/stdlib_HTTP2_refused_stream","Output":"=== RUN TestIsRetryableCodexModelsManifestTransportError/stdlib_HTTP2_refused_stream\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/stdlib_HTTP2_refused_stream","Output":"--- PASS: TestIsRetryableCodexModelsManifestTransportError/stdlib_HTTP2_refused_stream (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/stdlib_HTTP2_refused_stream","Elapsed":0} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/stdlib_HTTP2_connection_error"} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/stdlib_HTTP2_connection_error","Output":"=== RUN TestIsRetryableCodexModelsManifestTransportError/stdlib_HTTP2_connection_error\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/stdlib_HTTP2_connection_error","Output":"--- PASS: TestIsRetryableCodexModelsManifestTransportError/stdlib_HTTP2_connection_error (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError/stdlib_HTTP2_connection_error","Elapsed":0} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError","Output":"--- PASS: TestIsRetryableCodexModelsManifestTransportError (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestTransportError","Elapsed":0} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus"} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus","Output":"=== RUN TestIsRetryableCodexModelsManifestStatus\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus","Output":"=== PAUSE TestIsRetryableCodexModelsManifestStatus\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus"} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestPassthrough"} {"Time":"2026-09-12T11:42:35.0500587+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestPassthrough","Output":"=== RUN TestFetchCodexModelsManifestPassthrough\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0505662+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestPassthrough","Output":"--- PASS: TestFetchCodexModelsManifestPassthrough (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0505662+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestPassthrough","Elapsed":0} {"Time":"2026-09-12T11:42:35.0505662+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAgentIdentityUsesAssertionWithoutOAuthToken"} {"Time":"2026-09-12T11:42:35.0505662+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAgentIdentityUsesAssertionWithoutOAuthToken","Output":"=== RUN TestFetchCodexModelsManifestAgentIdentityUsesAssertionWithoutOAuthToken\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0510698+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAgentIdentityUsesAssertionWithoutOAuthToken","Output":"--- PASS: TestFetchCodexModelsManifestAgentIdentityUsesAssertionWithoutOAuthToken (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0510698+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAgentIdentityUsesAssertionWithoutOAuthToken","Elapsed":0} {"Time":"2026-09-12T11:42:35.0510698+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAgentIdentityRecoversInvalidTaskOnce"} {"Time":"2026-09-12T11:42:35.0510698+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAgentIdentityRecoversInvalidTaskOnce","Output":"=== RUN TestFetchCodexModelsManifestAgentIdentityRecoversInvalidTaskOnce\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0520836+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAgentIdentityRecoversInvalidTaskOnce","Output":"--- PASS: TestFetchCodexModelsManifestAgentIdentityRecoversInvalidTaskOnce (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0520836+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAgentIdentityRecoversInvalidTaskOnce","Elapsed":0} {"Time":"2026-09-12T11:42:35.0520836+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAgentIdentityRedactsUpstreamErrors"} {"Time":"2026-09-12T11:42:35.0520836+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAgentIdentityRedactsUpstreamErrors","Output":"=== RUN TestFetchCodexModelsManifestAgentIdentityRedactsUpstreamErrors\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.052591+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAgentIdentityRedactsUpstreamErrors","Output":"--- PASS: TestFetchCodexModelsManifestAgentIdentityRedactsUpstreamErrors (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.052591+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAgentIdentityRedactsUpstreamErrors","Elapsed":0} {"Time":"2026-09-12T11:42:35.052591+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestDefaultClientVersion"} {"Time":"2026-09-12T11:42:35.052591+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestDefaultClientVersion","Output":"=== RUN TestFetchCodexModelsManifestDefaultClientVersion\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0530989+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestDefaultClientVersion","Output":"--- PASS: TestFetchCodexModelsManifestDefaultClientVersion (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0530989+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestDefaultClientVersion","Elapsed":0} {"Time":"2026-09-12T11:42:35.0530989+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestNotModified"} {"Time":"2026-09-12T11:42:35.0530989+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestNotModified","Output":"=== RUN TestFetchCodexModelsManifestNotModified\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0530989+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestNotModified","Output":"--- PASS: TestFetchCodexModelsManifestNotModified (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0530989+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestNotModified","Elapsed":0} {"Time":"2026-09-12T11:42:35.0530989+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestUpstreamError"} {"Time":"2026-09-12T11:42:35.0530989+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestUpstreamError","Output":"=== RUN TestFetchCodexModelsManifestUpstreamError\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0536066+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestUpstreamError","Output":"--- PASS: TestFetchCodexModelsManifestUpstreamError (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0536066+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestUpstreamError","Elapsed":0} {"Time":"2026-09-12T11:42:35.0536066+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestMissingToken"} {"Time":"2026-09-12T11:42:35.0536066+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestMissingToken","Output":"=== RUN TestFetchCodexModelsManifestMissingToken\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0536066+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestMissingToken","Output":"--- PASS: TestFetchCodexModelsManifestMissingToken (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0536066+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestMissingToken","Elapsed":0} {"Time":"2026-09-12T11:42:35.0536066+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyCustomUpstream"} {"Time":"2026-09-12T11:42:35.0536066+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyCustomUpstream","Output":"=== RUN TestFetchCodexModelsManifestAPIKeyCustomUpstream\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0541136+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyCustomUpstream","Output":"--- PASS: TestFetchCodexModelsManifestAPIKeyCustomUpstream (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0541136+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyCustomUpstream","Elapsed":0} {"Time":"2026-09-12T11:42:35.0541136+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyCompleteBodyWithoutUpstreamETagUsesFinalBodyETag"} {"Time":"2026-09-12T11:42:35.0541136+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyCompleteBodyWithoutUpstreamETagUsesFinalBodyETag","Output":"=== RUN TestFetchCodexModelsManifestAPIKeyCompleteBodyWithoutUpstreamETagUsesFinalBodyETag\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0556484+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyCompleteBodyWithoutUpstreamETagUsesFinalBodyETag","Output":"--- PASS: TestFetchCodexModelsManifestAPIKeyCompleteBodyWithoutUpstreamETagUsesFinalBodyETag (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0556484+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyCompleteBodyWithoutUpstreamETagUsesFinalBodyETag","Elapsed":0} {"Time":"2026-09-12T11:42:35.0556484+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyConvertsStandardOpenAIModelList"} {"Time":"2026-09-12T11:42:35.0556484+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyConvertsStandardOpenAIModelList","Output":"=== RUN TestFetchCodexModelsManifestAPIKeyConvertsStandardOpenAIModelList\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0567285+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyConvertsStandardOpenAIModelList","Output":"--- PASS: TestFetchCodexModelsManifestAPIKeyConvertsStandardOpenAIModelList (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0567285+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyConvertsStandardOpenAIModelList","Elapsed":0} {"Time":"2026-09-12T11:42:35.0567285+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestConvertOpenAIModelListToCodexManifestUsesCompleteDescriptors"} {"Time":"2026-09-12T11:42:35.0567285+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestConvertOpenAIModelListToCodexManifestUsesCompleteDescriptors","Output":"=== RUN TestConvertOpenAIModelListToCodexManifestUsesCompleteDescriptors\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0567285+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestConvertOpenAIModelListToCodexManifestUsesCompleteDescriptors","Output":"--- PASS: TestConvertOpenAIModelListToCodexManifestUsesCompleteDescriptors (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0567285+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestConvertOpenAIModelListToCodexManifestUsesCompleteDescriptors","Elapsed":0} {"Time":"2026-09-12T11:42:35.0567285+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientPreservesProviderMetadata"} {"Time":"2026-09-12T11:42:35.0567285+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientPreservesProviderMetadata","Output":"=== RUN TestCompleteAPIKeyCodexModelsManifestForClientPreservesProviderMetadata\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0567285+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientPreservesProviderMetadata","Output":"=== PAUSE TestCompleteAPIKeyCodexModelsManifestForClientPreservesProviderMetadata\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0567285+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientPreservesProviderMetadata"} {"Time":"2026-09-12T11:42:35.0567285+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientUsesKnownGPTImageFallback"} {"Time":"2026-09-12T11:42:35.0567285+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientUsesKnownGPTImageFallback","Output":"=== RUN TestCompleteAPIKeyCodexModelsManifestForClientUsesKnownGPTImageFallback\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0567285+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientUsesKnownGPTImageFallback","Output":"=== PAUSE TestCompleteAPIKeyCodexModelsManifestForClientUsesKnownGPTImageFallback\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0567285+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientUsesKnownGPTImageFallback"} {"Time":"2026-09-12T11:42:35.0567285+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientUsesSyncedMetadataForConvertedModelList"} {"Time":"2026-09-12T11:42:35.0567285+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientUsesSyncedMetadataForConvertedModelList","Output":"=== RUN TestCompleteAPIKeyCodexModelsManifestForClientUsesSyncedMetadataForConvertedModelList\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0567285+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientUsesSyncedMetadataForConvertedModelList","Output":"=== PAUSE TestCompleteAPIKeyCodexModelsManifestForClientUsesSyncedMetadataForConvertedModelList\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0567285+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientUsesSyncedMetadataForConvertedModelList"} {"Time":"2026-09-12T11:42:35.0567285+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientFillsMissingProviderFieldsWithoutOverwritingExplicitMetadata"} {"Time":"2026-09-12T11:42:35.0567285+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientFillsMissingProviderFieldsWithoutOverwritingExplicitMetadata","Output":"=== RUN TestCompleteAPIKeyCodexModelsManifestForClientFillsMissingProviderFieldsWithoutOverwritingExplicitMetadata\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0567285+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientFillsMissingProviderFieldsWithoutOverwritingExplicitMetadata","Output":"=== PAUSE TestCompleteAPIKeyCodexModelsManifestForClientFillsMissingProviderFieldsWithoutOverwritingExplicitMetadata\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0567285+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientFillsMissingProviderFieldsWithoutOverwritingExplicitMetadata"} {"Time":"2026-09-12T11:42:35.0567285+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientUsesCurrentSnapshotForCachedNativeManifest"} {"Time":"2026-09-12T11:42:35.0567285+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientUsesCurrentSnapshotForCachedNativeManifest","Output":"=== RUN TestCompleteAPIKeyCodexModelsManifestForClientUsesCurrentSnapshotForCachedNativeManifest\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0567285+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientUsesCurrentSnapshotForCachedNativeManifest","Output":"=== PAUSE TestCompleteAPIKeyCodexModelsManifestForClientUsesCurrentSnapshotForCachedNativeManifest\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0567285+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientUsesCurrentSnapshotForCachedNativeManifest"} {"Time":"2026-09-12T11:42:35.0567285+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientMarksOnlyOfficialVisionGPTImageInput"} {"Time":"2026-09-12T11:42:35.0567285+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientMarksOnlyOfficialVisionGPTImageInput","Output":"=== RUN TestCompleteAPIKeyCodexModelsManifestForClientMarksOnlyOfficialVisionGPTImageInput\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0567285+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientMarksOnlyOfficialVisionGPTImageInput","Output":"=== PAUSE TestCompleteAPIKeyCodexModelsManifestForClientMarksOnlyOfficialVisionGPTImageInput\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0567285+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientMarksOnlyOfficialVisionGPTImageInput"} {"Time":"2026-09-12T11:42:35.0567285+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientFiltersOfficialNonAgentModels"} {"Time":"2026-09-12T11:42:35.0567285+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientFiltersOfficialNonAgentModels","Output":"=== RUN TestCompleteAPIKeyCodexModelsManifestForClientFiltersOfficialNonAgentModels\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0567285+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientFiltersOfficialNonAgentModels","Output":"=== PAUSE TestCompleteAPIKeyCodexModelsManifestForClientFiltersOfficialNonAgentModels\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0567285+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientFiltersOfficialNonAgentModels"} {"Time":"2026-09-12T11:42:35.0567285+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAdjustAPIKeyCodexModelsManifest"} {"Time":"2026-09-12T11:42:35.0567285+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAdjustAPIKeyCodexModelsManifest","Output":"=== RUN TestAdjustAPIKeyCodexModelsManifest\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0567285+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAdjustAPIKeyCodexModelsManifest/affected_models_disable_responses_lite_and_preserve_unknown_fields"} {"Time":"2026-09-12T11:42:35.0567285+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAdjustAPIKeyCodexModelsManifest/affected_models_disable_responses_lite_and_preserve_unknown_fields","Output":"=== RUN TestAdjustAPIKeyCodexModelsManifest/affected_models_disable_responses_lite_and_preserve_unknown_fields\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0567285+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAdjustAPIKeyCodexModelsManifest/affected_models_disable_responses_lite_and_preserve_unknown_fields","Output":"--- PASS: TestAdjustAPIKeyCodexModelsManifest/affected_models_disable_responses_lite_and_preserve_unknown_fields (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0567285+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAdjustAPIKeyCodexModelsManifest/affected_models_disable_responses_lite_and_preserve_unknown_fields","Elapsed":0} {"Time":"2026-09-12T11:42:35.0567285+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAdjustAPIKeyCodexModelsManifest/unaffected_model_unchanged"} {"Time":"2026-09-12T11:42:35.0567285+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAdjustAPIKeyCodexModelsManifest/unaffected_model_unchanged","Output":"=== RUN TestAdjustAPIKeyCodexModelsManifest/unaffected_model_unchanged\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0567285+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAdjustAPIKeyCodexModelsManifest/unaffected_model_unchanged","Output":"--- PASS: TestAdjustAPIKeyCodexModelsManifest/unaffected_model_unchanged (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0567285+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAdjustAPIKeyCodexModelsManifest/unaffected_model_unchanged","Elapsed":0} {"Time":"2026-09-12T11:42:35.0567285+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAdjustAPIKeyCodexModelsManifest/false_missing_and_alternate_entries_unchanged"} {"Time":"2026-09-12T11:42:35.0567285+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAdjustAPIKeyCodexModelsManifest/false_missing_and_alternate_entries_unchanged","Output":"=== RUN TestAdjustAPIKeyCodexModelsManifest/false_missing_and_alternate_entries_unchanged\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0567285+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAdjustAPIKeyCodexModelsManifest/false_missing_and_alternate_entries_unchanged","Output":"--- PASS: TestAdjustAPIKeyCodexModelsManifest/false_missing_and_alternate_entries_unchanged (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0567285+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAdjustAPIKeyCodexModelsManifest/false_missing_and_alternate_entries_unchanged","Elapsed":0} {"Time":"2026-09-12T11:42:35.0567285+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAdjustAPIKeyCodexModelsManifest","Output":"--- PASS: TestAdjustAPIKeyCodexModelsManifest (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0567285+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAdjustAPIKeyCodexModelsManifest","Elapsed":0} {"Time":"2026-09-12T11:42:35.0567285+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyDisablesResponsesLiteForAffectedModels"} {"Time":"2026-09-12T11:42:35.0567285+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyDisablesResponsesLiteForAffectedModels","Output":"=== RUN TestFetchCodexModelsManifestAPIKeyDisablesResponsesLiteForAffectedModels\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0572493+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyDisablesResponsesLiteForAffectedModels","Output":"--- PASS: TestFetchCodexModelsManifestAPIKeyDisablesResponsesLiteForAffectedModels (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0572493+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyDisablesResponsesLiteForAffectedModels","Elapsed":0} {"Time":"2026-09-12T11:42:35.0572493+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestOAuthPreservesResponsesLite"} {"Time":"2026-09-12T11:42:35.0572493+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestOAuthPreservesResponsesLite","Output":"=== RUN TestFetchCodexModelsManifestOAuthPreservesResponsesLite\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0572493+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestOAuthPreservesResponsesLite","Output":"--- PASS: TestFetchCodexModelsManifestOAuthPreservesResponsesLite (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0572493+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestOAuthPreservesResponsesLite","Elapsed":0} {"Time":"2026-09-12T11:42:35.0572493+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestConvertOpenAIModelListToCompleteCodexManifest"} {"Time":"2026-09-12T11:42:35.0572493+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestConvertOpenAIModelListToCompleteCodexManifest","Output":"=== RUN TestConvertOpenAIModelListToCompleteCodexManifest\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0572493+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestConvertOpenAIModelListToCompleteCodexManifest","Output":"=== PAUSE TestConvertOpenAIModelListToCompleteCodexManifest\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0572493+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestConvertOpenAIModelListToCompleteCodexManifest"} {"Time":"2026-09-12T11:42:35.0572493+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestConvertOpenAIModelListToCodexManifestLeavesUnsupportedBodiesUnchanged"} {"Time":"2026-09-12T11:42:35.0572493+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestConvertOpenAIModelListToCodexManifestLeavesUnsupportedBodiesUnchanged","Output":"=== RUN TestConvertOpenAIModelListToCodexManifestLeavesUnsupportedBodiesUnchanged\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0572493+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestConvertOpenAIModelListToCodexManifestLeavesUnsupportedBodiesUnchanged/codex_manifest_unchanged"} {"Time":"2026-09-12T11:42:35.0572493+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestConvertOpenAIModelListToCodexManifestLeavesUnsupportedBodiesUnchanged/codex_manifest_unchanged","Output":"=== RUN TestConvertOpenAIModelListToCodexManifestLeavesUnsupportedBodiesUnchanged/codex_manifest_unchanged\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0577564+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestConvertOpenAIModelListToCodexManifestLeavesUnsupportedBodiesUnchanged/codex_manifest_unchanged","Output":"--- PASS: TestConvertOpenAIModelListToCodexManifestLeavesUnsupportedBodiesUnchanged/codex_manifest_unchanged (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0577564+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestConvertOpenAIModelListToCodexManifestLeavesUnsupportedBodiesUnchanged/codex_manifest_unchanged","Elapsed":0} {"Time":"2026-09-12T11:42:35.0577564+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestConvertOpenAIModelListToCodexManifestLeavesUnsupportedBodiesUnchanged/empty_data_unchanged"} {"Time":"2026-09-12T11:42:35.0577564+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestConvertOpenAIModelListToCodexManifestLeavesUnsupportedBodiesUnchanged/empty_data_unchanged","Output":"=== RUN TestConvertOpenAIModelListToCodexManifestLeavesUnsupportedBodiesUnchanged/empty_data_unchanged\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0577564+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestConvertOpenAIModelListToCodexManifestLeavesUnsupportedBodiesUnchanged/empty_data_unchanged","Output":"--- PASS: TestConvertOpenAIModelListToCodexManifestLeavesUnsupportedBodiesUnchanged/empty_data_unchanged (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0577564+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestConvertOpenAIModelListToCodexManifestLeavesUnsupportedBodiesUnchanged/empty_data_unchanged","Elapsed":0} {"Time":"2026-09-12T11:42:35.0577564+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestConvertOpenAIModelListToCodexManifestLeavesUnsupportedBodiesUnchanged/data_not_an_array_unchanged"} {"Time":"2026-09-12T11:42:35.0577564+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestConvertOpenAIModelListToCodexManifestLeavesUnsupportedBodiesUnchanged/data_not_an_array_unchanged","Output":"=== RUN TestConvertOpenAIModelListToCodexManifestLeavesUnsupportedBodiesUnchanged/data_not_an_array_unchanged\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0577564+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestConvertOpenAIModelListToCodexManifestLeavesUnsupportedBodiesUnchanged/data_not_an_array_unchanged","Output":"--- PASS: TestConvertOpenAIModelListToCodexManifestLeavesUnsupportedBodiesUnchanged/data_not_an_array_unchanged (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0577564+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestConvertOpenAIModelListToCodexManifestLeavesUnsupportedBodiesUnchanged/data_not_an_array_unchanged","Elapsed":0} {"Time":"2026-09-12T11:42:35.0577564+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestConvertOpenAIModelListToCodexManifestLeavesUnsupportedBodiesUnchanged/entries_without_usable_IDs_unchanged"} {"Time":"2026-09-12T11:42:35.0577564+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestConvertOpenAIModelListToCodexManifestLeavesUnsupportedBodiesUnchanged/entries_without_usable_IDs_unchanged","Output":"=== RUN TestConvertOpenAIModelListToCodexManifestLeavesUnsupportedBodiesUnchanged/entries_without_usable_IDs_unchanged\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0577564+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestConvertOpenAIModelListToCodexManifestLeavesUnsupportedBodiesUnchanged/entries_without_usable_IDs_unchanged","Output":"--- PASS: TestConvertOpenAIModelListToCodexManifestLeavesUnsupportedBodiesUnchanged/entries_without_usable_IDs_unchanged (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0577564+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestConvertOpenAIModelListToCodexManifestLeavesUnsupportedBodiesUnchanged/entries_without_usable_IDs_unchanged","Elapsed":0} {"Time":"2026-09-12T11:42:35.0577564+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestConvertOpenAIModelListToCodexManifestLeavesUnsupportedBodiesUnchanged/invalid_JSON_unchanged"} {"Time":"2026-09-12T11:42:35.0577564+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestConvertOpenAIModelListToCodexManifestLeavesUnsupportedBodiesUnchanged/invalid_JSON_unchanged","Output":"=== RUN TestConvertOpenAIModelListToCodexManifestLeavesUnsupportedBodiesUnchanged/invalid_JSON_unchanged\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0577564+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestConvertOpenAIModelListToCodexManifestLeavesUnsupportedBodiesUnchanged/invalid_JSON_unchanged","Output":"--- PASS: TestConvertOpenAIModelListToCodexManifestLeavesUnsupportedBodiesUnchanged/invalid_JSON_unchanged (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0577564+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestConvertOpenAIModelListToCodexManifestLeavesUnsupportedBodiesUnchanged/invalid_JSON_unchanged","Elapsed":0} {"Time":"2026-09-12T11:42:35.0577564+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestConvertOpenAIModelListToCodexManifestLeavesUnsupportedBodiesUnchanged/non-object_unchanged"} {"Time":"2026-09-12T11:42:35.0577564+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestConvertOpenAIModelListToCodexManifestLeavesUnsupportedBodiesUnchanged/non-object_unchanged","Output":"=== RUN TestConvertOpenAIModelListToCodexManifestLeavesUnsupportedBodiesUnchanged/non-object_unchanged\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0577564+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestConvertOpenAIModelListToCodexManifestLeavesUnsupportedBodiesUnchanged/non-object_unchanged","Output":"--- PASS: TestConvertOpenAIModelListToCodexManifestLeavesUnsupportedBodiesUnchanged/non-object_unchanged (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0577564+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestConvertOpenAIModelListToCodexManifestLeavesUnsupportedBodiesUnchanged/non-object_unchanged","Elapsed":0} {"Time":"2026-09-12T11:42:35.0577564+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestConvertOpenAIModelListToCodexManifestLeavesUnsupportedBodiesUnchanged","Output":"--- PASS: TestConvertOpenAIModelListToCodexManifestLeavesUnsupportedBodiesUnchanged (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0577564+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestConvertOpenAIModelListToCodexManifestLeavesUnsupportedBodiesUnchanged","Elapsed":0} {"Time":"2026-09-12T11:42:35.0577564+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestUsesConfiguredBodyLimit"} {"Time":"2026-09-12T11:42:35.0577564+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestUsesConfiguredBodyLimit","Output":"=== RUN TestFetchCodexModelsManifestUsesConfiguredBodyLimit\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0577564+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestUsesConfiguredBodyLimit","Output":"--- PASS: TestFetchCodexModelsManifestUsesConfiguredBodyLimit (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0577564+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestUsesConfiguredBodyLimit","Elapsed":0} {"Time":"2026-09-12T11:42:35.0577564+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAcceptsConfiguredLimitAboveLegacyBoundary"} {"Time":"2026-09-12T11:42:35.0577564+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAcceptsConfiguredLimitAboveLegacyBoundary","Output":"=== RUN TestFetchCodexModelsManifestAcceptsConfiguredLimitAboveLegacyBoundary\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0926135+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAcceptsConfiguredLimitAboveLegacyBoundary","Output":"--- PASS: TestFetchCodexModelsManifestAcceptsConfiguredLimitAboveLegacyBoundary (0.03s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0926135+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAcceptsConfiguredLimitAboveLegacyBoundary","Elapsed":0.03} {"Time":"2026-09-12T11:42:35.0926135+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestRejectsInvalidEnvelope"} {"Time":"2026-09-12T11:42:35.0926135+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestRejectsInvalidEnvelope","Output":"=== RUN TestFetchCodexModelsManifestRejectsInvalidEnvelope\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0926135+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestRejectsInvalidEnvelope/OpenAI_models_list"} {"Time":"2026-09-12T11:42:35.0926135+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestRejectsInvalidEnvelope/OpenAI_models_list","Output":"=== RUN TestFetchCodexModelsManifestRejectsInvalidEnvelope/OpenAI_models_list\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0926135+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestRejectsInvalidEnvelope/OpenAI_models_list","Output":"--- PASS: TestFetchCodexModelsManifestRejectsInvalidEnvelope/OpenAI_models_list (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0926135+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestRejectsInvalidEnvelope/OpenAI_models_list","Elapsed":0} {"Time":"2026-09-12T11:42:35.0926135+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestRejectsInvalidEnvelope/invalid_JSON"} {"Time":"2026-09-12T11:42:35.0926135+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestRejectsInvalidEnvelope/invalid_JSON","Output":"=== RUN TestFetchCodexModelsManifestRejectsInvalidEnvelope/invalid_JSON\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0926135+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestRejectsInvalidEnvelope/invalid_JSON","Output":"--- PASS: TestFetchCodexModelsManifestRejectsInvalidEnvelope/invalid_JSON (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0926135+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestRejectsInvalidEnvelope/invalid_JSON","Elapsed":0} {"Time":"2026-09-12T11:42:35.0926135+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestRejectsInvalidEnvelope/non-object"} {"Time":"2026-09-12T11:42:35.0926135+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestRejectsInvalidEnvelope/non-object","Output":"=== RUN TestFetchCodexModelsManifestRejectsInvalidEnvelope/non-object\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0926135+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestRejectsInvalidEnvelope/non-object","Output":"--- PASS: TestFetchCodexModelsManifestRejectsInvalidEnvelope/non-object (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0926135+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestRejectsInvalidEnvelope/non-object","Elapsed":0} {"Time":"2026-09-12T11:42:35.0926135+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestRejectsInvalidEnvelope/null_object"} {"Time":"2026-09-12T11:42:35.0926135+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestRejectsInvalidEnvelope/null_object","Output":"=== RUN TestFetchCodexModelsManifestRejectsInvalidEnvelope/null_object\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0926135+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestRejectsInvalidEnvelope/null_object","Output":"--- PASS: TestFetchCodexModelsManifestRejectsInvalidEnvelope/null_object (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0926135+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestRejectsInvalidEnvelope/null_object","Elapsed":0} {"Time":"2026-09-12T11:42:35.0926135+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestRejectsInvalidEnvelope/missing_models"} {"Time":"2026-09-12T11:42:35.0926135+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestRejectsInvalidEnvelope/missing_models","Output":"=== RUN TestFetchCodexModelsManifestRejectsInvalidEnvelope/missing_models\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0926135+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestRejectsInvalidEnvelope/missing_models","Output":"--- PASS: TestFetchCodexModelsManifestRejectsInvalidEnvelope/missing_models (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0926135+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestRejectsInvalidEnvelope/missing_models","Elapsed":0} {"Time":"2026-09-12T11:42:35.0926135+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestRejectsInvalidEnvelope/models_object"} {"Time":"2026-09-12T11:42:35.0926135+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestRejectsInvalidEnvelope/models_object","Output":"=== RUN TestFetchCodexModelsManifestRejectsInvalidEnvelope/models_object\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0926135+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestRejectsInvalidEnvelope/models_object","Output":"--- PASS: TestFetchCodexModelsManifestRejectsInvalidEnvelope/models_object (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0926135+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestRejectsInvalidEnvelope/models_object","Elapsed":0} {"Time":"2026-09-12T11:42:35.0926135+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestRejectsInvalidEnvelope/models_null"} {"Time":"2026-09-12T11:42:35.0926135+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestRejectsInvalidEnvelope/models_null","Output":"=== RUN TestFetchCodexModelsManifestRejectsInvalidEnvelope/models_null\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0926135+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestRejectsInvalidEnvelope/models_null","Output":"--- PASS: TestFetchCodexModelsManifestRejectsInvalidEnvelope/models_null (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0926135+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestRejectsInvalidEnvelope/models_null","Elapsed":0} {"Time":"2026-09-12T11:42:35.0926135+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestRejectsInvalidEnvelope","Output":"--- PASS: TestFetchCodexModelsManifestRejectsInvalidEnvelope (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0926135+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestRejectsInvalidEnvelope","Elapsed":0} {"Time":"2026-09-12T11:42:35.0926135+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyDoesNotCacheInvalidEnvelope"} {"Time":"2026-09-12T11:42:35.0926135+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyDoesNotCacheInvalidEnvelope","Output":"=== RUN TestFetchCodexModelsManifestAPIKeyDoesNotCacheInvalidEnvelope\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0926135+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyDoesNotCacheInvalidEnvelope","Output":"--- PASS: TestFetchCodexModelsManifestAPIKeyDoesNotCacheInvalidEnvelope (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.0926135+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyDoesNotCacheInvalidEnvelope","Elapsed":0} {"Time":"2026-09-12T11:42:35.0926135+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeySharedRefreshSurvivesCallerCancellation"} {"Time":"2026-09-12T11:42:35.0926135+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeySharedRefreshSurvivesCallerCancellation","Output":"=== RUN TestFetchCodexModelsManifestAPIKeySharedRefreshSurvivesCallerCancellation\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.14315+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeySharedRefreshSurvivesCallerCancellation","Output":"--- PASS: TestFetchCodexModelsManifestAPIKeySharedRefreshSurvivesCallerCancellation (0.05s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.14315+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeySharedRefreshSurvivesCallerCancellation","Elapsed":0.05} {"Time":"2026-09-12T11:42:35.14315+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyConcurrentRequestsShareRefresh"} {"Time":"2026-09-12T11:42:35.14315+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyConcurrentRequestsShareRefresh","Output":"=== RUN TestFetchCodexModelsManifestAPIKeyConcurrentRequestsShareRefresh\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.1942323+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyConcurrentRequestsShareRefresh","Output":"--- PASS: TestFetchCodexModelsManifestAPIKeyConcurrentRequestsShareRefresh (0.05s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.1942323+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyConcurrentRequestsShareRefresh","Elapsed":0.05} {"Time":"2026-09-12T11:42:35.1942323+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyFreshCacheHandlesETagLocally"} {"Time":"2026-09-12T11:42:35.1942323+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyFreshCacheHandlesETagLocally","Output":"=== RUN TestFetchCodexModelsManifestAPIKeyFreshCacheHandlesETagLocally\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.1942323+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyFreshCacheHandlesETagLocally","Output":"--- PASS: TestFetchCodexModelsManifestAPIKeyFreshCacheHandlesETagLocally (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.1942323+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyFreshCacheHandlesETagLocally","Elapsed":0} {"Time":"2026-09-12T11:42:35.1942323+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyCacheSurvivesClientMutation"} {"Time":"2026-09-12T11:42:35.1942323+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyCacheSurvivesClientMutation","Output":"=== RUN TestFetchCodexModelsManifestAPIKeyCacheSurvivesClientMutation\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.1969646+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyCacheSurvivesClientMutation","Output":"--- PASS: TestFetchCodexModelsManifestAPIKeyCacheSurvivesClientMutation (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.1969646+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyCacheSurvivesClientMutation","Elapsed":0} {"Time":"2026-09-12T11:42:35.1969646+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyCacheKeyIsolatesRequestIdentity"} {"Time":"2026-09-12T11:42:35.1969646+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyCacheKeyIsolatesRequestIdentity","Output":"=== RUN TestFetchCodexModelsManifestAPIKeyCacheKeyIsolatesRequestIdentity\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.1975321+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyCacheKeyIsolatesRequestIdentity","Output":"--- PASS: TestFetchCodexModelsManifestAPIKeyCacheKeyIsolatesRequestIdentity (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.1975321+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyCacheKeyIsolatesRequestIdentity","Elapsed":0} {"Time":"2026-09-12T11:42:35.1975321+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyCacheBoundsEntriesAndBodySize"} {"Time":"2026-09-12T11:42:35.1975321+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyCacheBoundsEntriesAndBodySize","Output":"=== RUN TestFetchCodexModelsManifestAPIKeyCacheBoundsEntriesAndBodySize\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2192525+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyCacheBoundsEntriesAndBodySize","Output":"--- PASS: TestFetchCodexModelsManifestAPIKeyCacheBoundsEntriesAndBodySize (0.02s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2192525+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyCacheBoundsEntriesAndBodySize","Elapsed":0.02} {"Time":"2026-09-12T11:42:35.2192525+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyServesStaleWhileRefreshing"} {"Time":"2026-09-12T11:42:35.2192525+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyServesStaleWhileRefreshing","Output":"=== RUN TestFetchCodexModelsManifestAPIKeyServesStaleWhileRefreshing\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2300502+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyServesStaleWhileRefreshing","Output":"--- PASS: TestFetchCodexModelsManifestAPIKeyServesStaleWhileRefreshing (0.01s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2300502+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyServesStaleWhileRefreshing","Elapsed":0.01} {"Time":"2026-09-12T11:42:35.2300502+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyRevalidatesStaleETag"} {"Time":"2026-09-12T11:42:35.2300502+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyRevalidatesStaleETag","Output":"=== RUN TestFetchCodexModelsManifestAPIKeyRevalidatesStaleETag\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2300502+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyRevalidatesStaleETag","Output":"--- PASS: TestFetchCodexModelsManifestAPIKeyRevalidatesStaleETag (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2300502+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyRevalidatesStaleETag","Elapsed":0} {"Time":"2026-09-12T11:42:35.2300502+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyColdCacheHandlesNotModifiedLocally"} {"Time":"2026-09-12T11:42:35.2300502+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyColdCacheHandlesNotModifiedLocally","Output":"=== RUN TestFetchCodexModelsManifestAPIKeyColdCacheHandlesNotModifiedLocally\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2300502+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyColdCacheHandlesNotModifiedLocally","Output":"--- PASS: TestFetchCodexModelsManifestAPIKeyColdCacheHandlesNotModifiedLocally (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2300502+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyColdCacheHandlesNotModifiedLocally","Elapsed":0} {"Time":"2026-09-12T11:42:35.2300502+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyDoesNotCacheUnexpectedColdNotModified"} {"Time":"2026-09-12T11:42:35.2300502+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyDoesNotCacheUnexpectedColdNotModified","Output":"=== RUN TestFetchCodexModelsManifestAPIKeyDoesNotCacheUnexpectedColdNotModified\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2300502+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyDoesNotCacheUnexpectedColdNotModified","Output":"--- PASS: TestFetchCodexModelsManifestAPIKeyDoesNotCacheUnexpectedColdNotModified (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2300502+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyDoesNotCacheUnexpectedColdNotModified","Elapsed":0} {"Time":"2026-09-12T11:42:35.2300502+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyPreservesBaseURLQuery"} {"Time":"2026-09-12T11:42:35.2300502+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyPreservesBaseURLQuery","Output":"=== RUN TestFetchCodexModelsManifestAPIKeyPreservesBaseURLQuery\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2300502+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyPreservesBaseURLQuery","Output":"--- PASS: TestFetchCodexModelsManifestAPIKeyPreservesBaseURLQuery (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2300502+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyPreservesBaseURLQuery","Elapsed":0} {"Time":"2026-09-12T11:42:35.2300502+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyRejectsBaseURLFragment"} {"Time":"2026-09-12T11:42:35.2300502+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyRejectsBaseURLFragment","Output":"=== RUN TestFetchCodexModelsManifestAPIKeyRejectsBaseURLFragment\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2300502+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyRejectsBaseURLFragment","Output":"--- PASS: TestFetchCodexModelsManifestAPIKeyRejectsBaseURLFragment (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2300502+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyRejectsBaseURLFragment","Elapsed":0} {"Time":"2026-09-12T11:42:35.2300502+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestOAuth401MarksAccountUnschedulable"} {"Time":"2026-09-12T11:42:35.2300502+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestOAuth401MarksAccountUnschedulable","Output":"=== RUN TestFetchCodexModelsManifestOAuth401MarksAccountUnschedulable\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2313122+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestOAuth401MarksAccountUnschedulable","Output":"--- PASS: TestFetchCodexModelsManifestOAuth401MarksAccountUnschedulable (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2313122+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestOAuth401MarksAccountUnschedulable","Elapsed":0} {"Time":"2026-09-12T11:42:35.2313122+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestOAuth401TokenRevokedDisablesAccount"} {"Time":"2026-09-12T11:42:35.2313122+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestOAuth401TokenRevokedDisablesAccount","Output":"=== RUN TestFetchCodexModelsManifestOAuth401TokenRevokedDisablesAccount\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2318319+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestOAuth401TokenRevokedDisablesAccount","Output":"2026/09/12 03:42:35 WARN account_disabled_auth_error account_id=1 error=\"Token revoked (401): token has been revoked\"\n"} {"Time":"2026-09-12T11:42:35.2318319+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestOAuth401TokenRevokedDisablesAccount","Output":"--- PASS: TestFetchCodexModelsManifestOAuth401TokenRevokedDisablesAccount (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2318319+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestOAuth401TokenRevokedDisablesAccount","Elapsed":0} {"Time":"2026-09-12T11:42:35.2318319+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAgentIdentity401DoesNotDisableAccount"} {"Time":"2026-09-12T11:42:35.2318319+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAgentIdentity401DoesNotDisableAccount","Output":"=== RUN TestFetchCodexModelsManifestAgentIdentity401DoesNotDisableAccount\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2323393+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAgentIdentity401DoesNotDisableAccount","Output":"--- PASS: TestFetchCodexModelsManifestAgentIdentity401DoesNotDisableAccount (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2323393+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAgentIdentity401DoesNotDisableAccount","Elapsed":0} {"Time":"2026-09-12T11:42:35.2323393+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKey401KeepsNoFailoverAndNoDisable"} {"Time":"2026-09-12T11:42:35.2323393+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKey401KeepsNoFailoverAndNoDisable","Output":"=== RUN TestFetchCodexModelsManifestAPIKey401KeepsNoFailoverAndNoDisable\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2323393+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKey401KeepsNoFailoverAndNoDisable","Output":"--- PASS: TestFetchCodexModelsManifestAPIKey401KeepsNoFailoverAndNoDisable (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2323393+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKey401KeepsNoFailoverAndNoDisable","Elapsed":0} {"Time":"2026-09-12T11:42:35.2323393+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyUpstreamError"} {"Time":"2026-09-12T11:42:35.2323393+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyUpstreamError","Output":"=== RUN TestFetchCodexModelsManifestAPIKeyUpstreamError\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2323393+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyUpstreamError","Output":"--- PASS: TestFetchCodexModelsManifestAPIKeyUpstreamError (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2323393+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyUpstreamError","Elapsed":0} {"Time":"2026-09-12T11:42:35.2323393+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyUsesOfficialOpenAIModelsEndpoint"} {"Time":"2026-09-12T11:42:35.2323393+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyUsesOfficialOpenAIModelsEndpoint","Output":"=== RUN TestFetchCodexModelsManifestAPIKeyUsesOfficialOpenAIModelsEndpoint\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2323393+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyUsesOfficialOpenAIModelsEndpoint/missing_base_URL"} {"Time":"2026-09-12T11:42:35.2323393+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyUsesOfficialOpenAIModelsEndpoint/missing_base_URL","Output":"=== RUN TestFetchCodexModelsManifestAPIKeyUsesOfficialOpenAIModelsEndpoint/missing_base_URL\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2334018+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyUsesOfficialOpenAIModelsEndpoint/missing_base_URL","Output":"--- PASS: TestFetchCodexModelsManifestAPIKeyUsesOfficialOpenAIModelsEndpoint/missing_base_URL (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2334018+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyUsesOfficialOpenAIModelsEndpoint/missing_base_URL","Elapsed":0} {"Time":"2026-09-12T11:42:35.2334018+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyUsesOfficialOpenAIModelsEndpoint/official_host"} {"Time":"2026-09-12T11:42:35.2334018+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyUsesOfficialOpenAIModelsEndpoint/official_host","Output":"=== RUN TestFetchCodexModelsManifestAPIKeyUsesOfficialOpenAIModelsEndpoint/official_host\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2339133+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyUsesOfficialOpenAIModelsEndpoint/official_host","Output":"--- PASS: TestFetchCodexModelsManifestAPIKeyUsesOfficialOpenAIModelsEndpoint/official_host (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2339133+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyUsesOfficialOpenAIModelsEndpoint/official_host","Elapsed":0} {"Time":"2026-09-12T11:42:35.2339133+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyUsesOfficialOpenAIModelsEndpoint/official_versioned_URL"} {"Time":"2026-09-12T11:42:35.2339133+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyUsesOfficialOpenAIModelsEndpoint/official_versioned_URL","Output":"=== RUN TestFetchCodexModelsManifestAPIKeyUsesOfficialOpenAIModelsEndpoint/official_versioned_URL\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2344233+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyUsesOfficialOpenAIModelsEndpoint/official_versioned_URL","Output":"--- PASS: TestFetchCodexModelsManifestAPIKeyUsesOfficialOpenAIModelsEndpoint/official_versioned_URL (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2344233+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyUsesOfficialOpenAIModelsEndpoint/official_versioned_URL","Elapsed":0} {"Time":"2026-09-12T11:42:35.2344233+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyUsesOfficialOpenAIModelsEndpoint","Output":"--- PASS: TestFetchCodexModelsManifestAPIKeyUsesOfficialOpenAIModelsEndpoint (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2344233+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestAPIKeyUsesOfficialOpenAIModelsEndpoint","Elapsed":0} {"Time":"2026-09-12T11:42:35.2344233+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestOAuthFreshWindowZeroUpstreamRequests"} {"Time":"2026-09-12T11:42:35.2344233+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestOAuthFreshWindowZeroUpstreamRequests","Output":"=== RUN TestFetchCodexModelsManifestOAuthFreshWindowZeroUpstreamRequests\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2349357+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestOAuthFreshWindowZeroUpstreamRequests","Output":"--- PASS: TestFetchCodexModelsManifestOAuthFreshWindowZeroUpstreamRequests (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2349357+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestOAuthFreshWindowZeroUpstreamRequests","Elapsed":0} {"Time":"2026-09-12T11:42:35.2349357+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestOAuthStaleServesOldValueAndRefreshesInBackground"} {"Time":"2026-09-12T11:42:35.2349357+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestOAuthStaleServesOldValueAndRefreshesInBackground","Output":"=== RUN TestFetchCodexModelsManifestOAuthStaleServesOldValueAndRefreshesInBackground\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2359532+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestOAuthStaleServesOldValueAndRefreshesInBackground","Output":"--- PASS: TestFetchCodexModelsManifestOAuthStaleServesOldValueAndRefreshesInBackground (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2359532+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestOAuthStaleServesOldValueAndRefreshesInBackground","Elapsed":0} {"Time":"2026-09-12T11:42:35.2359532+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestOAuthOverdueSynchronousRefreshAndFailure"} {"Time":"2026-09-12T11:42:35.2359532+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestOAuthOverdueSynchronousRefreshAndFailure","Output":"=== RUN TestFetchCodexModelsManifestOAuthOverdueSynchronousRefreshAndFailure\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2359532+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestOAuthOverdueSynchronousRefreshAndFailure/overdue_refresh_waits_and_re-caches"} {"Time":"2026-09-12T11:42:35.2359532+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestOAuthOverdueSynchronousRefreshAndFailure/overdue_refresh_waits_and_re-caches","Output":"=== RUN TestFetchCodexModelsManifestOAuthOverdueSynchronousRefreshAndFailure/overdue_refresh_waits_and_re-caches\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2364803+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestOAuthOverdueSynchronousRefreshAndFailure/overdue_refresh_waits_and_re-caches","Output":"--- PASS: TestFetchCodexModelsManifestOAuthOverdueSynchronousRefreshAndFailure/overdue_refresh_waits_and_re-caches (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2364803+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestOAuthOverdueSynchronousRefreshAndFailure/overdue_refresh_waits_and_re-caches","Elapsed":0} {"Time":"2026-09-12T11:42:35.2364803+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestOAuthOverdueSynchronousRefreshAndFailure/overdue_upstream_failure_returns_error_not_stale_cache"} {"Time":"2026-09-12T11:42:35.2364803+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestOAuthOverdueSynchronousRefreshAndFailure/overdue_upstream_failure_returns_error_not_stale_cache","Output":"=== RUN TestFetchCodexModelsManifestOAuthOverdueSynchronousRefreshAndFailure/overdue_upstream_failure_returns_error_not_stale_cache\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2364803+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestOAuthOverdueSynchronousRefreshAndFailure/overdue_upstream_failure_returns_error_not_stale_cache","Output":"--- PASS: TestFetchCodexModelsManifestOAuthOverdueSynchronousRefreshAndFailure/overdue_upstream_failure_returns_error_not_stale_cache (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2364803+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestOAuthOverdueSynchronousRefreshAndFailure/overdue_upstream_failure_returns_error_not_stale_cache","Elapsed":0} {"Time":"2026-09-12T11:42:35.2364803+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestOAuthOverdueSynchronousRefreshAndFailure","Output":"--- PASS: TestFetchCodexModelsManifestOAuthOverdueSynchronousRefreshAndFailure (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2364803+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestOAuthOverdueSynchronousRefreshAndFailure","Elapsed":0} {"Time":"2026-09-12T11:42:35.2364803+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestOAuthTokenChangeCacheMiss"} {"Time":"2026-09-12T11:42:35.2364803+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestOAuthTokenChangeCacheMiss","Output":"=== RUN TestFetchCodexModelsManifestOAuthTokenChangeCacheMiss\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2369903+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestOAuthTokenChangeCacheMiss","Output":"--- PASS: TestFetchCodexModelsManifestOAuthTokenChangeCacheMiss (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2369903+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestOAuthTokenChangeCacheMiss","Elapsed":0} {"Time":"2026-09-12T11:42:35.2369903+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestOAuthSharedAcrossGroupsWithIndependentFiltering"} {"Time":"2026-09-12T11:42:35.2369903+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestOAuthSharedAcrossGroupsWithIndependentFiltering","Output":"=== RUN TestFetchCodexModelsManifestOAuthSharedAcrossGroupsWithIndependentFiltering\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2374991+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestOAuthSharedAcrossGroupsWithIndependentFiltering","Output":"--- PASS: TestFetchCodexModelsManifestOAuthSharedAcrossGroupsWithIndependentFiltering (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2374991+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchCodexModelsManifestOAuthSharedAcrossGroupsWithIndependentFiltering","Elapsed":0} {"Time":"2026-09-12T11:42:35.2374991+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIOAuthService_ValidateCodexPersonalAccessToken"} {"Time":"2026-09-12T11:42:35.2374991+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIOAuthService_ValidateCodexPersonalAccessToken","Output":"=== RUN TestOpenAIOAuthService_ValidateCodexPersonalAccessToken\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2380085+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIOAuthService_ValidateCodexPersonalAccessToken","Output":"--- PASS: TestOpenAIOAuthService_ValidateCodexPersonalAccessToken (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2380085+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIOAuthService_ValidateCodexPersonalAccessToken","Elapsed":0} {"Time":"2026-09-12T11:42:35.2380085+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIOAuthService_ValidateCodexPersonalAccessTokenRequiresATPrefix"} {"Time":"2026-09-12T11:42:35.2380085+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIOAuthService_ValidateCodexPersonalAccessTokenRequiresATPrefix","Output":"=== RUN TestOpenAIOAuthService_ValidateCodexPersonalAccessTokenRequiresATPrefix\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2380085+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIOAuthService_ValidateCodexPersonalAccessTokenRequiresATPrefix","Output":"--- PASS: TestOpenAIOAuthService_ValidateCodexPersonalAccessTokenRequiresATPrefix (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2380085+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIOAuthService_ValidateCodexPersonalAccessTokenRequiresATPrefix","Elapsed":0} {"Time":"2026-09-12T11:42:35.2380085+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_ReservedPythonNameIsOAuthOnly"} {"Time":"2026-09-12T11:42:35.2380085+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_ReservedPythonNameIsOAuthOnly","Output":"=== RUN TestApplyCodexOAuthTransform_ReservedPythonNameIsOAuthOnly\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2380085+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_ReservedPythonNameIsOAuthOnly","Output":"--- PASS: TestApplyCodexOAuthTransform_ReservedPythonNameIsOAuthOnly (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2380085+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_ReservedPythonNameIsOAuthOnly","Elapsed":0} {"Time":"2026-09-12T11:42:35.2380085+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestRestoreCodexToolNamesFromContext_HTTPAndWSPayloadShapes"} {"Time":"2026-09-12T11:42:35.2380085+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestRestoreCodexToolNamesFromContext_HTTPAndWSPayloadShapes","Output":"=== RUN TestRestoreCodexToolNamesFromContext_HTTPAndWSPayloadShapes\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2380085+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestRestoreCodexToolNamesFromContext_HTTPAndWSPayloadShapes","Output":"--- PASS: TestRestoreCodexToolNamesFromContext_HTTPAndWSPayloadShapes (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2380085+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestRestoreCodexToolNamesFromContext_HTTPAndWSPayloadShapes","Elapsed":0} {"Time":"2026-09-12T11:42:35.2380085+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestRestoreCodexToolNamesInJSON_OnlyTouchesResponseToolCallNodesAndPreservesNumbers"} {"Time":"2026-09-12T11:42:35.2380085+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestRestoreCodexToolNamesInJSON_OnlyTouchesResponseToolCallNodesAndPreservesNumbers","Output":"=== RUN TestRestoreCodexToolNamesInJSON_OnlyTouchesResponseToolCallNodesAndPreservesNumbers\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2380085+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestRestoreCodexToolNamesInJSON_OnlyTouchesResponseToolCallNodesAndPreservesNumbers","Output":"--- PASS: TestRestoreCodexToolNamesInJSON_OnlyTouchesResponseToolCallNodesAndPreservesNumbers (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2380085+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestRestoreCodexToolNamesInJSON_OnlyTouchesResponseToolCallNodesAndPreservesNumbers","Elapsed":0} {"Time":"2026-09-12T11:42:35.2380085+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestRestoreCodexToolNamesInJSON_ExplicitHTTPAndSSEToolCallProtocols"} {"Time":"2026-09-12T11:42:35.2380085+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestRestoreCodexToolNamesInJSON_ExplicitHTTPAndSSEToolCallProtocols","Output":"=== RUN TestRestoreCodexToolNamesInJSON_ExplicitHTTPAndSSEToolCallProtocols\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2380085+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestRestoreCodexToolNamesInJSON_ExplicitHTTPAndSSEToolCallProtocols/chat_http"} {"Time":"2026-09-12T11:42:35.2380085+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestRestoreCodexToolNamesInJSON_ExplicitHTTPAndSSEToolCallProtocols/chat_http","Output":"=== RUN TestRestoreCodexToolNamesInJSON_ExplicitHTTPAndSSEToolCallProtocols/chat_http\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2380085+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestRestoreCodexToolNamesInJSON_ExplicitHTTPAndSSEToolCallProtocols/chat_http","Output":"--- PASS: TestRestoreCodexToolNamesInJSON_ExplicitHTTPAndSSEToolCallProtocols/chat_http (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2380085+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestRestoreCodexToolNamesInJSON_ExplicitHTTPAndSSEToolCallProtocols/chat_http","Elapsed":0} {"Time":"2026-09-12T11:42:35.2380085+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestRestoreCodexToolNamesInJSON_ExplicitHTTPAndSSEToolCallProtocols/chat_sse"} {"Time":"2026-09-12T11:42:35.2380085+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestRestoreCodexToolNamesInJSON_ExplicitHTTPAndSSEToolCallProtocols/chat_sse","Output":"=== RUN TestRestoreCodexToolNamesInJSON_ExplicitHTTPAndSSEToolCallProtocols/chat_sse\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2380085+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestRestoreCodexToolNamesInJSON_ExplicitHTTPAndSSEToolCallProtocols/chat_sse","Output":"--- PASS: TestRestoreCodexToolNamesInJSON_ExplicitHTTPAndSSEToolCallProtocols/chat_sse (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2380085+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestRestoreCodexToolNamesInJSON_ExplicitHTTPAndSSEToolCallProtocols/chat_sse","Elapsed":0} {"Time":"2026-09-12T11:42:35.2380085+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestRestoreCodexToolNamesInJSON_ExplicitHTTPAndSSEToolCallProtocols/messages_tool_use"} {"Time":"2026-09-12T11:42:35.2380085+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestRestoreCodexToolNamesInJSON_ExplicitHTTPAndSSEToolCallProtocols/messages_tool_use","Output":"=== RUN TestRestoreCodexToolNamesInJSON_ExplicitHTTPAndSSEToolCallProtocols/messages_tool_use\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2380085+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestRestoreCodexToolNamesInJSON_ExplicitHTTPAndSSEToolCallProtocols/messages_tool_use","Output":"--- PASS: TestRestoreCodexToolNamesInJSON_ExplicitHTTPAndSSEToolCallProtocols/messages_tool_use (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2380085+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestRestoreCodexToolNamesInJSON_ExplicitHTTPAndSSEToolCallProtocols/messages_tool_use","Elapsed":0} {"Time":"2026-09-12T11:42:35.2380085+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestRestoreCodexToolNamesInJSON_ExplicitHTTPAndSSEToolCallProtocols","Output":"--- PASS: TestRestoreCodexToolNamesInJSON_ExplicitHTTPAndSSEToolCallProtocols (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2380085+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestRestoreCodexToolNamesInJSON_ExplicitHTTPAndSSEToolCallProtocols","Elapsed":0} {"Time":"2026-09-12T11:42:35.2380085+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexToolNameReverse_WSSessionReplacementDoesNotChangeActiveTurn"} {"Time":"2026-09-12T11:42:35.2380085+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexToolNameReverse_WSSessionReplacementDoesNotChangeActiveTurn","Output":"=== RUN TestCodexToolNameReverse_WSSessionReplacementDoesNotChangeActiveTurn\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2380085+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexToolNameReverse_WSSessionReplacementDoesNotChangeActiveTurn","Output":"--- PASS: TestCodexToolNameReverse_WSSessionReplacementDoesNotChangeActiveTurn (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2380085+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexToolNameReverse_WSSessionReplacementDoesNotChangeActiveTurn","Elapsed":0} {"Time":"2026-09-12T11:42:35.2380085+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestRestoreCodexToolNamesFromSSEContextUsesEventLineTypeWithoutAddingType"} {"Time":"2026-09-12T11:42:35.2380085+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestRestoreCodexToolNamesFromSSEContextUsesEventLineTypeWithoutAddingType","Output":"=== RUN TestRestoreCodexToolNamesFromSSEContextUsesEventLineTypeWithoutAddingType\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestRestoreCodexToolNamesFromSSEContextUsesEventLineTypeWithoutAddingType","Output":"--- PASS: TestRestoreCodexToolNamesFromSSEContextUsesEventLineTypeWithoutAddingType (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestRestoreCodexToolNamesFromSSEContextUsesEventLineTypeWithoutAddingType","Elapsed":0} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnsureCodexReasoningInclude"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnsureCodexReasoningInclude","Output":"=== RUN TestEnsureCodexReasoningInclude\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnsureCodexReasoningInclude","Output":"--- PASS: TestEnsureCodexReasoningInclude (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestEnsureCodexReasoningInclude","Elapsed":0} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexClientMetadata"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexClientMetadata","Output":"=== RUN TestApplyCodexClientMetadata\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexClientMetadata","Output":"--- PASS: TestApplyCodexClientMetadata (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexClientMetadata","Elapsed":0} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestDefaultCodexSynthInstructionsModelAware"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestDefaultCodexSynthInstructionsModelAware","Output":"=== RUN TestDefaultCodexSynthInstructionsModelAware\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestDefaultCodexSynthInstructionsModelAware","Output":"--- PASS: TestDefaultCodexSynthInstructionsModelAware (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestDefaultCodexSynthInstructionsModelAware","Elapsed":0} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_ToolContinuationPreservesInput"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_ToolContinuationPreservesInput","Output":"=== RUN TestApplyCodexOAuthTransform_ToolContinuationPreservesInput\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_ToolContinuationPreservesInput","Output":"--- PASS: TestApplyCodexOAuthTransform_ToolContinuationPreservesInput (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_ToolContinuationPreservesInput","Elapsed":0} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_MessagesBridgePromptCacheKeyIsHeaderOnly"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_MessagesBridgePromptCacheKeyIsHeaderOnly","Output":"=== RUN TestApplyCodexOAuthTransform_MessagesBridgePromptCacheKeyIsHeaderOnly\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_MessagesBridgePromptCacheKeyIsHeaderOnly","Output":"--- PASS: TestApplyCodexOAuthTransform_MessagesBridgePromptCacheKeyIsHeaderOnly (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_MessagesBridgePromptCacheKeyIsHeaderOnly","Elapsed":0} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_ToolContinuationPreservesNativeMessageAndReasoningIDs"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_ToolContinuationPreservesNativeMessageAndReasoningIDs","Output":"=== RUN TestApplyCodexOAuthTransform_ToolContinuationPreservesNativeMessageAndReasoningIDs\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_ToolContinuationPreservesNativeMessageAndReasoningIDs","Output":"--- PASS: TestApplyCodexOAuthTransform_ToolContinuationPreservesNativeMessageAndReasoningIDs (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_ToolContinuationPreservesNativeMessageAndReasoningIDs","Elapsed":0} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_ToolContinuationNormalizesToolReferenceIDsOnly"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_ToolContinuationNormalizesToolReferenceIDsOnly","Output":"=== RUN TestApplyCodexOAuthTransform_ToolContinuationNormalizesToolReferenceIDsOnly\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_ToolContinuationNormalizesToolReferenceIDsOnly","Output":"--- PASS: TestApplyCodexOAuthTransform_ToolContinuationNormalizesToolReferenceIDsOnly (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_ToolContinuationNormalizesToolReferenceIDsOnly","Elapsed":0} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_NormalizesIsolatedLegacyReferenceAcrossTurns"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_NormalizesIsolatedLegacyReferenceAcrossTurns","Output":"=== RUN TestApplyCodexOAuthTransform_NormalizesIsolatedLegacyReferenceAcrossTurns\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_NormalizesIsolatedLegacyReferenceAcrossTurns","Output":"--- PASS: TestApplyCodexOAuthTransform_NormalizesIsolatedLegacyReferenceAcrossTurns (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_NormalizesIsolatedLegacyReferenceAcrossTurns","Elapsed":0} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_BoundsLongCallIDsAndPreservesPairing"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_BoundsLongCallIDsAndPreservesPairing","Output":"=== RUN TestApplyCodexOAuthTransform_BoundsLongCallIDsAndPreservesPairing\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_BoundsLongCallIDsAndPreservesPairing/non-native_boundary_id"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_BoundsLongCallIDsAndPreservesPairing/non-native_boundary_id","Output":"=== RUN TestApplyCodexOAuthTransform_BoundsLongCallIDsAndPreservesPairing/non-native_boundary_id\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_BoundsLongCallIDsAndPreservesPairing/non-native_boundary_id","Output":"--- PASS: TestApplyCodexOAuthTransform_BoundsLongCallIDsAndPreservesPairing/non-native_boundary_id (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_BoundsLongCallIDsAndPreservesPairing/non-native_boundary_id","Elapsed":0} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_BoundsLongCallIDsAndPreservesPairing/overlong_fc_id"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_BoundsLongCallIDsAndPreservesPairing/overlong_fc_id","Output":"=== RUN TestApplyCodexOAuthTransform_BoundsLongCallIDsAndPreservesPairing/overlong_fc_id\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_BoundsLongCallIDsAndPreservesPairing/overlong_fc_id","Output":"--- PASS: TestApplyCodexOAuthTransform_BoundsLongCallIDsAndPreservesPairing/overlong_fc_id (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_BoundsLongCallIDsAndPreservesPairing/overlong_fc_id","Elapsed":0} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_BoundsLongCallIDsAndPreservesPairing/equivalent_prefixes"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_BoundsLongCallIDsAndPreservesPairing/equivalent_prefixes","Output":"=== RUN TestApplyCodexOAuthTransform_BoundsLongCallIDsAndPreservesPairing/equivalent_prefixes\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_BoundsLongCallIDsAndPreservesPairing/equivalent_prefixes","Output":"--- PASS: TestApplyCodexOAuthTransform_BoundsLongCallIDsAndPreservesPairing/equivalent_prefixes (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_BoundsLongCallIDsAndPreservesPairing/equivalent_prefixes","Elapsed":0} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_BoundsLongCallIDsAndPreservesPairing","Output":"--- PASS: TestApplyCodexOAuthTransform_BoundsLongCallIDsAndPreservesPairing (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_BoundsLongCallIDsAndPreservesPairing","Elapsed":0} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_PreservesCallIDsWithinLimitWhenRequested"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_PreservesCallIDsWithinLimitWhenRequested","Output":"=== RUN TestApplyCodexOAuthTransform_PreservesCallIDsWithinLimitWhenRequested\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_PreservesCallIDsWithinLimitWhenRequested/anthropic_toolu_id"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_PreservesCallIDsWithinLimitWhenRequested/anthropic_toolu_id","Output":"=== RUN TestApplyCodexOAuthTransform_PreservesCallIDsWithinLimitWhenRequested/anthropic_toolu_id\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_PreservesCallIDsWithinLimitWhenRequested/anthropic_toolu_id","Output":"--- PASS: TestApplyCodexOAuthTransform_PreservesCallIDsWithinLimitWhenRequested/anthropic_toolu_id (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_PreservesCallIDsWithinLimitWhenRequested/anthropic_toolu_id","Elapsed":0} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_PreservesCallIDsWithinLimitWhenRequested/boundary_64_chars"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_PreservesCallIDsWithinLimitWhenRequested/boundary_64_chars","Output":"=== RUN TestApplyCodexOAuthTransform_PreservesCallIDsWithinLimitWhenRequested/boundary_64_chars\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_PreservesCallIDsWithinLimitWhenRequested/boundary_64_chars","Output":"--- PASS: TestApplyCodexOAuthTransform_PreservesCallIDsWithinLimitWhenRequested/boundary_64_chars (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_PreservesCallIDsWithinLimitWhenRequested/boundary_64_chars","Elapsed":0} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_PreservesCallIDsWithinLimitWhenRequested","Output":"--- PASS: TestApplyCodexOAuthTransform_PreservesCallIDsWithinLimitWhenRequested (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_PreservesCallIDsWithinLimitWhenRequested","Elapsed":0} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_CompactsOverlongCallIDsWhenPreserveRequested"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_CompactsOverlongCallIDsWhenPreserveRequested","Output":"=== RUN TestApplyCodexOAuthTransform_CompactsOverlongCallIDsWhenPreserveRequested\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_CompactsOverlongCallIDsWhenPreserveRequested","Output":"--- PASS: TestApplyCodexOAuthTransform_CompactsOverlongCallIDsWhenPreserveRequested (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_CompactsOverlongCallIDsWhenPreserveRequested","Elapsed":0} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_ToolSearchOutputPreservesCallID"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_ToolSearchOutputPreservesCallID","Output":"=== RUN TestApplyCodexOAuthTransform_ToolSearchOutputPreservesCallID\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_ToolSearchOutputPreservesCallID","Output":"--- PASS: TestApplyCodexOAuthTransform_ToolSearchOutputPreservesCallID (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_ToolSearchOutputPreservesCallID","Elapsed":0} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_CustomAndMCPToolOutputsPreserveCallID"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_CustomAndMCPToolOutputsPreserveCallID","Output":"=== RUN TestApplyCodexOAuthTransform_CustomAndMCPToolOutputsPreserveCallID\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_CustomAndMCPToolOutputsPreserveCallID","Output":"--- PASS: TestApplyCodexOAuthTransform_CustomAndMCPToolOutputsPreserveCallID (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_CustomAndMCPToolOutputsPreserveCallID","Elapsed":0} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_NormalizesNativeToolCallPairsByType"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_NormalizesNativeToolCallPairsByType","Output":"=== RUN TestApplyCodexOAuthTransform_NormalizesNativeToolCallPairsByType\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_NormalizesNativeToolCallPairsByType","Output":"--- PASS: TestApplyCodexOAuthTransform_NormalizesNativeToolCallPairsByType (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_NormalizesNativeToolCallPairsByType","Elapsed":0} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_PreservesNativeCallIDsWhenRequested"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_PreservesNativeCallIDsWhenRequested","Output":"=== RUN TestApplyCodexOAuthTransform_PreservesNativeCallIDsWhenRequested\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_PreservesNativeCallIDsWhenRequested","Output":"--- PASS: TestApplyCodexOAuthTransform_PreservesNativeCallIDsWhenRequested (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_PreservesNativeCallIDsWhenRequested","Elapsed":0} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_BoundsEquivalentNativeToolCallIDsWithPairing"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_BoundsEquivalentNativeToolCallIDsWithPairing","Output":"=== RUN TestApplyCodexOAuthTransform_BoundsEquivalentNativeToolCallIDsWithPairing\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_BoundsEquivalentNativeToolCallIDsWithPairing","Output":"--- PASS: TestApplyCodexOAuthTransform_BoundsEquivalentNativeToolCallIDsWithPairing (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_BoundsEquivalentNativeToolCallIDsWithPairing","Elapsed":0} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_ImageAndWebSearchCallsDoNotGainCallID"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_ImageAndWebSearchCallsDoNotGainCallID","Output":"=== RUN TestApplyCodexOAuthTransform_ImageAndWebSearchCallsDoNotGainCallID\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_ImageAndWebSearchCallsDoNotGainCallID","Output":"--- PASS: TestApplyCodexOAuthTransform_ImageAndWebSearchCallsDoNotGainCallID (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_ImageAndWebSearchCallsDoNotGainCallID","Elapsed":0} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_ConvertsToolRoleMessageToFunctionCallOutput"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_ConvertsToolRoleMessageToFunctionCallOutput","Output":"=== RUN TestApplyCodexOAuthTransform_ConvertsToolRoleMessageToFunctionCallOutput\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_ConvertsToolRoleMessageToFunctionCallOutput","Output":"--- PASS: TestApplyCodexOAuthTransform_ConvertsToolRoleMessageToFunctionCallOutput (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_ConvertsToolRoleMessageToFunctionCallOutput","Elapsed":0} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_StringifiesNonStringMessageContentText"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_StringifiesNonStringMessageContentText","Output":"=== RUN TestApplyCodexOAuthTransform_StringifiesNonStringMessageContentText\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_StringifiesNonStringMessageContentText","Output":"--- PASS: TestApplyCodexOAuthTransform_StringifiesNonStringMessageContentText (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_StringifiesNonStringMessageContentText","Elapsed":0} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_PreservesAllowedTools"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_PreservesAllowedTools","Output":"=== RUN TestApplyCodexOAuthTransform_PreservesAllowedTools\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_PreservesAllowedTools/top_level/auto"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_PreservesAllowedTools/top_level/auto","Output":"=== RUN TestApplyCodexOAuthTransform_PreservesAllowedTools/top_level/auto\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_PreservesAllowedTools/top_level/auto","Output":"--- PASS: TestApplyCodexOAuthTransform_PreservesAllowedTools/top_level/auto (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_PreservesAllowedTools/top_level/auto","Elapsed":0} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_PreservesAllowedTools/top_level/required"} {"Time":"2026-09-12T11:42:35.2385184+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_PreservesAllowedTools/top_level/required","Output":"=== RUN TestApplyCodexOAuthTransform_PreservesAllowedTools/top_level/required\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_PreservesAllowedTools/top_level/required","Output":"--- PASS: TestApplyCodexOAuthTransform_PreservesAllowedTools/top_level/required (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_PreservesAllowedTools/top_level/required","Elapsed":0} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_PreservesAllowedTools/additional_tools/auto"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_PreservesAllowedTools/additional_tools/auto","Output":"=== RUN TestApplyCodexOAuthTransform_PreservesAllowedTools/additional_tools/auto\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_PreservesAllowedTools/additional_tools/auto","Output":"--- PASS: TestApplyCodexOAuthTransform_PreservesAllowedTools/additional_tools/auto (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_PreservesAllowedTools/additional_tools/auto","Elapsed":0} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_PreservesAllowedTools/additional_tools/required"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_PreservesAllowedTools/additional_tools/required","Output":"=== RUN TestApplyCodexOAuthTransform_PreservesAllowedTools/additional_tools/required\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_PreservesAllowedTools/additional_tools/required","Output":"--- PASS: TestApplyCodexOAuthTransform_PreservesAllowedTools/additional_tools/required (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_PreservesAllowedTools/additional_tools/required","Elapsed":0} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_PreservesAllowedTools","Output":"--- PASS: TestApplyCodexOAuthTransform_PreservesAllowedTools (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_PreservesAllowedTools","Elapsed":0} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeCodexToolChoice_InvalidAllowedToolsNeverBecomesAuto"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeCodexToolChoice_InvalidAllowedToolsNeverBecomesAuto","Output":"=== RUN TestNormalizeCodexToolChoice_InvalidAllowedToolsNeverBecomesAuto\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeCodexToolChoice_InvalidAllowedToolsNeverBecomesAuto","Output":"--- PASS: TestNormalizeCodexToolChoice_InvalidAllowedToolsNeverBecomesAuto (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeCodexToolChoice_InvalidAllowedToolsNeverBecomesAuto","Elapsed":0} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_AllowedToolsKeepsReservedNameReferences"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_AllowedToolsKeepsReservedNameReferences","Output":"=== RUN TestApplyCodexOAuthTransform_AllowedToolsKeepsReservedNameReferences\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_AllowedToolsKeepsReservedNameReferences","Output":"--- PASS: TestApplyCodexOAuthTransform_AllowedToolsKeepsReservedNameReferences (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_AllowedToolsKeepsReservedNameReferences","Elapsed":0} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_DowngradesUnknownToolChoice"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_DowngradesUnknownToolChoice","Output":"=== RUN TestApplyCodexOAuthTransform_DowngradesUnknownToolChoice\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_DowngradesUnknownToolChoice","Output":"--- PASS: TestApplyCodexOAuthTransform_DowngradesUnknownToolChoice (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_DowngradesUnknownToolChoice","Elapsed":0} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_PreservesKnownToolChoice"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_PreservesKnownToolChoice","Output":"=== RUN TestApplyCodexOAuthTransform_PreservesKnownToolChoice\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_PreservesKnownToolChoice","Output":"--- PASS: TestApplyCodexOAuthTransform_PreservesKnownToolChoice (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_PreservesKnownToolChoice","Elapsed":0} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_NormalizesLegacyFunctionToolChoice"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_NormalizesLegacyFunctionToolChoice","Output":"=== RUN TestApplyCodexOAuthTransform_NormalizesLegacyFunctionToolChoice\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_NormalizesLegacyFunctionToolChoice","Output":"--- PASS: TestApplyCodexOAuthTransform_NormalizesLegacyFunctionToolChoice (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_NormalizesLegacyFunctionToolChoice","Elapsed":0} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_DowngradesMissingFunctionToolChoice"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_DowngradesMissingFunctionToolChoice","Output":"=== RUN TestApplyCodexOAuthTransform_DowngradesMissingFunctionToolChoice\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_DowngradesMissingFunctionToolChoice","Output":"--- PASS: TestApplyCodexOAuthTransform_DowngradesMissingFunctionToolChoice (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_DowngradesMissingFunctionToolChoice","Elapsed":0} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_AddsFallbackNameForFunctionCallInput"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_AddsFallbackNameForFunctionCallInput","Output":"=== RUN TestApplyCodexOAuthTransform_AddsFallbackNameForFunctionCallInput\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_AddsFallbackNameForFunctionCallInput","Output":"--- PASS: TestApplyCodexOAuthTransform_AddsFallbackNameForFunctionCallInput (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_AddsFallbackNameForFunctionCallInput","Elapsed":0} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_PreservesFunctionCallInputName"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_PreservesFunctionCallInputName","Output":"=== RUN TestApplyCodexOAuthTransform_PreservesFunctionCallInputName\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_PreservesFunctionCallInputName","Output":"--- PASS: TestApplyCodexOAuthTransform_PreservesFunctionCallInputName (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_PreservesFunctionCallInputName","Elapsed":0} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_PreservesMCPToolCallIDAndName"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_PreservesMCPToolCallIDAndName","Output":"=== RUN TestApplyCodexOAuthTransform_PreservesMCPToolCallIDAndName\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_PreservesMCPToolCallIDAndName","Output":"--- PASS: TestApplyCodexOAuthTransform_PreservesMCPToolCallIDAndName (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_PreservesMCPToolCallIDAndName","Elapsed":0} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexInputItemRequiresNameTypesAllowCallID"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexInputItemRequiresNameTypesAllowCallID","Output":"=== RUN TestCodexInputItemRequiresNameTypesAllowCallID\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexInputItemRequiresNameTypesAllowCallID","Output":"--- PASS: TestCodexInputItemRequiresNameTypesAllowCallID (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexInputItemRequiresNameTypesAllowCallID","Elapsed":0} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_ExplicitStoreFalsePreserved"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_ExplicitStoreFalsePreserved","Output":"=== RUN TestApplyCodexOAuthTransform_ExplicitStoreFalsePreserved\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_ExplicitStoreFalsePreserved","Output":"--- PASS: TestApplyCodexOAuthTransform_ExplicitStoreFalsePreserved (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_ExplicitStoreFalsePreserved","Elapsed":0} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_ExplicitStoreTrueForcedFalse"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_ExplicitStoreTrueForcedFalse","Output":"=== RUN TestApplyCodexOAuthTransform_ExplicitStoreTrueForcedFalse\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_ExplicitStoreTrueForcedFalse","Output":"--- PASS: TestApplyCodexOAuthTransform_ExplicitStoreTrueForcedFalse (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_ExplicitStoreTrueForcedFalse","Elapsed":0} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_CompactForcesNonStreaming"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_CompactForcesNonStreaming","Output":"=== RUN TestApplyCodexOAuthTransform_CompactForcesNonStreaming\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_CompactForcesNonStreaming","Output":"--- PASS: TestApplyCodexOAuthTransform_CompactForcesNonStreaming (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_CompactForcesNonStreaming","Elapsed":0} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_NonContinuationDefaultsStoreFalseAndStripsIDs"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_NonContinuationDefaultsStoreFalseAndStripsIDs","Output":"=== RUN TestApplyCodexOAuthTransform_NonContinuationDefaultsStoreFalseAndStripsIDs\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_NonContinuationDefaultsStoreFalseAndStripsIDs","Output":"--- PASS: TestApplyCodexOAuthTransform_NonContinuationDefaultsStoreFalseAndStripsIDs (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_NonContinuationDefaultsStoreFalseAndStripsIDs","Elapsed":0} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFilterCodexInput_RemovesItemReferenceWhenNotPreserved"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFilterCodexInput_RemovesItemReferenceWhenNotPreserved","Output":"=== RUN TestFilterCodexInput_RemovesItemReferenceWhenNotPreserved\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFilterCodexInput_RemovesItemReferenceWhenNotPreserved","Output":"--- PASS: TestFilterCodexInput_RemovesItemReferenceWhenNotPreserved (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFilterCodexInput_RemovesItemReferenceWhenNotPreserved","Elapsed":0} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_NormalizeCodexTools_PreservesResponsesFunctionTools"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_NormalizeCodexTools_PreservesResponsesFunctionTools","Output":"=== RUN TestApplyCodexOAuthTransform_NormalizeCodexTools_PreservesResponsesFunctionTools\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_NormalizeCodexTools_PreservesResponsesFunctionTools","Output":"--- PASS: TestApplyCodexOAuthTransform_NormalizeCodexTools_PreservesResponsesFunctionTools (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_NormalizeCodexTools_PreservesResponsesFunctionTools","Elapsed":0} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexImageGenerationBridge_PreservesClientImageFunctionTools"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexImageGenerationBridge_PreservesClientImageFunctionTools","Output":"=== RUN TestCodexImageGenerationBridge_PreservesClientImageFunctionTools\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexImageGenerationBridge_PreservesClientImageFunctionTools/flat_image_gen_function"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexImageGenerationBridge_PreservesClientImageFunctionTools/flat_image_gen_function","Output":"=== RUN TestCodexImageGenerationBridge_PreservesClientImageFunctionTools/flat_image_gen_function\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexImageGenerationBridge_PreservesClientImageFunctionTools/flat_image_gen_function","Output":"--- PASS: TestCodexImageGenerationBridge_PreservesClientImageFunctionTools/flat_image_gen_function (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexImageGenerationBridge_PreservesClientImageFunctionTools/flat_image_gen_function","Elapsed":0} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexImageGenerationBridge_PreservesClientImageFunctionTools/nested_image_gen_function"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexImageGenerationBridge_PreservesClientImageFunctionTools/nested_image_gen_function","Output":"=== RUN TestCodexImageGenerationBridge_PreservesClientImageFunctionTools/nested_image_gen_function\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexImageGenerationBridge_PreservesClientImageFunctionTools/nested_image_gen_function","Output":"--- PASS: TestCodexImageGenerationBridge_PreservesClientImageFunctionTools/nested_image_gen_function (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexImageGenerationBridge_PreservesClientImageFunctionTools/nested_image_gen_function","Elapsed":0} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexImageGenerationBridge_PreservesClientImageFunctionTools/similar_function_name_still_receives_hosted_bridge"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexImageGenerationBridge_PreservesClientImageFunctionTools/similar_function_name_still_receives_hosted_bridge","Output":"=== RUN TestCodexImageGenerationBridge_PreservesClientImageFunctionTools/similar_function_name_still_receives_hosted_bridge\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexImageGenerationBridge_PreservesClientImageFunctionTools/similar_function_name_still_receives_hosted_bridge","Output":"--- PASS: TestCodexImageGenerationBridge_PreservesClientImageFunctionTools/similar_function_name_still_receives_hosted_bridge (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2390243+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexImageGenerationBridge_PreservesClientImageFunctionTools/similar_function_name_still_receives_hosted_bridge","Elapsed":0} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexImageGenerationBridge_PreservesClientImageFunctionTools","Output":"--- PASS: TestCodexImageGenerationBridge_PreservesClientImageFunctionTools (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexImageGenerationBridge_PreservesClientImageFunctionTools","Elapsed":0} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexImageGenerationBridgeInstructions_AppendsBridgeOnce"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexImageGenerationBridgeInstructions_AppendsBridgeOnce","Output":"=== RUN TestApplyCodexImageGenerationBridgeInstructions_AppendsBridgeOnce\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexImageGenerationBridgeInstructions_AppendsBridgeOnce","Output":"--- PASS: TestApplyCodexImageGenerationBridgeInstructions_AppendsBridgeOnce (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexImageGenerationBridgeInstructions_AppendsBridgeOnce","Elapsed":0} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexImageGenerationBridgeInstructions_SkipsSpark"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexImageGenerationBridgeInstructions_SkipsSpark","Output":"=== RUN TestApplyCodexImageGenerationBridgeInstructions_SkipsSpark\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexImageGenerationBridgeInstructions_SkipsSpark","Output":"--- PASS: TestApplyCodexImageGenerationBridgeInstructions_SkipsSpark (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexImageGenerationBridgeInstructions_SkipsSpark","Elapsed":0} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexImageGenerationBridgeInstructions_SkipsWithoutImageTool"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexImageGenerationBridgeInstructions_SkipsWithoutImageTool","Output":"=== RUN TestApplyCodexImageGenerationBridgeInstructions_SkipsWithoutImageTool\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexImageGenerationBridgeInstructions_SkipsWithoutImageTool","Output":"--- PASS: TestApplyCodexImageGenerationBridgeInstructions_SkipsWithoutImageTool (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexImageGenerationBridgeInstructions_SkipsWithoutImageTool","Elapsed":0} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestValidateCodexSparkInputRejectsInputImage"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestValidateCodexSparkInputRejectsInputImage","Output":"=== RUN TestValidateCodexSparkInputRejectsInputImage\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestValidateCodexSparkInputRejectsInputImage","Output":"--- PASS: TestValidateCodexSparkInputRejectsInputImage (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestValidateCodexSparkInputRejectsInputImage","Elapsed":0} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestValidateCodexSparkInputRejectsChatImageURL"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestValidateCodexSparkInputRejectsChatImageURL","Output":"=== RUN TestValidateCodexSparkInputRejectsChatImageURL\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestValidateCodexSparkInputRejectsChatImageURL","Output":"--- PASS: TestValidateCodexSparkInputRejectsChatImageURL (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestValidateCodexSparkInputRejectsChatImageURL","Elapsed":0} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestValidateCodexSparkInputAllowsTextOnly"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestValidateCodexSparkInputAllowsTextOnly","Output":"=== RUN TestValidateCodexSparkInputAllowsTextOnly\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestValidateCodexSparkInputAllowsTextOnly","Output":"--- PASS: TestValidateCodexSparkInputAllowsTextOnly (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestValidateCodexSparkInputAllowsTextOnly","Elapsed":0} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_AddsSparkImageUnsupportedInstructions"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_AddsSparkImageUnsupportedInstructions","Output":"=== RUN TestApplyCodexOAuthTransform_AddsSparkImageUnsupportedInstructions\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_AddsSparkImageUnsupportedInstructions","Output":"--- PASS: TestApplyCodexOAuthTransform_AddsSparkImageUnsupportedInstructions (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_AddsSparkImageUnsupportedInstructions","Elapsed":0} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_DoesNotAddSparkImageUnsupportedForNonSpark"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_DoesNotAddSparkImageUnsupportedForNonSpark","Output":"=== RUN TestApplyCodexOAuthTransform_DoesNotAddSparkImageUnsupportedForNonSpark\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_DoesNotAddSparkImageUnsupportedForNonSpark","Output":"--- PASS: TestApplyCodexOAuthTransform_DoesNotAddSparkImageUnsupportedForNonSpark (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_DoesNotAddSparkImageUnsupportedForNonSpark","Elapsed":0} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_StripsImageGenerationToolForSpark"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_StripsImageGenerationToolForSpark","Output":"=== RUN TestApplyCodexOAuthTransform_StripsImageGenerationToolForSpark\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_StripsImageGenerationToolForSpark","Output":"--- PASS: TestApplyCodexOAuthTransform_StripsImageGenerationToolForSpark (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_StripsImageGenerationToolForSpark","Elapsed":0} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_StripsImageGenerationToolForSparkAlias"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_StripsImageGenerationToolForSparkAlias","Output":"=== RUN TestApplyCodexOAuthTransform_StripsImageGenerationToolForSparkAlias\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_StripsImageGenerationToolForSparkAlias","Output":"--- PASS: TestApplyCodexOAuthTransform_StripsImageGenerationToolForSparkAlias (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_StripsImageGenerationToolForSparkAlias","Elapsed":0} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_KeepsImageGenerationToolForNonSpark"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_KeepsImageGenerationToolForNonSpark","Output":"=== RUN TestApplyCodexOAuthTransform_KeepsImageGenerationToolForNonSpark\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_KeepsImageGenerationToolForNonSpark","Output":"--- PASS: TestApplyCodexOAuthTransform_KeepsImageGenerationToolForNonSpark (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_KeepsImageGenerationToolForNonSpark","Elapsed":0} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_EmptyInput"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_EmptyInput","Output":"=== RUN TestApplyCodexOAuthTransform_EmptyInput\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_EmptyInput","Output":"--- PASS: TestApplyCodexOAuthTransform_EmptyInput (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_EmptyInput","Elapsed":0} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeCodexModel_Gpt53"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeCodexModel_Gpt53","Output":"=== RUN TestNormalizeCodexModel_Gpt53\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeCodexModel_Gpt53","Output":"--- PASS: TestNormalizeCodexModel_Gpt53 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeCodexModel_Gpt53","Elapsed":0} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeCodexModel_RemovedModelsFallbackToSupportedTargets"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeCodexModel_RemovedModelsFallbackToSupportedTargets","Output":"=== RUN TestNormalizeCodexModel_RemovedModelsFallbackToSupportedTargets\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeCodexModel_RemovedModelsFallbackToSupportedTargets","Output":"--- PASS: TestNormalizeCodexModel_RemovedModelsFallbackToSupportedTargets (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeCodexModel_RemovedModelsFallbackToSupportedTargets","Elapsed":0} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_PreservesBareSparkModel"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_PreservesBareSparkModel","Output":"=== RUN TestApplyCodexOAuthTransform_PreservesBareSparkModel\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_PreservesBareSparkModel","Output":"--- PASS: TestApplyCodexOAuthTransform_PreservesBareSparkModel (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_PreservesBareSparkModel","Elapsed":0} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_TrimmedModelWithoutPolicyRewrite"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_TrimmedModelWithoutPolicyRewrite","Output":"=== RUN TestApplyCodexOAuthTransform_TrimmedModelWithoutPolicyRewrite\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_TrimmedModelWithoutPolicyRewrite","Output":"--- PASS: TestApplyCodexOAuthTransform_TrimmedModelWithoutPolicyRewrite (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_TrimmedModelWithoutPolicyRewrite","Elapsed":0} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_CodexCLI_PreservesExistingInstructions"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_CodexCLI_PreservesExistingInstructions","Output":"=== RUN TestApplyCodexOAuthTransform_CodexCLI_PreservesExistingInstructions\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_CodexCLI_PreservesExistingInstructions","Output":"--- PASS: TestApplyCodexOAuthTransform_CodexCLI_PreservesExistingInstructions (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_CodexCLI_PreservesExistingInstructions","Elapsed":0} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_CodexCLI_SuppliesDefaultWhenEmpty"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_CodexCLI_SuppliesDefaultWhenEmpty","Output":"=== RUN TestApplyCodexOAuthTransform_CodexCLI_SuppliesDefaultWhenEmpty\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_CodexCLI_SuppliesDefaultWhenEmpty","Output":"--- PASS: TestApplyCodexOAuthTransform_CodexCLI_SuppliesDefaultWhenEmpty (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_CodexCLI_SuppliesDefaultWhenEmpty","Elapsed":0} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_GPT55SuppliesModelSpecificInstructions"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_GPT55SuppliesModelSpecificInstructions","Output":"=== RUN TestApplyCodexOAuthTransform_GPT55SuppliesModelSpecificInstructions\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_GPT55SuppliesModelSpecificInstructions","Output":"--- PASS: TestApplyCodexOAuthTransform_GPT55SuppliesModelSpecificInstructions (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_GPT55SuppliesModelSpecificInstructions","Elapsed":0} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_GPT6AstraSuppliesModelSpecificInstructions"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_GPT6AstraSuppliesModelSpecificInstructions","Output":"=== RUN TestApplyCodexOAuthTransform_GPT6AstraSuppliesModelSpecificInstructions\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_GPT6AstraSuppliesModelSpecificInstructions","Output":"--- PASS: TestApplyCodexOAuthTransform_GPT6AstraSuppliesModelSpecificInstructions (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_GPT6AstraSuppliesModelSpecificInstructions","Elapsed":0} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_NonCodexCLI_PreservesExistingInstructions"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_NonCodexCLI_PreservesExistingInstructions","Output":"=== RUN TestApplyCodexOAuthTransform_NonCodexCLI_PreservesExistingInstructions\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_NonCodexCLI_PreservesExistingInstructions","Output":"--- PASS: TestApplyCodexOAuthTransform_NonCodexCLI_PreservesExistingInstructions (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_NonCodexCLI_PreservesExistingInstructions","Elapsed":0} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_StringInputConvertedToArray"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_StringInputConvertedToArray","Output":"=== RUN TestApplyCodexOAuthTransform_StringInputConvertedToArray\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_StringInputConvertedToArray","Output":"--- PASS: TestApplyCodexOAuthTransform_StringInputConvertedToArray (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_StringInputConvertedToArray","Elapsed":0} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_EmptyStringInputBecomesEmptyArray"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_EmptyStringInputBecomesEmptyArray","Output":"=== RUN TestApplyCodexOAuthTransform_EmptyStringInputBecomesEmptyArray\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_EmptyStringInputBecomesEmptyArray","Output":"--- PASS: TestApplyCodexOAuthTransform_EmptyStringInputBecomesEmptyArray (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_EmptyStringInputBecomesEmptyArray","Elapsed":0} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_WhitespaceStringInputBecomesEmptyArray"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_WhitespaceStringInputBecomesEmptyArray","Output":"=== RUN TestApplyCodexOAuthTransform_WhitespaceStringInputBecomesEmptyArray\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_WhitespaceStringInputBecomesEmptyArray","Output":"--- PASS: TestApplyCodexOAuthTransform_WhitespaceStringInputBecomesEmptyArray (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_WhitespaceStringInputBecomesEmptyArray","Elapsed":0} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_StringInputWithToolsField"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_StringInputWithToolsField","Output":"=== RUN TestApplyCodexOAuthTransform_StringInputWithToolsField\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_StringInputWithToolsField","Output":"--- PASS: TestApplyCodexOAuthTransform_StringInputWithToolsField (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_StringInputWithToolsField","Elapsed":0} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_StripsPromptCacheRetention"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_StripsPromptCacheRetention","Output":"=== RUN TestApplyCodexOAuthTransform_StripsPromptCacheRetention\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_StripsPromptCacheRetention","Output":"--- PASS: TestApplyCodexOAuthTransform_StripsPromptCacheRetention (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_StripsPromptCacheRetention","Elapsed":0} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_StripsChatGPTInternalUnsupportedFields"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_StripsChatGPTInternalUnsupportedFields","Output":"=== RUN TestApplyCodexOAuthTransform_StripsChatGPTInternalUnsupportedFields\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_StripsChatGPTInternalUnsupportedFields","Output":"--- PASS: TestApplyCodexOAuthTransform_StripsChatGPTInternalUnsupportedFields (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_StripsChatGPTInternalUnsupportedFields","Elapsed":0} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_NormalizesPromptAndCommands"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_NormalizesPromptAndCommands","Output":"=== RUN TestApplyCodexOAuthTransform_NormalizesPromptAndCommands\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2395356+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_NormalizesPromptAndCommands","Output":"--- PASS: TestApplyCodexOAuthTransform_NormalizesPromptAndCommands (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_NormalizesPromptAndCommands","Elapsed":0} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_ExtractsSystemMessages"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_ExtractsSystemMessages","Output":"=== RUN TestApplyCodexOAuthTransform_ExtractsSystemMessages\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_ExtractsSystemMessages","Output":"--- PASS: TestApplyCodexOAuthTransform_ExtractsSystemMessages (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_ExtractsSystemMessages","Elapsed":0} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_JsonObjectKeepsJsonInstructionInInput"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_JsonObjectKeepsJsonInstructionInInput","Output":"=== RUN TestApplyCodexOAuthTransform_JsonObjectKeepsJsonInstructionInInput\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_JsonObjectKeepsJsonInstructionInInput","Output":"--- PASS: TestApplyCodexOAuthTransform_JsonObjectKeepsJsonInstructionInInput (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyCodexOAuthTransform_JsonObjectKeepsJsonInstructionInInput","Elapsed":0} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFilterCodexInput_PreservesReasoningStripsID"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFilterCodexInput_PreservesReasoningStripsID","Output":"=== RUN TestFilterCodexInput_PreservesReasoningStripsID\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFilterCodexInput_PreservesReasoningStripsID/preserveReferences=true"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFilterCodexInput_PreservesReasoningStripsID/preserveReferences=true","Output":"=== RUN TestFilterCodexInput_PreservesReasoningStripsID/preserveReferences=true\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFilterCodexInput_PreservesReasoningStripsID/preserveReferences=true","Output":"--- PASS: TestFilterCodexInput_PreservesReasoningStripsID/preserveReferences=true (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFilterCodexInput_PreservesReasoningStripsID/preserveReferences=true","Elapsed":0} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFilterCodexInput_PreservesReasoningStripsID/preserveReferences=false"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFilterCodexInput_PreservesReasoningStripsID/preserveReferences=false","Output":"=== RUN TestFilterCodexInput_PreservesReasoningStripsID/preserveReferences=false\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFilterCodexInput_PreservesReasoningStripsID/preserveReferences=false","Output":"--- PASS: TestFilterCodexInput_PreservesReasoningStripsID/preserveReferences=false (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFilterCodexInput_PreservesReasoningStripsID/preserveReferences=false","Elapsed":0} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFilterCodexInput_PreservesReasoningStripsID","Output":"--- PASS: TestFilterCodexInput_PreservesReasoningStripsID (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFilterCodexInput_PreservesReasoningStripsID","Elapsed":0} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFilterCodexInput_BareReasoningStripsIDBackfillsSummary"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFilterCodexInput_BareReasoningStripsIDBackfillsSummary","Output":"=== RUN TestFilterCodexInput_BareReasoningStripsIDBackfillsSummary\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFilterCodexInput_BareReasoningStripsIDBackfillsSummary","Output":"--- PASS: TestFilterCodexInput_BareReasoningStripsIDBackfillsSummary (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFilterCodexInput_BareReasoningStripsIDBackfillsSummary","Elapsed":0} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFilterCodexInput_ReasoningBackfillsMissingSummary"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFilterCodexInput_ReasoningBackfillsMissingSummary","Output":"=== RUN TestFilterCodexInput_ReasoningBackfillsMissingSummary\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFilterCodexInput_ReasoningBackfillsMissingSummary","Output":"--- PASS: TestFilterCodexInput_ReasoningBackfillsMissingSummary (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFilterCodexInput_ReasoningBackfillsMissingSummary","Elapsed":0} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFilterCodexInput_PreservesReasoningSummaryAndContent"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFilterCodexInput_PreservesReasoningSummaryAndContent","Output":"=== RUN TestFilterCodexInput_PreservesReasoningSummaryAndContent\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFilterCodexInput_PreservesReasoningSummaryAndContent","Output":"--- PASS: TestFilterCodexInput_PreservesReasoningSummaryAndContent (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFilterCodexInput_PreservesReasoningSummaryAndContent","Elapsed":0} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFilterCodexInput_PreservesReasoningInMixedInput"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFilterCodexInput_PreservesReasoningInMixedInput","Output":"=== RUN TestFilterCodexInput_PreservesReasoningInMixedInput\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFilterCodexInput_PreservesReasoningInMixedInput/preserveReferences=true"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFilterCodexInput_PreservesReasoningInMixedInput/preserveReferences=true","Output":"=== RUN TestFilterCodexInput_PreservesReasoningInMixedInput/preserveReferences=true\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFilterCodexInput_PreservesReasoningInMixedInput/preserveReferences=true","Output":"--- PASS: TestFilterCodexInput_PreservesReasoningInMixedInput/preserveReferences=true (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFilterCodexInput_PreservesReasoningInMixedInput/preserveReferences=true","Elapsed":0} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFilterCodexInput_PreservesReasoningInMixedInput/preserveReferences=false"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFilterCodexInput_PreservesReasoningInMixedInput/preserveReferences=false","Output":"=== RUN TestFilterCodexInput_PreservesReasoningInMixedInput/preserveReferences=false\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFilterCodexInput_PreservesReasoningInMixedInput/preserveReferences=false","Output":"--- PASS: TestFilterCodexInput_PreservesReasoningInMixedInput/preserveReferences=false (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFilterCodexInput_PreservesReasoningInMixedInput/preserveReferences=false","Elapsed":0} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFilterCodexInput_PreservesReasoningInMixedInput","Output":"--- PASS: TestFilterCodexInput_PreservesReasoningInMixedInput (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFilterCodexInput_PreservesReasoningInMixedInput","Elapsed":0} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexTurnStateSeed"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexTurnStateSeed","Output":"=== RUN TestOpenAICodexTurnStateSeed\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexTurnStateSeed","Output":"--- PASS: TestOpenAICodexTurnStateSeed (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexTurnStateSeed","Elapsed":0} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestRelayOpenAICodexTurnState_SetsHeaderAndRecordsProvenance"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestRelayOpenAICodexTurnState_SetsHeaderAndRecordsProvenance","Output":"=== RUN TestRelayOpenAICodexTurnState_SetsHeaderAndRecordsProvenance\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestRelayOpenAICodexTurnState_SetsHeaderAndRecordsProvenance","Output":"--- PASS: TestRelayOpenAICodexTurnState_SetsHeaderAndRecordsProvenance (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestRelayOpenAICodexTurnState_SetsHeaderAndRecordsProvenance","Elapsed":0} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestRelayOpenAICodexTurnState_ClearsStaleValueWhenUpstreamAbsent"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestRelayOpenAICodexTurnState_ClearsStaleValueWhenUpstreamAbsent","Output":"=== RUN TestRelayOpenAICodexTurnState_ClearsStaleValueWhenUpstreamAbsent\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestRelayOpenAICodexTurnState_ClearsStaleValueWhenUpstreamAbsent","Output":"--- PASS: TestRelayOpenAICodexTurnState_ClearsStaleValueWhenUpstreamAbsent (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestRelayOpenAICodexTurnState_ClearsStaleValueWhenUpstreamAbsent","Elapsed":0} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestStageOpenAICodexTurnState_StagedHeaders"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestStageOpenAICodexTurnState_StagedHeaders","Output":"=== RUN TestStageOpenAICodexTurnState_StagedHeaders\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestStageOpenAICodexTurnState_StagedHeaders","Output":"--- PASS: TestStageOpenAICodexTurnState_StagedHeaders (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestStageOpenAICodexTurnState_StagedHeaders","Elapsed":0} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNoteStagedOpenAICodexTurnStateCommitted_NoopWithoutState"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNoteStagedOpenAICodexTurnStateCommitted_NoopWithoutState","Output":"=== RUN TestNoteStagedOpenAICodexTurnStateCommitted_NoopWithoutState\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNoteStagedOpenAICodexTurnStateCommitted_NoopWithoutState","Output":"--- PASS: TestNoteStagedOpenAICodexTurnStateCommitted_NoopWithoutState (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNoteStagedOpenAICodexTurnStateCommitted_NoopWithoutState","Elapsed":0} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGuardOpenAICodexTurnStateEcho"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGuardOpenAICodexTurnStateEcho","Output":"=== RUN TestGuardOpenAICodexTurnStateEcho\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGuardOpenAICodexTurnStateEcho/same_account_keeps_echo"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGuardOpenAICodexTurnStateEcho/same_account_keeps_echo","Output":"=== RUN TestGuardOpenAICodexTurnStateEcho/same_account_keeps_echo\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGuardOpenAICodexTurnStateEcho/same_account_keeps_echo","Output":"--- PASS: TestGuardOpenAICodexTurnStateEcho/same_account_keeps_echo (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGuardOpenAICodexTurnStateEcho/same_account_keeps_echo","Elapsed":0} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGuardOpenAICodexTurnStateEcho/foreign_account_strips_echo"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGuardOpenAICodexTurnStateEcho/foreign_account_strips_echo","Output":"=== RUN TestGuardOpenAICodexTurnStateEcho/foreign_account_strips_echo\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGuardOpenAICodexTurnStateEcho/foreign_account_strips_echo","Output":"--- PASS: TestGuardOpenAICodexTurnStateEcho/foreign_account_strips_echo (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGuardOpenAICodexTurnStateEcho/foreign_account_strips_echo","Elapsed":0} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGuardOpenAICodexTurnStateEcho/no_provenance_passthrough"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGuardOpenAICodexTurnStateEcho/no_provenance_passthrough","Output":"=== RUN TestGuardOpenAICodexTurnStateEcho/no_provenance_passthrough\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGuardOpenAICodexTurnStateEcho/no_provenance_passthrough","Output":"--- PASS: TestGuardOpenAICodexTurnStateEcho/no_provenance_passthrough (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGuardOpenAICodexTurnStateEcho/no_provenance_passthrough","Elapsed":0} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGuardOpenAICodexTurnStateEcho/expired_provenance_passthrough_and_pruned"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGuardOpenAICodexTurnStateEcho/expired_provenance_passthrough_and_pruned","Output":"=== RUN TestGuardOpenAICodexTurnStateEcho/expired_provenance_passthrough_and_pruned\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGuardOpenAICodexTurnStateEcho/expired_provenance_passthrough_and_pruned","Output":"--- PASS: TestGuardOpenAICodexTurnStateEcho/expired_provenance_passthrough_and_pruned (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGuardOpenAICodexTurnStateEcho/expired_provenance_passthrough_and_pruned","Elapsed":0} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGuardOpenAICodexTurnStateEcho/no_session_seed_noop"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGuardOpenAICodexTurnStateEcho/no_session_seed_noop","Output":"=== RUN TestGuardOpenAICodexTurnStateEcho/no_session_seed_noop\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGuardOpenAICodexTurnStateEcho/no_session_seed_noop","Output":"--- PASS: TestGuardOpenAICodexTurnStateEcho/no_session_seed_noop (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGuardOpenAICodexTurnStateEcho/no_session_seed_noop","Elapsed":0} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGuardOpenAICodexTurnStateEcho/no_echo_noop"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGuardOpenAICodexTurnStateEcho/no_echo_noop","Output":"=== RUN TestGuardOpenAICodexTurnStateEcho/no_echo_noop\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGuardOpenAICodexTurnStateEcho/no_echo_noop","Output":"--- PASS: TestGuardOpenAICodexTurnStateEcho/no_echo_noop (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGuardOpenAICodexTurnStateEcho/no_echo_noop","Elapsed":0} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGuardOpenAICodexTurnStateEcho","Output":"--- PASS: TestGuardOpenAICodexTurnStateEcho (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGuardOpenAICodexTurnStateEcho","Elapsed":0} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSweepOpenAICodexTurnStateOrigins_PrunesExpiredEntries"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSweepOpenAICodexTurnStateOrigins_PrunesExpiredEntries","Output":"=== RUN TestSweepOpenAICodexTurnStateOrigins_PrunesExpiredEntries\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSweepOpenAICodexTurnStateOrigins_PrunesExpiredEntries","Output":"--- PASS: TestSweepOpenAICodexTurnStateOrigins_PrunesExpiredEntries (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSweepOpenAICodexTurnStateOrigins_PrunesExpiredEntries","Elapsed":0} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyOpenAICodexBetaFeatures"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyOpenAICodexBetaFeatures","Output":"=== RUN TestApplyOpenAICodexBetaFeatures\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyOpenAICodexBetaFeatures/oauth_plain_request_gets_default_codex_shape"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyOpenAICodexBetaFeatures/oauth_plain_request_gets_default_codex_shape","Output":"=== RUN TestApplyOpenAICodexBetaFeatures/oauth_plain_request_gets_default_codex_shape\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyOpenAICodexBetaFeatures/oauth_plain_request_gets_default_codex_shape","Output":"--- PASS: TestApplyOpenAICodexBetaFeatures/oauth_plain_request_gets_default_codex_shape (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyOpenAICodexBetaFeatures/oauth_plain_request_gets_default_codex_shape","Elapsed":0} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyOpenAICodexBetaFeatures/client_declared_header_preserved"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyOpenAICodexBetaFeatures/client_declared_header_preserved","Output":"=== RUN TestApplyOpenAICodexBetaFeatures/client_declared_header_preserved\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyOpenAICodexBetaFeatures/client_declared_header_preserved","Output":"--- PASS: TestApplyOpenAICodexBetaFeatures/client_declared_header_preserved (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyOpenAICodexBetaFeatures/client_declared_header_preserved","Elapsed":0} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyOpenAICodexBetaFeatures/native_v2_forces_feature_even_when_client_trimmed_it"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyOpenAICodexBetaFeatures/native_v2_forces_feature_even_when_client_trimmed_it","Output":"=== RUN TestApplyOpenAICodexBetaFeatures/native_v2_forces_feature_even_when_client_trimmed_it\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyOpenAICodexBetaFeatures/native_v2_forces_feature_even_when_client_trimmed_it","Output":"--- PASS: TestApplyOpenAICodexBetaFeatures/native_v2_forces_feature_even_when_client_trimmed_it (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyOpenAICodexBetaFeatures/native_v2_forces_feature_even_when_client_trimmed_it","Elapsed":0} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyOpenAICodexBetaFeatures/native_v2_applies_to_non_oauth_too"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyOpenAICodexBetaFeatures/native_v2_applies_to_non_oauth_too","Output":"=== RUN TestApplyOpenAICodexBetaFeatures/native_v2_applies_to_non_oauth_too\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyOpenAICodexBetaFeatures/native_v2_applies_to_non_oauth_too","Output":"--- PASS: TestApplyOpenAICodexBetaFeatures/native_v2_applies_to_non_oauth_too (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyOpenAICodexBetaFeatures/native_v2_applies_to_non_oauth_too","Elapsed":0} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyOpenAICodexBetaFeatures/non_oauth_plain_request_untouched"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyOpenAICodexBetaFeatures/non_oauth_plain_request_untouched","Output":"=== RUN TestApplyOpenAICodexBetaFeatures/non_oauth_plain_request_untouched\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyOpenAICodexBetaFeatures/non_oauth_plain_request_untouched","Output":"--- PASS: TestApplyOpenAICodexBetaFeatures/non_oauth_plain_request_untouched (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyOpenAICodexBetaFeatures/non_oauth_plain_request_untouched","Elapsed":0} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyOpenAICodexBetaFeatures/nil_account_plain_request_untouched"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyOpenAICodexBetaFeatures/nil_account_plain_request_untouched","Output":"=== RUN TestApplyOpenAICodexBetaFeatures/nil_account_plain_request_untouched\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyOpenAICodexBetaFeatures/nil_account_plain_request_untouched","Output":"--- PASS: TestApplyOpenAICodexBetaFeatures/nil_account_plain_request_untouched (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyOpenAICodexBetaFeatures/nil_account_plain_request_untouched","Elapsed":0} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyOpenAICodexBetaFeatures","Output":"--- PASS: TestApplyOpenAICodexBetaFeatures (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestApplyOpenAICodexBetaFeatures","Elapsed":0} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestLatestCodexStableReleaseVersion"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestLatestCodexStableReleaseVersion","Output":"=== RUN TestLatestCodexStableReleaseVersion\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestLatestCodexStableReleaseVersion","Output":"--- PASS: TestLatestCodexStableReleaseVersion (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestLatestCodexStableReleaseVersion","Elapsed":0} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncWritesLatestStableVersion"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncWritesLatestStableVersion","Output":"=== RUN TestOpenAICodexVersionSyncWritesLatestStableVersion\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncWritesLatestStableVersion","Output":"2026/09/12 03:42:35 INFO openai_codex_version_synced previous=\"\" version=0.146.0\n"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncWritesLatestStableVersion","Output":"--- PASS: TestOpenAICodexVersionSyncWritesLatestStableVersion (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncWritesLatestStableVersion","Elapsed":0} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncNeverMovesBackwards"} {"Time":"2026-09-12T11:42:35.2400472+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncNeverMovesBackwards","Output":"=== RUN TestOpenAICodexVersionSyncNeverMovesBackwards\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncNeverMovesBackwards","Output":"--- PASS: TestOpenAICodexVersionSyncNeverMovesBackwards (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncNeverMovesBackwards","Elapsed":0} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncSkippedWhenDisabled"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncSkippedWhenDisabled","Output":"=== RUN TestOpenAICodexVersionSyncSkippedWhenDisabled\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncSkippedWhenDisabled","Output":"--- PASS: TestOpenAICodexVersionSyncSkippedWhenDisabled (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncSkippedWhenDisabled","Elapsed":0} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncEnabledByDefault"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncEnabledByDefault","Output":"=== RUN TestOpenAICodexVersionSyncEnabledByDefault\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncEnabledByDefault","Output":"2026/09/12 03:42:35 INFO openai_codex_version_synced previous=\"\" version=0.146.0\n"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncEnabledByDefault","Output":"2026/09/12 03:42:35 INFO openai_codex_version_synced previous=\"\" version=0.146.0\n"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncEnabledByDefault","Output":"--- PASS: TestOpenAICodexVersionSyncEnabledByDefault (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncEnabledByDefault","Elapsed":0} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncKeepsValueOnFetchError"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncKeepsValueOnFetchError","Output":"=== RUN TestOpenAICodexVersionSyncKeepsValueOnFetchError\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncKeepsValueOnFetchError","Output":"2026/09/12 03:42:35 WARN openai_codex_version_sync_latest_fetch_failed error=\"network down\"\n"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncKeepsValueOnFetchError","Output":"2026/09/12 03:42:35 WARN openai_codex_version_sync_fetch_failed error=\"network down\"\n"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncKeepsValueOnFetchError","Output":"--- PASS: TestOpenAICodexVersionSyncKeepsValueOnFetchError (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncKeepsValueOnFetchError","Elapsed":0} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncUsesLatestReleaseEndpoint"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncUsesLatestReleaseEndpoint","Output":"=== RUN TestOpenAICodexVersionSyncUsesLatestReleaseEndpoint\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncUsesLatestReleaseEndpoint","Output":"2026/09/12 03:42:35 INFO openai_codex_version_synced previous=\"\" version=0.146.0\n"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncUsesLatestReleaseEndpoint","Output":"--- PASS: TestOpenAICodexVersionSyncUsesLatestReleaseEndpoint (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncUsesLatestReleaseEndpoint","Elapsed":0} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncFallsBackToReleaseList"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncFallsBackToReleaseList","Output":"=== RUN TestOpenAICodexVersionSyncFallsBackToReleaseList\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncFallsBackToReleaseList/latest_属于其他_tag_家族"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncFallsBackToReleaseList/latest_属于其他_tag_家族","Output":"=== RUN TestOpenAICodexVersionSyncFallsBackToReleaseList/latest_属于其他_tag_家族\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncFallsBackToReleaseList/latest_属于其他_tag_家族","Output":"2026/09/12 03:42:35 INFO openai_codex_version_synced previous=\"\" version=0.146.0\n"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncFallsBackToReleaseList/latest_属于其他_tag_家族","Output":"--- PASS: TestOpenAICodexVersionSyncFallsBackToReleaseList/latest_属于其他_tag_家族 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncFallsBackToReleaseList/latest_属于其他_tag_家族","Elapsed":0} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncFallsBackToReleaseList/latest_是预发布"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncFallsBackToReleaseList/latest_是预发布","Output":"=== RUN TestOpenAICodexVersionSyncFallsBackToReleaseList/latest_是预发布\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncFallsBackToReleaseList/latest_是预发布","Output":"2026/09/12 03:42:35 INFO openai_codex_version_synced previous=\"\" version=0.146.0\n"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncFallsBackToReleaseList/latest_是预发布","Output":"--- PASS: TestOpenAICodexVersionSyncFallsBackToReleaseList/latest_是预发布 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncFallsBackToReleaseList/latest_是预发布","Elapsed":0} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncFallsBackToReleaseList/latest_抓取失败"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncFallsBackToReleaseList/latest_抓取失败","Output":"=== RUN TestOpenAICodexVersionSyncFallsBackToReleaseList/latest_抓取失败\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncFallsBackToReleaseList/latest_抓取失败","Output":"2026/09/12 03:42:35 WARN openai_codex_version_sync_latest_fetch_failed error=\"network down\"\n"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncFallsBackToReleaseList/latest_抓取失败","Output":"2026/09/12 03:42:35 INFO openai_codex_version_synced previous=\"\" version=0.146.0\n"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncFallsBackToReleaseList/latest_抓取失败","Output":"--- PASS: TestOpenAICodexVersionSyncFallsBackToReleaseList/latest_抓取失败 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncFallsBackToReleaseList/latest_抓取失败","Elapsed":0} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncFallsBackToReleaseList/latest_为空"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncFallsBackToReleaseList/latest_为空","Output":"=== RUN TestOpenAICodexVersionSyncFallsBackToReleaseList/latest_为空\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncFallsBackToReleaseList/latest_为空","Output":"2026/09/12 03:42:35 INFO openai_codex_version_synced previous=\"\" version=0.146.0\n"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncFallsBackToReleaseList/latest_为空","Output":"--- PASS: TestOpenAICodexVersionSyncFallsBackToReleaseList/latest_为空 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncFallsBackToReleaseList/latest_为空","Elapsed":0} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncFallsBackToReleaseList","Output":"--- PASS: TestOpenAICodexVersionSyncFallsBackToReleaseList (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncFallsBackToReleaseList","Elapsed":0} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncLatestSharesFiltering"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncLatestSharesFiltering","Output":"=== RUN TestOpenAICodexVersionSyncLatestSharesFiltering\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncLatestSharesFiltering","Output":"2026/09/12 03:42:35 INFO openai_codex_version_synced previous=\"\" version=0.146.0\n"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncLatestSharesFiltering","Output":"--- PASS: TestOpenAICodexVersionSyncLatestSharesFiltering (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncLatestSharesFiltering","Elapsed":0} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncStartRequiresDependencies"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncStartRequiresDependencies","Output":"=== RUN TestOpenAICodexVersionSyncStartRequiresDependencies\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncStartRequiresDependencies","Output":"--- PASS: TestOpenAICodexVersionSyncStartRequiresDependencies (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncStartRequiresDependencies","Elapsed":0} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexClientVersionPriority"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexClientVersionPriority","Output":"=== RUN TestGetOpenAICodexClientVersionPriority\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexClientVersionPriority/面板覆写优先"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexClientVersionPriority/面板覆写优先","Output":"=== RUN TestGetOpenAICodexClientVersionPriority/面板覆写优先\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexClientVersionPriority/面板覆写优先","Output":"--- PASS: TestGetOpenAICodexClientVersionPriority/面板覆写优先 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexClientVersionPriority/面板覆写优先","Elapsed":0} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexClientVersionPriority/覆写为空时用同步值"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexClientVersionPriority/覆写为空时用同步值","Output":"=== RUN TestGetOpenAICodexClientVersionPriority/覆写为空时用同步值\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexClientVersionPriority/覆写为空时用同步值","Output":"--- PASS: TestGetOpenAICodexClientVersionPriority/覆写为空时用同步值 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexClientVersionPriority/覆写为空时用同步值","Elapsed":0} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexClientVersionPriority/两者皆空时用内置常量"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexClientVersionPriority/两者皆空时用内置常量","Output":"=== RUN TestGetOpenAICodexClientVersionPriority/两者皆空时用内置常量\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexClientVersionPriority/两者皆空时用内置常量","Output":"--- PASS: TestGetOpenAICodexClientVersionPriority/两者皆空时用内置常量 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexClientVersionPriority/两者皆空时用内置常量","Elapsed":0} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexClientVersionPriority/非法覆写回退同步值"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexClientVersionPriority/非法覆写回退同步值","Output":"=== RUN TestGetOpenAICodexClientVersionPriority/非法覆写回退同步值\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexClientVersionPriority/非法覆写回退同步值","Output":"--- PASS: TestGetOpenAICodexClientVersionPriority/非法覆写回退同步值 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexClientVersionPriority/非法覆写回退同步值","Elapsed":0} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexClientVersionPriority/非法同步值回退内置常量"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexClientVersionPriority/非法同步值回退内置常量","Output":"=== RUN TestGetOpenAICodexClientVersionPriority/非法同步值回退内置常量\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexClientVersionPriority/非法同步值回退内置常量","Output":"--- PASS: TestGetOpenAICodexClientVersionPriority/非法同步值回退内置常量 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexClientVersionPriority/非法同步值回退内置常量","Elapsed":0} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexClientVersionPriority","Output":"--- PASS: TestGetOpenAICodexClientVersionPriority (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexClientVersionPriority","Elapsed":0} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexClientVersionFallsBackOnError"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexClientVersionFallsBackOnError","Output":"=== RUN TestGetOpenAICodexClientVersionFallsBackOnError\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexClientVersionFallsBackOnError","Output":"2026/09/12 03:42:35 WARN failed to get openai codex client version setting error=\"db down\"\n"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexClientVersionFallsBackOnError","Output":"--- PASS: TestGetOpenAICodexClientVersionFallsBackOnError (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexClientVersionFallsBackOnError","Elapsed":0} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexCanonicalUserAgentBuildsFromVersion"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexCanonicalUserAgentBuildsFromVersion","Output":"=== RUN TestGetOpenAICodexCanonicalUserAgentBuildsFromVersion\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexCanonicalUserAgentBuildsFromVersion","Output":"--- PASS: TestGetOpenAICodexCanonicalUserAgentBuildsFromVersion (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexCanonicalUserAgentBuildsFromVersion","Elapsed":0} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexCanonicalUserAgentRebuildsPanelUAVersion"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexCanonicalUserAgentRebuildsPanelUAVersion","Output":"=== RUN TestGetOpenAICodexCanonicalUserAgentRebuildsPanelUAVersion\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexCanonicalUserAgentRebuildsPanelUAVersion/陈旧面板_UA_跟随生效版本"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexCanonicalUserAgentRebuildsPanelUAVersion/陈旧面板_UA_跟随生效版本","Output":"=== RUN TestGetOpenAICodexCanonicalUserAgentRebuildsPanelUAVersion/陈旧面板_UA_跟随生效版本\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexCanonicalUserAgentRebuildsPanelUAVersion/陈旧面板_UA_跟随生效版本","Output":"--- PASS: TestGetOpenAICodexCanonicalUserAgentRebuildsPanelUAVersion/陈旧面板_UA_跟随生效版本 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexCanonicalUserAgentRebuildsPanelUAVersion/陈旧面板_UA_跟随生效版本","Elapsed":0} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexCanonicalUserAgentRebuildsPanelUAVersion/自定义指纹原样保留"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexCanonicalUserAgentRebuildsPanelUAVersion/自定义指纹原样保留","Output":"=== RUN TestGetOpenAICodexCanonicalUserAgentRebuildsPanelUAVersion/自定义指纹原样保留\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexCanonicalUserAgentRebuildsPanelUAVersion/自定义指纹原样保留","Output":"--- PASS: TestGetOpenAICodexCanonicalUserAgentRebuildsPanelUAVersion/自定义指纹原样保留 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexCanonicalUserAgentRebuildsPanelUAVersion/自定义指纹原样保留","Elapsed":0} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexCanonicalUserAgentRebuildsPanelUAVersion/TUI_UA_的首尾两个版本号同时更新"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexCanonicalUserAgentRebuildsPanelUAVersion/TUI_UA_的首尾两个版本号同时更新","Output":"=== RUN TestGetOpenAICodexCanonicalUserAgentRebuildsPanelUAVersion/TUI_UA_的首尾两个版本号同时更新\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexCanonicalUserAgentRebuildsPanelUAVersion/TUI_UA_的首尾两个版本号同时更新","Output":"--- PASS: TestGetOpenAICodexCanonicalUserAgentRebuildsPanelUAVersion/TUI_UA_的首尾两个版本号同时更新 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexCanonicalUserAgentRebuildsPanelUAVersion/TUI_UA_的首尾两个版本号同时更新","Elapsed":0} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexCanonicalUserAgentRebuildsPanelUAVersion/面板版本号覆写优先"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexCanonicalUserAgentRebuildsPanelUAVersion/面板版本号覆写优先","Output":"=== RUN TestGetOpenAICodexCanonicalUserAgentRebuildsPanelUAVersion/面板版本号覆写优先\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexCanonicalUserAgentRebuildsPanelUAVersion/面板版本号覆写优先","Output":"--- PASS: TestGetOpenAICodexCanonicalUserAgentRebuildsPanelUAVersion/面板版本号覆写优先 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexCanonicalUserAgentRebuildsPanelUAVersion/面板版本号覆写优先","Elapsed":0} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexCanonicalUserAgentRebuildsPanelUAVersion/非_Codex_形态原样返回"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexCanonicalUserAgentRebuildsPanelUAVersion/非_Codex_形态原样返回","Output":"=== RUN TestGetOpenAICodexCanonicalUserAgentRebuildsPanelUAVersion/非_Codex_形态原样返回\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexCanonicalUserAgentRebuildsPanelUAVersion/非_Codex_形态原样返回","Output":"--- PASS: TestGetOpenAICodexCanonicalUserAgentRebuildsPanelUAVersion/非_Codex_形态原样返回 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexCanonicalUserAgentRebuildsPanelUAVersion/非_Codex_形态原样返回","Elapsed":0} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexCanonicalUserAgentRebuildsPanelUAVersion","Output":"--- PASS: TestGetOpenAICodexCanonicalUserAgentRebuildsPanelUAVersion (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetOpenAICodexCanonicalUserAgentRebuildsPanelUAVersion","Elapsed":0} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncInitialSkipsWhenRecentlySynced"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncInitialSkipsWhenRecentlySynced","Output":"=== RUN TestOpenAICodexVersionSyncInitialSkipsWhenRecentlySynced\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncInitialSkipsWhenRecentlySynced","Output":"--- PASS: TestOpenAICodexVersionSyncInitialSkipsWhenRecentlySynced (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncInitialSkipsWhenRecentlySynced","Elapsed":0} {"Time":"2026-09-12T11:42:35.2405599+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncInitialRunsWhenStaleOrMissing"} {"Time":"2026-09-12T11:42:35.2410675+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncInitialRunsWhenStaleOrMissing","Output":"=== RUN TestOpenAICodexVersionSyncInitialRunsWhenStaleOrMissing\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2410675+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncInitialRunsWhenStaleOrMissing/同步值已过期"} {"Time":"2026-09-12T11:42:35.2410675+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncInitialRunsWhenStaleOrMissing/同步值已过期","Output":"=== RUN TestOpenAICodexVersionSyncInitialRunsWhenStaleOrMissing/同步值已过期\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2410675+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncInitialRunsWhenStaleOrMissing/同步值已过期","Output":"2026/09/12 03:42:35 INFO openai_codex_version_synced previous=0.146.0 version=0.147.0\n"} {"Time":"2026-09-12T11:42:35.2410675+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncInitialRunsWhenStaleOrMissing/同步值已过期","Output":"--- PASS: TestOpenAICodexVersionSyncInitialRunsWhenStaleOrMissing/同步值已过期 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2410675+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncInitialRunsWhenStaleOrMissing/同步值已过期","Elapsed":0} {"Time":"2026-09-12T11:42:35.2410675+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncInitialRunsWhenStaleOrMissing/尚无同步值"} {"Time":"2026-09-12T11:42:35.2410675+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncInitialRunsWhenStaleOrMissing/尚无同步值","Output":"=== RUN TestOpenAICodexVersionSyncInitialRunsWhenStaleOrMissing/尚无同步值\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2410675+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncInitialRunsWhenStaleOrMissing/尚无同步值","Output":"2026/09/12 03:42:35 INFO openai_codex_version_synced previous=\"\" version=0.146.0\n"} {"Time":"2026-09-12T11:42:35.2410675+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncInitialRunsWhenStaleOrMissing/尚无同步值","Output":"--- PASS: TestOpenAICodexVersionSyncInitialRunsWhenStaleOrMissing/尚无同步值 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2410675+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncInitialRunsWhenStaleOrMissing/尚无同步值","Elapsed":0} {"Time":"2026-09-12T11:42:35.2410675+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncInitialRunsWhenStaleOrMissing","Output":"--- PASS: TestOpenAICodexVersionSyncInitialRunsWhenStaleOrMissing (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2410675+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAICodexVersionSyncInitialRunsWhenStaleOrMissing","Elapsed":0} {"Time":"2026-09-12T11:42:35.2410675+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexVersionComparisonIsNumericNotLexical"} {"Time":"2026-09-12T11:42:35.2410675+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexVersionComparisonIsNumericNotLexical","Output":"=== RUN TestCodexVersionComparisonIsNumericNotLexical\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2410675+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexVersionComparisonIsNumericNotLexical","Output":"--- PASS: TestCodexVersionComparisonIsNumericNotLexical (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2410675+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexVersionComparisonIsNumericNotLexical","Elapsed":0} {"Time":"2026-09-12T11:42:35.2410675+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestForwardAsAnthropic_DoesNotAutoDerivePromptCacheKeyForNonCodexModel"} {"Time":"2026-09-12T11:42:35.2410675+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestForwardAsAnthropic_DoesNotAutoDerivePromptCacheKeyForNonCodexModel","Output":"=== RUN TestForwardAsAnthropic_DoesNotAutoDerivePromptCacheKeyForNonCodexModel\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2410675+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestForwardAsAnthropic_DoesNotAutoDerivePromptCacheKeyForNonCodexModel","Output":"=== PAUSE TestForwardAsAnthropic_DoesNotAutoDerivePromptCacheKeyForNonCodexModel\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2410675+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestForwardAsAnthropic_DoesNotAutoDerivePromptCacheKeyForNonCodexModel"} {"Time":"2026-09-12T11:42:35.2410675+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestForwardAsAnthropic_TrimsFullReplayOnlyForCodexCompatModels"} {"Time":"2026-09-12T11:42:35.2410675+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestForwardAsAnthropic_TrimsFullReplayOnlyForCodexCompatModels","Output":"=== RUN TestForwardAsAnthropic_TrimsFullReplayOnlyForCodexCompatModels\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2410675+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestForwardAsAnthropic_TrimsFullReplayOnlyForCodexCompatModels","Output":"=== PAUSE TestForwardAsAnthropic_TrimsFullReplayOnlyForCodexCompatModels\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2410675+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestForwardAsAnthropic_TrimsFullReplayOnlyForCodexCompatModels"} {"Time":"2026-09-12T11:42:35.2410675+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestForwardAsAnthropic_ReusesOAuthCodexTurnState"} {"Time":"2026-09-12T11:42:35.2410675+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestForwardAsAnthropic_ReusesOAuthCodexTurnState","Output":"=== RUN TestForwardAsAnthropic_ReusesOAuthCodexTurnState\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2410675+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestForwardAsAnthropic_ReusesOAuthCodexTurnState","Output":"=== PAUSE TestForwardAsAnthropic_ReusesOAuthCodexTurnState\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2410675+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestForwardAsAnthropic_ReusesOAuthCodexTurnState"} {"Time":"2026-09-12T11:42:35.2410675+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestForwardAsAnthropic_OAuthRestoresCodexIdentityHeaders"} {"Time":"2026-09-12T11:42:35.2410675+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestForwardAsAnthropic_OAuthRestoresCodexIdentityHeaders","Output":"=== RUN TestForwardAsAnthropic_OAuthRestoresCodexIdentityHeaders\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2410675+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestForwardAsAnthropic_OAuthRestoresCodexIdentityHeaders/官方vscode身份"} {"Time":"2026-09-12T11:42:35.2410675+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestForwardAsAnthropic_OAuthRestoresCodexIdentityHeaders/官方vscode身份","Output":"=== RUN TestForwardAsAnthropic_OAuthRestoresCodexIdentityHeaders/官方vscode身份\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2415754+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestForwardAsAnthropic_OAuthRestoresCodexIdentityHeaders/官方vscode身份","Output":"--- PASS: TestForwardAsAnthropic_OAuthRestoresCodexIdentityHeaders/官方vscode身份 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2415754+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestForwardAsAnthropic_OAuthRestoresCodexIdentityHeaders/官方vscode身份","Elapsed":0} {"Time":"2026-09-12T11:42:35.2415754+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestForwardAsAnthropic_OAuthRestoresCodexIdentityHeaders/TUI身份"} {"Time":"2026-09-12T11:42:35.2415754+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestForwardAsAnthropic_OAuthRestoresCodexIdentityHeaders/TUI身份","Output":"=== RUN TestForwardAsAnthropic_OAuthRestoresCodexIdentityHeaders/TUI身份\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2415754+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestForwardAsAnthropic_OAuthRestoresCodexIdentityHeaders/TUI身份","Output":"--- PASS: TestForwardAsAnthropic_OAuthRestoresCodexIdentityHeaders/TUI身份 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2415754+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestForwardAsAnthropic_OAuthRestoresCodexIdentityHeaders/TUI身份","Elapsed":0} {"Time":"2026-09-12T11:42:35.2415754+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestForwardAsAnthropic_OAuthRestoresCodexIdentityHeaders/第三方UA"} {"Time":"2026-09-12T11:42:35.2415754+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestForwardAsAnthropic_OAuthRestoresCodexIdentityHeaders/第三方UA","Output":"=== RUN TestForwardAsAnthropic_OAuthRestoresCodexIdentityHeaders/第三方UA\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2420844+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestForwardAsAnthropic_OAuthRestoresCodexIdentityHeaders/第三方UA","Output":"--- PASS: TestForwardAsAnthropic_OAuthRestoresCodexIdentityHeaders/第三方UA (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2420844+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestForwardAsAnthropic_OAuthRestoresCodexIdentityHeaders/第三方UA","Elapsed":0} {"Time":"2026-09-12T11:42:35.2420844+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestForwardAsAnthropic_OAuthRestoresCodexIdentityHeaders","Output":"--- PASS: TestForwardAsAnthropic_OAuthRestoresCodexIdentityHeaders (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2420844+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestForwardAsAnthropic_OAuthRestoresCodexIdentityHeaders","Elapsed":0} {"Time":"2026-09-12T11:42:35.2420844+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestForwardAsAnthropic_ForcedCodexInstructionsTemplatePrependsRenderedInstructions"} {"Time":"2026-09-12T11:42:35.2420844+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestForwardAsAnthropic_ForcedCodexInstructionsTemplatePrependsRenderedInstructions","Output":"=== RUN TestForwardAsAnthropic_ForcedCodexInstructionsTemplatePrependsRenderedInstructions\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2420844+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestForwardAsAnthropic_ForcedCodexInstructionsTemplatePrependsRenderedInstructions","Output":"=== PAUSE TestForwardAsAnthropic_ForcedCodexInstructionsTemplatePrependsRenderedInstructions\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2420844+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestForwardAsAnthropic_ForcedCodexInstructionsTemplatePrependsRenderedInstructions"} {"Time":"2026-09-12T11:42:35.2420844+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestForwardAsAnthropic_ForcedCodexInstructionsTemplateUsesCachedTemplateContent"} {"Time":"2026-09-12T11:42:35.2420844+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestForwardAsAnthropic_ForcedCodexInstructionsTemplateUsesCachedTemplateContent","Output":"=== RUN TestForwardAsAnthropic_ForcedCodexInstructionsTemplateUsesCachedTemplateContent\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2420844+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestForwardAsAnthropic_ForcedCodexInstructionsTemplateUsesCachedTemplateContent","Output":"=== PAUSE TestForwardAsAnthropic_ForcedCodexInstructionsTemplateUsesCachedTemplateContent\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2420844+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestForwardAsAnthropic_ForcedCodexInstructionsTemplateUsesCachedTemplateContent"} {"Time":"2026-09-12T11:42:35.2425949+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceRecordUsage_CodexDefaultEchoKeepsFastBilling"} {"Time":"2026-09-12T11:42:35.2425949+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceRecordUsage_CodexDefaultEchoKeepsFastBilling","Output":"=== RUN TestOpenAIGatewayServiceRecordUsage_CodexDefaultEchoKeepsFastBilling\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2425949+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceRecordUsage_CodexDefaultEchoKeepsFastBilling/oauth"} {"Time":"2026-09-12T11:42:35.2425949+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceRecordUsage_CodexDefaultEchoKeepsFastBilling/oauth","Output":"=== RUN TestOpenAIGatewayServiceRecordUsage_CodexDefaultEchoKeepsFastBilling/oauth\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2425949+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceRecordUsage_CodexDefaultEchoKeepsFastBilling/oauth","Output":"2026/09/12 03:42:35 [OpenAI WS Mode][openai_ws_mode=true] bootstrap enabled=false oauth_enabled=false apikey_enabled=false force_http=false responses_websockets_v2=false responses_websockets=false payload_log_sample_rate=0.000 event_flush_batch_size=0 event_flush_interval_ms=0 prewarm_cooldown_ms=0 retry_backoff_initial_ms=0 retry_backoff_max_ms=0 retry_jitter_ratio=0.000 retry_total_budget_ms=0 ws_read_limit_bytes=16777216\n"} {"Time":"2026-09-12T11:42:35.2425949+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceRecordUsage_CodexDefaultEchoKeepsFastBilling/oauth","Output":"2026/09/12 03:42:35 [Billing] Using fallback pricing for model: gpt-5.6-sol\n"} {"Time":"2026-09-12T11:42:35.2425949+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceRecordUsage_CodexDefaultEchoKeepsFastBilling/oauth","Output":"--- PASS: TestOpenAIGatewayServiceRecordUsage_CodexDefaultEchoKeepsFastBilling/oauth (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2425949+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceRecordUsage_CodexDefaultEchoKeepsFastBilling/oauth","Elapsed":0} {"Time":"2026-09-12T11:42:35.2425949+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceRecordUsage_CodexDefaultEchoKeepsFastBilling/setup-token"} {"Time":"2026-09-12T11:42:35.2425949+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceRecordUsage_CodexDefaultEchoKeepsFastBilling/setup-token","Output":"=== RUN TestOpenAIGatewayServiceRecordUsage_CodexDefaultEchoKeepsFastBilling/setup-token\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2425949+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceRecordUsage_CodexDefaultEchoKeepsFastBilling/setup-token","Output":"2026/09/12 03:42:35 [OpenAI WS Mode][openai_ws_mode=true] bootstrap enabled=false oauth_enabled=false apikey_enabled=false force_http=false responses_websockets_v2=false responses_websockets=false payload_log_sample_rate=0.000 event_flush_batch_size=0 event_flush_interval_ms=0 prewarm_cooldown_ms=0 retry_backoff_initial_ms=0 retry_backoff_max_ms=0 retry_jitter_ratio=0.000 retry_total_budget_ms=0 ws_read_limit_bytes=16777216\n"} {"Time":"2026-09-12T11:42:35.2425949+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceRecordUsage_CodexDefaultEchoKeepsFastBilling/setup-token","Output":"2026/09/12 03:42:35 [Billing] Using fallback pricing for model: gpt-5.6-sol\n"} {"Time":"2026-09-12T11:42:35.2425949+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceRecordUsage_CodexDefaultEchoKeepsFastBilling/setup-token","Output":"--- PASS: TestOpenAIGatewayServiceRecordUsage_CodexDefaultEchoKeepsFastBilling/setup-token (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2425949+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceRecordUsage_CodexDefaultEchoKeepsFastBilling/setup-token","Elapsed":0} {"Time":"2026-09-12T11:42:35.2425949+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceRecordUsage_CodexDefaultEchoKeepsFastBilling","Output":"--- PASS: TestOpenAIGatewayServiceRecordUsage_CodexDefaultEchoKeepsFastBilling (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2425949+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceRecordUsage_CodexDefaultEchoKeepsFastBilling","Elapsed":0} {"Time":"2026-09-12T11:42:35.2425949+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIResponseFlush_CompatibleAPIKeyDoesNotUseCodexBareErrorSynthesis"} {"Time":"2026-09-12T11:42:35.2425949+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIResponseFlush_CompatibleAPIKeyDoesNotUseCodexBareErrorSynthesis","Output":"=== RUN TestOpenAIResponseFlush_CompatibleAPIKeyDoesNotUseCodexBareErrorSynthesis\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIResponseFlush_CompatibleAPIKeyDoesNotUseCodexBareErrorSynthesis","Output":"--- PASS: TestOpenAIResponseFlush_CompatibleAPIKeyDoesNotUseCodexBareErrorSynthesis (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIResponseFlush_CompatibleAPIKeyDoesNotUseCodexBareErrorSynthesis","Elapsed":0} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_GetCodexClientRestrictionDetector"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_GetCodexClientRestrictionDetector","Output":"=== RUN TestOpenAIGatewayService_GetCodexClientRestrictionDetector\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_GetCodexClientRestrictionDetector/使用注入的_detector"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_GetCodexClientRestrictionDetector/使用注入的_detector","Output":"=== RUN TestOpenAIGatewayService_GetCodexClientRestrictionDetector/使用注入的_detector\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_GetCodexClientRestrictionDetector/使用注入的_detector","Output":"--- PASS: TestOpenAIGatewayService_GetCodexClientRestrictionDetector/使用注入的_detector (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_GetCodexClientRestrictionDetector/使用注入的_detector","Elapsed":0} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_GetCodexClientRestrictionDetector/service_为_nil_时返回默认_detector"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_GetCodexClientRestrictionDetector/service_为_nil_时返回默认_detector","Output":"=== RUN TestOpenAIGatewayService_GetCodexClientRestrictionDetector/service_为_nil_时返回默认_detector\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_GetCodexClientRestrictionDetector/service_为_nil_时返回默认_detector","Output":"--- PASS: TestOpenAIGatewayService_GetCodexClientRestrictionDetector/service_为_nil_时返回默认_detector (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_GetCodexClientRestrictionDetector/service_为_nil_时返回默认_detector","Elapsed":0} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_GetCodexClientRestrictionDetector/service_未注入_detector_时返回默认_detector"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_GetCodexClientRestrictionDetector/service_未注入_detector_时返回默认_detector","Output":"=== RUN TestOpenAIGatewayService_GetCodexClientRestrictionDetector/service_未注入_detector_时返回默认_detector\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_GetCodexClientRestrictionDetector/service_未注入_detector_时返回默认_detector","Output":"--- PASS: TestOpenAIGatewayService_GetCodexClientRestrictionDetector/service_未注入_detector_时返回默认_detector (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_GetCodexClientRestrictionDetector/service_未注入_detector_时返回默认_detector","Elapsed":0} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_GetCodexClientRestrictionDetector","Output":"--- PASS: TestOpenAIGatewayService_GetCodexClientRestrictionDetector (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_GetCodexClientRestrictionDetector","Elapsed":0} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestLogCodexCLIOnlyDetection_NilSafety"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestLogCodexCLIOnlyDetection_NilSafety","Output":"=== RUN TestLogCodexCLIOnlyDetection_NilSafety\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestLogCodexCLIOnlyDetection_NilSafety","Output":"--- PASS: TestLogCodexCLIOnlyDetection_NilSafety (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestLogCodexCLIOnlyDetection_NilSafety","Elapsed":0} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestLogCodexCLIOnlyDetection_OnlyLogsRejected"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestLogCodexCLIOnlyDetection_OnlyLogsRejected","Output":"=== RUN TestLogCodexCLIOnlyDetection_OnlyLogsRejected\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestLogCodexCLIOnlyDetection_OnlyLogsRejected","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:35.243Z\",\"msg\":\"OpenAI codex_cli_only 放行请求\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"account_id\":1001,\"codex_cli_only_enabled\":true,\"codex_official_client_match\":true,\"reject_reason\":\"official_client_user_agent_matched\",\"api_key_id\":2002}\n"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestLogCodexCLIOnlyDetection_OnlyLogsRejected","Output":"{\"level\":\"WARN\",\"time\":\"2026-09-12T03:42:35.243Z\",\"msg\":\"OpenAI codex_cli_only 拒绝非官方客户端请求\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"account_id\":1001,\"codex_cli_only_enabled\":true,\"codex_official_client_match\":false,\"reject_reason\":\"official_client_user_agent_not_matched\",\"api_key_id\":2002}\n"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestLogCodexCLIOnlyDetection_OnlyLogsRejected","Output":"--- PASS: TestLogCodexCLIOnlyDetection_OnlyLogsRejected (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestLogCodexCLIOnlyDetection_OnlyLogsRejected","Elapsed":0} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestLogCodexCLIOnlyDetection_RejectedIncludesRequestDetails"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestLogCodexCLIOnlyDetection_RejectedIncludesRequestDetails","Output":"=== RUN TestLogCodexCLIOnlyDetection_RejectedIncludesRequestDetails\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestLogCodexCLIOnlyDetection_RejectedIncludesRequestDetails","Output":"{\"level\":\"WARN\",\"time\":\"2026-09-12T03:42:35.243Z\",\"msg\":\"OpenAI codex_cli_only 拒绝非官方客户端请求\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"account_id\":1001,\"codex_cli_only_enabled\":true,\"codex_official_client_match\":false,\"reject_reason\":\"official_client_user_agent_not_matched\",\"api_key_id\":2002,\"request_method\":\"POST\",\"request_path\":\"/v1/responses\",\"request_query\":\"trace=1\",\"request_host\":\"example.com\",\"request_client_ip\":\"203.0.113.42\",\"request_remote_addr\":\"172.18.0.1:54321\",\"request_user_agent\":\"codex_cli_rs/0.98.0 (Windows 10.0.19045; x86_64) unknown\",\"request_content_type\":\"application/json\",\"request_content_length\":0,\"request_stream\":false,\"request_model\":\"gpt-5.2\",\"request_prompt_cache_key_sha256\":\"a39ee25f645d9e4e\",\"request_headers\":{\"content-type\":\"application/json\",\"openai-beta\":\"assistants=v2\",\"user-agent\":\"codex_cli_rs/0.98.0 (Windows 10.0.19045; x86_64) unknown\",\"x-real-ip\":\"203.0.113.42\"},\"request_body_size\":133}\n"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestLogCodexCLIOnlyDetection_RejectedIncludesRequestDetails","Output":"--- PASS: TestLogCodexCLIOnlyDetection_RejectedIncludesRequestDetails (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestLogCodexCLIOnlyDetection_RejectedIncludesRequestDetails","Elapsed":0} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexSnapshotBaseTime"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexSnapshotBaseTime","Output":"=== RUN TestCodexSnapshotBaseTime\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexSnapshotBaseTime/nil_snapshot_uses_fallback"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexSnapshotBaseTime/nil_snapshot_uses_fallback","Output":"=== RUN TestCodexSnapshotBaseTime/nil_snapshot_uses_fallback\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexSnapshotBaseTime/nil_snapshot_uses_fallback","Output":"--- PASS: TestCodexSnapshotBaseTime/nil_snapshot_uses_fallback (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexSnapshotBaseTime/nil_snapshot_uses_fallback","Elapsed":0} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexSnapshotBaseTime/empty_updatedAt_uses_fallback"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexSnapshotBaseTime/empty_updatedAt_uses_fallback","Output":"=== RUN TestCodexSnapshotBaseTime/empty_updatedAt_uses_fallback\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexSnapshotBaseTime/empty_updatedAt_uses_fallback","Output":"--- PASS: TestCodexSnapshotBaseTime/empty_updatedAt_uses_fallback (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexSnapshotBaseTime/empty_updatedAt_uses_fallback","Elapsed":0} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexSnapshotBaseTime/valid_updatedAt_wins"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexSnapshotBaseTime/valid_updatedAt_wins","Output":"=== RUN TestCodexSnapshotBaseTime/valid_updatedAt_wins\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexSnapshotBaseTime/valid_updatedAt_wins","Output":"--- PASS: TestCodexSnapshotBaseTime/valid_updatedAt_wins (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexSnapshotBaseTime/valid_updatedAt_wins","Elapsed":0} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexSnapshotBaseTime/invalid_updatedAt_uses_fallback"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexSnapshotBaseTime/invalid_updatedAt_uses_fallback","Output":"=== RUN TestCodexSnapshotBaseTime/invalid_updatedAt_uses_fallback\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexSnapshotBaseTime/invalid_updatedAt_uses_fallback","Output":"--- PASS: TestCodexSnapshotBaseTime/invalid_updatedAt_uses_fallback (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexSnapshotBaseTime/invalid_updatedAt_uses_fallback","Elapsed":0} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexSnapshotBaseTime","Output":"--- PASS: TestCodexSnapshotBaseTime (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexSnapshotBaseTime","Elapsed":0} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexResetAtRFC3339"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexResetAtRFC3339","Output":"=== RUN TestCodexResetAtRFC3339\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexResetAtRFC3339/nil_reset_returns_nil"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexResetAtRFC3339/nil_reset_returns_nil","Output":"=== RUN TestCodexResetAtRFC3339/nil_reset_returns_nil\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexResetAtRFC3339/nil_reset_returns_nil","Output":"--- PASS: TestCodexResetAtRFC3339/nil_reset_returns_nil (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexResetAtRFC3339/nil_reset_returns_nil","Elapsed":0} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexResetAtRFC3339/positive_seconds"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexResetAtRFC3339/positive_seconds","Output":"=== RUN TestCodexResetAtRFC3339/positive_seconds\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexResetAtRFC3339/positive_seconds","Output":"--- PASS: TestCodexResetAtRFC3339/positive_seconds (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexResetAtRFC3339/positive_seconds","Elapsed":0} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexResetAtRFC3339/negative_seconds_clamp_to_base"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexResetAtRFC3339/negative_seconds_clamp_to_base","Output":"=== RUN TestCodexResetAtRFC3339/negative_seconds_clamp_to_base\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexResetAtRFC3339/negative_seconds_clamp_to_base","Output":"--- PASS: TestCodexResetAtRFC3339/negative_seconds_clamp_to_base (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexResetAtRFC3339/negative_seconds_clamp_to_base","Elapsed":0} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexResetAtRFC3339","Output":"--- PASS: TestCodexResetAtRFC3339 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCodexResetAtRFC3339","Elapsed":0} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexUsageExtraUpdates_UsesSnapshotUpdatedAt"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexUsageExtraUpdates_UsesSnapshotUpdatedAt","Output":"=== RUN TestBuildCodexUsageExtraUpdates_UsesSnapshotUpdatedAt\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexUsageExtraUpdates_UsesSnapshotUpdatedAt","Output":"--- PASS: TestBuildCodexUsageExtraUpdates_UsesSnapshotUpdatedAt (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexUsageExtraUpdates_UsesSnapshotUpdatedAt","Elapsed":0} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexUsageExtraUpdates_FreshAccountUsedPercentNotInverted_Issue2994"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexUsageExtraUpdates_FreshAccountUsedPercentNotInverted_Issue2994","Output":"=== RUN TestBuildCodexUsageExtraUpdates_FreshAccountUsedPercentNotInverted_Issue2994\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexUsageExtraUpdates_FreshAccountUsedPercentNotInverted_Issue2994","Output":"--- PASS: TestBuildCodexUsageExtraUpdates_FreshAccountUsedPercentNotInverted_Issue2994 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexUsageExtraUpdates_FreshAccountUsedPercentNotInverted_Issue2994","Elapsed":0} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexUsageExtraUpdates_FallbackToNowWhenUpdatedAtInvalid"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexUsageExtraUpdates_FallbackToNowWhenUpdatedAtInvalid","Output":"=== RUN TestBuildCodexUsageExtraUpdates_FallbackToNowWhenUpdatedAtInvalid\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexUsageExtraUpdates_FallbackToNowWhenUpdatedAtInvalid","Output":"--- PASS: TestBuildCodexUsageExtraUpdates_FallbackToNowWhenUpdatedAtInvalid (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexUsageExtraUpdates_FallbackToNowWhenUpdatedAtInvalid","Elapsed":0} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexUsageExtraUpdates_ClampNegativeResetSeconds"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexUsageExtraUpdates_ClampNegativeResetSeconds","Output":"=== RUN TestBuildCodexUsageExtraUpdates_ClampNegativeResetSeconds\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexUsageExtraUpdates_ClampNegativeResetSeconds","Output":"--- PASS: TestBuildCodexUsageExtraUpdates_ClampNegativeResetSeconds (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexUsageExtraUpdates_ClampNegativeResetSeconds","Elapsed":0} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexUsageExtraUpdates_NilSnapshot"} {"Time":"2026-09-12T11:42:35.2431043+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexUsageExtraUpdates_NilSnapshot","Output":"=== RUN TestBuildCodexUsageExtraUpdates_NilSnapshot\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2436516+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexUsageExtraUpdates_NilSnapshot","Output":"--- PASS: TestBuildCodexUsageExtraUpdates_NilSnapshot (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2436516+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexUsageExtraUpdates_NilSnapshot","Elapsed":0} {"Time":"2026-09-12T11:42:35.2436516+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexUsageExtraUpdates_WithoutNormalizedWindowFields"} {"Time":"2026-09-12T11:42:35.2436516+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexUsageExtraUpdates_WithoutNormalizedWindowFields","Output":"=== RUN TestBuildCodexUsageExtraUpdates_WithoutNormalizedWindowFields\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2436516+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexUsageExtraUpdates_WithoutNormalizedWindowFields","Output":"--- PASS: TestBuildCodexUsageExtraUpdates_WithoutNormalizedWindowFields (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2436516+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexUsageExtraUpdates_WithoutNormalizedWindowFields","Elapsed":0} {"Time":"2026-09-12T11:42:35.2436516+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_Forward_CodexSparkRejectsEscapedInputImage"} {"Time":"2026-09-12T11:42:35.2436516+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_Forward_CodexSparkRejectsEscapedInputImage","Output":"=== RUN TestOpenAIGatewayService_Forward_CodexSparkRejectsEscapedInputImage\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2436516+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_Forward_CodexSparkRejectsEscapedInputImage","Output":"--- PASS: TestOpenAIGatewayService_Forward_CodexSparkRejectsEscapedInputImage (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2436516+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_Forward_CodexSparkRejectsEscapedInputImage","Elapsed":0} {"Time":"2026-09-12T11:42:35.2436516+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_Forward_CodexBridgeInjectionSetsImageBilling"} {"Time":"2026-09-12T11:42:35.2436516+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_Forward_CodexBridgeInjectionSetsImageBilling","Output":"=== RUN TestOpenAIGatewayService_Forward_CodexBridgeInjectionSetsImageBilling\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2436516+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_Forward_CodexBridgeInjectionSetsImageBilling","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:35.243Z\",\"msg\":\"[OpenAI] Injected /responses image_generation tool for Codex client\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:35.2436516+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_Forward_CodexBridgeInjectionSetsImageBilling","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:35.243Z\",\"msg\":\"[OpenAI] Set /responses image_generation tool_choice=auto for Codex client\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:35.2436516+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_Forward_CodexBridgeInjectionSetsImageBilling","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:35.243Z\",\"msg\":\"[OpenAI] /responses image_generation request inbound_model=gpt-5 mapped_model=gpt-5 account_type=apikey\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:35.2436516+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_Forward_CodexBridgeInjectionSetsImageBilling","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:35.243Z\",\"msg\":\"[OpenAI] Added Codex image_generation bridge instructions\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:35.2436516+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_Forward_CodexBridgeInjectionSetsImageBilling","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:35.243Z\",\"msg\":\"openai routing decision\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_routing\",\"transport\":\"http\",\"account_id\":7,\"final_model\":\"gpt-5\",\"final_service_tier\":\"\",\"routing_hint_generated\":false,\"ws_affinity_decision\":\"not_applicable\"}\n"} {"Time":"2026-09-12T11:42:35.2436516+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_Forward_CodexBridgeInjectionSetsImageBilling","Output":"--- PASS: TestOpenAIGatewayService_Forward_CodexBridgeInjectionSetsImageBilling (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2436516+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_Forward_CodexBridgeInjectionSetsImageBilling","Elapsed":0} {"Time":"2026-09-12T11:42:35.2436516+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexSessionIDKeepsReconnectHashStable"} {"Time":"2026-09-12T11:42:35.2436516+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexSessionIDKeepsReconnectHashStable","Output":"=== RUN TestOpenAIGatewayService_CodexSessionIDKeepsReconnectHashStable\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2436516+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexSessionIDKeepsReconnectHashStable","Output":"--- PASS: TestOpenAIGatewayService_CodexSessionIDKeepsReconnectHashStable (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2436516+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexSessionIDKeepsReconnectHashStable","Elapsed":0} {"Time":"2026-09-12T11:42:35.2436516+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIUpdateCodexUsageSnapshotFromHeaders"} {"Time":"2026-09-12T11:42:35.2436516+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIUpdateCodexUsageSnapshotFromHeaders","Output":"=== RUN TestOpenAIUpdateCodexUsageSnapshotFromHeaders\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2441602+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIUpdateCodexUsageSnapshotFromHeaders","Output":"--- PASS: TestOpenAIUpdateCodexUsageSnapshotFromHeaders (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2441602+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIUpdateCodexUsageSnapshotFromHeaders","Elapsed":0} {"Time":"2026-09-12T11:42:35.2441602+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeOpenAICompactRequestBodyPreservesCurrentCodexPayloadFields"} {"Time":"2026-09-12T11:42:35.2441602+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeOpenAICompactRequestBodyPreservesCurrentCodexPayloadFields","Output":"=== RUN TestNormalizeOpenAICompactRequestBodyPreservesCurrentCodexPayloadFields\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2441602+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeOpenAICompactRequestBodyPreservesCurrentCodexPayloadFields","Output":"--- PASS: TestNormalizeOpenAICompactRequestBodyPreservesCurrentCodexPayloadFields (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2441602+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeOpenAICompactRequestBodyPreservesCurrentCodexPayloadFields","Elapsed":0} {"Time":"2026-09-12T11:42:35.2441602+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIBuildUpstreamRequestPreservesCodexIdentityHeaders"} {"Time":"2026-09-12T11:42:35.2441602+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIBuildUpstreamRequestPreservesCodexIdentityHeaders","Output":"=== RUN TestOpenAIBuildUpstreamRequestPreservesCodexIdentityHeaders\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2441602+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIBuildUpstreamRequestPreservesCodexIdentityHeaders","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:35.244Z\",\"msg\":\"openai routing decision\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_routing\",\"transport\":\"http\",\"account_id\":0,\"final_model\":\"gpt-5\",\"final_service_tier\":\"\",\"routing_hint_generated\":false,\"ws_affinity_decision\":\"not_applicable\"}\n"} {"Time":"2026-09-12T11:42:35.2441602+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIBuildUpstreamRequestPreservesCodexIdentityHeaders","Output":"--- PASS: TestOpenAIBuildUpstreamRequestPreservesCodexIdentityHeaders (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2441602+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIBuildUpstreamRequestPreservesCodexIdentityHeaders","Elapsed":0} {"Time":"2026-09-12T11:42:35.2441602+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestExtractCodexFinalResponse_SampleReplay"} {"Time":"2026-09-12T11:42:35.2441602+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestExtractCodexFinalResponse_SampleReplay","Output":"=== RUN TestExtractCodexFinalResponse_SampleReplay\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2441602+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestExtractCodexFinalResponse_SampleReplay","Output":"--- PASS: TestExtractCodexFinalResponse_SampleReplay (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2441602+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestExtractCodexFinalResponse_SampleReplay","Elapsed":0} {"Time":"2026-09-12T11:42:35.2441602+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeOpenAICodexCompactReasoningEffortDowngradesMax"} {"Time":"2026-09-12T11:42:35.2441602+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeOpenAICodexCompactReasoningEffortDowngradesMax","Output":"=== RUN TestNormalizeOpenAICodexCompactReasoningEffortDowngradesMax\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2441602+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeOpenAICodexCompactReasoningEffortDowngradesMax","Output":"--- PASS: TestNormalizeOpenAICodexCompactReasoningEffortDowngradesMax (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2441602+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeOpenAICodexCompactReasoningEffortDowngradesMax","Elapsed":0} {"Time":"2026-09-12T11:42:35.2441602+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeOpenAICodexCompactReasoningEffortForAccountScopesCompatibility"} {"Time":"2026-09-12T11:42:35.2441602+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeOpenAICodexCompactReasoningEffortForAccountScopesCompatibility","Output":"=== RUN TestNormalizeOpenAICodexCompactReasoningEffortForAccountScopesCompatibility\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2441602+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeOpenAICodexCompactReasoningEffortForAccountScopesCompatibility/OpenAI_OAuth_compact_降级"} {"Time":"2026-09-12T11:42:35.2441602+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeOpenAICodexCompactReasoningEffortForAccountScopesCompatibility/OpenAI_OAuth_compact_降级","Output":"=== RUN TestNormalizeOpenAICodexCompactReasoningEffortForAccountScopesCompatibility/OpenAI_OAuth_compact_降级\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2441602+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeOpenAICodexCompactReasoningEffortForAccountScopesCompatibility/OpenAI_OAuth_compact_降级","Output":"--- PASS: TestNormalizeOpenAICodexCompactReasoningEffortForAccountScopesCompatibility/OpenAI_OAuth_compact_降级 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2441602+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeOpenAICodexCompactReasoningEffortForAccountScopesCompatibility/OpenAI_OAuth_compact_降级","Elapsed":0} {"Time":"2026-09-12T11:42:35.2441602+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeOpenAICodexCompactReasoningEffortForAccountScopesCompatibility/OpenAI_OAuth_普通请求保留"} {"Time":"2026-09-12T11:42:35.2441602+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeOpenAICodexCompactReasoningEffortForAccountScopesCompatibility/OpenAI_OAuth_普通请求保留","Output":"=== RUN TestNormalizeOpenAICodexCompactReasoningEffortForAccountScopesCompatibility/OpenAI_OAuth_普通请求保留\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2441602+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeOpenAICodexCompactReasoningEffortForAccountScopesCompatibility/OpenAI_OAuth_普通请求保留","Output":"--- PASS: TestNormalizeOpenAICodexCompactReasoningEffortForAccountScopesCompatibility/OpenAI_OAuth_普通请求保留 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2441602+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeOpenAICodexCompactReasoningEffortForAccountScopesCompatibility/OpenAI_OAuth_普通请求保留","Elapsed":0} {"Time":"2026-09-12T11:42:35.2441602+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeOpenAICodexCompactReasoningEffortForAccountScopesCompatibility/OpenAI_API_Key_compact_保留"} {"Time":"2026-09-12T11:42:35.2441602+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeOpenAICodexCompactReasoningEffortForAccountScopesCompatibility/OpenAI_API_Key_compact_保留","Output":"=== RUN TestNormalizeOpenAICodexCompactReasoningEffortForAccountScopesCompatibility/OpenAI_API_Key_compact_保留\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2441602+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeOpenAICodexCompactReasoningEffortForAccountScopesCompatibility/OpenAI_API_Key_compact_保留","Output":"--- PASS: TestNormalizeOpenAICodexCompactReasoningEffortForAccountScopesCompatibility/OpenAI_API_Key_compact_保留 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2441602+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeOpenAICodexCompactReasoningEffortForAccountScopesCompatibility/OpenAI_API_Key_compact_保留","Elapsed":0} {"Time":"2026-09-12T11:42:35.2441602+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeOpenAICodexCompactReasoningEffortForAccountScopesCompatibility/Grok_OAuth_compact_保留"} {"Time":"2026-09-12T11:42:35.2441602+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeOpenAICodexCompactReasoningEffortForAccountScopesCompatibility/Grok_OAuth_compact_保留","Output":"=== RUN TestNormalizeOpenAICodexCompactReasoningEffortForAccountScopesCompatibility/Grok_OAuth_compact_保留\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2441602+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeOpenAICodexCompactReasoningEffortForAccountScopesCompatibility/Grok_OAuth_compact_保留","Output":"--- PASS: TestNormalizeOpenAICodexCompactReasoningEffortForAccountScopesCompatibility/Grok_OAuth_compact_保留 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2441602+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeOpenAICodexCompactReasoningEffortForAccountScopesCompatibility/Grok_OAuth_compact_保留","Elapsed":0} {"Time":"2026-09-12T11:42:35.2441602+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeOpenAICodexCompactReasoningEffortForAccountScopesCompatibility","Output":"--- PASS: TestNormalizeOpenAICodexCompactReasoningEffortForAccountScopesCompatibility (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2441602+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeOpenAICodexCompactReasoningEffortForAccountScopesCompatibility","Elapsed":0} {"Time":"2026-09-12T11:42:35.2441602+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexImageInjectionRespectsGroupCapability"} {"Time":"2026-09-12T11:42:35.2441602+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexImageInjectionRespectsGroupCapability","Output":"=== RUN TestOpenAIGatewayServiceForward_CodexImageInjectionRespectsGroupCapability\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2441602+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexImageInjectionRespectsGroupCapability/disabled_group_skips_injection"} {"Time":"2026-09-12T11:42:35.2441602+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexImageInjectionRespectsGroupCapability/disabled_group_skips_injection","Output":"=== RUN TestOpenAIGatewayServiceForward_CodexImageInjectionRespectsGroupCapability/disabled_group_skips_injection\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2441602+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexImageInjectionRespectsGroupCapability/disabled_group_skips_injection","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:35.244Z\",\"msg\":\"openai routing decision\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_routing\",\"transport\":\"http\",\"account_id\":5151,\"final_model\":\"gpt-5.4\",\"final_service_tier\":\"\",\"routing_hint_generated\":false,\"ws_affinity_decision\":\"not_applicable\"}\n"} {"Time":"2026-09-12T11:42:35.2441602+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexImageInjectionRespectsGroupCapability/disabled_group_skips_injection","Output":"--- PASS: TestOpenAIGatewayServiceForward_CodexImageInjectionRespectsGroupCapability/disabled_group_skips_injection (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2441602+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexImageInjectionRespectsGroupCapability/disabled_group_skips_injection","Elapsed":0} {"Time":"2026-09-12T11:42:35.2441602+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexImageInjectionRespectsGroupCapability/enabled_group_skips_injection_by_default"} {"Time":"2026-09-12T11:42:35.2441602+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexImageInjectionRespectsGroupCapability/enabled_group_skips_injection_by_default","Output":"=== RUN TestOpenAIGatewayServiceForward_CodexImageInjectionRespectsGroupCapability/enabled_group_skips_injection_by_default\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2441602+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexImageInjectionRespectsGroupCapability/enabled_group_skips_injection_by_default","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:35.244Z\",\"msg\":\"openai routing decision\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_routing\",\"transport\":\"http\",\"account_id\":5151,\"final_model\":\"gpt-5.4\",\"final_service_tier\":\"\",\"routing_hint_generated\":false,\"ws_affinity_decision\":\"not_applicable\"}\n"} {"Time":"2026-09-12T11:42:35.2441602+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexImageInjectionRespectsGroupCapability/enabled_group_skips_injection_by_default","Output":"--- PASS: TestOpenAIGatewayServiceForward_CodexImageInjectionRespectsGroupCapability/enabled_group_skips_injection_by_default (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2441602+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexImageInjectionRespectsGroupCapability/enabled_group_skips_injection_by_default","Elapsed":0} {"Time":"2026-09-12T11:42:35.2441602+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexImageInjectionRespectsGroupCapability/enabled_group_injects_image_tool_when_bridge_enabled"} {"Time":"2026-09-12T11:42:35.2441602+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexImageInjectionRespectsGroupCapability/enabled_group_injects_image_tool_when_bridge_enabled","Output":"=== RUN TestOpenAIGatewayServiceForward_CodexImageInjectionRespectsGroupCapability/enabled_group_injects_image_tool_when_bridge_enabled\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2446688+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexImageInjectionRespectsGroupCapability/enabled_group_injects_image_tool_when_bridge_enabled","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:35.244Z\",\"msg\":\"[OpenAI] Injected /responses image_generation tool for Codex client\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:35.2446688+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexImageInjectionRespectsGroupCapability/enabled_group_injects_image_tool_when_bridge_enabled","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:35.244Z\",\"msg\":\"[OpenAI] Set /responses image_generation tool_choice=auto for Codex client\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:35.2446688+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexImageInjectionRespectsGroupCapability/enabled_group_injects_image_tool_when_bridge_enabled","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:35.244Z\",\"msg\":\"[OpenAI] /responses image_generation request inbound_model=gpt-5.4 mapped_model=gpt-5.4 account_type=apikey\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:35.2446688+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexImageInjectionRespectsGroupCapability/enabled_group_injects_image_tool_when_bridge_enabled","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:35.244Z\",\"msg\":\"[OpenAI] Added Codex image_generation bridge instructions\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:35.2446688+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexImageInjectionRespectsGroupCapability/enabled_group_injects_image_tool_when_bridge_enabled","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:35.244Z\",\"msg\":\"openai routing decision\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_routing\",\"transport\":\"http\",\"account_id\":5151,\"final_model\":\"gpt-5.4\",\"final_service_tier\":\"\",\"routing_hint_generated\":false,\"ws_affinity_decision\":\"not_applicable\"}\n"} {"Time":"2026-09-12T11:42:35.2446688+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexImageInjectionRespectsGroupCapability/enabled_group_injects_image_tool_when_bridge_enabled","Output":"--- PASS: TestOpenAIGatewayServiceForward_CodexImageInjectionRespectsGroupCapability/enabled_group_injects_image_tool_when_bridge_enabled (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2446688+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexImageInjectionRespectsGroupCapability/enabled_group_injects_image_tool_when_bridge_enabled","Elapsed":0} {"Time":"2026-09-12T11:42:35.2446688+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexImageInjectionRespectsGroupCapability/responses_lite_skips_hosted_image_bridge"} {"Time":"2026-09-12T11:42:35.2446688+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexImageInjectionRespectsGroupCapability/responses_lite_skips_hosted_image_bridge","Output":"=== RUN TestOpenAIGatewayServiceForward_CodexImageInjectionRespectsGroupCapability/responses_lite_skips_hosted_image_bridge\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2446688+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexImageInjectionRespectsGroupCapability/responses_lite_skips_hosted_image_bridge","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:35.244Z\",\"msg\":\"openai routing decision\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_routing\",\"transport\":\"http\",\"account_id\":5151,\"final_model\":\"gpt-5.4\",\"final_service_tier\":\"\",\"routing_hint_generated\":false,\"ws_affinity_decision\":\"not_applicable\"}\n"} {"Time":"2026-09-12T11:42:35.2446688+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexImageInjectionRespectsGroupCapability/responses_lite_skips_hosted_image_bridge","Output":"--- PASS: TestOpenAIGatewayServiceForward_CodexImageInjectionRespectsGroupCapability/responses_lite_skips_hosted_image_bridge (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2446688+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexImageInjectionRespectsGroupCapability/responses_lite_skips_hosted_image_bridge","Elapsed":0} {"Time":"2026-09-12T11:42:35.2446688+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexImageInjectionRespectsGroupCapability","Output":"--- PASS: TestOpenAIGatewayServiceForward_CodexImageInjectionRespectsGroupCapability (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2446688+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexImageInjectionRespectsGroupCapability","Elapsed":0} {"Time":"2026-09-12T11:42:35.2446688+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_ChannelBridgeOverrideEnablesCodexInjection"} {"Time":"2026-09-12T11:42:35.2446688+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_ChannelBridgeOverrideEnablesCodexInjection","Output":"=== RUN TestOpenAIGatewayServiceForward_ChannelBridgeOverrideEnablesCodexInjection\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2446688+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_ChannelBridgeOverrideEnablesCodexInjection","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:35.244Z\",\"msg\":\"[OpenAI] Injected /responses image_generation tool for Codex client\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:35.2446688+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_ChannelBridgeOverrideEnablesCodexInjection","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:35.244Z\",\"msg\":\"[OpenAI] Set /responses image_generation tool_choice=auto for Codex client\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:35.2446688+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_ChannelBridgeOverrideEnablesCodexInjection","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:35.244Z\",\"msg\":\"[OpenAI] /responses image_generation request inbound_model=gpt-5.4 mapped_model=gpt-5.4 account_type=apikey\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:35.2446688+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_ChannelBridgeOverrideEnablesCodexInjection","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:35.244Z\",\"msg\":\"[OpenAI] Added Codex image_generation bridge instructions\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:35.2446688+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_ChannelBridgeOverrideEnablesCodexInjection","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:35.244Z\",\"msg\":\"openai routing decision\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_routing\",\"transport\":\"http\",\"account_id\":5151,\"final_model\":\"gpt-5.4\",\"final_service_tier\":\"\",\"routing_hint_generated\":false,\"ws_affinity_decision\":\"not_applicable\"}\n"} {"Time":"2026-09-12T11:42:35.2446688+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_ChannelBridgeOverrideEnablesCodexInjection","Output":"--- PASS: TestOpenAIGatewayServiceForward_ChannelBridgeOverrideEnablesCodexInjection (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2446688+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_ChannelBridgeOverrideEnablesCodexInjection","Elapsed":0} {"Time":"2026-09-12T11:42:35.2446688+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexBridgeDoesNotInjectHostedToolAlongsideImageGenNamespace"} {"Time":"2026-09-12T11:42:35.2446688+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexBridgeDoesNotInjectHostedToolAlongsideImageGenNamespace","Output":"=== RUN TestOpenAIGatewayServiceForward_CodexBridgeDoesNotInjectHostedToolAlongsideImageGenNamespace\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2446688+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexBridgeDoesNotInjectHostedToolAlongsideImageGenNamespace","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:35.244Z\",\"msg\":\"[OpenAI] /responses image_generation request inbound_model=gpt-5.5 mapped_model=gpt-5.5 account_type=apikey\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:35.2446688+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexBridgeDoesNotInjectHostedToolAlongsideImageGenNamespace","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:35.244Z\",\"msg\":\"[OpenAI] Added Codex image_generation bridge instructions\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:35.2451772+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexBridgeDoesNotInjectHostedToolAlongsideImageGenNamespace","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:35.245Z\",\"msg\":\"openai routing decision\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_routing\",\"transport\":\"http\",\"account_id\":5151,\"final_model\":\"gpt-5.5\",\"final_service_tier\":\"\",\"routing_hint_generated\":false,\"ws_affinity_decision\":\"not_applicable\"}\n"} {"Time":"2026-09-12T11:42:35.2451772+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexBridgeDoesNotInjectHostedToolAlongsideImageGenNamespace","Output":"--- PASS: TestOpenAIGatewayServiceForward_CodexBridgeDoesNotInjectHostedToolAlongsideImageGenNamespace (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2451772+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexBridgeDoesNotInjectHostedToolAlongsideImageGenNamespace","Elapsed":0} {"Time":"2026-09-12T11:42:35.2451772+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexBridgePreservesImageGenFunction"} {"Time":"2026-09-12T11:42:35.2451772+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexBridgePreservesImageGenFunction","Output":"=== RUN TestOpenAIGatewayServiceForward_CodexBridgePreservesImageGenFunction\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2451772+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexBridgePreservesImageGenFunction/flat_function"} {"Time":"2026-09-12T11:42:35.2451772+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexBridgePreservesImageGenFunction/flat_function","Output":"=== RUN TestOpenAIGatewayServiceForward_CodexBridgePreservesImageGenFunction/flat_function\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2451772+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexBridgePreservesImageGenFunction/flat_function","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:35.245Z\",\"msg\":\"openai routing decision\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_routing\",\"transport\":\"http\",\"account_id\":5151,\"final_model\":\"gpt-5.5\",\"final_service_tier\":\"\",\"routing_hint_generated\":false,\"ws_affinity_decision\":\"not_applicable\"}\n"} {"Time":"2026-09-12T11:42:35.2451772+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexBridgePreservesImageGenFunction/flat_function","Output":"--- PASS: TestOpenAIGatewayServiceForward_CodexBridgePreservesImageGenFunction/flat_function (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2451772+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexBridgePreservesImageGenFunction/flat_function","Elapsed":0} {"Time":"2026-09-12T11:42:35.2451772+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexBridgePreservesImageGenFunction/nested_function"} {"Time":"2026-09-12T11:42:35.2451772+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexBridgePreservesImageGenFunction/nested_function","Output":"=== RUN TestOpenAIGatewayServiceForward_CodexBridgePreservesImageGenFunction/nested_function\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2451772+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexBridgePreservesImageGenFunction/nested_function","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:35.245Z\",\"msg\":\"openai routing decision\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_routing\",\"transport\":\"http\",\"account_id\":5151,\"final_model\":\"gpt-5.5\",\"final_service_tier\":\"\",\"routing_hint_generated\":false,\"ws_affinity_decision\":\"not_applicable\"}\n"} {"Time":"2026-09-12T11:42:35.2451772+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexBridgePreservesImageGenFunction/nested_function","Output":"--- PASS: TestOpenAIGatewayServiceForward_CodexBridgePreservesImageGenFunction/nested_function (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2451772+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexBridgePreservesImageGenFunction/nested_function","Elapsed":0} {"Time":"2026-09-12T11:42:35.2451772+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexBridgePreservesImageGenFunction","Output":"--- PASS: TestOpenAIGatewayServiceForward_CodexBridgePreservesImageGenFunction (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2451772+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexBridgePreservesImageGenFunction","Elapsed":0} {"Time":"2026-09-12T11:42:35.2451772+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexBridgePreservesExistingToolChoice"} {"Time":"2026-09-12T11:42:35.2451772+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexBridgePreservesExistingToolChoice","Output":"=== RUN TestOpenAIGatewayServiceForward_CodexBridgePreservesExistingToolChoice\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2451772+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexBridgePreservesExistingToolChoice","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:35.245Z\",\"msg\":\"[OpenAI] /responses image_generation request inbound_model=gpt-5.4 mapped_model=gpt-5.4 account_type=apikey\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:35.2451772+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexBridgePreservesExistingToolChoice","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:35.245Z\",\"msg\":\"[OpenAI] Added Codex image_generation bridge instructions\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:35.2451772+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexBridgePreservesExistingToolChoice","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:35.245Z\",\"msg\":\"openai routing decision\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_routing\",\"transport\":\"http\",\"account_id\":5151,\"final_model\":\"gpt-5.4\",\"final_service_tier\":\"\",\"routing_hint_generated\":false,\"ws_affinity_decision\":\"not_applicable\"}\n"} {"Time":"2026-09-12T11:42:35.2451772+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexBridgePreservesExistingToolChoice","Output":"--- PASS: TestOpenAIGatewayServiceForward_CodexBridgePreservesExistingToolChoice (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2451772+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexBridgePreservesExistingToolChoice","Elapsed":0} {"Time":"2026-09-12T11:42:35.2451772+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexBridgeSkipsCompactRequests"} {"Time":"2026-09-12T11:42:35.2451772+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexBridgeSkipsCompactRequests","Output":"=== RUN TestOpenAIGatewayServiceForward_CodexBridgeSkipsCompactRequests\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2451772+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexBridgeSkipsCompactRequests","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:35.245Z\",\"msg\":\"openai routing decision\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_routing\",\"transport\":\"http\",\"account_id\":5151,\"final_model\":\"gpt-5.4\",\"final_service_tier\":\"\",\"routing_hint_generated\":false,\"ws_affinity_decision\":\"not_applicable\"}\n"} {"Time":"2026-09-12T11:42:35.2451772+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexBridgeSkipsCompactRequests","Output":"--- PASS: TestOpenAIGatewayServiceForward_CodexBridgeSkipsCompactRequests (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2451772+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayServiceForward_CodexBridgeSkipsCompactRequests","Elapsed":0} {"Time":"2026-09-12T11:42:35.2451772+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexImageGenerationBridgeOverridePrecedence"} {"Time":"2026-09-12T11:42:35.2451772+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexImageGenerationBridgeOverridePrecedence","Output":"=== RUN TestOpenAIGatewayService_CodexImageGenerationBridgeOverridePrecedence\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2451772+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexImageGenerationBridgeOverridePrecedence/global_default_enables_bridge"} {"Time":"2026-09-12T11:42:35.2451772+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexImageGenerationBridgeOverridePrecedence/global_default_enables_bridge","Output":"=== RUN TestOpenAIGatewayService_CodexImageGenerationBridgeOverridePrecedence/global_default_enables_bridge\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2451772+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexImageGenerationBridgeOverridePrecedence/global_default_enables_bridge","Output":"--- PASS: TestOpenAIGatewayService_CodexImageGenerationBridgeOverridePrecedence/global_default_enables_bridge (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2451772+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexImageGenerationBridgeOverridePrecedence/global_default_enables_bridge","Elapsed":0} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexImageGenerationBridgeOverridePrecedence/channel_true_overrides_disabled_global"} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexImageGenerationBridgeOverridePrecedence/channel_true_overrides_disabled_global","Output":"=== RUN TestOpenAIGatewayService_CodexImageGenerationBridgeOverridePrecedence/channel_true_overrides_disabled_global\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexImageGenerationBridgeOverridePrecedence/channel_true_overrides_disabled_global","Output":"--- PASS: TestOpenAIGatewayService_CodexImageGenerationBridgeOverridePrecedence/channel_true_overrides_disabled_global (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexImageGenerationBridgeOverridePrecedence/channel_true_overrides_disabled_global","Elapsed":0} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexImageGenerationBridgeOverridePrecedence/channel_false_overrides_enabled_global"} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexImageGenerationBridgeOverridePrecedence/channel_false_overrides_enabled_global","Output":"=== RUN TestOpenAIGatewayService_CodexImageGenerationBridgeOverridePrecedence/channel_false_overrides_enabled_global\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexImageGenerationBridgeOverridePrecedence/channel_false_overrides_enabled_global","Output":"--- PASS: TestOpenAIGatewayService_CodexImageGenerationBridgeOverridePrecedence/channel_false_overrides_enabled_global (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexImageGenerationBridgeOverridePrecedence/channel_false_overrides_enabled_global","Elapsed":0} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexImageGenerationBridgeOverridePrecedence/account_false_overrides_channel_and_global_true"} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexImageGenerationBridgeOverridePrecedence/account_false_overrides_channel_and_global_true","Output":"=== RUN TestOpenAIGatewayService_CodexImageGenerationBridgeOverridePrecedence/account_false_overrides_channel_and_global_true\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexImageGenerationBridgeOverridePrecedence/account_false_overrides_channel_and_global_true","Output":"--- PASS: TestOpenAIGatewayService_CodexImageGenerationBridgeOverridePrecedence/account_false_overrides_channel_and_global_true (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexImageGenerationBridgeOverridePrecedence/account_false_overrides_channel_and_global_true","Elapsed":0} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexImageGenerationBridgeOverridePrecedence/nested_account_true_overrides_channel_false"} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexImageGenerationBridgeOverridePrecedence/nested_account_true_overrides_channel_false","Output":"=== RUN TestOpenAIGatewayService_CodexImageGenerationBridgeOverridePrecedence/nested_account_true_overrides_channel_false\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexImageGenerationBridgeOverridePrecedence/nested_account_true_overrides_channel_false","Output":"--- PASS: TestOpenAIGatewayService_CodexImageGenerationBridgeOverridePrecedence/nested_account_true_overrides_channel_false (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexImageGenerationBridgeOverridePrecedence/nested_account_true_overrides_channel_false","Elapsed":0} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexImageGenerationBridgeOverridePrecedence/non_openai_account_extra_is_ignored"} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexImageGenerationBridgeOverridePrecedence/non_openai_account_extra_is_ignored","Output":"=== RUN TestOpenAIGatewayService_CodexImageGenerationBridgeOverridePrecedence/non_openai_account_extra_is_ignored\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexImageGenerationBridgeOverridePrecedence/non_openai_account_extra_is_ignored","Output":"--- PASS: TestOpenAIGatewayService_CodexImageGenerationBridgeOverridePrecedence/non_openai_account_extra_is_ignored (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexImageGenerationBridgeOverridePrecedence/non_openai_account_extra_is_ignored","Elapsed":0} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexImageGenerationBridgeOverridePrecedence","Output":"--- PASS: TestOpenAIGatewayService_CodexImageGenerationBridgeOverridePrecedence (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexImageGenerationBridgeOverridePrecedence","Elapsed":0} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1CodexSemanticEquivalence"} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1CodexSemanticEquivalence","Output":"=== RUN TestMode1CodexSemanticEquivalence\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1CodexSemanticEquivalence/string_input"} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1CodexSemanticEquivalence/string_input","Output":"=== RUN TestMode1CodexSemanticEquivalence/string_input\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1CodexSemanticEquivalence/string_input","Output":"--- PASS: TestMode1CodexSemanticEquivalence/string_input (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1CodexSemanticEquivalence/string_input","Elapsed":0} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1CodexSemanticEquivalence/text_parts"} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1CodexSemanticEquivalence/text_parts","Output":"=== RUN TestMode1CodexSemanticEquivalence/text_parts\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1CodexSemanticEquivalence/text_parts","Output":"--- PASS: TestMode1CodexSemanticEquivalence/text_parts (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1CodexSemanticEquivalence/text_parts","Elapsed":0} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1CodexSemanticEquivalence/reasoning_replay_metadata"} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1CodexSemanticEquivalence/reasoning_replay_metadata","Output":"=== RUN TestMode1CodexSemanticEquivalence/reasoning_replay_metadata\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1CodexSemanticEquivalence/reasoning_replay_metadata","Output":"--- PASS: TestMode1CodexSemanticEquivalence/reasoning_replay_metadata (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1CodexSemanticEquivalence/reasoning_replay_metadata","Elapsed":0} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1CodexSemanticEquivalence/system_promotion"} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1CodexSemanticEquivalence/system_promotion","Output":"=== RUN TestMode1CodexSemanticEquivalence/system_promotion\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1CodexSemanticEquivalence/system_promotion","Output":"--- PASS: TestMode1CodexSemanticEquivalence/system_promotion (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1CodexSemanticEquivalence/system_promotion","Elapsed":0} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1CodexSemanticEquivalence/tool_schema"} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1CodexSemanticEquivalence/tool_schema","Output":"=== RUN TestMode1CodexSemanticEquivalence/tool_schema\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1CodexSemanticEquivalence/tool_schema","Output":"--- PASS: TestMode1CodexSemanticEquivalence/tool_schema (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1CodexSemanticEquivalence/tool_schema","Elapsed":0} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1CodexSemanticEquivalence/tool_role_result"} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1CodexSemanticEquivalence/tool_role_result","Output":"=== RUN TestMode1CodexSemanticEquivalence/tool_role_result\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1CodexSemanticEquivalence/tool_role_result","Output":"--- PASS: TestMode1CodexSemanticEquivalence/tool_role_result (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1CodexSemanticEquivalence/tool_role_result","Elapsed":0} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1CodexSemanticEquivalence/call_pair"} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1CodexSemanticEquivalence/call_pair","Output":"=== RUN TestMode1CodexSemanticEquivalence/call_pair\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1CodexSemanticEquivalence/call_pair","Output":"--- PASS: TestMode1CodexSemanticEquivalence/call_pair (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1CodexSemanticEquivalence/call_pair","Elapsed":0} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1CodexSemanticEquivalence/model_alias"} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1CodexSemanticEquivalence/model_alias","Output":"=== RUN TestMode1CodexSemanticEquivalence/model_alias\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1CodexSemanticEquivalence/model_alias","Output":"--- PASS: TestMode1CodexSemanticEquivalence/model_alias (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1CodexSemanticEquivalence/model_alias","Elapsed":0} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1CodexSemanticEquivalence/minimal_compatibility"} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1CodexSemanticEquivalence/minimal_compatibility","Output":"=== RUN TestMode1CodexSemanticEquivalence/minimal_compatibility\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1CodexSemanticEquivalence/minimal_compatibility","Output":"--- PASS: TestMode1CodexSemanticEquivalence/minimal_compatibility (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1CodexSemanticEquivalence/minimal_compatibility","Elapsed":0} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1CodexSemanticEquivalence/legacy_pro_mode"} {"Time":"2026-09-12T11:42:35.2456864+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1CodexSemanticEquivalence/legacy_pro_mode","Output":"=== RUN TestMode1CodexSemanticEquivalence/legacy_pro_mode\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1CodexSemanticEquivalence/legacy_pro_mode","Output":"--- PASS: TestMode1CodexSemanticEquivalence/legacy_pro_mode (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1CodexSemanticEquivalence/legacy_pro_mode","Elapsed":0} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1CodexSemanticEquivalence/unsupported_OAuth_budget"} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1CodexSemanticEquivalence/unsupported_OAuth_budget","Output":"=== RUN TestMode1CodexSemanticEquivalence/unsupported_OAuth_budget\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1CodexSemanticEquivalence/unsupported_OAuth_budget","Output":"--- PASS: TestMode1CodexSemanticEquivalence/unsupported_OAuth_budget (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1CodexSemanticEquivalence/unsupported_OAuth_budget","Elapsed":0} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1CodexSemanticEquivalence","Output":"--- PASS: TestMode1CodexSemanticEquivalence (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1CodexSemanticEquivalence","Elapsed":0} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss"} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss","Output":"=== RUN TestMode1SemanticGuardStillRejectsActualLoss\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/changed_text"} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/changed_text","Output":"=== RUN TestMode1SemanticGuardStillRejectsActualLoss/changed_text\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/changed_text","Output":"--- PASS: TestMode1SemanticGuardStillRejectsActualLoss/changed_text (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/changed_text","Elapsed":0} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/dropped_turn"} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/dropped_turn","Output":"=== RUN TestMode1SemanticGuardStillRejectsActualLoss/dropped_turn\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/dropped_turn","Output":"--- PASS: TestMode1SemanticGuardStillRejectsActualLoss/dropped_turn (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/dropped_turn","Elapsed":0} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/lost_system"} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/lost_system","Output":"=== RUN TestMode1SemanticGuardStillRejectsActualLoss/lost_system\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/lost_system","Output":"--- PASS: TestMode1SemanticGuardStillRejectsActualLoss/lost_system (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/lost_system","Elapsed":0} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/lost_encrypted_reasoning"} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/lost_encrypted_reasoning","Output":"=== RUN TestMode1SemanticGuardStillRejectsActualLoss/lost_encrypted_reasoning\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/lost_encrypted_reasoning","Output":"--- PASS: TestMode1SemanticGuardStillRejectsActualLoss/lost_encrypted_reasoning (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/lost_encrypted_reasoning","Elapsed":0} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/lost_reference"} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/lost_reference","Output":"=== RUN TestMode1SemanticGuardStillRejectsActualLoss/lost_reference\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/lost_reference","Output":"--- PASS: TestMode1SemanticGuardStillRejectsActualLoss/lost_reference (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/lost_reference","Elapsed":0} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/wrong_call_id"} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/wrong_call_id","Output":"=== RUN TestMode1SemanticGuardStillRejectsActualLoss/wrong_call_id\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/wrong_call_id","Output":"--- PASS: TestMode1SemanticGuardStillRejectsActualLoss/wrong_call_id (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/wrong_call_id","Elapsed":0} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/changed_result"} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/changed_result","Output":"=== RUN TestMode1SemanticGuardStillRejectsActualLoss/changed_result\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/changed_result","Output":"--- PASS: TestMode1SemanticGuardStillRejectsActualLoss/changed_result (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/changed_result","Elapsed":0} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/lost_tools"} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/lost_tools","Output":"=== RUN TestMode1SemanticGuardStillRejectsActualLoss/lost_tools\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/lost_tools","Output":"--- PASS: TestMode1SemanticGuardStillRejectsActualLoss/lost_tools (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/lost_tools","Elapsed":0} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/conflicting_legacy_tools"} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/conflicting_legacy_tools","Output":"=== RUN TestMode1SemanticGuardStillRejectsActualLoss/conflicting_legacy_tools\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/conflicting_legacy_tools","Output":"--- PASS: TestMode1SemanticGuardStillRejectsActualLoss/conflicting_legacy_tools (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/conflicting_legacy_tools","Elapsed":0} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/tool_without_association"} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/tool_without_association","Output":"=== RUN TestMode1SemanticGuardStillRejectsActualLoss/tool_without_association\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/tool_without_association","Output":"--- PASS: TestMode1SemanticGuardStillRejectsActualLoss/tool_without_association (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/tool_without_association","Elapsed":0} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/lost_malformed_tool"} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/lost_malformed_tool","Output":"=== RUN TestMode1SemanticGuardStillRejectsActualLoss/lost_malformed_tool\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/lost_malformed_tool","Output":"--- PASS: TestMode1SemanticGuardStillRejectsActualLoss/lost_malformed_tool (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/lost_malformed_tool","Elapsed":0} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/lowered_reasoning"} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/lowered_reasoning","Output":"=== RUN TestMode1SemanticGuardStillRejectsActualLoss/lowered_reasoning\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/lowered_reasoning","Output":"--- PASS: TestMode1SemanticGuardStillRejectsActualLoss/lowered_reasoning (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/lowered_reasoning","Elapsed":0} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/lost_Astra_mode"} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/lost_Astra_mode","Output":"=== RUN TestMode1SemanticGuardStillRejectsActualLoss/lost_Astra_mode\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/lost_Astra_mode","Output":"--- PASS: TestMode1SemanticGuardStillRejectsActualLoss/lost_Astra_mode (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/lost_Astra_mode","Elapsed":0} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/changed_model"} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/changed_model","Output":"=== RUN TestMode1SemanticGuardStillRejectsActualLoss/changed_model\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/changed_model","Output":"--- PASS: TestMode1SemanticGuardStillRejectsActualLoss/changed_model (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/changed_model","Elapsed":0} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/changed_budget"} {"Time":"2026-09-12T11:42:35.2461963+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/changed_budget","Output":"=== RUN TestMode1SemanticGuardStillRejectsActualLoss/changed_budget\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2467042+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/changed_budget","Output":"--- PASS: TestMode1SemanticGuardStillRejectsActualLoss/changed_budget (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2467042+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/changed_budget","Elapsed":0} {"Time":"2026-09-12T11:42:35.2467042+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/lost_continuity"} {"Time":"2026-09-12T11:42:35.2467042+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/lost_continuity","Output":"=== RUN TestMode1SemanticGuardStillRejectsActualLoss/lost_continuity\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2467042+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/lost_continuity","Output":"--- PASS: TestMode1SemanticGuardStillRejectsActualLoss/lost_continuity (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2467042+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss/lost_continuity","Elapsed":0} {"Time":"2026-09-12T11:42:35.2467042+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss","Output":"--- PASS: TestMode1SemanticGuardStillRejectsActualLoss (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2467042+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1SemanticGuardStillRejectsActualLoss","Elapsed":0} {"Time":"2026-09-12T11:42:35.2467042+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1GuardAcceptsActualCodexTransform"} {"Time":"2026-09-12T11:42:35.2467042+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1GuardAcceptsActualCodexTransform","Output":"=== RUN TestMode1GuardAcceptsActualCodexTransform\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2467042+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1GuardAcceptsActualCodexTransform","Output":"--- PASS: TestMode1GuardAcceptsActualCodexTransform (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2467042+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1GuardAcceptsActualCodexTransform","Elapsed":0} {"Time":"2026-09-12T11:42:35.2467042+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1GuardRejectsInvalidJSON"} {"Time":"2026-09-12T11:42:35.2467042+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1GuardRejectsInvalidJSON","Output":"=== RUN TestMode1GuardRejectsInvalidJSON\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2467042+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1GuardRejectsInvalidJSON","Output":"--- PASS: TestMode1GuardRejectsInvalidJSON (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2467042+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1GuardRejectsInvalidJSON","Elapsed":0} {"Time":"2026-09-12T11:42:35.2467042+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1V3StandardWSSPoolSeparatesConversations"} {"Time":"2026-09-12T11:42:35.2467042+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1V3StandardWSSPoolSeparatesConversations","Output":"=== RUN TestMode1V3StandardWSSPoolSeparatesConversations\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2508269+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1V3StandardWSSPoolSeparatesConversations","Output":"--- PASS: TestMode1V3StandardWSSPoolSeparatesConversations (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2508269+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1V3StandardWSSPoolSeparatesConversations","Elapsed":0} {"Time":"2026-09-12T11:42:35.2508269+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1V3WSPassthroughAcceptsCompatibilityFrames"} {"Time":"2026-09-12T11:42:35.2508269+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1V3WSPassthroughAcceptsCompatibilityFrames","Output":"=== RUN TestMode1V3WSPassthroughAcceptsCompatibilityFrames\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.2513366+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1V3WSPassthroughAcceptsCompatibilityFrames","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:35.251Z\",\"msg\":\"[OpenAI WS v2 passthrough] ws_mode=passthrough ws_router=v2 relay_start account_id=72 model=gpt-5.2 previous_response_id=- first_message_type=text first_message_bytes=118\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_ws_v2\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:35.2513366+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1V3WSPassthroughAcceptsCompatibilityFrames","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:35.251Z\",\"msg\":\"[OpenAI WS v2 passthrough] ws_mode=passthrough ws_router=v2 relay_dial_start account_id=72 ws_host=chatgpt.com ws_path=/backend-api/codex/responses proxy_enabled=false\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_ws_v2\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:35.2513366+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1V3WSPassthroughAcceptsCompatibilityFrames","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:35.251Z\",\"msg\":\"openai routing decision\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_routing\",\"transport\":\"responses_websockets_v2\",\"account_id\":72,\"final_model\":\"gpt-5.2\",\"final_service_tier\":\"\",\"routing_hint_generated\":true,\"ws_affinity_decision\":\"soft_routing_hint\"}\n"} {"Time":"2026-09-12T11:42:35.2523625+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1V3WSPassthroughAcceptsCompatibilityFrames","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:35.252Z\",\"msg\":\"[OpenAI WS v2 passthrough] ws_mode=passthrough ws_router=v2 relay_dial_ok account_id=72 status_code=101 upstream_request_id=-\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_ws_v2\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:35.2528871+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1V3WSPassthroughAcceptsCompatibilityFrames","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:35.252Z\",\"msg\":\"[OpenAI WS v2 passthrough] ws_mode=passthrough ws_router=v2 relay_trace account_id=72 stage=relay_start direction=- msg_type=text bytes=118 graceful=false wrote_downstream=false err=-\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_ws_v2\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:35.2528871+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1V3WSPassthroughAcceptsCompatibilityFrames","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:35.252Z\",\"msg\":\"[OpenAI WS v2 passthrough] ws_mode=passthrough ws_router=v2 relay_trace account_id=72 stage=write_first_message_skipped direction=client_to_upstream msg_type=text bytes=118 graceful=false wrote_downstream=false err=-\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_ws_v2\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:35.2528871+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1V3WSPassthroughAcceptsCompatibilityFrames","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:35.252Z\",\"msg\":\"[OpenAI WS v2 passthrough] ws_mode=passthrough ws_router=v2 relay_turn_completed account_id=72 turn=1 request_id=resp_local terminal_event=response.completed turn_requested_model=gpt-5.2 turn_upstream_model=gpt-5.2 duration_ms=0 first_token_ms=-1 input_tokens=0 output_tokens=0 cache_read_tokens=0\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_ws_v2\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:35.2528871+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1V3WSPassthroughAcceptsCompatibilityFrames","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:35.252Z\",\"msg\":\"[OpenAI WS v2 passthrough] ws_mode=passthrough ws_router=v2 relay_turn_completed account_id=72 turn=2 request_id=resp_local terminal_event=response.completed turn_requested_model=gpt-5.2 turn_upstream_model=gpt-5.2 duration_ms=0 first_token_ms=-1 input_tokens=0 output_tokens=0 cache_read_tokens=0\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_ws_v2\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:35.2533979+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1V3WSPassthroughAcceptsCompatibilityFrames","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:35.252Z\",\"msg\":\"[OpenAI WS v2 passthrough] ws_mode=passthrough ws_router=v2 relay_trace account_id=72 stage=read_client_fail direction=client_to_upstream msg_type=- bytes=0 graceful=true wrote_downstream=false err=fail to get reader: received close frame: status = StatusNormalClosure and reason = \\\"done\\\"\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_ws_v2\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:35.2533979+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1V3WSPassthroughAcceptsCompatibilityFrames","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:35.253Z\",\"msg\":\"[OpenAI WS v2 passthrough] ws_mode=passthrough ws_router=v2 relay_trace account_id=72 stage=first_exit direction=client_to_upstream msg_type=- bytes=0 graceful=true wrote_downstream=false err=fail to get reader: received close frame: status = StatusNormalClosure and reason = \\\"done\\\"\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_ws_v2\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:35.6010058+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/pkg/tlsfingerprint","Output":"testing: warning: no tests to run\n"} {"Time":"2026-09-12T11:42:35.6010058+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/pkg/tlsfingerprint","Output":"PASS\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:35.6021018+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/pkg/tlsfingerprint","Output":"ok \tgithub.com/Wei-Shaw/sub2api/internal/pkg/tlsfingerprint\t0.799s [no tests to run]\n"} {"Time":"2026-09-12T11:42:35.6021018+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/pkg/tlsfingerprint","Elapsed":0.799} {"Time":"2026-09-12T11:42:36.4541858+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1V3WSPassthroughAcceptsCompatibilityFrames","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:36.454Z\",\"msg\":\"[OpenAI WS v2 passthrough] ws_mode=passthrough ws_router=v2 relay_trace account_id=72 stage=read_upstream_fail direction=upstream_to_client msg_type=- bytes=0 graceful=true wrote_downstream=true err=context canceled\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_ws_v2\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:36.4541858+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1V3WSPassthroughAcceptsCompatibilityFrames","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:36.454Z\",\"msg\":\"[OpenAI WS v2 passthrough] ws_mode=passthrough ws_router=v2 relay_trace account_id=72 stage=relay_client_closed direction=- msg_type=- bytes=0 graceful=true wrote_downstream=false err=-\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_ws_v2\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:36.4541858+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1V3WSPassthroughAcceptsCompatibilityFrames","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:36.454Z\",\"msg\":\"[OpenAI WS v2 passthrough] ws_mode=passthrough ws_router=v2 relay_completed account_id=72 request_id=resp_local terminal_event=response.completed duration_ms=1201 c2u_frames=2 u2c_frames=4 dropped_frames=0 turns=2\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_ws_v2\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:36.4541858+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1V3WSPassthroughAcceptsCompatibilityFrames","Output":"--- PASS: TestMode1V3WSPassthroughAcceptsCompatibilityFrames (1.20s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4541858+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1V3WSPassthroughAcceptsCompatibilityFrames","Elapsed":1.2} {"Time":"2026-09-12T11:42:36.4541858+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeKnownOpenAICodexModelGPT6Astra"} {"Time":"2026-09-12T11:42:36.4541858+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeKnownOpenAICodexModelGPT6Astra","Output":"=== RUN TestNormalizeKnownOpenAICodexModelGPT6Astra\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4541858+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeKnownOpenAICodexModelGPT6Astra","Output":"--- PASS: TestNormalizeKnownOpenAICodexModelGPT6Astra (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4541858+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeKnownOpenAICodexModelGPT6Astra","Elapsed":0} {"Time":"2026-09-12T11:42:36.4541858+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeKnownOpenAICodexModel_BareGPT56RoutesToSol"} {"Time":"2026-09-12T11:42:36.4541858+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeKnownOpenAICodexModel_BareGPT56RoutesToSol","Output":"=== RUN TestNormalizeKnownOpenAICodexModel_BareGPT56RoutesToSol\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4541858+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeKnownOpenAICodexModel_BareGPT56RoutesToSol/openai/gpt-5.6"} {"Time":"2026-09-12T11:42:36.4541858+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeKnownOpenAICodexModel_BareGPT56RoutesToSol/openai/gpt-5.6","Output":"=== RUN TestNormalizeKnownOpenAICodexModel_BareGPT56RoutesToSol/openai/gpt-5.6\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4541858+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeKnownOpenAICodexModel_BareGPT56RoutesToSol/openai/gpt-5.6","Output":"--- PASS: TestNormalizeKnownOpenAICodexModel_BareGPT56RoutesToSol/openai/gpt-5.6 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4541858+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeKnownOpenAICodexModel_BareGPT56RoutesToSol/openai/gpt-5.6","Elapsed":0} {"Time":"2026-09-12T11:42:36.4541858+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeKnownOpenAICodexModel_BareGPT56RoutesToSol/gpt5.6"} {"Time":"2026-09-12T11:42:36.4541858+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeKnownOpenAICodexModel_BareGPT56RoutesToSol/gpt5.6","Output":"=== RUN TestNormalizeKnownOpenAICodexModel_BareGPT56RoutesToSol/gpt5.6\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4541858+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeKnownOpenAICodexModel_BareGPT56RoutesToSol/gpt5.6","Output":"--- PASS: TestNormalizeKnownOpenAICodexModel_BareGPT56RoutesToSol/gpt5.6 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4541858+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeKnownOpenAICodexModel_BareGPT56RoutesToSol/gpt5.6","Elapsed":0} {"Time":"2026-09-12T11:42:36.4541858+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeKnownOpenAICodexModel_BareGPT56RoutesToSol/gpt-5.6-high"} {"Time":"2026-09-12T11:42:36.4541858+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeKnownOpenAICodexModel_BareGPT56RoutesToSol/gpt-5.6-high","Output":"=== RUN TestNormalizeKnownOpenAICodexModel_BareGPT56RoutesToSol/gpt-5.6-high\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4541858+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeKnownOpenAICodexModel_BareGPT56RoutesToSol/gpt-5.6-high","Output":"--- PASS: TestNormalizeKnownOpenAICodexModel_BareGPT56RoutesToSol/gpt-5.6-high (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4541858+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeKnownOpenAICodexModel_BareGPT56RoutesToSol/gpt-5.6-high","Elapsed":0} {"Time":"2026-09-12T11:42:36.4541858+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeKnownOpenAICodexModel_BareGPT56RoutesToSol/gpt-5.6-max"} {"Time":"2026-09-12T11:42:36.4541858+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeKnownOpenAICodexModel_BareGPT56RoutesToSol/gpt-5.6-max","Output":"=== RUN TestNormalizeKnownOpenAICodexModel_BareGPT56RoutesToSol/gpt-5.6-max\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4541858+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeKnownOpenAICodexModel_BareGPT56RoutesToSol/gpt-5.6-max","Output":"--- PASS: TestNormalizeKnownOpenAICodexModel_BareGPT56RoutesToSol/gpt-5.6-max (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4541858+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeKnownOpenAICodexModel_BareGPT56RoutesToSol/gpt-5.6-max","Elapsed":0} {"Time":"2026-09-12T11:42:36.4541858+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeKnownOpenAICodexModel_BareGPT56RoutesToSol/gpt-5.6-2026-07-09"} {"Time":"2026-09-12T11:42:36.4541858+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeKnownOpenAICodexModel_BareGPT56RoutesToSol/gpt-5.6-2026-07-09","Output":"=== RUN TestNormalizeKnownOpenAICodexModel_BareGPT56RoutesToSol/gpt-5.6-2026-07-09\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.454854+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeKnownOpenAICodexModel_BareGPT56RoutesToSol/gpt-5.6-2026-07-09","Output":"--- PASS: TestNormalizeKnownOpenAICodexModel_BareGPT56RoutesToSol/gpt-5.6-2026-07-09 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.454854+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeKnownOpenAICodexModel_BareGPT56RoutesToSol/gpt-5.6-2026-07-09","Elapsed":0} {"Time":"2026-09-12T11:42:36.454854+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeKnownOpenAICodexModel_BareGPT56RoutesToSol/openai/gpt-5.6-max"} {"Time":"2026-09-12T11:42:36.454854+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeKnownOpenAICodexModel_BareGPT56RoutesToSol/openai/gpt-5.6-max","Output":"=== RUN TestNormalizeKnownOpenAICodexModel_BareGPT56RoutesToSol/openai/gpt-5.6-max\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.454854+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeKnownOpenAICodexModel_BareGPT56RoutesToSol/openai/gpt-5.6-max","Output":"--- PASS: TestNormalizeKnownOpenAICodexModel_BareGPT56RoutesToSol/openai/gpt-5.6-max (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.454854+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeKnownOpenAICodexModel_BareGPT56RoutesToSol/openai/gpt-5.6-max","Elapsed":0} {"Time":"2026-09-12T11:42:36.454854+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeKnownOpenAICodexModel_BareGPT56RoutesToSol/gpt-5.6"} {"Time":"2026-09-12T11:42:36.454854+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeKnownOpenAICodexModel_BareGPT56RoutesToSol/gpt-5.6","Output":"=== RUN TestNormalizeKnownOpenAICodexModel_BareGPT56RoutesToSol/gpt-5.6\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.454854+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeKnownOpenAICodexModel_BareGPT56RoutesToSol/gpt-5.6","Output":"--- PASS: TestNormalizeKnownOpenAICodexModel_BareGPT56RoutesToSol/gpt-5.6 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.454854+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeKnownOpenAICodexModel_BareGPT56RoutesToSol/gpt-5.6","Elapsed":0} {"Time":"2026-09-12T11:42:36.454854+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeKnownOpenAICodexModel_BareGPT56RoutesToSol","Output":"--- PASS: TestNormalizeKnownOpenAICodexModel_BareGPT56RoutesToSol (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.454854+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeKnownOpenAICodexModel_BareGPT56RoutesToSol","Elapsed":0} {"Time":"2026-09-12T11:42:36.454854+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeCodexModel"} {"Time":"2026-09-12T11:42:36.454854+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeCodexModel","Output":"=== RUN TestNormalizeCodexModel\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.454854+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeCodexModel","Output":"--- PASS: TestNormalizeCodexModel (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.454854+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNormalizeCodexModel","Elapsed":0} {"Time":"2026-09-12T11:42:36.454854+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestUsageBillingModelCandidatesPreserveCodexAutoReviewModel"} {"Time":"2026-09-12T11:42:36.454854+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestUsageBillingModelCandidatesPreserveCodexAutoReviewModel","Output":"=== RUN TestUsageBillingModelCandidatesPreserveCodexAutoReviewModel\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.454854+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestUsageBillingModelCandidatesPreserveCodexAutoReviewModel","Output":"--- PASS: TestUsageBillingModelCandidatesPreserveCodexAutoReviewModel (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.454854+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestUsageBillingModelCandidatesPreserveCodexAutoReviewModel","Elapsed":0} {"Time":"2026-09-12T11:42:36.454854+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchOpenAIModelsListUsesStandardRequestAndIsolatesCodexCache"} {"Time":"2026-09-12T11:42:36.454854+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchOpenAIModelsListUsesStandardRequestAndIsolatesCodexCache","Output":"=== RUN TestFetchOpenAIModelsListUsesStandardRequestAndIsolatesCodexCache\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.454854+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchOpenAIModelsListUsesStandardRequestAndIsolatesCodexCache","Output":"--- PASS: TestFetchOpenAIModelsListUsesStandardRequestAndIsolatesCodexCache (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.454854+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFetchOpenAIModelsListUsesStandardRequestAndIsolatesCodexCache","Elapsed":0} {"Time":"2026-09-12T11:42:36.454854+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestProjectAccountModelsCannotExposeCodexMediaThroughAlias"} {"Time":"2026-09-12T11:42:36.454854+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestProjectAccountModelsCannotExposeCodexMediaThroughAlias","Output":"=== RUN TestProjectAccountModelsCannotExposeCodexMediaThroughAlias\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.454854+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestProjectAccountModelsCannotExposeCodexMediaThroughAlias","Output":"--- PASS: TestProjectAccountModelsCannotExposeCodexMediaThroughAlias (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.454854+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestProjectAccountModelsCannotExposeCodexMediaThroughAlias","Elapsed":0} {"Time":"2026-09-12T11:42:36.454854+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_OAuthPassthrough_CodexMissingInstructionsGetsDefault"} {"Time":"2026-09-12T11:42:36.454854+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_OAuthPassthrough_CodexMissingInstructionsGetsDefault","Output":"=== RUN TestOpenAIGatewayService_OAuthPassthrough_CodexMissingInstructionsGetsDefault\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.454854+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_OAuthPassthrough_CodexMissingInstructionsGetsDefault/stream=false"} {"Time":"2026-09-12T11:42:36.454854+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_OAuthPassthrough_CodexMissingInstructionsGetsDefault/stream=false","Output":"=== RUN TestOpenAIGatewayService_OAuthPassthrough_CodexMissingInstructionsGetsDefault/stream=false\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4553685+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_OAuthPassthrough_CodexMissingInstructionsGetsDefault/stream=false","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:36.455Z\",\"msg\":\"[OpenAI 自动透传] 命中自动透传分支: account=123 name=acc type=oauth model=gpt-5.1-codex-max stream=false\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:36.4553685+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_OAuthPassthrough_CodexMissingInstructionsGetsDefault/stream=false","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:36.455Z\",\"msg\":\"openai routing decision\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_routing\",\"transport\":\"http_passthrough\",\"account_id\":123,\"final_model\":\"gpt-5.1-codex-max\",\"final_service_tier\":\"\",\"routing_hint_generated\":true,\"ws_affinity_decision\":\"not_applicable\"}\n"} {"Time":"2026-09-12T11:42:36.4553685+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_OAuthPassthrough_CodexMissingInstructionsGetsDefault/stream=false","Output":"--- PASS: TestOpenAIGatewayService_OAuthPassthrough_CodexMissingInstructionsGetsDefault/stream=false (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4558797+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_OAuthPassthrough_CodexMissingInstructionsGetsDefault/stream=false","Elapsed":0} {"Time":"2026-09-12T11:42:36.4558797+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_OAuthPassthrough_CodexMissingInstructionsGetsDefault/stream=true"} {"Time":"2026-09-12T11:42:36.4558797+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_OAuthPassthrough_CodexMissingInstructionsGetsDefault/stream=true","Output":"=== RUN TestOpenAIGatewayService_OAuthPassthrough_CodexMissingInstructionsGetsDefault/stream=true\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4558797+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_OAuthPassthrough_CodexMissingInstructionsGetsDefault/stream=true","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:36.455Z\",\"msg\":\"[OpenAI 自动透传] 命中自动透传分支: account=123 name=acc type=oauth model=gpt-5.1-codex-max stream=true\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:36.4558797+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_OAuthPassthrough_CodexMissingInstructionsGetsDefault/stream=true","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:36.455Z\",\"msg\":\"openai routing decision\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_routing\",\"transport\":\"http_passthrough\",\"account_id\":123,\"final_model\":\"gpt-5.1-codex-max\",\"final_service_tier\":\"\",\"routing_hint_generated\":true,\"ws_affinity_decision\":\"not_applicable\"}\n"} {"Time":"2026-09-12T11:42:36.45639+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_OAuthPassthrough_CodexMissingInstructionsGetsDefault/stream=true","Output":"--- PASS: TestOpenAIGatewayService_OAuthPassthrough_CodexMissingInstructionsGetsDefault/stream=true (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.45639+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_OAuthPassthrough_CodexMissingInstructionsGetsDefault/stream=true","Elapsed":0} {"Time":"2026-09-12T11:42:36.45639+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_OAuthPassthrough_CodexMissingInstructionsGetsDefault","Output":"--- PASS: TestOpenAIGatewayService_OAuthPassthrough_CodexMissingInstructionsGetsDefault (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.45639+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_OAuthPassthrough_CodexMissingInstructionsGetsDefault","Elapsed":0} {"Time":"2026-09-12T11:42:36.45639+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_OAuthLegacy_CompositeCodexUAUsesCodexOriginator"} {"Time":"2026-09-12T11:42:36.45639+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_OAuthLegacy_CompositeCodexUAUsesCodexOriginator","Output":"=== RUN TestOpenAIGatewayService_OAuthLegacy_CompositeCodexUAUsesCodexOriginator\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4574044+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_OAuthLegacy_CompositeCodexUAUsesCodexOriginator","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:36.457Z\",\"msg\":\"openai routing decision\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_routing\",\"transport\":\"http\",\"account_id\":123,\"final_model\":\"gpt-5.2\",\"final_service_tier\":\"\",\"routing_hint_generated\":true,\"ws_affinity_decision\":\"not_applicable\"}\n"} {"Time":"2026-09-12T11:42:36.4574044+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_OAuthLegacy_CompositeCodexUAUsesCodexOriginator","Output":"--- PASS: TestOpenAIGatewayService_OAuthLegacy_CompositeCodexUAUsesCodexOriginator (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4574044+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_OAuthLegacy_CompositeCodexUAUsesCodexOriginator","Elapsed":0} {"Time":"2026-09-12T11:42:36.4574044+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_OAuthPassthrough_ResponseHeadersAllowXCodex"} {"Time":"2026-09-12T11:42:36.4574044+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_OAuthPassthrough_ResponseHeadersAllowXCodex","Output":"=== RUN TestOpenAIGatewayService_OAuthPassthrough_ResponseHeadersAllowXCodex\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4574044+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_OAuthPassthrough_ResponseHeadersAllowXCodex","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:36.457Z\",\"msg\":\"[OpenAI 自动透传] 命中自动透传分支: account=123 name=acc type=oauth model=gpt-5.2 stream=true\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:36.4574044+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_OAuthPassthrough_ResponseHeadersAllowXCodex","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:36.457Z\",\"msg\":\"openai routing decision\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_routing\",\"transport\":\"http_passthrough\",\"account_id\":123,\"final_model\":\"gpt-5.2\",\"final_service_tier\":\"\",\"routing_hint_generated\":true,\"ws_affinity_decision\":\"not_applicable\"}\n"} {"Time":"2026-09-12T11:42:36.4574044+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_OAuthPassthrough_ResponseHeadersAllowXCodex","Output":"--- PASS: TestOpenAIGatewayService_OAuthPassthrough_ResponseHeadersAllowXCodex (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4574044+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_OAuthPassthrough_ResponseHeadersAllowXCodex","Elapsed":0} {"Time":"2026-09-12T11:42:36.4574044+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_OAuthPassthrough_NonCodexUAFallbackToCodexUA"} {"Time":"2026-09-12T11:42:36.4574044+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_OAuthPassthrough_NonCodexUAFallbackToCodexUA","Output":"=== RUN TestOpenAIGatewayService_OAuthPassthrough_NonCodexUAFallbackToCodexUA\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4574044+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_OAuthPassthrough_NonCodexUAFallbackToCodexUA","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:36.457Z\",\"msg\":\"[OpenAI 自动透传] 命中自动透传分支: account=123 name=acc type=oauth model=gpt-5.2 stream=true\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:36.4579122+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_OAuthPassthrough_NonCodexUAFallbackToCodexUA","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:36.457Z\",\"msg\":\"openai routing decision\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_routing\",\"transport\":\"http_passthrough\",\"account_id\":123,\"final_model\":\"gpt-5.2\",\"final_service_tier\":\"\",\"routing_hint_generated\":true,\"ws_affinity_decision\":\"not_applicable\"}\n"} {"Time":"2026-09-12T11:42:36.4579122+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_OAuthPassthrough_NonCodexUAFallbackToCodexUA","Output":"--- PASS: TestOpenAIGatewayService_OAuthPassthrough_NonCodexUAFallbackToCodexUA (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4579122+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_OAuthPassthrough_NonCodexUAFallbackToCodexUA","Elapsed":0} {"Time":"2026-09-12T11:42:36.4579122+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_OAuthPassthrough_CodexTuiIdentityUnified"} {"Time":"2026-09-12T11:42:36.4579122+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_OAuthPassthrough_CodexTuiIdentityUnified","Output":"=== RUN TestOpenAIGatewayService_OAuthPassthrough_CodexTuiIdentityUnified\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4579122+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_OAuthPassthrough_CodexTuiIdentityUnified","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:36.457Z\",\"msg\":\"[OpenAI 自动透传] 命中自动透传分支: account=123 name=acc type=oauth model=gpt-5.2 stream=true\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:36.4579122+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_OAuthPassthrough_CodexTuiIdentityUnified","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:36.457Z\",\"msg\":\"openai routing decision\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_routing\",\"transport\":\"http_passthrough\",\"account_id\":123,\"final_model\":\"gpt-5.2\",\"final_service_tier\":\"\",\"routing_hint_generated\":true,\"ws_affinity_decision\":\"not_applicable\"}\n"} {"Time":"2026-09-12T11:42:36.4579122+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_OAuthPassthrough_CodexTuiIdentityUnified","Output":"--- PASS: TestOpenAIGatewayService_OAuthPassthrough_CodexTuiIdentityUnified (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4579122+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_OAuthPassthrough_CodexTuiIdentityUnified","Elapsed":0} {"Time":"2026-09-12T11:42:36.4579122+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexFingerprintHTTPTransformedHeaderBodyParityAndDefaultCacheKey"} {"Time":"2026-09-12T11:42:36.4579122+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexFingerprintHTTPTransformedHeaderBodyParityAndDefaultCacheKey","Output":"=== RUN TestOpenAIGatewayService_CodexFingerprintHTTPTransformedHeaderBodyParityAndDefaultCacheKey\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4584958+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexFingerprintHTTPTransformedHeaderBodyParityAndDefaultCacheKey","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:36.458Z\",\"msg\":\"openai routing decision\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_routing\",\"transport\":\"http\",\"account_id\":4401,\"final_model\":\"gpt-5.2\",\"final_service_tier\":\"\",\"routing_hint_generated\":true,\"ws_affinity_decision\":\"not_applicable\"}\n"} {"Time":"2026-09-12T11:42:36.459045+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexFingerprintHTTPTransformedHeaderBodyParityAndDefaultCacheKey","Output":"--- PASS: TestOpenAIGatewayService_CodexFingerprintHTTPTransformedHeaderBodyParityAndDefaultCacheKey (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.459045+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexFingerprintHTTPTransformedHeaderBodyParityAndDefaultCacheKey","Elapsed":0} {"Time":"2026-09-12T11:42:36.459045+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexFingerprintHTTPRawPassthroughHeaderBodyParityAndDefaultCacheKey"} {"Time":"2026-09-12T11:42:36.459045+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexFingerprintHTTPRawPassthroughHeaderBodyParityAndDefaultCacheKey","Output":"=== RUN TestOpenAIGatewayService_CodexFingerprintHTTPRawPassthroughHeaderBodyParityAndDefaultCacheKey\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.459045+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexFingerprintHTTPRawPassthroughHeaderBodyParityAndDefaultCacheKey","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:36.459Z\",\"msg\":\"[OpenAI 自动透传] 命中自动透传分支: account=4402 name=oauth-raw type=oauth model=gpt-5.6-sol stream=true\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:36.459045+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexFingerprintHTTPRawPassthroughHeaderBodyParityAndDefaultCacheKey","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:36.459Z\",\"msg\":\"openai routing decision\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_routing\",\"transport\":\"http_passthrough\",\"account_id\":4402,\"final_model\":\"gpt-5.6-sol\",\"final_service_tier\":\"\",\"routing_hint_generated\":true,\"ws_affinity_decision\":\"not_applicable\"}\n"} {"Time":"2026-09-12T11:42:36.459045+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexFingerprintHTTPRawPassthroughHeaderBodyParityAndDefaultCacheKey","Output":"--- PASS: TestOpenAIGatewayService_CodexFingerprintHTTPRawPassthroughHeaderBodyParityAndDefaultCacheKey (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.459045+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexFingerprintHTTPRawPassthroughHeaderBodyParityAndDefaultCacheKey","Elapsed":0} {"Time":"2026-09-12T11:42:36.459045+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexFingerprintCompactDoesNotRewriteBodyCacheKeyOrMetadata"} {"Time":"2026-09-12T11:42:36.459045+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexFingerprintCompactDoesNotRewriteBodyCacheKeyOrMetadata","Output":"=== RUN TestOpenAIGatewayService_CodexFingerprintCompactDoesNotRewriteBodyCacheKeyOrMetadata\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4596233+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexFingerprintCompactDoesNotRewriteBodyCacheKeyOrMetadata","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:36.459Z\",\"msg\":\"openai routing decision\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_routing\",\"transport\":\"http\",\"account_id\":4403,\"final_model\":\"gpt-5.4\",\"final_service_tier\":\"\",\"routing_hint_generated\":true,\"ws_affinity_decision\":\"not_applicable\"}\n"} {"Time":"2026-09-12T11:42:36.4601834+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexFingerprintCompactDoesNotRewriteBodyCacheKeyOrMetadata","Output":"--- PASS: TestOpenAIGatewayService_CodexFingerprintCompactDoesNotRewriteBodyCacheKeyOrMetadata (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4601834+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexFingerprintCompactDoesNotRewriteBodyCacheKeyOrMetadata","Elapsed":0} {"Time":"2026-09-12T11:42:36.4601834+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexFingerprintMessagesBridgeDoesNotInjectBodyPromptCacheKey"} {"Time":"2026-09-12T11:42:36.4601834+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexFingerprintMessagesBridgeDoesNotInjectBodyPromptCacheKey","Output":"=== RUN TestOpenAIGatewayService_CodexFingerprintMessagesBridgeDoesNotInjectBodyPromptCacheKey\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4601834+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexFingerprintMessagesBridgeDoesNotInjectBodyPromptCacheKey","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:36.460Z\",\"msg\":\"openai routing decision\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_routing\",\"transport\":\"http\",\"account_id\":4404,\"final_model\":\"gpt-5.5\",\"final_service_tier\":\"\",\"routing_hint_generated\":true,\"ws_affinity_decision\":\"not_applicable\"}\n"} {"Time":"2026-09-12T11:42:36.4601834+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexFingerprintMessagesBridgeDoesNotInjectBodyPromptCacheKey","Output":"--- PASS: TestOpenAIGatewayService_CodexFingerprintMessagesBridgeDoesNotInjectBodyPromptCacheKey (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4601834+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexFingerprintMessagesBridgeDoesNotInjectBodyPromptCacheKey","Elapsed":0} {"Time":"2026-09-12T11:42:36.4601834+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexCLIOnly_RejectsNonCodexClient"} {"Time":"2026-09-12T11:42:36.4601834+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexCLIOnly_RejectsNonCodexClient","Output":"=== RUN TestOpenAIGatewayService_CodexCLIOnly_RejectsNonCodexClient\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4601834+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexCLIOnly_RejectsNonCodexClient","Output":"{\"level\":\"WARN\",\"time\":\"2026-09-12T03:42:36.460Z\",\"msg\":\"OpenAI codex_cli_only 拒绝非官方客户端请求\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"account_id\":123,\"codex_cli_only_enabled\":true,\"codex_official_client_match\":false,\"reject_reason\":\"official_client_user_agent_not_matched\",\"request_method\":\"POST\",\"request_path\":\"/v1/responses\",\"request_query\":\"\",\"request_host\":\"example.com\",\"request_client_ip\":\"192.0.2.1\",\"request_remote_addr\":\"192.0.2.1:1234\",\"request_user_agent\":\"curl/8.0\",\"request_content_type\":\"\",\"request_content_length\":0,\"request_stream\":false,\"request_model\":\"gpt-5.2\",\"request_headers\":{\"user-agent\":\"curl/8.0\"},\"request_body_size\":85}\n"} {"Time":"2026-09-12T11:42:36.4601834+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexCLIOnly_RejectsNonCodexClient","Output":"--- PASS: TestOpenAIGatewayService_CodexCLIOnly_RejectsNonCodexClient (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4601834+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexCLIOnly_RejectsNonCodexClient","Elapsed":0} {"Time":"2026-09-12T11:42:36.4601834+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexCLIOnly_AllowOfficialClientFamilies"} {"Time":"2026-09-12T11:42:36.4601834+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexCLIOnly_AllowOfficialClientFamilies","Output":"=== RUN TestOpenAIGatewayService_CodexCLIOnly_AllowOfficialClientFamilies\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4601834+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexCLIOnly_AllowOfficialClientFamilies/codex_cli_rs"} {"Time":"2026-09-12T11:42:36.4601834+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexCLIOnly_AllowOfficialClientFamilies/codex_cli_rs","Output":"=== RUN TestOpenAIGatewayService_CodexCLIOnly_AllowOfficialClientFamilies/codex_cli_rs\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4601834+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexCLIOnly_AllowOfficialClientFamilies/codex_cli_rs","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:36.460Z\",\"msg\":\"OpenAI codex_cli_only 放行请求\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"account_id\":123,\"codex_cli_only_enabled\":true,\"codex_official_client_match\":true,\"reject_reason\":\"official_client_user_agent_matched\"}\n"} {"Time":"2026-09-12T11:42:36.4601834+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexCLIOnly_AllowOfficialClientFamilies/codex_cli_rs","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:36.460Z\",\"msg\":\"[OpenAI 自动透传] 命中自动透传分支: account=123 name=acc type=oauth model=gpt-5.2 stream=true\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:36.4601834+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexCLIOnly_AllowOfficialClientFamilies/codex_cli_rs","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:36.460Z\",\"msg\":\"openai routing decision\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_routing\",\"transport\":\"http_passthrough\",\"account_id\":123,\"final_model\":\"gpt-5.2\",\"final_service_tier\":\"\",\"routing_hint_generated\":true,\"ws_affinity_decision\":\"not_applicable\"}\n"} {"Time":"2026-09-12T11:42:36.4601834+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexCLIOnly_AllowOfficialClientFamilies/codex_cli_rs","Output":"--- PASS: TestOpenAIGatewayService_CodexCLIOnly_AllowOfficialClientFamilies/codex_cli_rs (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4601834+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexCLIOnly_AllowOfficialClientFamilies/codex_cli_rs","Elapsed":0} {"Time":"2026-09-12T11:42:36.4601834+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexCLIOnly_AllowOfficialClientFamilies/codex_vscode"} {"Time":"2026-09-12T11:42:36.4601834+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexCLIOnly_AllowOfficialClientFamilies/codex_vscode","Output":"=== RUN TestOpenAIGatewayService_CodexCLIOnly_AllowOfficialClientFamilies/codex_vscode\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4601834+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexCLIOnly_AllowOfficialClientFamilies/codex_vscode","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:36.460Z\",\"msg\":\"OpenAI codex_cli_only 放行请求\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"account_id\":123,\"codex_cli_only_enabled\":true,\"codex_official_client_match\":true,\"reject_reason\":\"official_client_user_agent_matched\"}\n"} {"Time":"2026-09-12T11:42:36.46075+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexCLIOnly_AllowOfficialClientFamilies/codex_vscode","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:36.460Z\",\"msg\":\"[OpenAI 自动透传] 命中自动透传分支: account=123 name=acc type=oauth model=gpt-5.2 stream=true\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:36.46075+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexCLIOnly_AllowOfficialClientFamilies/codex_vscode","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:36.460Z\",\"msg\":\"openai routing decision\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_routing\",\"transport\":\"http_passthrough\",\"account_id\":123,\"final_model\":\"gpt-5.2\",\"final_service_tier\":\"\",\"routing_hint_generated\":true,\"ws_affinity_decision\":\"not_applicable\"}\n"} {"Time":"2026-09-12T11:42:36.46075+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexCLIOnly_AllowOfficialClientFamilies/codex_vscode","Output":"--- PASS: TestOpenAIGatewayService_CodexCLIOnly_AllowOfficialClientFamilies/codex_vscode (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.46075+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexCLIOnly_AllowOfficialClientFamilies/codex_vscode","Elapsed":0} {"Time":"2026-09-12T11:42:36.46075+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexCLIOnly_AllowOfficialClientFamilies/codex_app"} {"Time":"2026-09-12T11:42:36.46075+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexCLIOnly_AllowOfficialClientFamilies/codex_app","Output":"=== RUN TestOpenAIGatewayService_CodexCLIOnly_AllowOfficialClientFamilies/codex_app\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.46075+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexCLIOnly_AllowOfficialClientFamilies/codex_app","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:36.460Z\",\"msg\":\"OpenAI codex_cli_only 放行请求\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"account_id\":123,\"codex_cli_only_enabled\":true,\"codex_official_client_match\":true,\"reject_reason\":\"official_client_user_agent_matched\"}\n"} {"Time":"2026-09-12T11:42:36.46075+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexCLIOnly_AllowOfficialClientFamilies/codex_app","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:36.460Z\",\"msg\":\"[OpenAI 自动透传] 命中自动透传分支: account=123 name=acc type=oauth model=gpt-5.2 stream=true\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:36.46075+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexCLIOnly_AllowOfficialClientFamilies/codex_app","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:36.460Z\",\"msg\":\"openai routing decision\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_routing\",\"transport\":\"http_passthrough\",\"account_id\":123,\"final_model\":\"gpt-5.2\",\"final_service_tier\":\"\",\"routing_hint_generated\":true,\"ws_affinity_decision\":\"not_applicable\"}\n"} {"Time":"2026-09-12T11:42:36.46075+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexCLIOnly_AllowOfficialClientFamilies/codex_app","Output":"--- PASS: TestOpenAIGatewayService_CodexCLIOnly_AllowOfficialClientFamilies/codex_app (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.46075+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexCLIOnly_AllowOfficialClientFamilies/codex_app","Elapsed":0} {"Time":"2026-09-12T11:42:36.46075+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexCLIOnly_AllowOfficialClientFamilies/originator_codex_chatgpt_desktop"} {"Time":"2026-09-12T11:42:36.46075+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexCLIOnly_AllowOfficialClientFamilies/originator_codex_chatgpt_desktop","Output":"=== RUN TestOpenAIGatewayService_CodexCLIOnly_AllowOfficialClientFamilies/originator_codex_chatgpt_desktop\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.46075+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexCLIOnly_AllowOfficialClientFamilies/originator_codex_chatgpt_desktop","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:36.460Z\",\"msg\":\"OpenAI codex_cli_only 放行请求\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"account_id\":123,\"codex_cli_only_enabled\":true,\"codex_official_client_match\":true,\"reject_reason\":\"official_client_originator_matched\"}\n"} {"Time":"2026-09-12T11:42:36.46075+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexCLIOnly_AllowOfficialClientFamilies/originator_codex_chatgpt_desktop","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:36.460Z\",\"msg\":\"[OpenAI 自动透传] 命中自动透传分支: account=123 name=acc type=oauth model=gpt-5.2 stream=true\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:36.46075+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexCLIOnly_AllowOfficialClientFamilies/originator_codex_chatgpt_desktop","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:36.460Z\",\"msg\":\"openai routing decision\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_routing\",\"transport\":\"http_passthrough\",\"account_id\":123,\"final_model\":\"gpt-5.2\",\"final_service_tier\":\"\",\"routing_hint_generated\":true,\"ws_affinity_decision\":\"not_applicable\"}\n"} {"Time":"2026-09-12T11:42:36.46075+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexCLIOnly_AllowOfficialClientFamilies/originator_codex_chatgpt_desktop","Output":"--- PASS: TestOpenAIGatewayService_CodexCLIOnly_AllowOfficialClientFamilies/originator_codex_chatgpt_desktop (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.46075+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexCLIOnly_AllowOfficialClientFamilies/originator_codex_chatgpt_desktop","Elapsed":0} {"Time":"2026-09-12T11:42:36.46075+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexCLIOnly_AllowOfficialClientFamilies","Output":"--- PASS: TestOpenAIGatewayService_CodexCLIOnly_AllowOfficialClientFamilies (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.46075+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_CodexCLIOnly_AllowOfficialClientFamilies","Elapsed":0} {"Time":"2026-09-12T11:42:36.46075+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIOAuthService_GenerateAuthURL_OpenAIKeepsCodexFlow"} {"Time":"2026-09-12T11:42:36.46075+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIOAuthService_GenerateAuthURL_OpenAIKeepsCodexFlow","Output":"=== RUN TestOpenAIOAuthService_GenerateAuthURL_OpenAIKeepsCodexFlow\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.46075+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIOAuthService_GenerateAuthURL_OpenAIKeepsCodexFlow","Output":"--- PASS: TestOpenAIOAuthService_GenerateAuthURL_OpenAIKeepsCodexFlow (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.46075+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIOAuthService_GenerateAuthURL_OpenAIKeepsCodexFlow","Elapsed":0} {"Time":"2026-09-12T11:42:36.46075+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexSparkWindowExtraUpdates_ContainsCodexKeys"} {"Time":"2026-09-12T11:42:36.46075+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexSparkWindowExtraUpdates_ContainsCodexKeys","Output":"=== RUN TestBuildCodexSparkWindowExtraUpdates_ContainsCodexKeys\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.46075+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexSparkWindowExtraUpdates_ContainsCodexKeys","Output":"--- PASS: TestBuildCodexSparkWindowExtraUpdates_ContainsCodexKeys (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.46075+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexSparkWindowExtraUpdates_ContainsCodexKeys","Elapsed":0} {"Time":"2026-09-12T11:42:36.46075+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexSparkWindowExtraUpdates_NilUsage"} {"Time":"2026-09-12T11:42:36.46075+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexSparkWindowExtraUpdates_NilUsage","Output":"=== RUN TestBuildCodexSparkWindowExtraUpdates_NilUsage\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.46075+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexSparkWindowExtraUpdates_NilUsage","Output":"--- PASS: TestBuildCodexSparkWindowExtraUpdates_NilUsage (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.46075+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexSparkWindowExtraUpdates_NilUsage","Elapsed":0} {"Time":"2026-09-12T11:42:36.46075+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexSparkWindowExtraUpdates_NoBengalfox"} {"Time":"2026-09-12T11:42:36.46075+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexSparkWindowExtraUpdates_NoBengalfox","Output":"=== RUN TestBuildCodexSparkWindowExtraUpdates_NoBengalfox\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.46075+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexSparkWindowExtraUpdates_NoBengalfox","Output":"--- PASS: TestBuildCodexSparkWindowExtraUpdates_NoBengalfox (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.46075+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexSparkWindowExtraUpdates_NoBengalfox","Elapsed":0} {"Time":"2026-09-12T11:42:36.46075+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_OAuthPreservesCodexNamespaceTools"} {"Time":"2026-09-12T11:42:36.46075+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_OAuthPreservesCodexNamespaceTools","Output":"=== RUN TestOpenAIGatewayService_OAuthPreservesCodexNamespaceTools\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.46126+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_OAuthPreservesCodexNamespaceTools","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:36.461Z\",\"msg\":\"openai routing decision\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_routing\",\"transport\":\"http\",\"account_id\":5108,\"final_model\":\"gpt-5.6-terra\",\"final_service_tier\":\"\",\"routing_hint_generated\":true,\"ws_affinity_decision\":\"not_applicable\"}\n"} {"Time":"2026-09-12T11:42:36.46126+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_OAuthPreservesCodexNamespaceTools","Output":"--- PASS: TestOpenAIGatewayService_OAuthPreservesCodexNamespaceTools (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.46126+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_OAuthPreservesCodexNamespaceTools","Elapsed":0} {"Time":"2026-09-12T11:42:36.46126+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers"} {"Time":"2026-09-12T11:42:36.46126+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers","Output":"=== RUN TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.46126+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/fast_alias"} {"Time":"2026-09-12T11:42:36.46126+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/fast_alias","Output":"=== RUN TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/fast_alias\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.46126+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/fast_alias","Output":"--- PASS: TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/fast_alias (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.46126+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/fast_alias","Elapsed":0} {"Time":"2026-09-12T11:42:36.46126+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/priority"} {"Time":"2026-09-12T11:42:36.46126+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/priority","Output":"=== RUN TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/priority\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.46126+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/priority","Output":"--- PASS: TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/priority (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.46126+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/priority","Elapsed":0} {"Time":"2026-09-12T11:42:36.46126+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/flex"} {"Time":"2026-09-12T11:42:36.46126+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/flex","Output":"=== RUN TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/flex\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.46126+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/flex","Output":"--- PASS: TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/flex (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.46126+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/flex","Elapsed":0} {"Time":"2026-09-12T11:42:36.46126+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/ultrafast"} {"Time":"2026-09-12T11:42:36.46126+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/ultrafast","Output":"=== RUN TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/ultrafast\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.46126+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/ultrafast","Output":"--- PASS: TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/ultrafast (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.46126+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/ultrafast","Elapsed":0} {"Time":"2026-09-12T11:42:36.46126+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/explicit_default_sentinel"} {"Time":"2026-09-12T11:42:36.46126+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/explicit_default_sentinel","Output":"=== RUN TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/explicit_default_sentinel\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.46126+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/explicit_default_sentinel","Output":"--- PASS: TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/explicit_default_sentinel (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.46126+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/explicit_default_sentinel","Elapsed":0} {"Time":"2026-09-12T11:42:36.46126+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/omitted_tier"} {"Time":"2026-09-12T11:42:36.46126+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/omitted_tier","Output":"=== RUN TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/omitted_tier\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.46126+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/omitted_tier","Output":"--- PASS: TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/omitted_tier (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.46126+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/omitted_tier","Elapsed":0} {"Time":"2026-09-12T11:42:36.46126+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/auto_is_not_expanded_without_catalog_support"} {"Time":"2026-09-12T11:42:36.46126+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/auto_is_not_expanded_without_catalog_support","Output":"=== RUN TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/auto_is_not_expanded_without_catalog_support\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.46126+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/auto_is_not_expanded_without_catalog_support","Output":"--- PASS: TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/auto_is_not_expanded_without_catalog_support (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.46126+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/auto_is_not_expanded_without_catalog_support","Elapsed":0} {"Time":"2026-09-12T11:42:36.46126+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/scale_is_not_expanded_without_catalog_support"} {"Time":"2026-09-12T11:42:36.46126+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/scale_is_not_expanded_without_catalog_support","Output":"=== RUN TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/scale_is_not_expanded_without_catalog_support\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.46126+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/scale_is_not_expanded_without_catalog_support","Output":"--- PASS: TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/scale_is_not_expanded_without_catalog_support (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.46126+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/scale_is_not_expanded_without_catalog_support","Elapsed":0} {"Time":"2026-09-12T11:42:36.46126+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/unknown_tier_does_not_expand_protocol"} {"Time":"2026-09-12T11:42:36.4617662+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/unknown_tier_does_not_expand_protocol","Output":"=== RUN TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/unknown_tier_does_not_expand_protocol\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4617662+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/unknown_tier_does_not_expand_protocol","Output":"--- PASS: TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/unknown_tier_does_not_expand_protocol (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4617662+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/unknown_tier_does_not_expand_protocol","Elapsed":0} {"Time":"2026-09-12T11:42:36.4617662+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/invalid_header_value_is_omitted"} {"Time":"2026-09-12T11:42:36.4617662+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/invalid_header_value_is_omitted","Output":"=== RUN TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/invalid_header_value_is_omitted\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4617662+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/invalid_header_value_is_omitted","Output":"--- PASS: TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/invalid_header_value_is_omitted (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4617662+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/invalid_header_value_is_omitted","Elapsed":0} {"Time":"2026-09-12T11:42:36.4617662+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/delimiter_in_model_is_omitted:_gpt-5.6;evil"} {"Time":"2026-09-12T11:42:36.4617662+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/delimiter_in_model_is_omitted:_gpt-5.6;evil","Output":"=== RUN TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/delimiter_in_model_is_omitted:_gpt-5.6;evil\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4617662+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/delimiter_in_model_is_omitted:_gpt-5.6;evil","Output":"--- PASS: TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/delimiter_in_model_is_omitted:_gpt-5.6;evil (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4617662+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/delimiter_in_model_is_omitted:_gpt-5.6;evil","Elapsed":0} {"Time":"2026-09-12T11:42:36.4617662+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/delimiter_in_model_is_omitted:_gpt=5.6"} {"Time":"2026-09-12T11:42:36.4617662+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/delimiter_in_model_is_omitted:_gpt=5.6","Output":"=== RUN TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/delimiter_in_model_is_omitted:_gpt=5.6\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4617662+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/delimiter_in_model_is_omitted:_gpt=5.6","Output":"--- PASS: TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/delimiter_in_model_is_omitted:_gpt=5.6 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4617662+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/delimiter_in_model_is_omitted:_gpt=5.6","Elapsed":0} {"Time":"2026-09-12T11:42:36.4617662+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/api_key_strips_gateway-owned_hint_in_every_key_casing"} {"Time":"2026-09-12T11:42:36.4617662+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/api_key_strips_gateway-owned_hint_in_every_key_casing","Output":"=== RUN TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/api_key_strips_gateway-owned_hint_in_every_key_casing\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4617662+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/api_key_strips_gateway-owned_hint_in_every_key_casing","Output":"--- PASS: TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/api_key_strips_gateway-owned_hint_in_every_key_casing (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4617662+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/api_key_strips_gateway-owned_hint_in_every_key_casing","Elapsed":0} {"Time":"2026-09-12T11:42:36.4617662+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/oauth_replaces_spoofed_lowercase_hint"} {"Time":"2026-09-12T11:42:36.4617662+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/oauth_replaces_spoofed_lowercase_hint","Output":"=== RUN TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/oauth_replaces_spoofed_lowercase_hint\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4617662+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/oauth_replaces_spoofed_lowercase_hint","Output":"--- PASS: TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/oauth_replaces_spoofed_lowercase_hint (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4617662+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers/oauth_replaces_spoofed_lowercase_hint","Elapsed":0} {"Time":"2026-09-12T11:42:36.4617662+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers","Output":"--- PASS: TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4617662+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestSetOpenAICodexRoutingHintCanonicalizesOfficialServiceTiers","Elapsed":0} {"Time":"2026-09-12T11:42:36.4617662+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAISetupTokenChatCompletionsUsesCodexTransform"} {"Time":"2026-09-12T11:42:36.4617662+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAISetupTokenChatCompletionsUsesCodexTransform","Output":"=== RUN TestOpenAISetupTokenChatCompletionsUsesCodexTransform\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4617662+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAISetupTokenChatCompletionsUsesCodexTransform","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:36.461Z\",\"msg\":\"openai chat_completions: model mapping applied\",\"service\":\"sub2api\",\"env\":\"test\",\"account_id\":71,\"original_model\":\"gpt-5.4\",\"billing_model\":\"gpt-5.4\",\"upstream_model\":\"gpt-5.4\",\"stream\":false,\"responses_shape\":false,\"compat_prompt_cache_key_injected\":true,\"compat_prompt_cache_key_sha256\":\"9717875cd9aa4b57\"}\n"} {"Time":"2026-09-12T11:42:36.4617662+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAISetupTokenChatCompletionsUsesCodexTransform","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:36.461Z\",\"msg\":\"openai routing decision\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_routing\",\"transport\":\"http\",\"account_id\":71,\"final_model\":\"gpt-5.4\",\"final_service_tier\":\"\",\"routing_hint_generated\":true,\"ws_affinity_decision\":\"not_applicable\"}\n"} {"Time":"2026-09-12T11:42:36.4617662+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAISetupTokenChatCompletionsUsesCodexTransform","Output":"--- PASS: TestOpenAISetupTokenChatCompletionsUsesCodexTransform (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4617662+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAISetupTokenChatCompletionsUsesCodexTransform","Elapsed":0} {"Time":"2026-09-12T11:42:36.4617662+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAISetupTokenMessagesUsesCodexBridgeAndTurnState"} {"Time":"2026-09-12T11:42:36.4617662+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAISetupTokenMessagesUsesCodexBridgeAndTurnState","Output":"=== RUN TestOpenAISetupTokenMessagesUsesCodexBridgeAndTurnState\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4617662+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAISetupTokenMessagesUsesCodexBridgeAndTurnState","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:36.461Z\",\"msg\":\"openai messages: model mapping applied\",\"service\":\"sub2api\",\"env\":\"test\",\"account_id\":72,\"original_model\":\"claude-sonnet-4-5\",\"normalized_model\":\"claude-sonnet-4-5\",\"billing_model\":\"gpt-5.4\",\"upstream_model\":\"gpt-5.4\",\"stream\":true}\n"} {"Time":"2026-09-12T11:42:36.4617662+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAISetupTokenMessagesUsesCodexBridgeAndTurnState","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:36.461Z\",\"msg\":\"openai routing decision\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_routing\",\"transport\":\"http\",\"account_id\":72,\"final_model\":\"gpt-5.4\",\"final_service_tier\":\"\",\"routing_hint_generated\":true,\"ws_affinity_decision\":\"not_applicable\"}\n"} {"Time":"2026-09-12T11:42:36.4617662+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAISetupTokenMessagesUsesCodexBridgeAndTurnState","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:36.461Z\",\"msg\":\"openai messages: upstream identity restored\",\"service\":\"sub2api\",\"env\":\"test\",\"account_id\":72,\"upstream_model\":\"gpt-5.4\",\"compat_identity_restored\":true}\n"} {"Time":"2026-09-12T11:42:36.4617662+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAISetupTokenMessagesUsesCodexBridgeAndTurnState","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:36.461Z\",\"msg\":\"openai messages: model mapping applied\",\"service\":\"sub2api\",\"env\":\"test\",\"account_id\":72,\"original_model\":\"claude-sonnet-4-5\",\"normalized_model\":\"claude-sonnet-4-5\",\"billing_model\":\"gpt-5.4\",\"upstream_model\":\"gpt-5.4\",\"stream\":true}\n"} {"Time":"2026-09-12T11:42:36.4622757+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAISetupTokenMessagesUsesCodexBridgeAndTurnState","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:36.462Z\",\"msg\":\"openai routing decision\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_routing\",\"transport\":\"http\",\"account_id\":72,\"final_model\":\"gpt-5.4\",\"final_service_tier\":\"\",\"routing_hint_generated\":true,\"ws_affinity_decision\":\"not_applicable\"}\n"} {"Time":"2026-09-12T11:42:36.4622757+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAISetupTokenMessagesUsesCodexBridgeAndTurnState","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:36.462Z\",\"msg\":\"openai messages: upstream identity restored\",\"service\":\"sub2api\",\"env\":\"test\",\"account_id\":72,\"upstream_model\":\"gpt-5.4\",\"compat_identity_restored\":true}\n"} {"Time":"2026-09-12T11:42:36.4622757+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAISetupTokenMessagesUsesCodexBridgeAndTurnState","Output":"--- PASS: TestOpenAISetupTokenMessagesUsesCodexBridgeAndTurnState (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4622757+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAISetupTokenMessagesUsesCodexBridgeAndTurnState","Elapsed":0} {"Time":"2026-09-12T11:42:36.4622757+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_ProxyResponsesWebSocketFromClient_CodexImageBridgeRespectsResponsesLite"} {"Time":"2026-09-12T11:42:36.4622757+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_ProxyResponsesWebSocketFromClient_CodexImageBridgeRespectsResponsesLite","Output":"=== RUN TestOpenAIGatewayService_ProxyResponsesWebSocketFromClient_CodexImageBridgeRespectsResponsesLite\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4627857+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_ProxyResponsesWebSocketFromClient_CodexImageBridgeRespectsResponsesLite","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:36.462Z\",\"msg\":\"[OpenAI WS Mode][openai_ws_mode=true] ingress_ws_codex_image_tool_injected account_id=31\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:36.4627857+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_ProxyResponsesWebSocketFromClient_CodexImageBridgeRespectsResponsesLite","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:36.462Z\",\"msg\":\"[OpenAI WS Mode][openai_ws_mode=true] ingress_ws_codex_image_tool_choice_auto account_id=31\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:36.4627857+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_ProxyResponsesWebSocketFromClient_CodexImageBridgeRespectsResponsesLite","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:36.462Z\",\"msg\":\"[OpenAI WS Mode][openai_ws_mode=true] ingress_ws_codex_image_bridge_instructions_added account_id=31\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:36.4627857+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_ProxyResponsesWebSocketFromClient_CodexImageBridgeRespectsResponsesLite","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:36.462Z\",\"msg\":\"openai routing decision\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_routing\",\"transport\":\"responses_websockets_v2\",\"account_id\":31,\"final_model\":\"gpt-5.5\",\"final_service_tier\":\"\",\"routing_hint_generated\":true,\"ws_affinity_decision\":\"soft_routing_hint\"}\n"} {"Time":"2026-09-12T11:42:36.4627857+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_ProxyResponsesWebSocketFromClient_CodexImageBridgeRespectsResponsesLite","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:36.462Z\",\"msg\":\"[OpenAI WS Mode][openai_ws_mode=true] ingress_ws_protocol_confirm account_id=31 account_type=oauth transport=responses_websockets_v2 ws_host=chatgpt.com ws_path=/backend-api/codex/responses ws_mode=ctx_pool store_disabled=true has_session_hash=true has_previous_response_id=false\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:36.4627857+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_ProxyResponsesWebSocketFromClient_CodexImageBridgeRespectsResponsesLite","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:36.462Z\",\"msg\":\"[debug] [OpenAI WS Mode][openai_ws_mode=true] ingress_ws_start account_id=31 account_type=oauth transport=responses_websockets_v2 ws_host=chatgpt.com preferred_conn_id=- has_session_hash=true has_previous_response_id=false store_disabled=true\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:36.4627857+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_ProxyResponsesWebSocketFromClient_CodexImageBridgeRespectsResponsesLite","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:36.462Z\",\"msg\":\"[OpenAI WS Mode][openai_ws_mode=true] ingress_ws_upstream_connected account_id=31 turn=1 conn_id=oa_ws_31_1 conn_reused=false conn_pick_ms=0 queue_wait_ms=0 preferred_conn_id=-\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:36.4633108+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_ProxyResponsesWebSocketFromClient_CodexImageBridgeRespectsResponsesLite","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:36.462Z\",\"msg\":\"[debug] [OpenAI WS Mode][openai_ws_mode=true] ingress_ws_turn_request_sent account_id=31 turn=1 conn_id=oa_ws_31_1 payload_bytes=672\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:36.4633108+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_ProxyResponsesWebSocketFromClient_CodexImageBridgeRespectsResponsesLite","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:36.463Z\",\"msg\":\"[debug] [OpenAI WS Mode][openai_ws_mode=true] ingress_ws_turn_completed account_id=31 turn=1 conn_id=oa_ws_31_1 response_id=resp_codex_image_bridge duration_ms=0 events=1 token_events=0 terminal_events=1 first_event=response.completed last_event=response.completed first_token_ms=-1 client_disconnected=false\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:36.4633108+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_ProxyResponsesWebSocketFromClient_CodexImageBridgeRespectsResponsesLite","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:36.463Z\",\"msg\":\"[OpenAI WS Mode][openai_ws_mode=true] ingress_ws_next_turn_chain account_id=31 turn=1 next_turn=2 conn_id=oa_ws_31_1 previous_response_id=resp_codex_image_bridge previous_response_id_kind=response_id last_turn_response_id=resp_codex_image_bridge chained_from_last=true has_prompt_cache_key=false store_disabled=true\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:36.4633108+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_ProxyResponsesWebSocketFromClient_CodexImageBridgeRespectsResponsesLite","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:36.463Z\",\"msg\":\"[OpenAI WS Mode][openai_ws_mode=true] ingress_ws_prev_response_strict_eval account_id=31 turn=2 conn_id=oa_ws_31_1 action=drop_previous_response_id_full_create reason=non_input_changed previous_response_id=resp_codex_image_bridge expected_previous_response_id=resp_codex_image_bridge has_function_call_output=false\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:36.4633108+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_ProxyResponsesWebSocketFromClient_CodexImageBridgeRespectsResponsesLite","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:36.463Z\",\"msg\":\"[debug] [OpenAI WS Mode][openai_ws_mode=true] ingress_ws_turn_request_sent account_id=31 turn=2 conn_id=oa_ws_31_1 payload_bytes=648\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:36.4633108+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_ProxyResponsesWebSocketFromClient_CodexImageBridgeRespectsResponsesLite","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:36.463Z\",\"msg\":\"[debug] [OpenAI WS Mode][openai_ws_mode=true] ingress_ws_turn_completed account_id=31 turn=2 conn_id=oa_ws_31_1 response_id=resp_codex_image_lite duration_ms=0 events=1 token_events=0 terminal_events=1 first_event=response.completed last_event=response.completed first_token_ms=-1 client_disconnected=false\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:36.4633108+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_ProxyResponsesWebSocketFromClient_CodexImageBridgeRespectsResponsesLite","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:36.463Z\",\"msg\":\"[OpenAI WS Mode][openai_ws_mode=true] ingress_ws_next_turn_chain account_id=31 turn=2 next_turn=3 conn_id=oa_ws_31_1 previous_response_id=resp_codex_image_lite previous_response_id_kind=response_id last_turn_response_id=resp_codex_image_lite chained_from_last=true has_prompt_cache_key=false store_disabled=true\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:36.4638246+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_ProxyResponsesWebSocketFromClient_CodexImageBridgeRespectsResponsesLite","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:36.463Z\",\"msg\":\"[OpenAI WS Mode][openai_ws_mode=true] ingress_ws_prev_response_strict_eval account_id=31 turn=3 conn_id=oa_ws_31_1 action=drop_previous_response_id_full_create reason=non_input_changed previous_response_id=resp_codex_image_lite expected_previous_response_id=resp_codex_image_lite has_function_call_output=false\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:36.4638246+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_ProxyResponsesWebSocketFromClient_CodexImageBridgeRespectsResponsesLite","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:36.463Z\",\"msg\":\"[debug] [OpenAI WS Mode][openai_ws_mode=true] ingress_ws_turn_request_sent account_id=31 turn=3 conn_id=oa_ws_31_1 payload_bytes=543\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:36.4638246+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_ProxyResponsesWebSocketFromClient_CodexImageBridgeRespectsResponsesLite","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:36.463Z\",\"msg\":\"[debug] [OpenAI WS Mode][openai_ws_mode=true] ingress_ws_turn_completed account_id=31 turn=3 conn_id=oa_ws_31_1 response_id=resp_codex_image_function duration_ms=0 events=1 token_events=0 terminal_events=1 first_event=response.completed last_event=response.completed first_token_ms=-1 client_disconnected=false\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:36.4638246+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_ProxyResponsesWebSocketFromClient_CodexImageBridgeRespectsResponsesLite","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:36.463Z\",\"msg\":\"[debug] [OpenAI WS Mode][openai_ws_mode=true] ingress_ws_upstream_released account_id=31 conn_id=oa_ws_31_1\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:36.4638246+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_ProxyResponsesWebSocketFromClient_CodexImageBridgeRespectsResponsesLite","Output":"--- PASS: TestOpenAIGatewayService_ProxyResponsesWebSocketFromClient_CodexImageBridgeRespectsResponsesLite (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4638246+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_ProxyResponsesWebSocketFromClient_CodexImageBridgeRespectsResponsesLite","Elapsed":0} {"Time":"2026-09-12T11:42:36.4638246+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestStripCodexSparkImageGenerationToolFromRawPayload"} {"Time":"2026-09-12T11:42:36.4638246+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestStripCodexSparkImageGenerationToolFromRawPayload","Output":"=== RUN TestStripCodexSparkImageGenerationToolFromRawPayload\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4638246+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestStripCodexSparkImageGenerationToolFromRawPayload/strips_image_generation_for_spark"} {"Time":"2026-09-12T11:42:36.4638246+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestStripCodexSparkImageGenerationToolFromRawPayload/strips_image_generation_for_spark","Output":"=== RUN TestStripCodexSparkImageGenerationToolFromRawPayload/strips_image_generation_for_spark\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4638246+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestStripCodexSparkImageGenerationToolFromRawPayload/strips_image_generation_for_spark","Output":"--- PASS: TestStripCodexSparkImageGenerationToolFromRawPayload/strips_image_generation_for_spark (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4638246+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestStripCodexSparkImageGenerationToolFromRawPayload/strips_image_generation_for_spark","Elapsed":0} {"Time":"2026-09-12T11:42:36.4638246+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestStripCodexSparkImageGenerationToolFromRawPayload/strips_namespace_tools_for_spark"} {"Time":"2026-09-12T11:42:36.4638246+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestStripCodexSparkImageGenerationToolFromRawPayload/strips_namespace_tools_for_spark","Output":"=== RUN TestStripCodexSparkImageGenerationToolFromRawPayload/strips_namespace_tools_for_spark\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4638246+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestStripCodexSparkImageGenerationToolFromRawPayload/strips_namespace_tools_for_spark","Output":"--- PASS: TestStripCodexSparkImageGenerationToolFromRawPayload/strips_namespace_tools_for_spark (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4638246+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestStripCodexSparkImageGenerationToolFromRawPayload/strips_namespace_tools_for_spark","Elapsed":0} {"Time":"2026-09-12T11:42:36.4638246+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestStripCodexSparkImageGenerationToolFromRawPayload/keeps_image_generation_for_non_spark"} {"Time":"2026-09-12T11:42:36.4638246+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestStripCodexSparkImageGenerationToolFromRawPayload/keeps_image_generation_for_non_spark","Output":"=== RUN TestStripCodexSparkImageGenerationToolFromRawPayload/keeps_image_generation_for_non_spark\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4638246+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestStripCodexSparkImageGenerationToolFromRawPayload/keeps_image_generation_for_non_spark","Output":"--- PASS: TestStripCodexSparkImageGenerationToolFromRawPayload/keeps_image_generation_for_non_spark (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4638246+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestStripCodexSparkImageGenerationToolFromRawPayload/keeps_image_generation_for_non_spark","Elapsed":0} {"Time":"2026-09-12T11:42:36.4638246+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestStripCodexSparkImageGenerationToolFromRawPayload/noop_when_no_image_tool"} {"Time":"2026-09-12T11:42:36.4638246+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestStripCodexSparkImageGenerationToolFromRawPayload/noop_when_no_image_tool","Output":"=== RUN TestStripCodexSparkImageGenerationToolFromRawPayload/noop_when_no_image_tool\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4638246+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestStripCodexSparkImageGenerationToolFromRawPayload/noop_when_no_image_tool","Output":"--- PASS: TestStripCodexSparkImageGenerationToolFromRawPayload/noop_when_no_image_tool (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4643316+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestStripCodexSparkImageGenerationToolFromRawPayload/noop_when_no_image_tool","Elapsed":0} {"Time":"2026-09-12T11:42:36.4643316+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestStripCodexSparkImageGenerationToolFromRawPayload","Output":"--- PASS: TestStripCodexSparkImageGenerationToolFromRawPayload (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4643316+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestStripCodexSparkImageGenerationToolFromRawPayload","Elapsed":0} {"Time":"2026-09-12T11:42:36.4643316+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestResolveOpenAIWSSessionHeadersPrefersCodexHyphenHeader"} {"Time":"2026-09-12T11:42:36.4643316+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestResolveOpenAIWSSessionHeadersPrefersCodexHyphenHeader","Output":"=== RUN TestResolveOpenAIWSSessionHeadersPrefersCodexHyphenHeader\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4643316+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestResolveOpenAIWSSessionHeadersPrefersCodexHyphenHeader","Output":"--- PASS: TestResolveOpenAIWSSessionHeadersPrefersCodexHyphenHeader (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4643316+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestResolveOpenAIWSSessionHeadersPrefersCodexHyphenHeader","Elapsed":0} {"Time":"2026-09-12T11:42:36.4643316+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_BuildOpenAIWSHeadersPreservesCodexIdentity"} {"Time":"2026-09-12T11:42:36.4643316+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_BuildOpenAIWSHeadersPreservesCodexIdentity","Output":"=== RUN TestOpenAIGatewayService_BuildOpenAIWSHeadersPreservesCodexIdentity\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4643316+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_BuildOpenAIWSHeadersPreservesCodexIdentity","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:36.464Z\",\"msg\":\"openai routing decision\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_routing\",\"transport\":\"responses_websockets_v2\",\"account_id\":0,\"final_model\":\"\",\"final_service_tier\":\"\",\"routing_hint_generated\":false,\"ws_affinity_decision\":\"soft_routing_hint\"}\n"} {"Time":"2026-09-12T11:42:36.4643316+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_BuildOpenAIWSHeadersPreservesCodexIdentity","Output":"--- PASS: TestOpenAIGatewayService_BuildOpenAIWSHeadersPreservesCodexIdentity (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4643316+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_BuildOpenAIWSHeadersPreservesCodexIdentity","Elapsed":0} {"Time":"2026-09-12T11:42:36.4643316+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_Forward_WSv2_CodexFingerprintHandshakeBodyParityAndDefaultCacheKey"} {"Time":"2026-09-12T11:42:36.4643316+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_Forward_WSv2_CodexFingerprintHandshakeBodyParityAndDefaultCacheKey","Output":"=== RUN TestOpenAIGatewayService_Forward_WSv2_CodexFingerprintHandshakeBodyParityAndDefaultCacheKey\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4643316+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_Forward_WSv2_CodexFingerprintHandshakeBodyParityAndDefaultCacheKey","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:36.464Z\",\"msg\":\"[debug] [OpenAI WS Mode][openai_ws_mode=true] selected account_id=4405 account_type=oauth transport=responses_websockets_v2 reason=ws_v2_enabled model=gpt-5.2 stream=true\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:36.4648395+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_Forward_WSv2_CodexFingerprintHandshakeBodyParityAndDefaultCacheKey","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:36.464Z\",\"msg\":\"[debug] [OpenAI WS Mode][openai_ws_mode=true] forward_start account_id=4405 account_type=oauth model=gpt-5.2 stream=true has_previous_response_id=false\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:36.4648395+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_Forward_WSv2_CodexFingerprintHandshakeBodyParityAndDefaultCacheKey","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:36.464Z\",\"msg\":\"[debug] [OpenAI WS Mode][openai_ws_mode=true] dial_target account_id=4405 account_type=oauth ws_host=chatgpt.com ws_path=/backend-api/codex/responses\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:36.4648395+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_Forward_WSv2_CodexFingerprintHandshakeBodyParityAndDefaultCacheKey","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:36.464Z\",\"msg\":\"[OpenAI WS Mode][openai_ws_mode=true] [debug] payload_schema account_id=4405 attempt=1 event=response.create payload_keys=client_metadata,input,instructions,model,prompt_cache_key,store,stream,type payload_bytes=22894 payload_key_sizes=instructions:21671,client_metadata:613,prompt_cache_key:36,input:31,type:15,model:7 input_summary=items=1,text_chars=2,image_data_urls=0,image_data_url_chars=0,image_remote_urls=0 stream=true payload_strategy=full removed_keys=- has_previous_response_id=false has_prompt_cache_key=true has_tools=false\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:36.4648395+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_Forward_WSv2_CodexFingerprintHandshakeBodyParityAndDefaultCacheKey","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:36.464Z\",\"msg\":\"openai routing decision\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_routing\",\"transport\":\"responses_websockets_v2\",\"account_id\":4405,\"final_model\":\"gpt-5.2\",\"final_service_tier\":\"\",\"routing_hint_generated\":true,\"ws_affinity_decision\":\"soft_routing_hint\"}\n"} {"Time":"2026-09-12T11:42:36.4648395+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_Forward_WSv2_CodexFingerprintHandshakeBodyParityAndDefaultCacheKey","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:36.464Z\",\"msg\":\"[debug] [OpenAI WS Mode][openai_ws_mode=true] acquire_start account_id=4405 account_type=oauth transport=responses_websockets_v2 preferred_conn_id=- has_previous_response_id=false session_hash=6d83ac66dd39... has_turn_state=false turn_state_len=0 has_turn_metadata=true turn_metadata_len=167 store_disabled=true store_disabled_conn_mode=off retry_last_reason=- force_new_conn=false header_user_agent=codex-tui/0.146.0 (Ubuntu 22.4.0; x86_64) xterm-256color header_openai_beta=responses_websockets=2026-02-06 header_originator=codex-tui header_accept_language=- header_session_id=4065c8ec-c2ce-48bd-9198-53c4c5e30d6e header_conversation_id=- session_id_source=header_session-id conversation_id_source=none has_prompt_cache_key=true has_chatgpt_account_id=true has_authorization=true has_session_id=true has_conversation_id=false proxy_enabled=false\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:36.4648395+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_Forward_WSv2_CodexFingerprintHandshakeBodyParityAndDefaultCacheKey","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:36.464Z\",\"msg\":\"[debug] [OpenAI WS Mode][openai_ws_mode=true] connected account_id=4405 account_type=oauth transport=responses_websockets_v2 conn_id=oa_ws_4405_1 conn_reused=false conn_pick_ms=0 queue_wait_ms=0 has_previous_response_id=false\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:36.4648395+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_Forward_WSv2_CodexFingerprintHandshakeBodyParityAndDefaultCacheKey","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:36.464Z\",\"msg\":\"[debug] [OpenAI WS Mode][openai_ws_mode=true] handshake account_id=4405 conn_id=oa_ws_4405_1 has_turn_state=false turn_state_len=0\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:36.4648395+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_Forward_WSv2_CodexFingerprintHandshakeBodyParityAndDefaultCacheKey","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:36.464Z\",\"msg\":\"[debug] [OpenAI WS Mode][openai_ws_mode=true] write_request_sent account_id=4405 conn_id=oa_ws_4405_1 stream=true payload_bytes=22894 previous_response_id=-\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:36.4648395+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_Forward_WSv2_CodexFingerprintHandshakeBodyParityAndDefaultCacheKey","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:36.464Z\",\"msg\":\"[debug] [OpenAI WS Mode][openai_ws_mode=true] event_received account_id=4405 conn_id=oa_ws_4405_1 idx=1 type=response.completed bytes=132 token=false terminal=true buffered_pending=0\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:36.4648395+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_Forward_WSv2_CodexFingerprintHandshakeBodyParityAndDefaultCacheKey","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:36.464Z\",\"msg\":\"[debug] [OpenAI WS Mode][openai_ws_mode=true] completed account_id=4405 conn_id=oa_ws_4405_1 response_id=resp_ws_fingerprint stream=true duration_ms=0 events=1 token_events=0 terminal_events=1 buffered_events=0 buffered_flushed=0 first_event=response.completed last_event=response.completed first_token_ms=-1 wrote_downstream=true client_disconnected=false\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:36.4648395+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_Forward_WSv2_CodexFingerprintHandshakeBodyParityAndDefaultCacheKey","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:36.464Z\",\"msg\":\"[debug] [OpenAI WS Mode][openai_ws_mode=true] forward_succeeded account_id=4405 request_id=resp_ws_fingerprint stream=true has_first_token_ms=false first_token_ms=0 ws_attempts=1\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:36.465347+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_Forward_WSv2_CodexFingerprintHandshakeBodyParityAndDefaultCacheKey","Output":"--- PASS: TestOpenAIGatewayService_Forward_WSv2_CodexFingerprintHandshakeBodyParityAndDefaultCacheKey (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.465347+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_Forward_WSv2_CodexFingerprintHandshakeBodyParityAndDefaultCacheKey","Elapsed":0} {"Time":"2026-09-12T11:42:36.465347+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestProxyOpenAIWSHTTPBridgeTurnPromotesCodexAdditionalToolsForMixedCache"} {"Time":"2026-09-12T11:42:36.465347+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestProxyOpenAIWSHTTPBridgeTurnPromotesCodexAdditionalToolsForMixedCache","Output":"=== RUN TestProxyOpenAIWSHTTPBridgeTurnPromotesCodexAdditionalToolsForMixedCache\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.465347+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestProxyOpenAIWSHTTPBridgeTurnPromotesCodexAdditionalToolsForMixedCache","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:36.465Z\",\"msg\":\"[OpenAI WS Mode][openai_ws_mode=true] ingress_ws_http_bridge_turn_completed account_id=73 turn=1 response_id=resp_grok_codex_lite payload_bytes=484 duration_ms=0 events=2 token_events=0 terminal_events=1 first_event=response.created last_event=response.completed first_token_ms=-1 client_disconnected=false\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_gateway\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:36.465347+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestProxyOpenAIWSHTTPBridgeTurnPromotesCodexAdditionalToolsForMixedCache","Output":"--- PASS: TestProxyOpenAIWSHTTPBridgeTurnPromotesCodexAdditionalToolsForMixedCache (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.465347+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestProxyOpenAIWSHTTPBridgeTurnPromotesCodexAdditionalToolsForMixedCache","Elapsed":0} {"Time":"2026-09-12T11:42:36.4658577+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSSActualHandshakeAndFramePreservation"} {"Time":"2026-09-12T11:42:36.4658577+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSSActualHandshakeAndFramePreservation","Output":"=== RUN TestMode1WSSActualHandshakeAndFramePreservation\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.467416+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSSActualHandshakeAndFramePreservation","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:36.467Z\",\"logger\":\"slog\",\"msg\":\"tls_fingerprint_handshake_success\",\"service\":\"sub2api\",\"env\":\"test\",\"host\":\"127.0.0.1\",\"version\":772,\"cipher_suite\":4865,\"alpn\":\"http/1.1\"}\n"} {"Time":"2026-09-12T11:42:36.467416+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSSActualHandshakeAndFramePreservation","Output":"--- PASS: TestMode1WSSActualHandshakeAndFramePreservation (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.467416+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSSActualHandshakeAndFramePreservation","Elapsed":0} {"Time":"2026-09-12T11:42:36.467416+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSSTransportCacheIsolationAndProfileRotation"} {"Time":"2026-09-12T11:42:36.467416+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSSTransportCacheIsolationAndProfileRotation","Output":"=== RUN TestMode1WSSTransportCacheIsolationAndProfileRotation\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4679494+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSSTransportCacheIsolationAndProfileRotation","Output":"--- PASS: TestMode1WSSTransportCacheIsolationAndProfileRotation (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4679494+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSSTransportCacheIsolationAndProfileRotation","Elapsed":0} {"Time":"2026-09-12T11:42:36.4679494+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSSFailsClosedOnInvalidTLSAndCertificate"} {"Time":"2026-09-12T11:42:36.4679494+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSSFailsClosedOnInvalidTLSAndCertificate","Output":"=== RUN TestMode1WSSFailsClosedOnInvalidTLSAndCertificate\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4679494+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSSFailsClosedOnInvalidTLSAndCertificate/untrusted_certificate"} {"Time":"2026-09-12T11:42:36.4679494+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSSFailsClosedOnInvalidTLSAndCertificate/untrusted_certificate","Output":"=== RUN TestMode1WSSFailsClosedOnInvalidTLSAndCertificate/untrusted_certificate\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4840308+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSSFailsClosedOnInvalidTLSAndCertificate/untrusted_certificate","Output":"--- PASS: TestMode1WSSFailsClosedOnInvalidTLSAndCertificate/untrusted_certificate (0.02s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4840308+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSSFailsClosedOnInvalidTLSAndCertificate/untrusted_certificate","Elapsed":0.02} {"Time":"2026-09-12T11:42:36.4840308+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSSFailsClosedOnInvalidTLSAndCertificate/invalid_ALPN_cannot_fall_back_to_ordinary_TLS"} {"Time":"2026-09-12T11:42:36.4840308+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSSFailsClosedOnInvalidTLSAndCertificate/invalid_ALPN_cannot_fall_back_to_ordinary_TLS","Output":"=== RUN TestMode1WSSFailsClosedOnInvalidTLSAndCertificate/invalid_ALPN_cannot_fall_back_to_ordinary_TLS\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4840308+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSSFailsClosedOnInvalidTLSAndCertificate/invalid_ALPN_cannot_fall_back_to_ordinary_TLS","Output":"--- PASS: TestMode1WSSFailsClosedOnInvalidTLSAndCertificate/invalid_ALPN_cannot_fall_back_to_ordinary_TLS (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4840308+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSSFailsClosedOnInvalidTLSAndCertificate/invalid_ALPN_cannot_fall_back_to_ordinary_TLS","Elapsed":0} {"Time":"2026-09-12T11:42:36.4840308+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSSFailsClosedOnInvalidTLSAndCertificate/plaintext_rejected"} {"Time":"2026-09-12T11:42:36.4840308+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSSFailsClosedOnInvalidTLSAndCertificate/plaintext_rejected","Output":"=== RUN TestMode1WSSFailsClosedOnInvalidTLSAndCertificate/plaintext_rejected\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4840308+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSSFailsClosedOnInvalidTLSAndCertificate/plaintext_rejected","Output":"--- PASS: TestMode1WSSFailsClosedOnInvalidTLSAndCertificate/plaintext_rejected (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4840308+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSSFailsClosedOnInvalidTLSAndCertificate/plaintext_rejected","Elapsed":0} {"Time":"2026-09-12T11:42:36.4840308+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSSFailsClosedOnInvalidTLSAndCertificate","Output":"--- PASS: TestMode1WSSFailsClosedOnInvalidTLSAndCertificate (0.02s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4840308+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSSFailsClosedOnInvalidTLSAndCertificate","Elapsed":0.02} {"Time":"2026-09-12T11:42:36.4840308+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSConnectionPoolTransportCompatibility"} {"Time":"2026-09-12T11:42:36.4840308+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSConnectionPoolTransportCompatibility","Output":"=== RUN TestMode1WSConnectionPoolTransportCompatibility\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4856426+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSConnectionPoolTransportCompatibility","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:36.485Z\",\"logger\":\"slog\",\"msg\":\"tls_fingerprint_handshake_success\",\"service\":\"sub2api\",\"env\":\"test\",\"host\":\"127.0.0.1\",\"version\":772,\"cipher_suite\":4865,\"alpn\":\"http/1.1\"}\n"} {"Time":"2026-09-12T11:42:36.4871971+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSConnectionPoolTransportCompatibility","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:36.487Z\",\"logger\":\"slog\",\"msg\":\"tls_fingerprint_handshake_success\",\"service\":\"sub2api\",\"env\":\"test\",\"host\":\"127.0.0.1\",\"version\":772,\"cipher_suite\":4865,\"alpn\":\"http/1.1\"}\n"} {"Time":"2026-09-12T11:42:36.4882212+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSConnectionPoolTransportCompatibility","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:36.488Z\",\"logger\":\"slog\",\"msg\":\"tls_fingerprint_handshake_success\",\"service\":\"sub2api\",\"env\":\"test\",\"host\":\"127.0.0.1\",\"version\":772,\"cipher_suite\":4865,\"alpn\":\"http/1.1\"}\n"} {"Time":"2026-09-12T11:42:36.4892552+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSConnectionPoolTransportCompatibility","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:36.489Z\",\"logger\":\"slog\",\"msg\":\"tls_fingerprint_handshake_success\",\"service\":\"sub2api\",\"env\":\"test\",\"host\":\"127.0.0.1\",\"version\":772,\"cipher_suite\":4865,\"alpn\":\"http/1.1\"}\n"} {"Time":"2026-09-12T11:42:36.489784+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSConnectionPoolTransportCompatibility","Output":"--- PASS: TestMode1WSConnectionPoolTransportCompatibility (0.01s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.489784+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSConnectionPoolTransportCompatibility","Elapsed":0.01} {"Time":"2026-09-12T11:42:36.489784+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSAcquireUsesAccountTLSAndKeepsSessionsIsolated"} {"Time":"2026-09-12T11:42:36.489784+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSAcquireUsesAccountTLSAndKeepsSessionsIsolated","Output":"=== RUN TestMode1WSAcquireUsesAccountTLSAndKeepsSessionsIsolated\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4913478+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSAcquireUsesAccountTLSAndKeepsSessionsIsolated","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:36.491Z\",\"logger\":\"slog\",\"msg\":\"tls_fingerprint_handshake_success\",\"service\":\"sub2api\",\"env\":\"test\",\"host\":\"127.0.0.1\",\"version\":772,\"cipher_suite\":4865,\"alpn\":\"http/1.1\"}\n"} {"Time":"2026-09-12T11:42:36.4923724+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSAcquireUsesAccountTLSAndKeepsSessionsIsolated","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:36.492Z\",\"logger\":\"slog\",\"msg\":\"tls_fingerprint_handshake_success\",\"service\":\"sub2api\",\"env\":\"test\",\"host\":\"127.0.0.1\",\"version\":772,\"cipher_suite\":4865,\"alpn\":\"http/1.1\"}\n"} {"Time":"2026-09-12T11:42:36.4960073+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSAcquireUsesAccountTLSAndKeepsSessionsIsolated","Output":"--- PASS: TestMode1WSAcquireUsesAccountTLSAndKeepsSessionsIsolated (0.01s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4960073+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSAcquireUsesAccountTLSAndKeepsSessionsIsolated","Elapsed":0.01} {"Time":"2026-09-12T11:42:36.4960073+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSRuntimeConcurrencyCapCannotBeBypassed"} {"Time":"2026-09-12T11:42:36.4960073+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSRuntimeConcurrencyCapCannotBeBypassed","Output":"=== RUN TestMode1WSRuntimeConcurrencyCapCannotBeBypassed\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4960073+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSRuntimeConcurrencyCapCannotBeBypassed","Output":"--- PASS: TestMode1WSRuntimeConcurrencyCapCannotBeBypassed (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4960073+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSRuntimeConcurrencyCapCannotBeBypassed","Elapsed":0} {"Time":"2026-09-12T11:42:36.4960073+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSPassthroughEntryReachesRealTLS"} {"Time":"2026-09-12T11:42:36.4960073+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSPassthroughEntryReachesRealTLS","Output":"=== RUN TestMode1WSPassthroughEntryReachesRealTLS\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:36.4965344+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSPassthroughEntryReachesRealTLS","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:36.496Z\",\"msg\":\"[OpenAI WS v2 passthrough] ws_mode=passthrough ws_router=v2 relay_start account_id=45 model=gpt-5.1 previous_response_id=- first_message_type=text first_message_bytes=123\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_ws_v2\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:36.4965344+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSPassthroughEntryReachesRealTLS","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:36.496Z\",\"msg\":\"[OpenAI WS v2 passthrough] ws_mode=passthrough ws_router=v2 relay_dial_start account_id=45 ws_host=chatgpt.com ws_path=/backend-api/codex/responses proxy_enabled=false\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_ws_v2\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:36.4965344+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSPassthroughEntryReachesRealTLS","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:36.496Z\",\"msg\":\"openai routing decision\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_routing\",\"transport\":\"responses_websockets_v2\",\"account_id\":45,\"final_model\":\"gpt-5.1\",\"final_service_tier\":\"\",\"routing_hint_generated\":true,\"ws_affinity_decision\":\"soft_routing_hint\"}\n"} {"Time":"2026-09-12T11:42:36.4965344+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSPassthroughEntryReachesRealTLS","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:36.496Z\",\"msg\":\"openai routing decision\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_routing\",\"transport\":\"http\",\"account_id\":45,\"final_model\":\"gpt-5.4\",\"final_service_tier\":\"\",\"routing_hint_generated\":true,\"ws_affinity_decision\":\"not_applicable\"}\n"} {"Time":"2026-09-12T11:42:36.4980692+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSPassthroughEntryReachesRealTLS","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:36.498Z\",\"logger\":\"slog\",\"msg\":\"tls_fingerprint_handshake_success\",\"service\":\"sub2api\",\"env\":\"test\",\"host\":\"127.0.0.1\",\"version\":772,\"cipher_suite\":4865,\"alpn\":\"http/1.1\"}\n"} {"Time":"2026-09-12T11:42:36.4980692+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSPassthroughEntryReachesRealTLS","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:36.498Z\",\"msg\":\"[OpenAI WS v2 passthrough] ws_mode=passthrough ws_router=v2 relay_dial_ok account_id=45 status_code=0 upstream_request_id=-\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_ws_v2\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:36.4980692+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSPassthroughEntryReachesRealTLS","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:36.498Z\",\"msg\":\"[OpenAI WS v2 passthrough] ws_mode=passthrough ws_router=v2 relay_trace account_id=45 stage=relay_start direction=- msg_type=text bytes=123 graceful=false wrote_downstream=false err=-\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_ws_v2\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:36.4980692+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSPassthroughEntryReachesRealTLS","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:36.498Z\",\"msg\":\"[OpenAI WS v2 passthrough] ws_mode=passthrough ws_router=v2 relay_trace account_id=45 stage=write_first_message_skipped direction=client_to_upstream msg_type=text bytes=123 graceful=false wrote_downstream=false err=-\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_ws_v2\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:36.4985753+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSPassthroughEntryReachesRealTLS","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:36.498Z\",\"msg\":\"[OpenAI WS v2 passthrough] ws_mode=passthrough ws_router=v2 relay_trace account_id=45 stage=read_client_fail direction=client_to_upstream msg_type=- bytes=0 graceful=true wrote_downstream=false err=fail to get reader: received close frame: status = StatusNormalClosure and reason = \\\"done\\\"\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_ws_v2\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:36.4985753+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSPassthroughEntryReachesRealTLS","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:36.498Z\",\"msg\":\"[OpenAI WS v2 passthrough] ws_mode=passthrough ws_router=v2 relay_trace account_id=45 stage=first_exit direction=client_to_upstream msg_type=- bytes=0 graceful=true wrote_downstream=false err=fail to get reader: received close frame: status = StatusNormalClosure and reason = \\\"done\\\"\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_ws_v2\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:37.4984775+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSPassthroughEntryReachesRealTLS","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:37.498Z\",\"msg\":\"[OpenAI WS v2 passthrough] ws_mode=passthrough ws_router=v2 relay_trace account_id=45 stage=read_upstream_fail direction=upstream_to_client msg_type=- bytes=0 graceful=false wrote_downstream=true err=openai websocket passthrough first output timeout\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_ws_v2\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:37.4984775+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSPassthroughEntryReachesRealTLS","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:37.498Z\",\"msg\":\"[OpenAI WS v2 passthrough] ws_mode=passthrough ws_router=v2 relay_trace account_id=45 stage=second_exit direction=upstream_to_client msg_type=- bytes=0 graceful=false wrote_downstream=true err=openai websocket passthrough first output timeout\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_ws_v2\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:37.4984775+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSPassthroughEntryReachesRealTLS","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:37.498Z\",\"msg\":\"[OpenAI WS v2 passthrough] ws_mode=passthrough ws_router=v2 relay_trace account_id=45 stage=relay_client_closed direction=- msg_type=- bytes=0 graceful=true wrote_downstream=true err=-\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_ws_v2\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:37.4984775+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSPassthroughEntryReachesRealTLS","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:37.498Z\",\"msg\":\"[OpenAI WS v2 passthrough] ws_mode=passthrough ws_router=v2 relay_completed account_id=45 request_id=- terminal_event=- duration_ms=1000 c2u_frames=1 u2c_frames=1 dropped_frames=0 turns=0\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_ws_v2\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:37.4984775+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSPassthroughEntryReachesRealTLS","Output":"--- PASS: TestMode1WSPassthroughEntryReachesRealTLS (1.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:37.4984775+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSPassthroughEntryReachesRealTLS","Elapsed":1} {"Time":"2026-09-12T11:42:37.4984775+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSIngressRejectsLossyPolicyBeforeDial"} {"Time":"2026-09-12T11:42:37.4984775+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSIngressRejectsLossyPolicyBeforeDial","Output":"=== RUN TestMode1WSIngressRejectsLossyPolicyBeforeDial\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:37.4984775+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSIngressRejectsLossyPolicyBeforeDial/passthrough"} {"Time":"2026-09-12T11:42:37.4984775+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSIngressRejectsLossyPolicyBeforeDial/passthrough","Output":"=== RUN TestMode1WSIngressRejectsLossyPolicyBeforeDial/passthrough\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:37.4994939+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSIngressRejectsLossyPolicyBeforeDial/passthrough","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:37.499Z\",\"msg\":\"[OpenAI WS v2 passthrough] ws_mode=passthrough ws_router=v2 relay_start account_id=46 model=gpt-5.4 previous_response_id=- first_message_type=text first_message_bytes=122\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_ws_v2\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:37.4994939+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSIngressRejectsLossyPolicyBeforeDial/passthrough","Output":"--- PASS: TestMode1WSIngressRejectsLossyPolicyBeforeDial/passthrough (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:37.4994939+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSIngressRejectsLossyPolicyBeforeDial/passthrough","Elapsed":0} {"Time":"2026-09-12T11:42:37.4994939+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSIngressRejectsLossyPolicyBeforeDial/ctx_pool"} {"Time":"2026-09-12T11:42:37.4994939+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSIngressRejectsLossyPolicyBeforeDial/ctx_pool","Output":"=== RUN TestMode1WSIngressRejectsLossyPolicyBeforeDial/ctx_pool\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:37.5005369+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSIngressRejectsLossyPolicyBeforeDial/ctx_pool","Output":"--- PASS: TestMode1WSIngressRejectsLossyPolicyBeforeDial/ctx_pool (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:37.5005369+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSIngressRejectsLossyPolicyBeforeDial/ctx_pool","Elapsed":0} {"Time":"2026-09-12T11:42:37.5005369+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSIngressRejectsLossyPolicyBeforeDial","Output":"--- PASS: TestMode1WSIngressRejectsLossyPolicyBeforeDial (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:37.5005369+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSIngressRejectsLossyPolicyBeforeDial","Elapsed":0} {"Time":"2026-09-12T11:42:37.5005369+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSSOverLocalHTTPAndHTTPSProxy"} {"Time":"2026-09-12T11:42:37.5005369+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSSOverLocalHTTPAndHTTPSProxy","Output":"=== RUN TestMode1WSSOverLocalHTTPAndHTTPSProxy\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:37.5005369+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSSOverLocalHTTPAndHTTPSProxy/http"} {"Time":"2026-09-12T11:42:37.5005369+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSSOverLocalHTTPAndHTTPSProxy/http","Output":"=== RUN TestMode1WSSOverLocalHTTPAndHTTPSProxy/http\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:37.5020682+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSSOverLocalHTTPAndHTTPSProxy/http","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:37.502Z\",\"logger\":\"slog\",\"msg\":\"tls_fingerprint_handshake_success\",\"service\":\"sub2api\",\"env\":\"test\",\"host\":\"127.0.0.1\",\"version\":772,\"cipher_suite\":4865,\"alpn\":\"http/1.1\"}\n"} {"Time":"2026-09-12T11:42:37.502587+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSSOverLocalHTTPAndHTTPSProxy/http","Output":"--- PASS: TestMode1WSSOverLocalHTTPAndHTTPSProxy/http (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:37.502587+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSSOverLocalHTTPAndHTTPSProxy/http","Elapsed":0} {"Time":"2026-09-12T11:42:37.502587+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSSOverLocalHTTPAndHTTPSProxy/https"} {"Time":"2026-09-12T11:42:37.502587+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSSOverLocalHTTPAndHTTPSProxy/https","Output":"=== RUN TestMode1WSSOverLocalHTTPAndHTTPSProxy/https\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:37.5052367+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSSOverLocalHTTPAndHTTPSProxy/https","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:37.505Z\",\"logger\":\"slog\",\"msg\":\"tls_fingerprint_handshake_success\",\"service\":\"sub2api\",\"env\":\"test\",\"host\":\"127.0.0.1\",\"version\":772,\"cipher_suite\":4865,\"alpn\":\"http/1.1\"}\n"} {"Time":"2026-09-12T11:42:37.5062572+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSSOverLocalHTTPAndHTTPSProxy/https","Output":"--- PASS: TestMode1WSSOverLocalHTTPAndHTTPSProxy/https (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:37.5062572+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSSOverLocalHTTPAndHTTPSProxy/https","Elapsed":0} {"Time":"2026-09-12T11:42:37.5062572+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSSOverLocalHTTPAndHTTPSProxy","Output":"--- PASS: TestMode1WSSOverLocalHTTPAndHTTPSProxy (0.01s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:37.5062572+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMode1WSSOverLocalHTTPAndHTTPSProxy","Elapsed":0.01} {"Time":"2026-09-12T11:42:37.5062572+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_UpdateCodexUsageSnapshot_ExhaustedSnapshotDoesNotSetRateLimit"} {"Time":"2026-09-12T11:42:37.5062572+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_UpdateCodexUsageSnapshot_ExhaustedSnapshotDoesNotSetRateLimit","Output":"=== RUN TestOpenAIGatewayService_UpdateCodexUsageSnapshot_ExhaustedSnapshotDoesNotSetRateLimit\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:39.5064321+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_UpdateCodexUsageSnapshot_ExhaustedSnapshotDoesNotSetRateLimit","Output":"--- PASS: TestOpenAIGatewayService_UpdateCodexUsageSnapshot_ExhaustedSnapshotDoesNotSetRateLimit (2.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:39.5064321+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_UpdateCodexUsageSnapshot_ExhaustedSnapshotDoesNotSetRateLimit","Elapsed":2} {"Time":"2026-09-12T11:42:39.5064321+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_UpdateCodexUsageSnapshot_NonExhaustedSnapshotDoesNotSetRateLimit"} {"Time":"2026-09-12T11:42:39.5064321+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_UpdateCodexUsageSnapshot_NonExhaustedSnapshotDoesNotSetRateLimit","Output":"=== RUN TestOpenAIGatewayService_UpdateCodexUsageSnapshot_NonExhaustedSnapshotDoesNotSetRateLimit\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:39.7071315+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_UpdateCodexUsageSnapshot_NonExhaustedSnapshotDoesNotSetRateLimit","Output":"--- PASS: TestOpenAIGatewayService_UpdateCodexUsageSnapshot_NonExhaustedSnapshotDoesNotSetRateLimit (0.20s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:39.7071315+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_UpdateCodexUsageSnapshot_NonExhaustedSnapshotDoesNotSetRateLimit","Elapsed":0.2} {"Time":"2026-09-12T11:42:39.7071315+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_UpdateCodexUsageSnapshot_ThrottlesExtraWrites"} {"Time":"2026-09-12T11:42:39.7071315+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_UpdateCodexUsageSnapshot_ThrottlesExtraWrites","Output":"=== RUN TestOpenAIGatewayService_UpdateCodexUsageSnapshot_ThrottlesExtraWrites\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:39.9074683+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_UpdateCodexUsageSnapshot_ThrottlesExtraWrites","Output":"--- PASS: TestOpenAIGatewayService_UpdateCodexUsageSnapshot_ThrottlesExtraWrites (0.20s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:39.9081384+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_UpdateCodexUsageSnapshot_ThrottlesExtraWrites","Elapsed":0.2} {"Time":"2026-09-12T11:42:39.9081384+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_GetSchedulableAccount_ExhaustedCodexExtraDoesNotSetRateLimit"} {"Time":"2026-09-12T11:42:39.9081384+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_GetSchedulableAccount_ExhaustedCodexExtraDoesNotSetRateLimit","Output":"=== RUN TestOpenAIGatewayService_GetSchedulableAccount_ExhaustedCodexExtraDoesNotSetRateLimit\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:40.4763311+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/repository","Test":"TestBulkUpdateEnsuresCodexFingerprintSeedWithPerRowSQL"} {"Time":"2026-09-12T11:42:40.4763311+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/repository","Test":"TestBulkUpdateEnsuresCodexFingerprintSeedWithPerRowSQL","Output":"=== RUN TestBulkUpdateEnsuresCodexFingerprintSeedWithPerRowSQL\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:40.4763311+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/repository","Test":"TestBulkUpdateEnsuresCodexFingerprintSeedWithPerRowSQL","Output":"--- PASS: TestBulkUpdateEnsuresCodexFingerprintSeedWithPerRowSQL (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:40.4763311+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/repository","Test":"TestBulkUpdateEnsuresCodexFingerprintSeedWithPerRowSQL","Elapsed":0} {"Time":"2026-09-12T11:42:40.4763311+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/repository","Test":"TestUpdateExtraEnsuresCodexFingerprintSeedAtomicallyWhenEnabling"} {"Time":"2026-09-12T11:42:40.4763311+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/repository","Test":"TestUpdateExtraEnsuresCodexFingerprintSeedAtomicallyWhenEnabling","Output":"=== RUN TestUpdateExtraEnsuresCodexFingerprintSeedAtomicallyWhenEnabling\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:40.476845+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/repository","Test":"TestUpdateExtraEnsuresCodexFingerprintSeedAtomicallyWhenEnabling","Output":"--- PASS: TestUpdateExtraEnsuresCodexFingerprintSeedAtomicallyWhenEnabling (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:40.476845+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/repository","Test":"TestUpdateExtraEnsuresCodexFingerprintSeedAtomicallyWhenEnabling","Elapsed":0} {"Time":"2026-09-12T11:42:40.476845+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/repository","Test":"TestBulkUpdateCodexFingerprintSeedRollsBackWhenUpdateFails"} {"Time":"2026-09-12T11:42:40.476845+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/repository","Test":"TestBulkUpdateCodexFingerprintSeedRollsBackWhenUpdateFails","Output":"=== RUN TestBulkUpdateCodexFingerprintSeedRollsBackWhenUpdateFails\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:40.476845+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/repository","Test":"TestBulkUpdateCodexFingerprintSeedRollsBackWhenUpdateFails","Output":"--- PASS: TestBulkUpdateCodexFingerprintSeedRollsBackWhenUpdateFails (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:40.476845+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/repository","Test":"TestBulkUpdateCodexFingerprintSeedRollsBackWhenUpdateFails","Elapsed":0} {"Time":"2026-09-12T11:42:40.476845+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/repository","Test":"TestBulkUpdateCodexFingerprintSeedRollsBackWhenOutboxFails"} {"Time":"2026-09-12T11:42:40.476845+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/repository","Test":"TestBulkUpdateCodexFingerprintSeedRollsBackWhenOutboxFails","Output":"=== RUN TestBulkUpdateCodexFingerprintSeedRollsBackWhenOutboxFails\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:40.476845+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/repository","Test":"TestBulkUpdateCodexFingerprintSeedRollsBackWhenOutboxFails","Output":"--- PASS: TestBulkUpdateCodexFingerprintSeedRollsBackWhenOutboxFails (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:40.476845+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/repository","Test":"TestBulkUpdateCodexFingerprintSeedRollsBackWhenOutboxFails","Elapsed":0} {"Time":"2026-09-12T11:42:40.4773617+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/repository","Test":"TestMode1TLSPoolAlwaysSeparatesAccountsProxyAndProfile"} {"Time":"2026-09-12T11:42:40.4773617+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/repository","Test":"TestMode1TLSPoolAlwaysSeparatesAccountsProxyAndProfile","Output":"=== RUN TestMode1TLSPoolAlwaysSeparatesAccountsProxyAndProfile\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:40.4773617+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/repository","Test":"TestMode1TLSPoolAlwaysSeparatesAccountsProxyAndProfile","Output":"--- PASS: TestMode1TLSPoolAlwaysSeparatesAccountsProxyAndProfile (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:40.4773617+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/repository","Test":"TestMode1TLSPoolAlwaysSeparatesAccountsProxyAndProfile","Elapsed":0} {"Time":"2026-09-12T11:42:40.4773617+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/repository","Test":"TestMode1DoWithTLSActuallyUsesClientHello"} {"Time":"2026-09-12T11:42:40.4773617+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/repository","Test":"TestMode1DoWithTLSActuallyUsesClientHello","Output":"=== RUN TestMode1DoWithTLSActuallyUsesClientHello\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:40.480535+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/repository","Test":"TestMode1DoWithTLSActuallyUsesClientHello","Output":"--- PASS: TestMode1DoWithTLSActuallyUsesClientHello (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:40.480535+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/repository","Test":"TestMode1DoWithTLSActuallyUsesClientHello","Elapsed":0} {"Time":"2026-09-12T11:42:40.480535+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/repository","Test":"TestMode1SchedulerProjectionRetainsPolicyAndProxy"} {"Time":"2026-09-12T11:42:40.480535+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/repository","Test":"TestMode1SchedulerProjectionRetainsPolicyAndProxy","Output":"=== RUN TestMode1SchedulerProjectionRetainsPolicyAndProxy\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:40.4810468+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/repository","Test":"TestMode1SchedulerProjectionRetainsPolicyAndProxy","Output":"--- PASS: TestMode1SchedulerProjectionRetainsPolicyAndProxy (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:40.4810468+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/repository","Test":"TestMode1SchedulerProjectionRetainsPolicyAndProxy","Elapsed":0} {"Time":"2026-09-12T11:42:40.4810468+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/repository","Test":"TestMode1ConcurrencySlotsRemainBoundedAndRelease"} {"Time":"2026-09-12T11:42:40.4810468+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/repository","Test":"TestMode1ConcurrencySlotsRemainBoundedAndRelease","Output":"=== RUN TestMode1ConcurrencySlotsRemainBoundedAndRelease\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:40.4831348+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/repository","Test":"TestMode1ConcurrencySlotsRemainBoundedAndRelease","Output":"--- PASS: TestMode1ConcurrencySlotsRemainBoundedAndRelease (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:40.4831348+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/repository","Test":"TestMode1ConcurrencySlotsRemainBoundedAndRelease","Elapsed":0} {"Time":"2026-09-12T11:42:40.4831348+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/repository","Output":"PASS\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:40.4868523+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/repository","Output":"ok \tgithub.com/Wei-Shaw/sub2api/internal/repository\t5.683s\n"} {"Time":"2026-09-12T11:42:40.4868523+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/repository","Elapsed":5.683} {"Time":"2026-09-12T11:42:41.6240871+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestNormalizeCodexImportEntryAcceptsAgentIdentityAuthJSON"} {"Time":"2026-09-12T11:42:41.6240871+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestNormalizeCodexImportEntryAcceptsAgentIdentityAuthJSON","Output":"=== RUN TestNormalizeCodexImportEntryAcceptsAgentIdentityAuthJSON\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6246151+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestNormalizeCodexImportEntryAcceptsAgentIdentityAuthJSON","Output":"--- PASS: TestNormalizeCodexImportEntryAcceptsAgentIdentityAuthJSON (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6246151+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestNormalizeCodexImportEntryAcceptsAgentIdentityAuthJSON","Elapsed":0} {"Time":"2026-09-12T11:42:41.6246151+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestBuildCodexAgentIdentityKeysUseChatGPTAccountOnly"} {"Time":"2026-09-12T11:42:41.6246151+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestBuildCodexAgentIdentityKeysUseChatGPTAccountOnly","Output":"=== RUN TestBuildCodexAgentIdentityKeysUseChatGPTAccountOnly\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6246151+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestBuildCodexAgentIdentityKeysUseChatGPTAccountOnly","Output":"--- PASS: TestBuildCodexAgentIdentityKeysUseChatGPTAccountOnly (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6246151+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestBuildCodexAgentIdentityKeysUseChatGPTAccountOnly","Elapsed":0} {"Time":"2026-09-12T11:42:41.6246151+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestCodexAgentIdentityIndexSeparatesTeamsForSameUser"} {"Time":"2026-09-12T11:42:41.6246151+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestCodexAgentIdentityIndexSeparatesTeamsForSameUser","Output":"=== RUN TestCodexAgentIdentityIndexSeparatesTeamsForSameUser\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6246151+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestCodexAgentIdentityIndexSeparatesTeamsForSameUser","Output":"--- PASS: TestCodexAgentIdentityIndexSeparatesTeamsForSameUser (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6246151+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestCodexAgentIdentityIndexSeparatesTeamsForSameUser","Elapsed":0} {"Time":"2026-09-12T11:42:41.6246151+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestImportCodexSessionsKeepsAgentIdentityTeamsSeparate"} {"Time":"2026-09-12T11:42:41.6246151+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestImportCodexSessionsKeepsAgentIdentityTeamsSeparate","Output":"=== RUN TestImportCodexSessionsKeepsAgentIdentityTeamsSeparate\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6246151+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestImportCodexSessionsKeepsAgentIdentityTeamsSeparate","Output":"--- PASS: TestImportCodexSessionsKeepsAgentIdentityTeamsSeparate (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6246151+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestImportCodexSessionsKeepsAgentIdentityTeamsSeparate","Elapsed":0} {"Time":"2026-09-12T11:42:41.6246151+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestImportCodexSessionsMergesAgentIdentityRuntimesForSameTeam"} {"Time":"2026-09-12T11:42:41.6246151+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestImportCodexSessionsMergesAgentIdentityRuntimesForSameTeam","Output":"=== RUN TestImportCodexSessionsMergesAgentIdentityRuntimesForSameTeam\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6246151+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestImportCodexSessionsMergesAgentIdentityRuntimesForSameTeam","Output":"--- PASS: TestImportCodexSessionsMergesAgentIdentityRuntimesForSameTeam (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6246151+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestImportCodexSessionsMergesAgentIdentityRuntimesForSameTeam","Elapsed":0} {"Time":"2026-09-12T11:42:41.6246151+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestImportCodexSessionsCreatesAgentIdentityWithoutOAuthExpiry"} {"Time":"2026-09-12T11:42:41.6246151+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestImportCodexSessionsCreatesAgentIdentityWithoutOAuthExpiry","Output":"=== RUN TestImportCodexSessionsCreatesAgentIdentityWithoutOAuthExpiry\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6246151+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestImportCodexSessionsCreatesAgentIdentityWithoutOAuthExpiry","Output":"--- PASS: TestImportCodexSessionsCreatesAgentIdentityWithoutOAuthExpiry (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6246151+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestImportCodexSessionsCreatesAgentIdentityWithoutOAuthExpiry","Elapsed":0} {"Time":"2026-09-12T11:42:41.6246151+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestParseCodexSessionImportEntriesSupportsRawTokenJSONAndArray"} {"Time":"2026-09-12T11:42:41.6246151+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestParseCodexSessionImportEntriesSupportsRawTokenJSONAndArray","Output":"=== RUN TestParseCodexSessionImportEntriesSupportsRawTokenJSONAndArray\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestParseCodexSessionImportEntriesSupportsRawTokenJSONAndArray","Output":"--- PASS: TestParseCodexSessionImportEntriesSupportsRawTokenJSONAndArray (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestParseCodexSessionImportEntriesSupportsRawTokenJSONAndArray","Elapsed":0} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestParseCodexSessionImportEntriesFallsBackToLineModeForMixedJSONAndToken"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestParseCodexSessionImportEntriesFallsBackToLineModeForMixedJSONAndToken","Output":"=== RUN TestParseCodexSessionImportEntriesFallsBackToLineModeForMixedJSONAndToken\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestParseCodexSessionImportEntriesFallsBackToLineModeForMixedJSONAndToken","Output":"--- PASS: TestParseCodexSessionImportEntriesFallsBackToLineModeForMixedJSONAndToken (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestParseCodexSessionImportEntriesFallsBackToLineModeForMixedJSONAndToken","Elapsed":0} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestNormalizeCodexSessionJSONExtractsCredentialsAndIgnoresSessionToken"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestNormalizeCodexSessionJSONExtractsCredentialsAndIgnoresSessionToken","Output":"=== RUN TestNormalizeCodexSessionJSONExtractsCredentialsAndIgnoresSessionToken\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestNormalizeCodexSessionJSONExtractsCredentialsAndIgnoresSessionToken","Output":"--- PASS: TestNormalizeCodexSessionJSONExtractsCredentialsAndIgnoresSessionToken (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestNormalizeCodexSessionJSONExtractsCredentialsAndIgnoresSessionToken","Elapsed":0} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestMergeCodexImportCredentialsPreservesExistingRefreshFieldsWhenIncomingHasNoRefreshToken"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestMergeCodexImportCredentialsPreservesExistingRefreshFieldsWhenIncomingHasNoRefreshToken","Output":"=== RUN TestMergeCodexImportCredentialsPreservesExistingRefreshFieldsWhenIncomingHasNoRefreshToken\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestMergeCodexImportCredentialsPreservesExistingRefreshFieldsWhenIncomingHasNoRefreshToken","Output":"--- PASS: TestMergeCodexImportCredentialsPreservesExistingRefreshFieldsWhenIncomingHasNoRefreshToken (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestMergeCodexImportCredentialsPreservesExistingRefreshFieldsWhenIncomingHasNoRefreshToken","Elapsed":0} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestMergeCodexImportCredentialsKeepsRefreshFieldsWhenIncomingHasRefreshToken"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestMergeCodexImportCredentialsKeepsRefreshFieldsWhenIncomingHasRefreshToken","Output":"=== RUN TestMergeCodexImportCredentialsKeepsRefreshFieldsWhenIncomingHasRefreshToken\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestMergeCodexImportCredentialsKeepsRefreshFieldsWhenIncomingHasRefreshToken","Output":"--- PASS: TestMergeCodexImportCredentialsKeepsRefreshFieldsWhenIncomingHasRefreshToken (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestMergeCodexImportCredentialsKeepsRefreshFieldsWhenIncomingHasRefreshToken","Elapsed":0} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestNormalizeCodexImportRejectsExpiredAccessToken"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestNormalizeCodexImportRejectsExpiredAccessToken","Output":"=== RUN TestNormalizeCodexImportRejectsExpiredAccessToken\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestNormalizeCodexImportRejectsExpiredAccessToken","Output":"--- PASS: TestNormalizeCodexImportRejectsExpiredAccessToken (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestNormalizeCodexImportRejectsExpiredAccessToken","Elapsed":0} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestResolveCodexImportExpiryForNoRefreshTokenUsesTokenExpiry"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestResolveCodexImportExpiryForNoRefreshTokenUsesTokenExpiry","Output":"=== RUN TestResolveCodexImportExpiryForNoRefreshTokenUsesTokenExpiry\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestResolveCodexImportExpiryForNoRefreshTokenUsesTokenExpiry","Output":"--- PASS: TestResolveCodexImportExpiryForNoRefreshTokenUsesTokenExpiry (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestResolveCodexImportExpiryForNoRefreshTokenUsesTokenExpiry","Elapsed":0} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestResolveCodexImportExpiryForNoRefreshTokenRequiresExpiry"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestResolveCodexImportExpiryForNoRefreshTokenRequiresExpiry","Output":"=== RUN TestResolveCodexImportExpiryForNoRefreshTokenRequiresExpiry\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestResolveCodexImportExpiryForNoRefreshTokenRequiresExpiry","Output":"--- PASS: TestResolveCodexImportExpiryForNoRefreshTokenRequiresExpiry (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestResolveCodexImportExpiryForNoRefreshTokenRequiresExpiry","Elapsed":0} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestResolveCodexImportExpiryForNoRefreshTokenUsesEarlierRequestExpiry"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestResolveCodexImportExpiryForNoRefreshTokenUsesEarlierRequestExpiry","Output":"=== RUN TestResolveCodexImportExpiryForNoRefreshTokenUsesEarlierRequestExpiry\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestResolveCodexImportExpiryForNoRefreshTokenUsesEarlierRequestExpiry","Output":"--- PASS: TestResolveCodexImportExpiryForNoRefreshTokenUsesEarlierRequestExpiry (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestResolveCodexImportExpiryForNoRefreshTokenUsesEarlierRequestExpiry","Elapsed":0} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestCodexIdentityKeysPreferStrongIdentifiers"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestCodexIdentityKeysPreferStrongIdentifiers","Output":"=== RUN TestCodexIdentityKeysPreferStrongIdentifiers\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestCodexIdentityKeysPreferStrongIdentifiers","Output":"--- PASS: TestCodexIdentityKeysPreferStrongIdentifiers (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestCodexIdentityKeysPreferStrongIdentifiers","Elapsed":0} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestCodexAccountIndexDoesNotMatchDifferentUsersInSameChatGPTAccount"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestCodexAccountIndexDoesNotMatchDifferentUsersInSameChatGPTAccount","Output":"=== RUN TestCodexAccountIndexDoesNotMatchDifferentUsersInSameChatGPTAccount\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestCodexAccountIndexDoesNotMatchDifferentUsersInSameChatGPTAccount","Output":"--- PASS: TestCodexAccountIndexDoesNotMatchDifferentUsersInSameChatGPTAccount (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestCodexAccountIndexDoesNotMatchDifferentUsersInSameChatGPTAccount","Elapsed":0} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestCodexAccountIndexFallsBackToAccountKeyWhenRefreshTokenExistsAndUserIDMissing"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestCodexAccountIndexFallsBackToAccountKeyWhenRefreshTokenExistsAndUserIDMissing","Output":"=== RUN TestCodexAccountIndexFallsBackToAccountKeyWhenRefreshTokenExistsAndUserIDMissing\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestCodexAccountIndexFallsBackToAccountKeyWhenRefreshTokenExistsAndUserIDMissing","Output":"--- PASS: TestCodexAccountIndexFallsBackToAccountKeyWhenRefreshTokenExistsAndUserIDMissing (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestCodexAccountIndexFallsBackToAccountKeyWhenRefreshTokenExistsAndUserIDMissing","Elapsed":0} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestCodexAccountIndexAccessTokenOnlyUsesTokenFingerprint"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestCodexAccountIndexAccessTokenOnlyUsesTokenFingerprint","Output":"=== RUN TestCodexAccountIndexAccessTokenOnlyUsesTokenFingerprint\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestCodexAccountIndexAccessTokenOnlyUsesTokenFingerprint","Output":"--- PASS: TestCodexAccountIndexAccessTokenOnlyUsesTokenFingerprint (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestCodexAccountIndexAccessTokenOnlyUsesTokenFingerprint","Elapsed":0} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestCodexAccountIndexKeepsAllCandidatesForSharedAccountKey"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestCodexAccountIndexKeepsAllCandidatesForSharedAccountKey","Output":"=== RUN TestCodexAccountIndexKeepsAllCandidatesForSharedAccountKey\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestCodexAccountIndexKeepsAllCandidatesForSharedAccountKey","Output":"--- PASS: TestCodexAccountIndexKeepsAllCandidatesForSharedAccountKey (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestCodexAccountIndexKeepsAllCandidatesForSharedAccountKey","Elapsed":0} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestCodexAccountIndexUpsertReplacesSameAccount"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestCodexAccountIndexUpsertReplacesSameAccount","Output":"=== RUN TestCodexAccountIndexUpsertReplacesSameAccount\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestCodexAccountIndexUpsertReplacesSameAccount","Output":"--- PASS: TestCodexAccountIndexUpsertReplacesSameAccount (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestCodexAccountIndexUpsertReplacesSameAccount","Elapsed":0} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestCodexAccountIndexUpdateRemovesAllPreviousKeys"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestCodexAccountIndexUpdateRemovesAllPreviousKeys","Output":"=== RUN TestCodexAccountIndexUpdateRemovesAllPreviousKeys\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestCodexAccountIndexUpdateRemovesAllPreviousKeys","Output":"--- PASS: TestCodexAccountIndexUpdateRemovesAllPreviousKeys (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestCodexAccountIndexUpdateRemovesAllPreviousKeys","Elapsed":0} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestCodexAccountIndexUpdatePreservesSharedKeyCandidateOrder"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestCodexAccountIndexUpdatePreservesSharedKeyCandidateOrder","Output":"=== RUN TestCodexAccountIndexUpdatePreservesSharedKeyCandidateOrder\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestCodexAccountIndexUpdatePreservesSharedKeyCandidateOrder","Output":"--- PASS: TestCodexAccountIndexUpdatePreservesSharedKeyCandidateOrder (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestCodexAccountIndexUpdatePreservesSharedKeyCandidateOrder","Elapsed":0} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestCodexIdentitySeenDistinguishesTeamMembers"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestCodexIdentitySeenDistinguishesTeamMembers","Output":"=== RUN TestCodexIdentitySeenDistinguishesTeamMembers\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestCodexIdentitySeenDistinguishesTeamMembers","Output":"--- PASS: TestCodexIdentitySeenDistinguishesTeamMembers (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestCodexIdentitySeenDistinguishesTeamMembers","Elapsed":0} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestNormalizeCodexImportUsesJWTSubForAccessTokenOnlyIdentity"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestNormalizeCodexImportUsesJWTSubForAccessTokenOnlyIdentity","Output":"=== RUN TestNormalizeCodexImportUsesJWTSubForAccessTokenOnlyIdentity\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestNormalizeCodexImportUsesJWTSubForAccessTokenOnlyIdentity","Output":"--- PASS: TestNormalizeCodexImportUsesJWTSubForAccessTokenOnlyIdentity (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestNormalizeCodexImportUsesJWTSubForAccessTokenOnlyIdentity","Elapsed":0} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestImportCodexSessionsAccessTokenOnlySameWorkspaceDifferentUsersCreatesTwoAccounts"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestImportCodexSessionsAccessTokenOnlySameWorkspaceDifferentUsersCreatesTwoAccounts","Output":"=== RUN TestImportCodexSessionsAccessTokenOnlySameWorkspaceDifferentUsersCreatesTwoAccounts\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestImportCodexSessionsAccessTokenOnlySameWorkspaceDifferentUsersCreatesTwoAccounts","Output":"--- PASS: TestImportCodexSessionsAccessTokenOnlySameWorkspaceDifferentUsersCreatesTwoAccounts (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestImportCodexSessionsAccessTokenOnlySameWorkspaceDifferentUsersCreatesTwoAccounts","Elapsed":0} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestImportCodexSessionsAccessTokenOnlySameWorkspaceAndUserDifferentTokensCreatesTwoAccounts"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestImportCodexSessionsAccessTokenOnlySameWorkspaceAndUserDifferentTokensCreatesTwoAccounts","Output":"=== RUN TestImportCodexSessionsAccessTokenOnlySameWorkspaceAndUserDifferentTokensCreatesTwoAccounts\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestImportCodexSessionsAccessTokenOnlySameWorkspaceAndUserDifferentTokensCreatesTwoAccounts","Output":"--- PASS: TestImportCodexSessionsAccessTokenOnlySameWorkspaceAndUserDifferentTokensCreatesTwoAccounts (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestImportCodexSessionsAccessTokenOnlySameWorkspaceAndUserDifferentTokensCreatesTwoAccounts","Elapsed":0} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestImportCodexSessionsAccessTokenOnlySameUserUpdatesExisting"} {"Time":"2026-09-12T11:42:41.6251354+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestImportCodexSessionsAccessTokenOnlySameUserUpdatesExisting","Output":"=== RUN TestImportCodexSessionsAccessTokenOnlySameUserUpdatesExisting\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6256434+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestImportCodexSessionsAccessTokenOnlySameUserUpdatesExisting","Output":"--- PASS: TestImportCodexSessionsAccessTokenOnlySameUserUpdatesExisting (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6256434+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestImportCodexSessionsAccessTokenOnlySameUserUpdatesExisting","Elapsed":0} {"Time":"2026-09-12T11:42:41.6256434+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestImportCodexSessionsUpgradesAccessTokenOnlyAccountWithRefreshToken"} {"Time":"2026-09-12T11:42:41.6256434+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestImportCodexSessionsUpgradesAccessTokenOnlyAccountWithRefreshToken","Output":"=== RUN TestImportCodexSessionsUpgradesAccessTokenOnlyAccountWithRefreshToken\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6256434+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestImportCodexSessionsUpgradesAccessTokenOnlyAccountWithRefreshToken","Output":"--- PASS: TestImportCodexSessionsUpgradesAccessTokenOnlyAccountWithRefreshToken (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6256434+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestImportCodexSessionsUpgradesAccessTokenOnlyAccountWithRefreshToken","Elapsed":0} {"Time":"2026-09-12T11:42:41.6256434+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestImportCodexSessionsAccessTokenOnlyPreservesExistingRefreshToken"} {"Time":"2026-09-12T11:42:41.6256434+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestImportCodexSessionsAccessTokenOnlyPreservesExistingRefreshToken","Output":"=== RUN TestImportCodexSessionsAccessTokenOnlyPreservesExistingRefreshToken\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6256434+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestImportCodexSessionsAccessTokenOnlyPreservesExistingRefreshToken","Output":"--- PASS: TestImportCodexSessionsAccessTokenOnlyPreservesExistingRefreshToken (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6256434+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestImportCodexSessionsAccessTokenOnlyPreservesExistingRefreshToken","Elapsed":0} {"Time":"2026-09-12T11:42:41.6256434+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestImportCodexSessionsBatchOldAccessTokenDoesNotRollbackRefreshToken"} {"Time":"2026-09-12T11:42:41.6256434+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestImportCodexSessionsBatchOldAccessTokenDoesNotRollbackRefreshToken","Output":"=== RUN TestImportCodexSessionsBatchOldAccessTokenDoesNotRollbackRefreshToken\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6256434+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestImportCodexSessionsBatchOldAccessTokenDoesNotRollbackRefreshToken","Output":"--- PASS: TestImportCodexSessionsBatchOldAccessTokenDoesNotRollbackRefreshToken (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6256434+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestImportCodexSessionsBatchOldAccessTokenDoesNotRollbackRefreshToken","Elapsed":0} {"Time":"2026-09-12T11:42:41.6256434+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestImportCodexSessionsWithRefreshTokenKeepsExistingDedup"} {"Time":"2026-09-12T11:42:41.6256434+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestImportCodexSessionsWithRefreshTokenKeepsExistingDedup","Output":"=== RUN TestImportCodexSessionsWithRefreshTokenKeepsExistingDedup\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6256434+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestImportCodexSessionsWithRefreshTokenKeepsExistingDedup","Output":"--- PASS: TestImportCodexSessionsWithRefreshTokenKeepsExistingDedup (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6256434+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestImportCodexSessionsWithRefreshTokenKeepsExistingDedup","Elapsed":0} {"Time":"2026-09-12T11:42:41.6256434+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestOpenAIOAuthCodexPATBoundaryRejectsMalformedOpenAILongContextBillingValueBeforeTokenValidation"} {"Time":"2026-09-12T11:42:41.6256434+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestOpenAIOAuthCodexPATBoundaryRejectsMalformedOpenAILongContextBillingValueBeforeTokenValidation","Output":"=== RUN TestOpenAIOAuthCodexPATBoundaryRejectsMalformedOpenAILongContextBillingValueBeforeTokenValidation\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6256434+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestOpenAIOAuthCodexPATBoundaryRejectsMalformedOpenAILongContextBillingValueBeforeTokenValidation","Output":"--- PASS: TestOpenAIOAuthCodexPATBoundaryRejectsMalformedOpenAILongContextBillingValueBeforeTokenValidation (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6256434+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Test":"TestOpenAIOAuthCodexPATBoundaryRejectsMalformedOpenAILongContextBillingValueBeforeTokenValidation","Elapsed":0} {"Time":"2026-09-12T11:42:41.6261517+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Output":"PASS\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.6292372+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Output":"ok \tgithub.com/Wei-Shaw/sub2api/internal/handler/admin\t6.825s\n"} {"Time":"2026-09-12T11:42:41.6292372+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/handler/admin","Elapsed":6.825} {"Time":"2026-09-12T11:42:41.908623+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_GetSchedulableAccount_ExhaustedCodexExtraDoesNotSetRateLimit","Output":"--- PASS: TestOpenAIGatewayService_GetSchedulableAccount_ExhaustedCodexExtraDoesNotSetRateLimit (2.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:41.908623+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestOpenAIGatewayService_GetSchedulableAccount_ExhaustedCodexExtraDoesNotSetRateLimit","Elapsed":2} {"Time":"2026-09-12T11:42:41.908623+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAdminService_ListAccounts_ExhaustedCodexExtraDoesNotSetRateLimit"} {"Time":"2026-09-12T11:42:41.908623+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAdminService_ListAccounts_ExhaustedCodexExtraDoesNotSetRateLimit","Output":"=== RUN TestAdminService_ListAccounts_ExhaustedCodexExtraDoesNotSetRateLimit\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.908996+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAdminService_ListAccounts_ExhaustedCodexExtraDoesNotSetRateLimit","Output":"--- PASS: TestAdminService_ListAccounts_ExhaustedCodexExtraDoesNotSetRateLimit (2.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.908996+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAdminService_ListAccounts_ExhaustedCodexExtraDoesNotSetRateLimit","Elapsed":2} {"Time":"2026-09-12T11:42:43.9096394+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetModelPricing_Gpt53CodexSparkUsesGpt51CodexPricing"} {"Time":"2026-09-12T11:42:43.9096394+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetModelPricing_Gpt53CodexSparkUsesGpt51CodexPricing","Output":"=== RUN TestGetModelPricing_Gpt53CodexSparkUsesGpt51CodexPricing\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9096394+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetModelPricing_Gpt53CodexSparkUsesGpt51CodexPricing","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:43.909Z\",\"msg\":\"[Pricing][SparkBilling] gpt-5.3-codex-spark -\u003e gpt-5.1-codex billing\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.pricing\",\"legacy_printf\":true}\n"} {"Time":"2026-09-12T11:42:43.9096394+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetModelPricing_Gpt53CodexSparkUsesGpt51CodexPricing","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:43.909Z\",\"msg\":\"[Pricing] OpenAI fallback matched gpt-5.3-codex-spark -\u003e gpt-5.1-codex\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.pricing\"}\n"} {"Time":"2026-09-12T11:42:43.9096394+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetModelPricing_Gpt53CodexSparkUsesGpt51CodexPricing","Output":"--- PASS: TestGetModelPricing_Gpt53CodexSparkUsesGpt51CodexPricing (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9096394+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetModelPricing_Gpt53CodexSparkUsesGpt51CodexPricing","Elapsed":0} {"Time":"2026-09-12T11:42:43.9096394+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetModelPricing_Gpt53CodexFallbackStillUsesGpt52Codex"} {"Time":"2026-09-12T11:42:43.9096394+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetModelPricing_Gpt53CodexFallbackStillUsesGpt52Codex","Output":"=== RUN TestGetModelPricing_Gpt53CodexFallbackStillUsesGpt52Codex\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9096394+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetModelPricing_Gpt53CodexFallbackStillUsesGpt52Codex","Output":"{\"level\":\"INFO\",\"time\":\"2026-09-12T03:42:43.909Z\",\"msg\":\"[Pricing] OpenAI fallback matched gpt-5.3-codex -\u003e gpt-5.2-codex\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.pricing\"}\n"} {"Time":"2026-09-12T11:42:43.9096394+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetModelPricing_Gpt53CodexFallbackStillUsesGpt52Codex","Output":"--- PASS: TestGetModelPricing_Gpt53CodexFallbackStillUsesGpt52Codex (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9096394+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetModelPricing_Gpt53CodexFallbackStillUsesGpt52Codex","Elapsed":0} {"Time":"2026-09-12T11:42:43.9096394+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestDefaultPricingUsesCurrentCodexAutoReviewBaseRates"} {"Time":"2026-09-12T11:42:43.9096394+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestDefaultPricingUsesCurrentCodexAutoReviewBaseRates","Output":"=== RUN TestDefaultPricingUsesCurrentCodexAutoReviewBaseRates\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9134264+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestDefaultPricingUsesCurrentCodexAutoReviewBaseRates","Output":"--- PASS: TestDefaultPricingUsesCurrentCodexAutoReviewBaseRates (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9134264+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestDefaultPricingUsesCurrentCodexAutoReviewBaseRates","Elapsed":0} {"Time":"2026-09-12T11:42:43.9134264+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexRestrictionPolicy"} {"Time":"2026-09-12T11:42:43.9134264+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexRestrictionPolicy","Output":"=== RUN TestGetCodexRestrictionPolicy\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexRestrictionPolicy","Output":"--- PASS: TestGetCodexRestrictionPolicy (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexRestrictionPolicy","Elapsed":0} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexRestrictionPolicy_DefaultsSafe"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexRestrictionPolicy_DefaultsSafe","Output":"=== RUN TestGetCodexRestrictionPolicy_DefaultsSafe\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexRestrictionPolicy_DefaultsSafe","Output":"--- PASS: TestGetCodexRestrictionPolicy_DefaultsSafe (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexRestrictionPolicy_DefaultsSafe","Elapsed":0} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexRestrictionPolicy_InvalidJSONSafe"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexRestrictionPolicy_InvalidJSONSafe","Output":"=== RUN TestGetCodexRestrictionPolicy_InvalidJSONSafe\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexRestrictionPolicy_InvalidJSONSafe","Output":"--- PASS: TestGetCodexRestrictionPolicy_InvalidJSONSafe (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexRestrictionPolicy_InvalidJSONSafe","Elapsed":0} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMigrateOpenAIAllowClaudeCodeCodexPluginSetting"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMigrateOpenAIAllowClaudeCodeCodexPluginSetting","Output":"=== RUN TestMigrateOpenAIAllowClaudeCodeCodexPluginSetting\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMigrateOpenAIAllowClaudeCodeCodexPluginSetting/legacy_true_appends_Claude_Code_entry_to_whitelist"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMigrateOpenAIAllowClaudeCodeCodexPluginSetting/legacy_true_appends_Claude_Code_entry_to_whitelist","Output":"=== RUN TestMigrateOpenAIAllowClaudeCodeCodexPluginSetting/legacy_true_appends_Claude_Code_entry_to_whitelist\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMigrateOpenAIAllowClaudeCodeCodexPluginSetting/legacy_true_appends_Claude_Code_entry_to_whitelist","Output":"--- PASS: TestMigrateOpenAIAllowClaudeCodeCodexPluginSetting/legacy_true_appends_Claude_Code_entry_to_whitelist (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMigrateOpenAIAllowClaudeCodeCodexPluginSetting/legacy_true_appends_Claude_Code_entry_to_whitelist","Elapsed":0} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMigrateOpenAIAllowClaudeCodeCodexPluginSetting/legacy_true_does_not_duplicate_existing_Claude_Code_entry"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMigrateOpenAIAllowClaudeCodeCodexPluginSetting/legacy_true_does_not_duplicate_existing_Claude_Code_entry","Output":"=== RUN TestMigrateOpenAIAllowClaudeCodeCodexPluginSetting/legacy_true_does_not_duplicate_existing_Claude_Code_entry\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMigrateOpenAIAllowClaudeCodeCodexPluginSetting/legacy_true_does_not_duplicate_existing_Claude_Code_entry","Output":"--- PASS: TestMigrateOpenAIAllowClaudeCodeCodexPluginSetting/legacy_true_does_not_duplicate_existing_Claude_Code_entry (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMigrateOpenAIAllowClaudeCodeCodexPluginSetting/legacy_true_does_not_duplicate_existing_Claude_Code_entry","Elapsed":0} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMigrateOpenAIAllowClaudeCodeCodexPluginSetting","Output":"--- PASS: TestMigrateOpenAIAllowClaudeCodeCodexPluginSetting (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMigrateOpenAIAllowClaudeCodeCodexPluginSetting","Elapsed":0} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexRestrictionPolicy_AllowAppServerClients"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexRestrictionPolicy_AllowAppServerClients","Output":"=== RUN TestGetCodexRestrictionPolicy_AllowAppServerClients\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexRestrictionPolicy_AllowAppServerClients/显式_true_开启"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexRestrictionPolicy_AllowAppServerClients/显式_true_开启","Output":"=== RUN TestGetCodexRestrictionPolicy_AllowAppServerClients/显式_true_开启\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexRestrictionPolicy_AllowAppServerClients/显式_true_开启","Output":"--- PASS: TestGetCodexRestrictionPolicy_AllowAppServerClients/显式_true_开启 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexRestrictionPolicy_AllowAppServerClients/显式_true_开启","Elapsed":0} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexRestrictionPolicy_AllowAppServerClients/缺失默认_false"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexRestrictionPolicy_AllowAppServerClients/缺失默认_false","Output":"=== RUN TestGetCodexRestrictionPolicy_AllowAppServerClients/缺失默认_false\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexRestrictionPolicy_AllowAppServerClients/缺失默认_false","Output":"--- PASS: TestGetCodexRestrictionPolicy_AllowAppServerClients/缺失默认_false (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexRestrictionPolicy_AllowAppServerClients/缺失默认_false","Elapsed":0} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexRestrictionPolicy_AllowAppServerClients/非_true_值视为_false"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexRestrictionPolicy_AllowAppServerClients/非_true_值视为_false","Output":"=== RUN TestGetCodexRestrictionPolicy_AllowAppServerClients/非_true_值视为_false\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexRestrictionPolicy_AllowAppServerClients/非_true_值视为_false","Output":"--- PASS: TestGetCodexRestrictionPolicy_AllowAppServerClients/非_true_值视为_false (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexRestrictionPolicy_AllowAppServerClients/非_true_值视为_false","Elapsed":0} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexRestrictionPolicy_AllowAppServerClients","Output":"--- PASS: TestGetCodexRestrictionPolicy_AllowAppServerClients (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexRestrictionPolicy_AllowAppServerClients","Elapsed":0} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexRestrictionPolicy_EngineFingerprintSignals"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexRestrictionPolicy_EngineFingerprintSignals","Output":"=== RUN TestGetCodexRestrictionPolicy_EngineFingerprintSignals\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexRestrictionPolicy_EngineFingerprintSignals/键缺失_→_默认种子(只勾x-codex-)"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexRestrictionPolicy_EngineFingerprintSignals/键缺失_→_默认种子(只勾x-codex-)","Output":"=== RUN TestGetCodexRestrictionPolicy_EngineFingerprintSignals/键缺失_→_默认种子(只勾x-codex-)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexRestrictionPolicy_EngineFingerprintSignals/键缺失_→_默认种子(只勾x-codex-)","Output":"--- PASS: TestGetCodexRestrictionPolicy_EngineFingerprintSignals/键缺失_→_默认种子(只勾x-codex-) (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexRestrictionPolicy_EngineFingerprintSignals/键缺失_→_默认种子(只勾x-codex-)","Elapsed":0} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexRestrictionPolicy_EngineFingerprintSignals/显式配置_→_原样采用"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexRestrictionPolicy_EngineFingerprintSignals/显式配置_→_原样采用","Output":"=== RUN TestGetCodexRestrictionPolicy_EngineFingerprintSignals/显式配置_→_原样采用\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexRestrictionPolicy_EngineFingerprintSignals/显式配置_→_原样采用","Output":"--- PASS: TestGetCodexRestrictionPolicy_EngineFingerprintSignals/显式配置_→_原样采用 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexRestrictionPolicy_EngineFingerprintSignals/显式配置_→_原样采用","Elapsed":0} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexRestrictionPolicy_EngineFingerprintSignals/非法JSON_→_回落默认种子"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexRestrictionPolicy_EngineFingerprintSignals/非法JSON_→_回落默认种子","Output":"=== RUN TestGetCodexRestrictionPolicy_EngineFingerprintSignals/非法JSON_→_回落默认种子\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexRestrictionPolicy_EngineFingerprintSignals/非法JSON_→_回落默认种子","Output":"--- PASS: TestGetCodexRestrictionPolicy_EngineFingerprintSignals/非法JSON_→_回落默认种子 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexRestrictionPolicy_EngineFingerprintSignals/非法JSON_→_回落默认种子","Elapsed":0} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexRestrictionPolicy_EngineFingerprintSignals","Output":"--- PASS: TestGetCodexRestrictionPolicy_EngineFingerprintSignals (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestGetCodexRestrictionPolicy_EngineFingerprintSignals","Elapsed":0} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMigrateCodexBodyFingerprintToSignals"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMigrateCodexBodyFingerprintToSignals","Output":"=== RUN TestMigrateCodexBodyFingerprintToSignals\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMigrateCodexBodyFingerprintToSignals/信号键已存在_→_不动"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMigrateCodexBodyFingerprintToSignals/信号键已存在_→_不动","Output":"=== RUN TestMigrateCodexBodyFingerprintToSignals/信号键已存在_→_不动\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMigrateCodexBodyFingerprintToSignals/信号键已存在_→_不动","Output":"--- PASS: TestMigrateCodexBodyFingerprintToSignals/信号键已存在_→_不动 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMigrateCodexBodyFingerprintToSignals/信号键已存在_→_不动","Elapsed":0} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMigrateCodexBodyFingerprintToSignals/信号键缺失_+_旧body=true_→_写种子且body行Required=true"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMigrateCodexBodyFingerprintToSignals/信号键缺失_+_旧body=true_→_写种子且body行Required=true","Output":"=== RUN TestMigrateCodexBodyFingerprintToSignals/信号键缺失_+_旧body=true_→_写种子且body行Required=true\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMigrateCodexBodyFingerprintToSignals/信号键缺失_+_旧body=true_→_写种子且body行Required=true","Output":"--- PASS: TestMigrateCodexBodyFingerprintToSignals/信号键缺失_+_旧body=true_→_写种子且body行Required=true (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMigrateCodexBodyFingerprintToSignals/信号键缺失_+_旧body=true_→_写种子且body行Required=true","Elapsed":0} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMigrateCodexBodyFingerprintToSignals/信号键缺失_+_旧body=false/缺_→_写种子(body不勾)"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMigrateCodexBodyFingerprintToSignals/信号键缺失_+_旧body=false/缺_→_写种子(body不勾)","Output":"=== RUN TestMigrateCodexBodyFingerprintToSignals/信号键缺失_+_旧body=false/缺_→_写种子(body不勾)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMigrateCodexBodyFingerprintToSignals/信号键缺失_+_旧body=false/缺_→_写种子(body不勾)","Output":"--- PASS: TestMigrateCodexBodyFingerprintToSignals/信号键缺失_+_旧body=false/缺_→_写种子(body不勾) (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMigrateCodexBodyFingerprintToSignals/信号键缺失_+_旧body=false/缺_→_写种子(body不勾)","Elapsed":0} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMigrateCodexBodyFingerprintToSignals","Output":"--- PASS: TestMigrateCodexBodyFingerprintToSignals (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMigrateCodexBodyFingerprintToSignals","Elapsed":0} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestValidateCodexClientEntriesJSON"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestValidateCodexClientEntriesJSON","Output":"=== RUN TestValidateCodexClientEntriesJSON\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestValidateCodexClientEntriesJSON","Output":"--- PASS: TestValidateCodexClientEntriesJSON (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestValidateCodexClientEntriesJSON","Elapsed":0} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestValidateCodexWhitelistEntriesJSON"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestValidateCodexWhitelistEntriesJSON","Output":"=== RUN TestValidateCodexWhitelistEntriesJSON\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestValidateCodexWhitelistEntriesJSON","Output":"--- PASS: TestValidateCodexWhitelistEntriesJSON (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9139385+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestValidateCodexWhitelistEntriesJSON","Elapsed":0} {"Time":"2026-09-12T11:42:43.9144454+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestShouldRefreshOpenAICodexSnapshot"} {"Time":"2026-09-12T11:42:43.9144454+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestShouldRefreshOpenAICodexSnapshot","Output":"=== CONT TestShouldRefreshOpenAICodexSnapshot\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9144454+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesAccountMappingOwnershipAndMappedModel"} {"Time":"2026-09-12T11:42:43.9144454+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesAccountMappingOwnershipAndMappedModel","Output":"=== CONT TestBuildCodexModelsManifestForGroupUsesAccountMappingOwnershipAndMappedModel\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9144454+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMergeGroupConfiguredCodexModelsHonorsCustomListAndFinalETag"} {"Time":"2026-09-12T11:42:43.9144454+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMergeGroupConfiguredCodexModelsHonorsCustomListAndFinalETag","Output":"=== CONT TestMergeGroupConfiguredCodexModelsHonorsCustomListAndFinalETag\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9144454+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFilterCodexModelIDsForGroupOmitsWildcardKeys"} {"Time":"2026-09-12T11:42:43.9144454+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFilterCodexModelIDsForGroupOmitsWildcardKeys","Output":"=== CONT TestFilterCodexModelIDsForGroupOmitsWildcardKeys\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9144454+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupDoesNotAdvertiseNoneWhenAccountReasoningConflicts"} {"Time":"2026-09-12T11:42:43.9144454+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupDoesNotAdvertiseNoneWhenAccountReasoningConflicts","Output":"=== CONT TestBuildCodexModelsManifestForGroupDoesNotAdvertiseNoneWhenAccountReasoningConflicts\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9149537+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesNoneForExplicitNonReasoningMetadata"} {"Time":"2026-09-12T11:42:43.9149537+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesNoneForExplicitNonReasoningMetadata","Output":"=== CONT TestBuildCodexModelsManifestForGroupUsesNoneForExplicitNonReasoningMetadata\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9149537+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildGroupConfiguredCodexModelsManifestUsesAdministratorConfiguration"} {"Time":"2026-09-12T11:42:43.9149537+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildGroupConfiguredCodexModelsManifestUsesAdministratorConfiguration","Output":"=== CONT TestBuildGroupConfiguredCodexModelsManifestUsesAdministratorConfiguration\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9149537+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildGroupConfiguredCodexModelsManifestFallsThroughWithoutConfiguration"} {"Time":"2026-09-12T11:42:43.9149537+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildGroupConfiguredCodexModelsManifestFallsThroughWithoutConfiguration","Output":"=== CONT TestBuildGroupConfiguredCodexModelsManifestFallsThroughWithoutConfiguration\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9149537+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupLoadsAccountsOnce"} {"Time":"2026-09-12T11:42:43.9149537+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupLoadsAccountsOnce","Output":"=== CONT TestBuildCodexModelsManifestForGroupLoadsAccountsOnce\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9149537+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMergeGroupConfiguredCodexModelsKeepsExplicitAutoReviewSelection"} {"Time":"2026-09-12T11:42:43.9149537+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMergeGroupConfiguredCodexModelsKeepsExplicitAutoReviewSelection","Output":"=== CONT TestMergeGroupConfiguredCodexModelsKeepsExplicitAutoReviewSelection\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9149537+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupOmitsDedicatedMediaTargetAlias"} {"Time":"2026-09-12T11:42:43.9149537+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupOmitsDedicatedMediaTargetAlias","Output":"=== CONT TestBuildCodexModelsManifestForGroupOmitsDedicatedMediaTargetAlias\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9149537+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesSyncedAccountMetadata"} {"Time":"2026-09-12T11:42:43.9149537+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesSyncedAccountMetadata","Output":"=== CONT TestBuildCodexModelsManifestForGroupUsesSyncedAccountMetadata\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9149537+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesSafeFallbackForConflictingAliasTargets"} {"Time":"2026-09-12T11:42:43.9149537+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesSafeFallbackForConflictingAliasTargets","Output":"=== CONT TestBuildCodexModelsManifestForGroupUsesSafeFallbackForConflictingAliasTargets\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9149537+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMergeGroupConfiguredCodexModelsFiltersAccountMappedAutoReviewByDefault"} {"Time":"2026-09-12T11:42:43.9149537+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMergeGroupConfiguredCodexModelsFiltersAccountMappedAutoReviewByDefault","Output":"=== CONT TestMergeGroupConfiguredCodexModelsFiltersAccountMappedAutoReviewByDefault\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9149537+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupKeepsCrossPlatformAliasAmbiguityClosed"} {"Time":"2026-09-12T11:42:43.9149537+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupKeepsCrossPlatformAliasAmbiguityClosed","Output":"=== CONT TestBuildCodexModelsManifestForGroupKeepsCrossPlatformAliasAmbiguityClosed\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9149537+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientFiltersOfficialNonAgentModels"} {"Time":"2026-09-12T11:42:43.9149537+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientFiltersOfficialNonAgentModels","Output":"=== CONT TestCompleteAPIKeyCodexModelsManifestForClientFiltersOfficialNonAgentModels\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9149537+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMergeGroupConfiguredCodexModelsFiltersAutoReviewByDefault"} {"Time":"2026-09-12T11:42:43.9149537+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMergeGroupConfiguredCodexModelsFiltersAutoReviewByDefault","Output":"=== CONT TestMergeGroupConfiguredCodexModelsFiltersAutoReviewByDefault\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9149537+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestForwardAsAnthropic_ReusesOAuthCodexTurnState"} {"Time":"2026-09-12T11:42:43.9149537+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestForwardAsAnthropic_ReusesOAuthCodexTurnState","Output":"=== CONT TestForwardAsAnthropic_ReusesOAuthCodexTurnState\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9149537+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupFallsBackToSchedulableWhenAvailabilityLookupFails"} {"Time":"2026-09-12T11:42:43.9149537+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupFallsBackToSchedulableWhenAvailabilityLookupFails","Output":"=== CONT TestBuildCodexModelsManifestForGroupFallsBackToSchedulableWhenAvailabilityLookupFails\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9149537+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientPreservesProviderMetadata"} {"Time":"2026-09-12T11:42:43.9149537+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientPreservesProviderMetadata","Output":"=== CONT TestCompleteAPIKeyCodexModelsManifestForClientPreservesProviderMetadata\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9149537+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesFallbackWhenTextOnlyPlatformHasNoSnapshot"} {"Time":"2026-09-12T11:42:43.9149537+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesFallbackWhenTextOnlyPlatformHasNoSnapshot","Output":"=== CONT TestBuildCodexModelsManifestForGroupUsesFallbackWhenTextOnlyPlatformHasNoSnapshot\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9149537+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestShouldRefreshOpenAICodexSnapshot","Output":"--- PASS: TestShouldRefreshOpenAICodexSnapshot (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9149537+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestShouldRefreshOpenAICodexSnapshot","Elapsed":0} {"Time":"2026-09-12T11:42:43.9149537+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFilterCodexModelIDsForGroupOmitsWildcardKeys","Output":"--- PASS: TestFilterCodexModelIDsForGroupOmitsWildcardKeys (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9149537+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestFilterCodexModelIDsForGroupOmitsWildcardKeys","Elapsed":0} {"Time":"2026-09-12T11:42:43.9149537+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildGroupConfiguredCodexModelsManifestFallsThroughWithoutConfiguration","Output":"--- PASS: TestBuildGroupConfiguredCodexModelsManifestFallsThroughWithoutConfiguration (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9149537+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildGroupConfiguredCodexModelsManifestFallsThroughWithoutConfiguration","Elapsed":0} {"Time":"2026-09-12T11:42:43.9149537+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesAccountMappingOwnershipAndMappedModel","Output":"--- PASS: TestBuildCodexModelsManifestForGroupUsesAccountMappingOwnershipAndMappedModel (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9149537+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesAccountMappingOwnershipAndMappedModel","Elapsed":0} {"Time":"2026-09-12T11:42:43.9149537+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupDoesNotAdvertiseNoneWhenAccountReasoningConflicts","Output":"--- PASS: TestBuildCodexModelsManifestForGroupDoesNotAdvertiseNoneWhenAccountReasoningConflicts (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9154771+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupDoesNotAdvertiseNoneWhenAccountReasoningConflicts","Elapsed":0} {"Time":"2026-09-12T11:42:43.9154771+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupOmitsDedicatedMediaTargetAlias","Output":"--- PASS: TestBuildCodexModelsManifestForGroupOmitsDedicatedMediaTargetAlias (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9154771+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupOmitsDedicatedMediaTargetAlias","Elapsed":0} {"Time":"2026-09-12T11:42:43.9154771+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMergeGroupConfiguredCodexModelsKeepsExplicitAutoReviewSelection","Output":"--- PASS: TestMergeGroupConfiguredCodexModelsKeepsExplicitAutoReviewSelection (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9154771+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMergeGroupConfiguredCodexModelsKeepsExplicitAutoReviewSelection","Elapsed":0} {"Time":"2026-09-12T11:42:43.9154771+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesNoneForExplicitNonReasoningMetadata","Output":"--- PASS: TestBuildCodexModelsManifestForGroupUsesNoneForExplicitNonReasoningMetadata (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9154771+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesNoneForExplicitNonReasoningMetadata","Elapsed":0} {"Time":"2026-09-12T11:42:43.9154771+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMergeGroupConfiguredCodexModelsFiltersAccountMappedAutoReviewByDefault","Output":"--- PASS: TestMergeGroupConfiguredCodexModelsFiltersAccountMappedAutoReviewByDefault (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9154771+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMergeGroupConfiguredCodexModelsFiltersAccountMappedAutoReviewByDefault","Elapsed":0} {"Time":"2026-09-12T11:42:43.9154771+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMergeGroupConfiguredCodexModelsFiltersAutoReviewByDefault","Output":"--- PASS: TestMergeGroupConfiguredCodexModelsFiltersAutoReviewByDefault (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9154771+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMergeGroupConfiguredCodexModelsFiltersAutoReviewByDefault","Elapsed":0} {"Time":"2026-09-12T11:42:43.9154771+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesSyncedAccountMetadata","Output":"--- PASS: TestBuildCodexModelsManifestForGroupUsesSyncedAccountMetadata (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9154771+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesSyncedAccountMetadata","Elapsed":0} {"Time":"2026-09-12T11:42:43.9154771+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesSafeFallbackForConflictingAliasTargets","Output":"--- PASS: TestBuildCodexModelsManifestForGroupUsesSafeFallbackForConflictingAliasTargets (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9154771+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesSafeFallbackForConflictingAliasTargets","Elapsed":0} {"Time":"2026-09-12T11:42:43.9154771+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMergeGroupConfiguredCodexModelsHonorsCustomListAndFinalETag","Output":"--- PASS: TestMergeGroupConfiguredCodexModelsHonorsCustomListAndFinalETag (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.915992+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMergeGroupConfiguredCodexModelsHonorsCustomListAndFinalETag","Elapsed":0} {"Time":"2026-09-12T11:42:43.915992+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesFallbackWhenTextOnlyPlatformHasNoSnapshot","Output":"--- PASS: TestBuildCodexModelsManifestForGroupUsesFallbackWhenTextOnlyPlatformHasNoSnapshot (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.915992+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesFallbackWhenTextOnlyPlatformHasNoSnapshot","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:43.914Z\",\"msg\":\"openai messages: model mapping applied\",\"service\":\"sub2api\",\"env\":\"test\",\"account_id\":1,\"original_model\":\"claude-sonnet-4-5\",\"normalized_model\":\"claude-sonnet-4-5\",\"billing_model\":\"gpt-5.4\",\"upstream_model\":\"gpt-5.4\",\"stream\":true}\n"} {"Time":"2026-09-12T11:42:43.915992+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesFallbackWhenTextOnlyPlatformHasNoSnapshot","Elapsed":0} {"Time":"2026-09-12T11:42:43.915992+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesExplicitCompositeResponsesRouteModel"} {"Time":"2026-09-12T11:42:43.915992+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesExplicitCompositeResponsesRouteModel","Output":"=== CONT TestBuildCodexModelsManifestForGroupUsesExplicitCompositeResponsesRouteModel\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.915992+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupPrefersSyncedOpenAIImageCapabilities"} {"Time":"2026-09-12T11:42:43.915992+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupPrefersSyncedOpenAIImageCapabilities","Output":"=== CONT TestBuildCodexModelsManifestForGroupPrefersSyncedOpenAIImageCapabilities\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.915992+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities"} {"Time":"2026-09-12T11:42:43.915992+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities","Output":"=== CONT TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.915992+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupAdvertisesOfficialOpenAIResponsesImageInput"} {"Time":"2026-09-12T11:42:43.915992+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupAdvertisesOfficialOpenAIResponsesImageInput","Output":"=== CONT TestBuildCodexModelsManifestForGroupAdvertisesOfficialOpenAIResponsesImageInput\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.915992+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupAdvertisesOfficialGrokResponsesImageInput"} {"Time":"2026-09-12T11:42:43.915992+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupAdvertisesOfficialGrokResponsesImageInput","Output":"=== CONT TestBuildCodexModelsManifestForGroupAdvertisesOfficialGrokResponsesImageInput\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.915992+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestOmitsDedicatedImageModels"} {"Time":"2026-09-12T11:42:43.915992+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestOmitsDedicatedImageModels","Output":"=== CONT TestBuildCodexModelsManifestOmitsDedicatedImageModels\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.915992+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestLeavesServiceTiersEmptyForOtherModels"} {"Time":"2026-09-12T11:42:43.915992+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestLeavesServiceTiersEmptyForOtherModels","Output":"=== CONT TestBuildCodexModelsManifestLeavesServiceTiersEmptyForOtherModels\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.915992+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestAdvertisesUltrafastServiceTierForSol"} {"Time":"2026-09-12T11:42:43.915992+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestAdvertisesUltrafastServiceTierForSol","Output":"=== CONT TestBuildCodexModelsManifestAdvertisesUltrafastServiceTierForSol\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.915992+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestAdvertisesPriorityServiceTierForFastGPTModels"} {"Time":"2026-09-12T11:42:43.915992+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestAdvertisesPriorityServiceTierForFastGPTModels","Output":"=== CONT TestBuildCodexModelsManifestAdvertisesPriorityServiceTierForFastGPTModels\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.915992+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestKeepsKnownReasoningChoices"} {"Time":"2026-09-12T11:42:43.915992+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestKeepsKnownReasoningChoices","Output":"=== CONT TestBuildCodexModelsManifestKeepsKnownReasoningChoices\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.915992+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestUsesSingleNoneReasoningChoiceForCustomModel"} {"Time":"2026-09-12T11:42:43.9165897+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestUsesSingleNoneReasoningChoiceForCustomModel","Output":"=== CONT TestBuildCodexModelsManifestUsesSingleNoneReasoningChoiceForCustomModel\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9165897+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNewConfiguredCodexModelDescriptorUsesProviderMetadataAndSafeFallback"} {"Time":"2026-09-12T11:42:43.9165897+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNewConfiguredCodexModelDescriptorUsesProviderMetadataAndSafeFallback","Output":"=== CONT TestNewConfiguredCodexModelDescriptorUsesProviderMetadataAndSafeFallback\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9165897+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientMarksOnlyOfficialVisionGPTImageInput"} {"Time":"2026-09-12T11:42:43.9165897+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientMarksOnlyOfficialVisionGPTImageInput","Output":"=== CONT TestCompleteAPIKeyCodexModelsManifestForClientMarksOnlyOfficialVisionGPTImageInput\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9165897+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientUsesCurrentSnapshotForCachedNativeManifest"} {"Time":"2026-09-12T11:42:43.9165897+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientUsesCurrentSnapshotForCachedNativeManifest","Output":"=== CONT TestCompleteAPIKeyCodexModelsManifestForClientUsesCurrentSnapshotForCachedNativeManifest\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9165897+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMergeGroupConfiguredCodexModelsInjectsCurrentGroupAliases"} {"Time":"2026-09-12T11:42:43.9165897+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMergeGroupConfiguredCodexModelsInjectsCurrentGroupAliases","Output":"=== CONT TestMergeGroupConfiguredCodexModelsInjectsCurrentGroupAliases\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9165897+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientFillsMissingProviderFieldsWithoutOverwritingExplicitMetadata"} {"Time":"2026-09-12T11:42:43.9165897+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientFillsMissingProviderFieldsWithoutOverwritingExplicitMetadata","Output":"=== CONT TestCompleteAPIKeyCodexModelsManifestForClientFillsMissingProviderFieldsWithoutOverwritingExplicitMetadata\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9165897+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupFallsBackWhenCapabilityLookupFails"} {"Time":"2026-09-12T11:42:43.9165897+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupFallsBackWhenCapabilityLookupFails","Output":"=== CONT TestBuildCodexModelsManifestForGroupFallsBackWhenCapabilityLookupFails\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9165897+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientUsesSyncedMetadataForConvertedModelList"} {"Time":"2026-09-12T11:42:43.9165897+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientUsesSyncedMetadataForConvertedModelList","Output":"=== CONT TestCompleteAPIKeyCodexModelsManifestForClientUsesSyncedMetadataForConvertedModelList\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9165897+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientUsesKnownGPTImageFallback"} {"Time":"2026-09-12T11:42:43.9165897+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientUsesKnownGPTImageFallback","Output":"=== CONT TestCompleteAPIKeyCodexModelsManifestForClientUsesKnownGPTImageFallback\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9165897+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupPreservesCompatibleAstraTextOnlyMetadata"} {"Time":"2026-09-12T11:42:43.9165897+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupPreservesCompatibleAstraTextOnlyMetadata","Output":"=== CONT TestBuildCodexModelsManifestForGroupPreservesCompatibleAstraTextOnlyMetadata\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9165897+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupIntersectsDifferentMappedTargetsWithoutLeakingAlias"} {"Time":"2026-09-12T11:42:43.9165897+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupIntersectsDifferentMappedTargetsWithoutLeakingAlias","Output":"=== CONT TestBuildCodexModelsManifestForGroupIntersectsDifferentMappedTargetsWithoutLeakingAlias\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9165897+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupIgnoresPersistentlyDisabledMappedAccounts"} {"Time":"2026-09-12T11:42:43.9165897+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupIgnoresPersistentlyDisabledMappedAccounts","Output":"=== CONT TestBuildCodexModelsManifestForGroupIgnoresPersistentlyDisabledMappedAccounts\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9165897+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildGroupConfiguredCodexModelsManifestIntersectsTransientlyUnschedulableMappedAccounts"} {"Time":"2026-09-12T11:42:43.9165897+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildGroupConfiguredCodexModelsManifestIntersectsTransientlyUnschedulableMappedAccounts","Output":"=== CONT TestBuildGroupConfiguredCodexModelsManifestIntersectsTransientlyUnschedulableMappedAccounts\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9165897+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupIntersectsTransientlyUnschedulableMappedAccounts"} {"Time":"2026-09-12T11:42:43.9165897+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupIntersectsTransientlyUnschedulableMappedAccounts","Output":"=== CONT TestBuildCodexModelsManifestForGroupIntersectsTransientlyUnschedulableMappedAccounts\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9165897+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexManifestSearchCapabilityPreservesUpstreamAndFailsClosed"} {"Time":"2026-09-12T11:42:43.9165897+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexManifestSearchCapabilityPreservesUpstreamAndFailsClosed","Output":"=== CONT TestCompleteAPIKeyCodexManifestSearchCapabilityPreservesUpstreamAndFailsClosed\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9165897+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexManifestSearchCapabilityPreservesUpstreamAndFailsClosed","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:43.916Z\",\"msg\":\"openai routing decision\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_routing\",\"transport\":\"http\",\"account_id\":1,\"final_model\":\"gpt-5.4\",\"final_service_tier\":\"\",\"routing_hint_generated\":true,\"ws_affinity_decision\":\"not_applicable\"}\n"} {"Time":"2026-09-12T11:42:43.9171297+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccountUsageService_GetOpenAIUsage_DoesNotPromoteCodexExtraToRateLimit"} {"Time":"2026-09-12T11:42:43.9171297+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccountUsageService_GetOpenAIUsage_DoesNotPromoteCodexExtraToRateLimit","Output":"=== CONT TestAccountUsageService_GetOpenAIUsage_DoesNotPromoteCodexExtraToRateLimit\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9171297+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupCorrectsOfficialAstraStaleModalities"} {"Time":"2026-09-12T11:42:43.9171297+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupCorrectsOfficialAstraStaleModalities","Output":"=== CONT TestBuildCodexModelsManifestForGroupCorrectsOfficialAstraStaleModalities\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9171297+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestForwardAsAnthropic_ForcedCodexInstructionsTemplatePrependsRenderedInstructions"} {"Time":"2026-09-12T11:42:43.9171297+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestForwardAsAnthropic_ForcedCodexInstructionsTemplatePrependsRenderedInstructions","Output":"=== CONT TestForwardAsAnthropic_ForcedCodexInstructionsTemplatePrependsRenderedInstructions\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9171297+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupAdvertisesSearchOnlyForChatBridgeRoutes"} {"Time":"2026-09-12T11:42:43.9171297+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupAdvertisesSearchOnlyForChatBridgeRoutes","Output":"=== CONT TestBuildCodexModelsManifestForGroupAdvertisesSearchOnlyForChatBridgeRoutes\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9171297+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupAdvertisesSearchOnlyForChatBridgeRoutes","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:43.917Z\",\"msg\":\"openai messages: upstream identity restored\",\"service\":\"sub2api\",\"env\":\"test\",\"account_id\":1,\"upstream_model\":\"gpt-5.4\",\"compat_identity_restored\":true}\n"} {"Time":"2026-09-12T11:42:43.9171297+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexUsageProgressFromExtra_ZerosExpiredWindow"} {"Time":"2026-09-12T11:42:43.9171297+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexUsageProgressFromExtra_ZerosExpiredWindow","Output":"=== CONT TestBuildCodexUsageProgressFromExtra_ZerosExpiredWindow\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9171297+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupLoadsAccountsOnce","Output":"--- PASS: TestBuildCodexModelsManifestForGroupLoadsAccountsOnce (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9171297+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupLoadsAccountsOnce","Elapsed":0} {"Time":"2026-09-12T11:42:43.9171297+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientPreservesProviderMetadata","Output":"--- PASS: TestCompleteAPIKeyCodexModelsManifestForClientPreservesProviderMetadata (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9171297+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientPreservesProviderMetadata","Elapsed":0} {"Time":"2026-09-12T11:42:43.9171297+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupKeepsCrossPlatformAliasAmbiguityClosed","Output":"--- PASS: TestBuildCodexModelsManifestForGroupKeepsCrossPlatformAliasAmbiguityClosed (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9171297+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupKeepsCrossPlatformAliasAmbiguityClosed","Elapsed":0} {"Time":"2026-09-12T11:42:43.9171297+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNewConfiguredCodexModelDescriptorUsesProviderMetadataAndSafeFallback","Output":"--- PASS: TestNewConfiguredCodexModelDescriptorUsesProviderMetadataAndSafeFallback (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9171297+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestNewConfiguredCodexModelDescriptorUsesProviderMetadataAndSafeFallback","Elapsed":0} {"Time":"2026-09-12T11:42:43.9171297+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientFiltersOfficialNonAgentModels","Output":"--- PASS: TestCompleteAPIKeyCodexModelsManifestForClientFiltersOfficialNonAgentModels (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9171297+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientFiltersOfficialNonAgentModels","Elapsed":0} {"Time":"2026-09-12T11:42:43.9171297+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupAdvertisesOfficialOpenAIResponsesImageInput","Output":"--- PASS: TestBuildCodexModelsManifestForGroupAdvertisesOfficialOpenAIResponsesImageInput (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9176413+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupAdvertisesOfficialOpenAIResponsesImageInput","Elapsed":0} {"Time":"2026-09-12T11:42:43.9176413+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesExplicitCompositeResponsesRouteModel","Output":"--- PASS: TestBuildCodexModelsManifestForGroupUsesExplicitCompositeResponsesRouteModel (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9176413+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesExplicitCompositeResponsesRouteModel","Elapsed":0} {"Time":"2026-09-12T11:42:43.9176413+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupIgnoresPersistentlyDisabledMappedAccounts","Output":"--- PASS: TestBuildCodexModelsManifestForGroupIgnoresPersistentlyDisabledMappedAccounts (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9176413+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupIgnoresPersistentlyDisabledMappedAccounts","Elapsed":0} {"Time":"2026-09-12T11:42:43.9176413+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupFallsBackToSchedulableWhenAvailabilityLookupFails","Output":"--- PASS: TestBuildCodexModelsManifestForGroupFallsBackToSchedulableWhenAvailabilityLookupFails (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9176413+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupFallsBackToSchedulableWhenAvailabilityLookupFails","Elapsed":0} {"Time":"2026-09-12T11:42:43.9176413+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestForwardAsAnthropic_DoesNotAutoDerivePromptCacheKeyForNonCodexModel"} {"Time":"2026-09-12T11:42:43.9176413+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestForwardAsAnthropic_DoesNotAutoDerivePromptCacheKeyForNonCodexModel","Output":"=== CONT TestForwardAsAnthropic_DoesNotAutoDerivePromptCacheKeyForNonCodexModel\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9176413+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupAdvertisesSearchOnlyForChatBridgeRoutes/chat_bridge"} {"Time":"2026-09-12T11:42:43.9176413+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupAdvertisesSearchOnlyForChatBridgeRoutes/chat_bridge","Output":"=== RUN TestBuildCodexModelsManifestForGroupAdvertisesSearchOnlyForChatBridgeRoutes/chat_bridge\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9176413+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupAdvertisesSearchOnlyForChatBridgeRoutes/chat_bridge","Output":"=== PAUSE TestBuildCodexModelsManifestForGroupAdvertisesSearchOnlyForChatBridgeRoutes/chat_bridge\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9176413+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupAdvertisesSearchOnlyForChatBridgeRoutes/chat_bridge"} {"Time":"2026-09-12T11:42:43.9176413+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupAdvertisesSearchOnlyForChatBridgeRoutes/native_responses"} {"Time":"2026-09-12T11:42:43.9176413+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupAdvertisesSearchOnlyForChatBridgeRoutes/native_responses","Output":"=== RUN TestBuildCodexModelsManifestForGroupAdvertisesSearchOnlyForChatBridgeRoutes/native_responses\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9176413+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupAdvertisesSearchOnlyForChatBridgeRoutes/native_responses","Output":"=== PAUSE TestBuildCodexModelsManifestForGroupAdvertisesSearchOnlyForChatBridgeRoutes/native_responses\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9176413+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupAdvertisesSearchOnlyForChatBridgeRoutes/native_responses"} {"Time":"2026-09-12T11:42:43.9176413+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupAdvertisesSearchOnlyForChatBridgeRoutes/mixed_routes"} {"Time":"2026-09-12T11:42:43.9176413+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupAdvertisesSearchOnlyForChatBridgeRoutes/mixed_routes","Output":"=== RUN TestBuildCodexModelsManifestForGroupAdvertisesSearchOnlyForChatBridgeRoutes/mixed_routes\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9176413+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupAdvertisesSearchOnlyForChatBridgeRoutes/mixed_routes","Output":"=== PAUSE TestBuildCodexModelsManifestForGroupAdvertisesSearchOnlyForChatBridgeRoutes/mixed_routes\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9176413+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupAdvertisesSearchOnlyForChatBridgeRoutes/mixed_routes"} {"Time":"2026-09-12T11:42:43.9176413+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexUsageProgressFromExtra_ZerosExpiredWindow/expired_5h_window_zeroes_utilization"} {"Time":"2026-09-12T11:42:43.9176413+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexUsageProgressFromExtra_ZerosExpiredWindow/expired_5h_window_zeroes_utilization","Output":"=== RUN TestBuildCodexUsageProgressFromExtra_ZerosExpiredWindow/expired_5h_window_zeroes_utilization\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9176413+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexUsageProgressFromExtra_ZerosExpiredWindow/expired_5h_window_zeroes_utilization","Output":"--- PASS: TestBuildCodexUsageProgressFromExtra_ZerosExpiredWindow/expired_5h_window_zeroes_utilization (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9176413+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexUsageProgressFromExtra_ZerosExpiredWindow/expired_5h_window_zeroes_utilization","Elapsed":0} {"Time":"2026-09-12T11:42:43.9176413+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexUsageProgressFromExtra_ZerosExpiredWindow/active_5h_window_keeps_utilization"} {"Time":"2026-09-12T11:42:43.9176413+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexUsageProgressFromExtra_ZerosExpiredWindow/active_5h_window_keeps_utilization","Output":"=== RUN TestBuildCodexUsageProgressFromExtra_ZerosExpiredWindow/active_5h_window_keeps_utilization\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9176413+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexUsageProgressFromExtra_ZerosExpiredWindow/active_5h_window_keeps_utilization","Output":"--- PASS: TestBuildCodexUsageProgressFromExtra_ZerosExpiredWindow/active_5h_window_keeps_utilization (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9176413+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexUsageProgressFromExtra_ZerosExpiredWindow/active_5h_window_keeps_utilization","Elapsed":0} {"Time":"2026-09-12T11:42:43.9176413+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexUsageProgressFromExtra_ZerosExpiredWindow/expired_7d_window_zeroes_utilization"} {"Time":"2026-09-12T11:42:43.9176413+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexUsageProgressFromExtra_ZerosExpiredWindow/expired_7d_window_zeroes_utilization","Output":"=== RUN TestBuildCodexUsageProgressFromExtra_ZerosExpiredWindow/expired_7d_window_zeroes_utilization\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9176413+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexUsageProgressFromExtra_ZerosExpiredWindow/expired_7d_window_zeroes_utilization","Output":"--- PASS: TestBuildCodexUsageProgressFromExtra_ZerosExpiredWindow/expired_7d_window_zeroes_utilization (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9176413+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexUsageProgressFromExtra_ZerosExpiredWindow/expired_7d_window_zeroes_utilization","Elapsed":0} {"Time":"2026-09-12T11:42:43.9176413+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexUsageProgressFromExtra_ZerosExpiredWindow","Output":"--- PASS: TestBuildCodexUsageProgressFromExtra_ZerosExpiredWindow (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9176413+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexUsageProgressFromExtra_ZerosExpiredWindow","Elapsed":0} {"Time":"2026-09-12T11:42:43.9176413+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesMappedTargetMetadataForCompositeAlias"} {"Time":"2026-09-12T11:42:43.9176413+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesMappedTargetMetadataForCompositeAlias","Output":"=== CONT TestBuildCodexModelsManifestForGroupUsesMappedTargetMetadataForCompositeAlias\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9176413+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildGroupConfiguredCodexModelsManifestIntersectsTransientlyUnschedulableMappedAccounts","Output":"--- PASS: TestBuildGroupConfiguredCodexModelsManifestIntersectsTransientlyUnschedulableMappedAccounts (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9176413+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildGroupConfiguredCodexModelsManifestIntersectsTransientlyUnschedulableMappedAccounts","Elapsed":0} {"Time":"2026-09-12T11:42:43.9176413+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestAdvertisesUltrafastServiceTierForSol","Output":"--- PASS: TestBuildCodexModelsManifestAdvertisesUltrafastServiceTierForSol (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9176413+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestAdvertisesUltrafastServiceTierForSol","Elapsed":0} {"Time":"2026-09-12T11:42:43.9176413+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestExtractOpenAICodexProbeUpdatesAccepts429WithCodexHeaders"} {"Time":"2026-09-12T11:42:43.9176413+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestExtractOpenAICodexProbeUpdatesAccepts429WithCodexHeaders","Output":"=== CONT TestExtractOpenAICodexProbeUpdatesAccepts429WithCodexHeaders\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9176413+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestExtractOpenAICodexProbeUpdatesAccepts429WithCodexHeaders","Output":"--- PASS: TestExtractOpenAICodexProbeUpdatesAccepts429WithCodexHeaders (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9176413+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestExtractOpenAICodexProbeUpdatesAccepts429WithCodexHeaders","Elapsed":0} {"Time":"2026-09-12T11:42:43.9176413+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccountUsageService_PersistOpenAICodexProbeSnapshotOnlyUpdatesExtra"} {"Time":"2026-09-12T11:42:43.9176413+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccountUsageService_PersistOpenAICodexProbeSnapshotOnlyUpdatesExtra","Output":"=== CONT TestAccountUsageService_PersistOpenAICodexProbeSnapshotOnlyUpdatesExtra\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9176413+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestOmitsDedicatedImageModels","Output":"--- PASS: TestBuildCodexModelsManifestOmitsDedicatedImageModels (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9176413+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestOmitsDedicatedImageModels","Elapsed":0} {"Time":"2026-09-12T11:42:43.9176413+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus"} {"Time":"2026-09-12T11:42:43.9176413+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus","Output":"=== CONT TestIsRetryableCodexModelsManifestStatus\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9176413+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestConvertOpenAIModelListToCompleteCodexManifest"} {"Time":"2026-09-12T11:42:43.9176413+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestConvertOpenAIModelListToCompleteCodexManifest","Output":"=== CONT TestConvertOpenAIModelListToCompleteCodexManifest\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9176413+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestConvertOpenAIModelListToCompleteCodexManifest","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:43.917Z\",\"msg\":\"openai messages: model mapping applied\",\"service\":\"sub2api\",\"env\":\"test\",\"account_id\":1,\"original_model\":\"claude-sonnet-4-5\",\"normalized_model\":\"claude-sonnet-4-5\",\"billing_model\":\"gpt-4o\",\"upstream_model\":\"gpt-4o\",\"stream\":true}\n"} {"Time":"2026-09-12T11:42:43.9181598+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestConvertOpenAIModelListToCompleteCodexManifest","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:43.918Z\",\"msg\":\"openai routing decision\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_routing\",\"transport\":\"http\",\"account_id\":1,\"final_model\":\"gpt-4o\",\"final_service_tier\":\"\",\"routing_hint_generated\":false,\"ws_affinity_decision\":\"not_applicable\"}\n"} {"Time":"2026-09-12T11:42:43.9181598+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestConvertOpenAIModelListToCompleteCodexManifest","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:43.918Z\",\"msg\":\"openai messages: model mapping applied\",\"service\":\"sub2api\",\"env\":\"test\",\"account_id\":1,\"original_model\":\"claude-sonnet-4-5\",\"normalized_model\":\"claude-sonnet-4-5\",\"billing_model\":\"gpt-5.4\",\"upstream_model\":\"gpt-5.4\",\"stream\":true}\n"} {"Time":"2026-09-12T11:42:43.9181598+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildGroupConfiguredCodexModelsManifestIgnoresPersistentlyDisabledMappedAccounts"} {"Time":"2026-09-12T11:42:43.9181598+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildGroupConfiguredCodexModelsManifestIgnoresPersistentlyDisabledMappedAccounts","Output":"=== CONT TestBuildGroupConfiguredCodexModelsManifestIgnoresPersistentlyDisabledMappedAccounts\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9181598+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupAdvertisesSearchOnlyForChatBridgeRoutes/native_responses"} {"Time":"2026-09-12T11:42:43.9181598+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupAdvertisesSearchOnlyForChatBridgeRoutes/native_responses","Output":"=== CONT TestBuildCodexModelsManifestForGroupAdvertisesSearchOnlyForChatBridgeRoutes/native_responses\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9181598+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestForwardAsAnthropic_TrimsFullReplayOnlyForCodexCompatModels"} {"Time":"2026-09-12T11:42:43.9181598+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestForwardAsAnthropic_TrimsFullReplayOnlyForCodexCompatModels","Output":"=== CONT TestForwardAsAnthropic_TrimsFullReplayOnlyForCodexCompatModels\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9181598+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupPrefersSyncedOpenAIImageCapabilities/explicit_text-only_snapshot_narrows_local_fallback"} {"Time":"2026-09-12T11:42:43.9181598+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupPrefersSyncedOpenAIImageCapabilities/explicit_text-only_snapshot_narrows_local_fallback","Output":"=== RUN TestBuildCodexModelsManifestForGroupPrefersSyncedOpenAIImageCapabilities/explicit_text-only_snapshot_narrows_local_fallback\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.919208+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupPrefersSyncedOpenAIImageCapabilities/explicit_text-only_snapshot_narrows_local_fallback","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:43.918Z\",\"msg\":\"openai messages: model mapping applied\",\"service\":\"sub2api\",\"env\":\"test\",\"account_id\":1,\"original_model\":\"gpt-5.4\",\"normalized_model\":\"gpt-5.4\",\"billing_model\":\"gpt-5.1\",\"upstream_model\":\"gpt-5.4\",\"stream\":true,\"compat_prompt_cache_key_injected\":true,\"compat_prompt_cache_key_sha256\":\"c8b82dd52b41c996\"}\n"} {"Time":"2026-09-12T11:42:43.919208+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupPrefersSyncedOpenAIImageCapabilities/explicit_text-only_snapshot_narrows_local_fallback","Output":"=== PAUSE TestBuildCodexModelsManifestForGroupPrefersSyncedOpenAIImageCapabilities/explicit_text-only_snapshot_narrows_local_fallback\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.919208+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupPrefersSyncedOpenAIImageCapabilities/explicit_text-only_snapshot_narrows_local_fallback"} {"Time":"2026-09-12T11:42:43.919208+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupIntersectsSyncedAccountMetadata"} {"Time":"2026-09-12T11:42:43.919208+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupIntersectsSyncedAccountMetadata","Output":"=== CONT TestBuildCodexModelsManifestForGroupIntersectsSyncedAccountMetadata\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.919208+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupPreservesCompatibleAstraTextOnlyMetadata","Output":"--- PASS: TestBuildCodexModelsManifestForGroupPreservesCompatibleAstraTextOnlyMetadata (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.919208+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupPreservesCompatibleAstraTextOnlyMetadata","Elapsed":0} {"Time":"2026-09-12T11:42:43.919208+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildGroupConfiguredCodexModelsManifestExpandsSelectedModelCoveredByWildcardMapping"} {"Time":"2026-09-12T11:42:43.919208+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildGroupConfiguredCodexModelsManifestExpandsSelectedModelCoveredByWildcardMapping","Output":"=== CONT TestBuildGroupConfiguredCodexModelsManifestExpandsSelectedModelCoveredByWildcardMapping\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.919208+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/api_key_404"} {"Time":"2026-09-12T11:42:43.919208+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/api_key_404","Output":"=== RUN TestIsRetryableCodexModelsManifestStatus/api_key_404\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.919208+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestShouldRefreshOpenAICodexSnapshot_SparkShadowIgnoresWSv2"} {"Time":"2026-09-12T11:42:43.919208+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestShouldRefreshOpenAICodexSnapshot_SparkShadowIgnoresWSv2","Output":"=== CONT TestShouldRefreshOpenAICodexSnapshot_SparkShadowIgnoresWSv2\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.919208+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_Grok_4.6"} {"Time":"2026-09-12T11:42:43.919208+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_Grok_4.6","Output":"=== RUN TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_Grok_4.6\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.919208+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupAdvertisesSearchOnlyForChatBridgeRoutes/chat_bridge"} {"Time":"2026-09-12T11:42:43.919208+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupAdvertisesSearchOnlyForChatBridgeRoutes/chat_bridge","Output":"=== CONT TestBuildCodexModelsManifestForGroupAdvertisesSearchOnlyForChatBridgeRoutes/chat_bridge\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.919208+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestForwardAsAnthropic_ForcedCodexInstructionsTemplateUsesCachedTemplateContent"} {"Time":"2026-09-12T11:42:43.919208+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestForwardAsAnthropic_ForcedCodexInstructionsTemplateUsesCachedTemplateContent","Output":"=== CONT TestForwardAsAnthropic_ForcedCodexInstructionsTemplateUsesCachedTemplateContent\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.919208+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupAdvertisesSearchOnlyForChatBridgeRoutes/mixed_routes"} {"Time":"2026-09-12T11:42:43.919208+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupAdvertisesSearchOnlyForChatBridgeRoutes/mixed_routes","Output":"=== CONT TestBuildCodexModelsManifestForGroupAdvertisesSearchOnlyForChatBridgeRoutes/mixed_routes\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.919208+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupAdvertisesSearchOnlyForChatBridgeRoutes/native_responses","Output":"--- PASS: TestBuildCodexModelsManifestForGroupAdvertisesSearchOnlyForChatBridgeRoutes/native_responses (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.919208+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupAdvertisesSearchOnlyForChatBridgeRoutes/native_responses","Elapsed":0} {"Time":"2026-09-12T11:42:43.919208+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/api_key_404","Output":"=== PAUSE TestIsRetryableCodexModelsManifestStatus/api_key_404\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.919208+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/api_key_404"} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:43.919Z\",\"msg\":\"openai routing decision\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_routing\",\"transport\":\"http\",\"account_id\":1,\"final_model\":\"gpt-5.4\",\"final_service_tier\":\"\",\"routing_hint_generated\":true,\"ws_affinity_decision\":\"not_applicable\"}\n"} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupAdvertisesSearchOnlyForChatBridgeRoutes/mixed_routes","Output":"--- PASS: TestBuildCodexModelsManifestForGroupAdvertisesSearchOnlyForChatBridgeRoutes/mixed_routes (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupAdvertisesSearchOnlyForChatBridgeRoutes/mixed_routes","Elapsed":0} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesMappedTargetMetadataForCompositeAlias","Output":"--- PASS: TestBuildCodexModelsManifestForGroupUsesMappedTargetMetadataForCompositeAlias (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesMappedTargetMetadataForCompositeAlias","Elapsed":0} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupAdvertisesOfficialGrokResponsesImageInput","Output":"--- PASS: TestBuildCodexModelsManifestForGroupAdvertisesOfficialGrokResponsesImageInput (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupAdvertisesOfficialGrokResponsesImageInput","Elapsed":0} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestUsesSingleNoneReasoningChoiceForCustomModel","Output":"--- PASS: TestBuildCodexModelsManifestUsesSingleNoneReasoningChoiceForCustomModel (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestUsesSingleNoneReasoningChoiceForCustomModel","Elapsed":0} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestForwardAsAnthropic_DoesNotAutoDerivePromptCacheKeyForNonCodexModel","Output":"--- PASS: TestForwardAsAnthropic_DoesNotAutoDerivePromptCacheKeyForNonCodexModel (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestForwardAsAnthropic_DoesNotAutoDerivePromptCacheKeyForNonCodexModel","Elapsed":0} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMergeGroupConfiguredCodexModelsInjectsCurrentGroupAliases","Output":"--- PASS: TestMergeGroupConfiguredCodexModelsInjectsCurrentGroupAliases (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestMergeGroupConfiguredCodexModelsInjectsCurrentGroupAliases","Elapsed":0} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestKeepsKnownReasoningChoices","Output":"--- PASS: TestBuildCodexModelsManifestKeepsKnownReasoningChoices (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestKeepsKnownReasoningChoices","Elapsed":0} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupCorrectsOfficialAstraStaleModalities","Output":"--- PASS: TestBuildCodexModelsManifestForGroupCorrectsOfficialAstraStaleModalities (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupCorrectsOfficialAstraStaleModalities","Elapsed":0} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupIntersectsTransientlyUnschedulableMappedAccounts","Output":"--- PASS: TestBuildCodexModelsManifestForGroupIntersectsTransientlyUnschedulableMappedAccounts (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupIntersectsTransientlyUnschedulableMappedAccounts","Elapsed":0} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestLeavesServiceTiersEmptyForOtherModels","Output":"--- PASS: TestBuildCodexModelsManifestLeavesServiceTiersEmptyForOtherModels (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestLeavesServiceTiersEmptyForOtherModels","Elapsed":0} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientFillsMissingProviderFieldsWithoutOverwritingExplicitMetadata","Output":"--- PASS: TestCompleteAPIKeyCodexModelsManifestForClientFillsMissingProviderFieldsWithoutOverwritingExplicitMetadata (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientFillsMissingProviderFieldsWithoutOverwritingExplicitMetadata","Elapsed":0} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexManifestSearchCapabilityPreservesUpstreamAndFailsClosed","Output":"--- PASS: TestCompleteAPIKeyCodexManifestSearchCapabilityPreservesUpstreamAndFailsClosed (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexManifestSearchCapabilityPreservesUpstreamAndFailsClosed","Elapsed":0} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestAdvertisesPriorityServiceTierForFastGPTModels","Output":"--- PASS: TestBuildCodexModelsManifestAdvertisesPriorityServiceTierForFastGPTModels (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestAdvertisesPriorityServiceTierForFastGPTModels","Elapsed":0} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupIntersectsDifferentMappedTargetsWithoutLeakingAlias","Output":"--- PASS: TestBuildCodexModelsManifestForGroupIntersectsDifferentMappedTargetsWithoutLeakingAlias (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupIntersectsDifferentMappedTargetsWithoutLeakingAlias","Elapsed":0} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestConvertOpenAIModelListToCompleteCodexManifest","Output":"--- PASS: TestConvertOpenAIModelListToCompleteCodexManifest (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestConvertOpenAIModelListToCompleteCodexManifest","Elapsed":0} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupFallsBackWhenCapabilityLookupFails","Output":"--- PASS: TestBuildCodexModelsManifestForGroupFallsBackWhenCapabilityLookupFails (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupFallsBackWhenCapabilityLookupFails","Elapsed":0} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestShouldRefreshOpenAICodexSnapshot_SparkShadowIgnoresWSv2","Output":"--- PASS: TestShouldRefreshOpenAICodexSnapshot_SparkShadowIgnoresWSv2 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestShouldRefreshOpenAICodexSnapshot_SparkShadowIgnoresWSv2","Elapsed":0} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildGroupConfiguredCodexModelsManifestIgnoresPersistentlyDisabledMappedAccounts","Output":"--- PASS: TestBuildGroupConfiguredCodexModelsManifestIgnoresPersistentlyDisabledMappedAccounts (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildGroupConfiguredCodexModelsManifestIgnoresPersistentlyDisabledMappedAccounts","Elapsed":0} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientUsesCurrentSnapshotForCachedNativeManifest","Output":"--- PASS: TestCompleteAPIKeyCodexModelsManifestForClientUsesCurrentSnapshotForCachedNativeManifest (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientUsesCurrentSnapshotForCachedNativeManifest","Elapsed":0} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientUsesKnownGPTImageFallback","Output":"--- PASS: TestCompleteAPIKeyCodexModelsManifestForClientUsesKnownGPTImageFallback (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientUsesKnownGPTImageFallback","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:43.919Z\",\"msg\":\"openai messages: model mapping applied\",\"service\":\"sub2api\",\"env\":\"test\",\"account_id\":1,\"original_model\":\"gpt-5.4\",\"normalized_model\":\"gpt-5.4\",\"billing_model\":\"gpt-5.1\",\"upstream_model\":\"gpt-5.4\",\"stream\":true,\"compat_prompt_cache_key_injected\":true,\"compat_prompt_cache_key_sha256\":\"c8b82dd52b41c996\"}\n"} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientUsesKnownGPTImageFallback","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:43.919Z\",\"msg\":\"openai routing decision\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_routing\",\"transport\":\"http\",\"account_id\":1,\"final_model\":\"gpt-5.4\",\"final_service_tier\":\"\",\"routing_hint_generated\":true,\"ws_affinity_decision\":\"not_applicable\"}\n"} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientUsesKnownGPTImageFallback","Elapsed":0} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupIntersectsSyncedAccountMetadata","Output":"--- PASS: TestBuildCodexModelsManifestForGroupIntersectsSyncedAccountMetadata (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupIntersectsSyncedAccountMetadata","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:43.919Z\",\"msg\":\"openai messages: upstream identity restored\",\"service\":\"sub2api\",\"env\":\"test\",\"account_id\":1,\"upstream_model\":\"gpt-5.4\",\"compat_identity_restored\":true}\n"} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupIntersectsSyncedAccountMetadata","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:43.919Z\",\"msg\":\"openai messages: upstream identity restored\",\"service\":\"sub2api\",\"env\":\"test\",\"account_id\":1,\"upstream_model\":\"gpt-5.4\",\"compat_identity_restored\":true}\n"} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupIntersectsSyncedAccountMetadata","Elapsed":0} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/api_key_405"} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/api_key_405","Output":"=== RUN TestIsRetryableCodexModelsManifestStatus/api_key_405\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupPrefersSyncedOpenAIImageCapabilities/explicit_multimodal_snapshot_preserves_local_fallback"} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupPrefersSyncedOpenAIImageCapabilities/explicit_multimodal_snapshot_preserves_local_fallback","Output":"=== RUN TestBuildCodexModelsManifestForGroupPrefersSyncedOpenAIImageCapabilities/explicit_multimodal_snapshot_preserves_local_fallback\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupPrefersSyncedOpenAIImageCapabilities/explicit_multimodal_snapshot_preserves_local_fallback","Output":"=== PAUSE TestBuildCodexModelsManifestForGroupPrefersSyncedOpenAIImageCapabilities/explicit_multimodal_snapshot_preserves_local_fallback\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupPrefersSyncedOpenAIImageCapabilities/explicit_multimodal_snapshot_preserves_local_fallback"} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupPrefersSyncedOpenAIImageCapabilities/explicit_text-only_snapshot_narrows_local_fallback"} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupPrefersSyncedOpenAIImageCapabilities/explicit_text-only_snapshot_narrows_local_fallback","Output":"=== CONT TestBuildCodexModelsManifestForGroupPrefersSyncedOpenAIImageCapabilities/explicit_text-only_snapshot_narrows_local_fallback\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupAdvertisesSearchOnlyForChatBridgeRoutes/chat_bridge","Output":"--- PASS: TestBuildCodexModelsManifestForGroupAdvertisesSearchOnlyForChatBridgeRoutes/chat_bridge (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupAdvertisesSearchOnlyForChatBridgeRoutes/chat_bridge","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:43.919Z\",\"msg\":\"openai routing decision\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_routing\",\"transport\":\"http\",\"account_id\":1,\"final_model\":\"gpt-5.4\",\"final_service_tier\":\"\",\"routing_hint_generated\":true,\"ws_affinity_decision\":\"not_applicable\"}\n"} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupAdvertisesSearchOnlyForChatBridgeRoutes/chat_bridge","Elapsed":0} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/api_key_405","Output":"=== PAUSE TestIsRetryableCodexModelsManifestStatus/api_key_405\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/api_key_405"} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/api_key_405","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:43.918Z\",\"msg\":\"openai messages: model mapping applied\",\"service\":\"sub2api\",\"env\":\"test\",\"account_id\":1,\"original_model\":\"claude-sonnet-4-5\",\"normalized_model\":\"claude-sonnet-4-5\",\"billing_model\":\"gpt-5.3-codex\",\"upstream_model\":\"gpt-5.3-codex\",\"stream\":true,\"compat_prompt_cache_key_injected\":true,\"compat_prompt_cache_key_sha256\":\"e8bf3c701e17d12d\",\"compat_full_replay_trimmed\":true,\"compat_messages_after_trim\":12}\n"} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/oauth_404"} {"Time":"2026-09-12T11:42:43.9197207+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/oauth_404","Output":"=== RUN TestIsRetryableCodexModelsManifestStatus/oauth_404\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/oauth_404","Output":"=== PAUSE TestIsRetryableCodexModelsManifestStatus/oauth_404\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/oauth_404"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/oauth_405"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/oauth_405","Output":"=== RUN TestIsRetryableCodexModelsManifestStatus/oauth_405\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/oauth_405","Output":"=== PAUSE TestIsRetryableCodexModelsManifestStatus/oauth_405\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/oauth_405"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/api_key_401"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/api_key_401","Output":"=== RUN TestIsRetryableCodexModelsManifestStatus/api_key_401\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/api_key_401","Output":"=== PAUSE TestIsRetryableCodexModelsManifestStatus/api_key_401\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/api_key_401"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/oauth_401"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/oauth_401","Output":"=== RUN TestIsRetryableCodexModelsManifestStatus/oauth_401\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/oauth_401","Output":"=== PAUSE TestIsRetryableCodexModelsManifestStatus/oauth_401\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/oauth_401"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/api_key_400"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/api_key_400","Output":"=== RUN TestIsRetryableCodexModelsManifestStatus/api_key_400\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/api_key_400","Output":"=== PAUSE TestIsRetryableCodexModelsManifestStatus/api_key_400\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/api_key_400"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/api_key_403"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/api_key_403","Output":"=== RUN TestIsRetryableCodexModelsManifestStatus/api_key_403\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/api_key_403","Output":"=== PAUSE TestIsRetryableCodexModelsManifestStatus/api_key_403\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/api_key_403"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/rate_limited"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/rate_limited","Output":"=== RUN TestIsRetryableCodexModelsManifestStatus/rate_limited\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/rate_limited","Output":"=== PAUSE TestIsRetryableCodexModelsManifestStatus/rate_limited\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/rate_limited"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/server_error"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/server_error","Output":"=== RUN TestIsRetryableCodexModelsManifestStatus/server_error\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/server_error","Output":"=== PAUSE TestIsRetryableCodexModelsManifestStatus/server_error\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/server_error"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/api_key_404"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/api_key_404","Output":"=== CONT TestIsRetryableCodexModelsManifestStatus/api_key_404\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/api_key_404","Output":"--- PASS: TestIsRetryableCodexModelsManifestStatus/api_key_404 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/api_key_404","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:43.919Z\",\"msg\":\"openai routing decision\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_routing\",\"transport\":\"http\",\"account_id\":1,\"final_model\":\"gpt-5.3-codex\",\"final_service_tier\":\"\",\"routing_hint_generated\":false,\"ws_affinity_decision\":\"not_applicable\"}\n"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/api_key_404","Elapsed":0} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/oauth_401"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/oauth_401","Output":"=== CONT TestIsRetryableCodexModelsManifestStatus/oauth_401\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/oauth_404"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/oauth_404","Output":"=== CONT TestIsRetryableCodexModelsManifestStatus/oauth_404\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/oauth_404","Output":"--- PASS: TestIsRetryableCodexModelsManifestStatus/oauth_404 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/oauth_404","Elapsed":0} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/api_key_405"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/api_key_405","Output":"=== CONT TestIsRetryableCodexModelsManifestStatus/api_key_405\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/server_error"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/server_error","Output":"=== CONT TestIsRetryableCodexModelsManifestStatus/server_error\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/server_error","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:43.919Z\",\"msg\":\"openai messages: upstream identity restored\",\"service\":\"sub2api\",\"env\":\"test\",\"account_id\":1,\"upstream_model\":\"gpt-5.4\",\"compat_identity_restored\":true}\n"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupAdvertisesSearchOnlyForChatBridgeRoutes","Output":"--- PASS: TestBuildCodexModelsManifestForGroupAdvertisesSearchOnlyForChatBridgeRoutes (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupAdvertisesSearchOnlyForChatBridgeRoutes","Elapsed":0} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestForwardAsAnthropic_ReusesOAuthCodexTurnState","Output":"--- PASS: TestForwardAsAnthropic_ReusesOAuthCodexTurnState (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestForwardAsAnthropic_ReusesOAuthCodexTurnState","Elapsed":0} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_Grok_4.6","Output":"=== PAUSE TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_Grok_4.6\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_Grok_4.6"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupPrefersSyncedOpenAIImageCapabilities/explicit_multimodal_snapshot_preserves_local_fallback"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupPrefersSyncedOpenAIImageCapabilities/explicit_multimodal_snapshot_preserves_local_fallback","Output":"=== CONT TestBuildCodexModelsManifestForGroupPrefersSyncedOpenAIImageCapabilities/explicit_multimodal_snapshot_preserves_local_fallback\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/api_key_401"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/api_key_401","Output":"=== CONT TestIsRetryableCodexModelsManifestStatus/api_key_401\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/api_key_401","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:43.920Z\",\"msg\":\"openai messages: model mapping applied\",\"service\":\"sub2api\",\"env\":\"test\",\"account_id\":1,\"original_model\":\"claude-sonnet-4-5\",\"normalized_model\":\"claude-sonnet-4-5\",\"billing_model\":\"gpt-4o\",\"upstream_model\":\"gpt-4o\",\"stream\":true}\n"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/oauth_401","Output":"--- PASS: TestIsRetryableCodexModelsManifestStatus/oauth_401 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/oauth_401","Elapsed":0} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/api_key_405","Output":"--- PASS: TestIsRetryableCodexModelsManifestStatus/api_key_405 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/api_key_405","Elapsed":0} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/server_error","Output":"--- PASS: TestIsRetryableCodexModelsManifestStatus/server_error (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/server_error","Elapsed":0} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/oauth_405"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/oauth_405","Output":"=== CONT TestIsRetryableCodexModelsManifestStatus/oauth_405\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/oauth_405","Output":"{\"level\":\"DEBUG\",\"time\":\"2026-09-12T03:42:43.920Z\",\"msg\":\"openai routing decision\",\"service\":\"sub2api\",\"env\":\"test\",\"component\":\"service.openai_routing\",\"transport\":\"http\",\"account_id\":1,\"final_model\":\"gpt-4o\",\"final_service_tier\":\"\",\"routing_hint_generated\":false,\"ws_affinity_decision\":\"not_applicable\"}\n"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/api_key_401","Output":"--- PASS: TestIsRetryableCodexModelsManifestStatus/api_key_401 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9203188+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/api_key_401","Elapsed":0} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/oauth_405","Output":"--- PASS: TestIsRetryableCodexModelsManifestStatus/oauth_405 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/oauth_405","Elapsed":0} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_Grok_Build_vision_host"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_Grok_Build_vision_host","Output":"=== RUN TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_Grok_Build_vision_host\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/rate_limited"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/rate_limited","Output":"=== CONT TestIsRetryableCodexModelsManifestStatus/rate_limited\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_Grok_Build_vision_host","Output":"=== PAUSE TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_Grok_Build_vision_host\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_Grok_Build_vision_host"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/api_key_403"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/api_key_403","Output":"=== CONT TestIsRetryableCodexModelsManifestStatus/api_key_403\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/api_key_400"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/api_key_400","Output":"=== CONT TestIsRetryableCodexModelsManifestStatus/api_key_400\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientUsesSyncedMetadataForConvertedModelList","Output":"--- PASS: TestCompleteAPIKeyCodexModelsManifestForClientUsesSyncedMetadataForConvertedModelList (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientUsesSyncedMetadataForConvertedModelList","Elapsed":0} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_Grok_4.20_vision_model"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_Grok_4.20_vision_model","Output":"=== RUN TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_Grok_4.20_vision_model\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestForwardAsAnthropic_ForcedCodexInstructionsTemplateUsesCachedTemplateContent","Output":"--- PASS: TestForwardAsAnthropic_ForcedCodexInstructionsTemplateUsesCachedTemplateContent (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestForwardAsAnthropic_ForcedCodexInstructionsTemplateUsesCachedTemplateContent","Elapsed":0} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_Grok_4.20_vision_model","Output":"=== PAUSE TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_Grok_4.20_vision_model\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_Grok_4.20_vision_model"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildGroupConfiguredCodexModelsManifestExpandsSelectedModelCoveredByWildcardMapping","Output":"--- PASS: TestBuildGroupConfiguredCodexModelsManifestExpandsSelectedModelCoveredByWildcardMapping (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildGroupConfiguredCodexModelsManifestExpandsSelectedModelCoveredByWildcardMapping","Elapsed":0} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/Grok_3_Mini_is_text_only"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/Grok_3_Mini_is_text_only","Output":"=== RUN TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/Grok_3_Mini_is_text_only\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/rate_limited","Output":"--- PASS: TestIsRetryableCodexModelsManifestStatus/rate_limited (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/rate_limited","Elapsed":0} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/Grok_3_Mini_is_text_only","Output":"=== PAUSE TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/Grok_3_Mini_is_text_only\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/Grok_3_Mini_is_text_only"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/Grok_Composer_has_only_Chat_image_bridge"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/Grok_Composer_has_only_Chat_image_bridge","Output":"=== RUN TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/Grok_Composer_has_only_Chat_image_bridge\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupPrefersSyncedOpenAIImageCapabilities/explicit_text-only_snapshot_narrows_local_fallback","Output":"--- PASS: TestBuildCodexModelsManifestForGroupPrefersSyncedOpenAIImageCapabilities/explicit_text-only_snapshot_narrows_local_fallback (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupPrefersSyncedOpenAIImageCapabilities/explicit_text-only_snapshot_narrows_local_fallback","Elapsed":0} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/api_key_403","Output":"--- PASS: TestIsRetryableCodexModelsManifestStatus/api_key_403 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/api_key_403","Elapsed":0} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/api_key_400","Output":"--- PASS: TestIsRetryableCodexModelsManifestStatus/api_key_400 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus/api_key_400","Elapsed":0} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus","Output":"--- PASS: TestIsRetryableCodexModelsManifestStatus (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestIsRetryableCodexModelsManifestStatus","Elapsed":0} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/Grok_Composer_has_only_Chat_image_bridge","Output":"=== PAUSE TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/Grok_Composer_has_only_Chat_image_bridge\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/Grok_Composer_has_only_Chat_image_bridge"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/custom_Grok_host"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/custom_Grok_host","Output":"=== RUN TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/custom_Grok_host\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/custom_Grok_host","Output":"=== PAUSE TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/custom_Grok_host\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/custom_Grok_host"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestForwardAsAnthropic_TrimsFullReplayOnlyForCodexCompatModels","Output":"--- PASS: TestForwardAsAnthropic_TrimsFullReplayOnlyForCodexCompatModels (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestForwardAsAnthropic_TrimsFullReplayOnlyForCodexCompatModels","Elapsed":0} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/malformed_Grok_host"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/malformed_Grok_host","Output":"=== RUN TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/malformed_Grok_host\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/malformed_Grok_host","Output":"=== PAUSE TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/malformed_Grok_host\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/malformed_Grok_host"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/mixed_official_and_custom_Grok_candidates"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/mixed_official_and_custom_Grok_candidates","Output":"=== RUN TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/mixed_official_and_custom_Grok_candidates\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/mixed_official_and_custom_Grok_candidates","Output":"=== PAUSE TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/mixed_official_and_custom_Grok_candidates\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/mixed_official_and_custom_Grok_candidates"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/DeepSeek_V4"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/DeepSeek_V4","Output":"=== RUN TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/DeepSeek_V4\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/DeepSeek_V4","Output":"=== PAUSE TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/DeepSeek_V4\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/DeepSeek_V4"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_OpenAI_API_key"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_OpenAI_API_key","Output":"=== RUN TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_OpenAI_API_key\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_OpenAI_API_key","Output":"=== PAUSE TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_OpenAI_API_key\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_OpenAI_API_key"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_OpenAI_legacy_text_model"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_OpenAI_legacy_text_model","Output":"=== RUN TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_OpenAI_legacy_text_model\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_OpenAI_legacy_text_model","Output":"=== PAUSE TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_OpenAI_legacy_text_model\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_OpenAI_legacy_text_model"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/custom_OpenAI-compatible_host"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/custom_OpenAI-compatible_host","Output":"=== RUN TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/custom_OpenAI-compatible_host\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/custom_OpenAI-compatible_host","Output":"=== PAUSE TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/custom_OpenAI-compatible_host\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/custom_OpenAI-compatible_host"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"run","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/custom_OpenAI-compatible_host_with_unknown_model"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/custom_OpenAI-compatible_host_with_unknown_model","Output":"=== RUN TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/custom_OpenAI-compatible_host_with_unknown_model\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/custom_OpenAI-compatible_host_with_unknown_model","Output":"=== PAUSE TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/custom_OpenAI-compatible_host_with_unknown_model\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"pause","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/custom_OpenAI-compatible_host_with_unknown_model"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_Grok_4.6"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_Grok_4.6","Output":"=== CONT TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_Grok_4.6\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/mixed_official_and_custom_Grok_candidates"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/mixed_official_and_custom_Grok_candidates","Output":"=== CONT TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/mixed_official_and_custom_Grok_candidates\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupPrefersSyncedOpenAIImageCapabilities/explicit_multimodal_snapshot_preserves_local_fallback","Output":"--- PASS: TestBuildCodexModelsManifestForGroupPrefersSyncedOpenAIImageCapabilities/explicit_multimodal_snapshot_preserves_local_fallback (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupPrefersSyncedOpenAIImageCapabilities/explicit_multimodal_snapshot_preserves_local_fallback","Elapsed":0} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/custom_Grok_host"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/custom_Grok_host","Output":"=== CONT TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/custom_Grok_host\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_OpenAI_API_key"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_OpenAI_API_key","Output":"=== CONT TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_OpenAI_API_key\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupPrefersSyncedOpenAIImageCapabilities","Output":"--- PASS: TestBuildCodexModelsManifestForGroupPrefersSyncedOpenAIImageCapabilities (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupPrefersSyncedOpenAIImageCapabilities","Elapsed":0} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/custom_OpenAI-compatible_host_with_unknown_model"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/custom_OpenAI-compatible_host_with_unknown_model","Output":"=== CONT TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/custom_OpenAI-compatible_host_with_unknown_model\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/DeepSeek_V4"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/DeepSeek_V4","Output":"=== CONT TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/DeepSeek_V4\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/Grok_3_Mini_is_text_only"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/Grok_3_Mini_is_text_only","Output":"=== CONT TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/Grok_3_Mini_is_text_only\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_Grok_Build_vision_host"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_Grok_Build_vision_host","Output":"=== CONT TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_Grok_Build_vision_host\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/custom_OpenAI-compatible_host"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/custom_OpenAI-compatible_host","Output":"=== CONT TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/custom_OpenAI-compatible_host\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/Grok_Composer_has_only_Chat_image_bridge"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/Grok_Composer_has_only_Chat_image_bridge","Output":"=== CONT TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/Grok_Composer_has_only_Chat_image_bridge\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_Grok_4.6","Output":"--- PASS: TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_Grok_4.6 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_Grok_4.6","Elapsed":0} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_OpenAI_legacy_text_model"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_OpenAI_legacy_text_model","Output":"=== CONT TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_OpenAI_legacy_text_model\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_Grok_4.20_vision_model"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_Grok_4.20_vision_model","Output":"=== CONT TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_Grok_4.20_vision_model\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"cont","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/malformed_Grok_host"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/malformed_Grok_host","Output":"=== CONT TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/malformed_Grok_host\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_Grok_Build_vision_host","Output":"--- PASS: TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_Grok_Build_vision_host (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_Grok_Build_vision_host","Elapsed":0} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/custom_OpenAI-compatible_host","Output":"--- PASS: TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/custom_OpenAI-compatible_host (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/custom_OpenAI-compatible_host","Elapsed":0} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/custom_Grok_host","Output":"--- PASS: TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/custom_Grok_host (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/custom_Grok_host","Elapsed":0} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/custom_OpenAI-compatible_host_with_unknown_model","Output":"--- PASS: TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/custom_OpenAI-compatible_host_with_unknown_model (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/custom_OpenAI-compatible_host_with_unknown_model","Elapsed":0} {"Time":"2026-09-12T11:42:43.9208329+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/Grok_Composer_has_only_Chat_image_bridge","Output":"--- PASS: TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/Grok_Composer_has_only_Chat_image_bridge (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9213467+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/Grok_Composer_has_only_Chat_image_bridge","Elapsed":0} {"Time":"2026-09-12T11:42:43.9213467+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_OpenAI_API_key","Output":"--- PASS: TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_OpenAI_API_key (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9213467+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_OpenAI_API_key","Elapsed":0} {"Time":"2026-09-12T11:42:43.9213467+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/DeepSeek_V4","Output":"--- PASS: TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/DeepSeek_V4 (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9213467+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/DeepSeek_V4","Elapsed":0} {"Time":"2026-09-12T11:42:43.9213467+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_OpenAI_legacy_text_model","Output":"--- PASS: TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_OpenAI_legacy_text_model (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9213467+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_OpenAI_legacy_text_model","Elapsed":0} {"Time":"2026-09-12T11:42:43.9213467+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/mixed_official_and_custom_Grok_candidates","Output":"--- PASS: TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/mixed_official_and_custom_Grok_candidates (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9213467+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/mixed_official_and_custom_Grok_candidates","Elapsed":0} {"Time":"2026-09-12T11:42:43.9213467+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestForwardAsAnthropic_ForcedCodexInstructionsTemplatePrependsRenderedInstructions","Output":"--- PASS: TestForwardAsAnthropic_ForcedCodexInstructionsTemplatePrependsRenderedInstructions (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9213467+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestForwardAsAnthropic_ForcedCodexInstructionsTemplatePrependsRenderedInstructions","Elapsed":0} {"Time":"2026-09-12T11:42:43.9213467+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/Grok_3_Mini_is_text_only","Output":"--- PASS: TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/Grok_3_Mini_is_text_only (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9213467+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/Grok_3_Mini_is_text_only","Elapsed":0} {"Time":"2026-09-12T11:42:43.9213467+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_Grok_4.20_vision_model","Output":"--- PASS: TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_Grok_4.20_vision_model (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9213467+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/official_Grok_4.20_vision_model","Elapsed":0} {"Time":"2026-09-12T11:42:43.9213467+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/malformed_Grok_host","Output":"--- PASS: TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/malformed_Grok_host (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9213467+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities/malformed_Grok_host","Elapsed":0} {"Time":"2026-09-12T11:42:43.9213467+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities","Output":"--- PASS: TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities (0.00s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9218611+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildCodexModelsManifestForGroupUsesProviderImageCapabilities","Elapsed":0} {"Time":"2026-09-12T11:42:43.9218611+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientMarksOnlyOfficialVisionGPTImageInput","Output":"--- PASS: TestCompleteAPIKeyCodexModelsManifestForClientMarksOnlyOfficialVisionGPTImageInput (0.01s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:43.9261253+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestCompleteAPIKeyCodexModelsManifestForClientMarksOnlyOfficialVisionGPTImageInput","Elapsed":0.01} {"Time":"2026-09-12T11:42:43.9261253+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildGroupConfiguredCodexModelsManifestUsesAdministratorConfiguration","Output":"--- PASS: TestBuildGroupConfiguredCodexModelsManifestUsesAdministratorConfiguration (0.01s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:44.1178606+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestBuildGroupConfiguredCodexModelsManifestUsesAdministratorConfiguration","Elapsed":0.01} {"Time":"2026-09-12T11:42:44.1178606+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccountUsageService_PersistOpenAICodexProbeSnapshotOnlyUpdatesExtra","Output":"--- PASS: TestAccountUsageService_PersistOpenAICodexProbeSnapshotOnlyUpdatesExtra (0.20s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:44.1185354+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccountUsageService_PersistOpenAICodexProbeSnapshotOnlyUpdatesExtra","Elapsed":0.2} {"Time":"2026-09-12T11:42:44.1185354+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccountUsageService_GetOpenAIUsage_DoesNotPromoteCodexExtraToRateLimit","Output":"--- PASS: TestAccountUsageService_GetOpenAIUsage_DoesNotPromoteCodexExtraToRateLimit (0.20s)\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:44.1185354+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Test":"TestAccountUsageService_GetOpenAIUsage_DoesNotPromoteCodexExtraToRateLimit","Elapsed":0.2} {"Time":"2026-09-12T11:42:44.1185354+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Output":"PASS\n","OutputType":"frame"} {"Time":"2026-09-12T11:42:44.1331736+08:00","Action":"output","Package":"github.com/Wei-Shaw/sub2api/internal/service","Output":"ok \tgithub.com/Wei-Shaw/sub2api/internal/service\t11.256s\n"} {"Time":"2026-09-12T11:42:44.1331736+08:00","Action":"pass","Package":"github.com/Wei-Shaw/sub2api/internal/service","Elapsed":11.256}