Skip to content

Commit d40a928

Browse files
committed
fix(ci): restore cross-platform data mode checks
The Data mode branch exposed three CI-only regressions after rebasing: a PostgreSQL sabotage test referenced the pre-microdollar pricing column, portable mapping paths conflicted with native Windows expectations and legacy rows, and incremental identity publication reloaded a session that the append lookup had already populated. Keep copied mapping keys portable across database generations and carry both resolved and parser-source projects through incremental writes so identity remains correct without the extra hot-path query.
1 parent 97806c6 commit d40a928

8 files changed

Lines changed: 32 additions & 34 deletions

File tree

internal/db/db_test.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5752,8 +5752,10 @@ func TestCopySessionMetadataPreservesWorktreeProjectMappings(t *testing.T) {
57525752
for _, m := range got {
57535753
projects[m.PathPrefix] = m.Project
57545754
}
5755-
require.Equal(t, "src_repo", projects[srcPrefix], "source mapping project")
5756-
require.Equal(t, "src_conflict", projects[dstPrefix], "destination mapping project")
5755+
require.Equal(t, "src_repo", projects[filepath.ToSlash(srcPrefix)],
5756+
"source mapping project")
5757+
require.Equal(t, "src_conflict", projects[filepath.ToSlash(dstPrefix)],
5758+
"destination mapping project")
57575759
}
57585760

57595761
func TestCopySessionMetadataPreservesClears(t *testing.T) {

internal/db/orphaned.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -724,15 +724,17 @@ func (d *DB) CopySessionMetadataFrom(
724724
SELECT 1
725725
FROM old_db.worktree_project_mappings old_m
726726
WHERE old_m.machine = main.worktree_project_mappings.machine
727-
AND old_m.path_prefix = main.worktree_project_mappings.path_prefix
727+
AND replace(old_m.path_prefix, char(92), '/') =
728+
main.worktree_project_mappings.path_prefix
728729
)`); err != nil {
729730
return fmt.Errorf("reconciling worktree project mappings: %w", err)
730731
}
731732
if _, err := tx.ExecContext(ctx, `
732733
INSERT INTO main.worktree_project_mappings
733734
(machine, path_prefix, layout, project, original_project,
734735
enabled, created_at, updated_at)
735-
SELECT machine, path_prefix, `+layoutSelect+`, project,
736+
SELECT machine, replace(path_prefix, char(92), '/'),
737+
`+layoutSelect+`, project,
736738
`+originalProjectSelect+`, enabled, created_at, updated_at
737739
FROM old_db.worktree_project_mappings
738740
WHERE true

internal/db/worktree_mappings.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -489,7 +489,8 @@ func (db *DB) CopyWorktreeProjectMappingsFrom(sourcePath string) error {
489489
INSERT INTO main.worktree_project_mappings
490490
(machine, path_prefix, layout, project, original_project,
491491
enabled, created_at, updated_at)
492-
SELECT machine, path_prefix, `+layoutSelect+`, project,
492+
SELECT machine, replace(path_prefix, char(92), '/'),
493+
`+layoutSelect+`, project,
493494
`+originalProjectSelect+`, enabled, created_at, updated_at
494495
FROM old_db.worktree_project_mappings
495496
WHERE TRUE

internal/db/worktree_mappings_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ func TestWorktreeProjectMappingsCRUDNormalizesAndScopesByMachine(t *testing.T) {
2727
})
2828
require.NoError(t, err, "create mapping")
2929
assert.Equal(t, "laptop", m.Machine, "machine")
30-
assert.Equal(t, prefix, m.PathPrefix, "path_prefix")
30+
assert.Equal(t, filepath.ToSlash(prefix), m.PathPrefix, "path_prefix")
3131
assert.Equal(t, WorktreeMappingLayoutExplicit, m.Layout, "layout")
3232
assert.Equal(t, "my_app", m.Project, "project")
3333

@@ -1557,7 +1557,7 @@ func TestCopyWorktreeProjectMappingsFromFillsOnlyEmptyOriginalProject(
15571557
assert.Equal(t, tt.wantOriginal, mappings[0].OriginalProject)
15581558
assert.Equal(t, owned.ID, mappings[0].ID, "destination owns the row")
15591559
assert.Equal(t, "host-a.example", mappings[0].Machine)
1560-
assert.Equal(t, prefix, mappings[0].PathPrefix)
1560+
assert.Equal(t, filepath.ToSlash(prefix), mappings[0].PathPrefix)
15611561
assert.Equal(t, WorktreeMappingLayoutExplicit, mappings[0].Layout)
15621562
assert.Equal(t, "destination_service", mappings[0].Project)
15631563
assert.False(t, mappings[0].Enabled)

internal/postgres/push_pgtest_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2979,7 +2979,8 @@ func TestSessionProvenanceBackfillMarkerNotWrittenOnFailure(t *testing.T) {
29792979
// requirement is applied but before the marker can be written, mirroring
29802980
// TestPushMarkerNotWrittenWhenResetRecoveryFails' model_pricing sabotage.
29812981
_, err := pg.Exec(
2982-
`ALTER TABLE model_pricing DROP COLUMN cache_read_per_mtok`,
2982+
`ALTER TABLE model_pricing
2983+
DROP COLUMN cache_read_microdollars_per_mtok`,
29832984
)
29842985
require.NoError(t, err, "drop model_pricing column")
29852986

internal/sync/engine.go

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6579,6 +6579,7 @@ func drainResults(results <-chan syncJob, remaining int) {
65796579
type incrementalUpdate struct {
65806580
sessionID string
65816581
project string
6582+
sourceProject string
65826583
machine string
65836584
cwd string
65846585
msgs []parser.ParsedMessage
@@ -8666,7 +8667,8 @@ func (e *Engine) tryIncrementalJSONL(
86668667
return processResult{
86678668
incremental: &incrementalUpdate{
86688669
sessionID: inc.ID,
8669-
project: inc.SourceProject,
8670+
project: inc.Project,
8671+
sourceProject: inc.SourceProject,
86708672
machine: inc.Machine,
86718673
cwd: inc.Cwd,
86728674
links: links,
@@ -8783,7 +8785,8 @@ func (e *Engine) tryIncrementalJSONL(
87838785
return processResult{
87848786
incremental: &incrementalUpdate{
87858787
sessionID: inc.ID,
8786-
project: inc.SourceProject,
8788+
project: inc.Project,
8789+
sourceProject: inc.SourceProject,
87878790
machine: inc.Machine,
87888791
cwd: inc.Cwd,
87898792
msgs: newMsgs,
@@ -11143,28 +11146,16 @@ func (e *Engine) writeIncremental(
1114311146
); err != nil {
1114411147
return err
1114511148
}
11146-
persisted, err := e.db.GetSession(context.Background(), inc.sessionID)
11147-
if err != nil {
11148-
return fmt.Errorf(
11149-
"reload incrementally written session %s: %w",
11150-
inc.sessionID, err,
11151-
)
11152-
}
1115311149
identitySession := db.Session{
1115411150
ID: inc.sessionID,
1115511151
Project: inc.project,
1115611152
Machine: inc.machine,
1115711153
Cwd: inc.cwd,
1115811154
}
11159-
if persisted != nil {
11160-
identitySession.Project = persisted.Project
11161-
identitySession.Machine = persisted.Machine
11162-
identitySession.Cwd = persisted.Cwd
11163-
}
1116411155
if err := e.writeProjectIdentityObservationWithSnapshotProject(
1116511156
context.Background(),
1116611157
identitySession,
11167-
inc.project,
11158+
inc.sourceProject,
1116811159
); err != nil {
1116911160
log.Printf(
1117011161
"incremental project identity observation %s: %v",

internal/sync/engine_integration_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2599,7 +2599,7 @@ func TestSyncEngineMappingPreservesParserProjectIdentitySnapshot(t *testing.T) {
25992599
require.NoError(t, err, "ListProjectIdentityObservations")
26002600
require.Len(t, observations, 1)
26012601
assert.Equal(t, "canonical_app", observations[0].Project)
2602-
assert.Equal(t, sessionCwd, observations[0].RootPath)
2602+
assert.Equal(t, filepath.ToSlash(sessionCwd), observations[0].RootPath)
26032603

26042604
snapshots, err := env.db.ListSessionProjectIdentitySnapshots(
26052605
context.Background(),
@@ -2608,7 +2608,7 @@ func TestSyncEngineMappingPreservesParserProjectIdentitySnapshot(t *testing.T) {
26082608
require.Len(t, snapshots, 1)
26092609
assert.Equal(t, "mapped-worktree", snapshots[0].SessionID)
26102610
assert.Equal(t, "feature_login", snapshots[0].Project)
2611-
assert.Equal(t, sessionCwd, snapshots[0].RootPath)
2611+
assert.Equal(t, filepath.ToSlash(sessionCwd), snapshots[0].RootPath)
26122612
}
26132613

26142614
func TestResyncAllUpgradeKeepsFreshProjectSnapshotAndDropsLegacyOrphan(

internal/sync/engine_test.go

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4128,7 +4128,7 @@ func TestProjectIdentityBulkWriteMappingPreservesParserProjectSnapshot(
41284128
require.NoError(t, err, "ListProjectIdentityObservations")
41294129
require.Len(t, observations, 1)
41304130
assert.Equal(t, "canonical_app", observations[0].Project)
4131-
assert.Equal(t, cwd, observations[0].RootPath)
4131+
assert.Equal(t, filepath.ToSlash(cwd), observations[0].RootPath)
41324132

41334133
snapshots, err := database.ListSessionProjectIdentitySnapshots(
41344134
context.Background(),
@@ -4137,7 +4137,7 @@ func TestProjectIdentityBulkWriteMappingPreservesParserProjectSnapshot(
41374137
require.Len(t, snapshots, 1)
41384138
assert.Equal(t, "mapped-bulk-identity", snapshots[0].SessionID)
41394139
assert.Equal(t, "feature_login", snapshots[0].Project)
4140-
assert.Equal(t, cwd, snapshots[0].RootPath)
4140+
assert.Equal(t, filepath.ToSlash(cwd), snapshots[0].RootPath)
41414141
}
41424142

41434143
func TestProjectIdentityFullSessionWriteMappingPreservesParserProjectSnapshot(
@@ -4183,7 +4183,7 @@ func TestProjectIdentityFullSessionWriteMappingPreservesParserProjectSnapshot(
41834183
require.NoError(t, err, "ListProjectIdentityObservations")
41844184
require.Len(t, observations, 1)
41854185
assert.Equal(t, "canonical_app", observations[0].Project)
4186-
assert.Equal(t, cwd, observations[0].RootPath)
4186+
assert.Equal(t, filepath.ToSlash(cwd), observations[0].RootPath)
41874187

41884188
snapshots, err := database.ListSessionProjectIdentitySnapshots(
41894189
context.Background(),
@@ -4192,7 +4192,7 @@ func TestProjectIdentityFullSessionWriteMappingPreservesParserProjectSnapshot(
41924192
require.Len(t, snapshots, 1)
41934193
assert.Equal(t, "mapped-full-identity", snapshots[0].SessionID)
41944194
assert.Equal(t, "feature_login", snapshots[0].Project)
4195-
assert.Equal(t, cwd, snapshots[0].RootPath)
4195+
assert.Equal(t, filepath.ToSlash(cwd), snapshots[0].RootPath)
41964196
}
41974197

41984198
func TestProjectIdentityMappedWriteWithEmptyParserProjectOmitsSnapshot(
@@ -4247,7 +4247,7 @@ func TestProjectIdentityMappedWriteWithEmptyParserProjectOmitsSnapshot(
42474247
require.NoError(t, err, "ListProjectIdentityObservations")
42484248
require.Len(t, observations, 1)
42494249
assert.Equal(t, "canonical_app", observations[0].Project)
4250-
assert.Equal(t, cwd, observations[0].RootPath)
4250+
assert.Equal(t, filepath.ToSlash(cwd), observations[0].RootPath)
42514251

42524252
snapshots, err := database.ListSessionProjectIdentitySnapshots(
42534253
context.Background(),
@@ -4339,7 +4339,7 @@ func TestProjectIdentityEmptySourceReparsePreservesExistingSnapshot(
43394339
require.NoError(t, err, "ListProjectIdentityObservations")
43404340
require.Len(t, observations, 1)
43414341
assert.Equal(t, "canonical_app", observations[0].Project)
4342-
assert.Equal(t, cwd, observations[0].RootPath)
4342+
assert.Equal(t, filepath.ToSlash(cwd), observations[0].RootPath)
43434343

43444344
snapshots, err := database.ListSessionProjectIdentitySnapshots(
43454345
context.Background(),
@@ -4348,7 +4348,7 @@ func TestProjectIdentityEmptySourceReparsePreservesExistingSnapshot(
43484348
require.Len(t, snapshots, 1)
43494349
assert.Equal(t, "mapped-reparse-"+tt.name, snapshots[0].SessionID)
43504350
assert.Equal(t, tt.sourceProject, snapshots[0].Project)
4351-
assert.Equal(t, cwd, snapshots[0].RootPath)
4351+
assert.Equal(t, filepath.ToSlash(cwd), snapshots[0].RootPath)
43524352
})
43534353
}
43544354
}
@@ -4408,7 +4408,7 @@ func TestProjectIdentityExplicitEmptyDeleteReinsertClearsNewFallback(
44084408
require.NoError(t, err, "ListProjectIdentityObservations")
44094409
require.Len(t, observations, 1)
44104410
assert.Equal(t, "canonical_app", observations[0].Project)
4411-
assert.Equal(t, cwd, observations[0].RootPath)
4411+
assert.Equal(t, filepath.ToSlash(cwd), observations[0].RootPath)
44124412

44134413
snapshots, err := database.ListSessionProjectIdentitySnapshots(
44144414
context.Background(),
@@ -4936,7 +4936,8 @@ func TestProjectIdentityIncrementalAppendUsesPersistedMappedProject(t *testing.T
49364936
e := NewEngine(database, EngineConfig{Machine: machine})
49374937
t.Cleanup(e.Close)
49384938
require.NoError(t, e.writeIncremental(&incrementalUpdate{
4939-
sessionID: sessionID, project: sourceProject, machine: machine, cwd: root,
4939+
sessionID: sessionID, project: targetProject,
4940+
sourceProject: sourceProject, machine: machine, cwd: root,
49404941
msgs: []parser.ParsedMessage{{
49414942
Role: parser.RoleAssistant, Content: "delta", Ordinal: 1,
49424943
}},

0 commit comments

Comments
 (0)