Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
188 commits
Select commit Hold shift + click to select a range
092d321
test: define versioned UI translation ledger contract
seonghobae Sep 3, 2026
b4c8310
feat: add fail-closed translation ledger read model
seonghobae Sep 3, 2026
43c7502
feat: persist immutable eight-locale translation resources
seonghobae Sep 3, 2026
370f83a
test: require publication serialization for translation children
seonghobae Sep 3, 2026
bb61753
fix: serialize translation publication with child writes
seonghobae Sep 3, 2026
d4380c2
docs: propose versioned UI translation ledger
seonghobae Sep 3, 2026
ba7af63
test: cover translation ledger read-model edge cases
seonghobae Sep 3, 2026
3b68e4e
test(i18n): reject incomplete exact-cache projections
seonghobae Sep 3, 2026
249b6cf
fix(i18n): verify cached projections against authoritative keysets
seonghobae Sep 3, 2026
f666a5b
test(i18n): preserve authoritative keyset admission on cache hits
seonghobae Sep 3, 2026
7df3478
docs(adr): make cache completeness authority explicit
seonghobae Sep 3, 2026
d75d0a9
test(i18n): require canonical resource identity in PostgreSQL
seonghobae Sep 3, 2026
d4d03da
fix(i18n): enforce canonical translation resource identity
seonghobae Sep 3, 2026
0e30753
docs(adr): align DB and cache resource identities
seonghobae Sep 3, 2026
c60693d
test(i18n): require database-owned publication timestamp
seonghobae Sep 3, 2026
5973bbb
fix(i18n): make publication timestamp database-owned
seonghobae Sep 3, 2026
4d06580
docs(adr): make publication provenance database-owned
seonghobae Sep 3, 2026
d982d26
test(i18n): exercise translation ledger invariants in PostgreSQL
seonghobae Sep 3, 2026
74f0521
test(i18n): timestamp the publication transition itself
seonghobae Sep 3, 2026
e2429b1
fix(i18n): timestamp the publication transition statement
seonghobae Sep 3, 2026
3a3f809
test(i18n): align publication receipt with statement time
seonghobae Sep 3, 2026
0089692
docs(adr): bind publication evidence to the transition statement
seonghobae Sep 3, 2026
527abd6
test(i18n): reject padded translation identities
seonghobae Sep 3, 2026
66ff153
fix(i18n): reject padded translation identities
seonghobae Sep 3, 2026
4df91d9
docs(adr): align translation identity admission evidence
seonghobae Sep 3, 2026
a0a7cf4
test(i18n): forbid new psycopg2 verification reachability
seonghobae Sep 3, 2026
2ec9873
test(i18n): use asyncpg for ledger PostgreSQL verification
seonghobae Sep 3, 2026
8b01c7c
fix(i18n): rollback failed asyncpg publication transaction
seonghobae Sep 3, 2026
e325392
test(i18n): prove cache reads release DB lease
seonghobae Sep 3, 2026
0241549
fix(i18n): release DB lease before cache I/O
seonghobae Sep 3, 2026
f077d19
test(i18n): align miss-path lease expectations
seonghobae Sep 3, 2026
b4056e2
docs(i18n): record cache lease boundary
seonghobae Sep 3, 2026
aa050f1
test(i18n): RED immutable translation aggregate identity
seonghobae Sep 3, 2026
04c851f
fix(i18n): freeze translation aggregate identity after insert
seonghobae Sep 3, 2026
9b2720c
docs(adr): record immutable translation aggregate identity
seonghobae Sep 3, 2026
c46634a
test(i18n): keep aggregate identity guard in hosted contract
seonghobae Sep 3, 2026
e2b5b5f
test(i18n): reject padded translation key identity
seonghobae Sep 3, 2026
413ea3b
fix(i18n): canonicalize required translation key identity
seonghobae Sep 3, 2026
913e3d1
test(i18n): preserve canonical required-key guard in hosted CI
seonghobae Sep 3, 2026
baa1986
docs(adr): make translation key identity canonical
seonghobae Sep 3, 2026
da3b9c5
test(i18n): reject non-space edge whitespace identity
seonghobae Sep 3, 2026
f74b7e2
fix(i18n): reject edge whitespace beyond plain spaces
seonghobae Sep 3, 2026
d8c3864
test(i18n): preserve edge-whitespace identity guard
seonghobae Sep 3, 2026
1da44d3
docs(adr): align PostgreSQL edge-whitespace semantics
seonghobae Sep 3, 2026
47c2c21
test(i18n): reject database whitespace-only copy
seonghobae Sep 3, 2026
55df3d8
test(i18n): prove whitespace-only copy publication fails
seonghobae Sep 3, 2026
9b42748
fix(i18n): reject whitespace-only translation copy
seonghobae Sep 3, 2026
b03c91d
docs(adr): align immutable copy completeness
seonghobae Sep 3, 2026
9f04f09
test(i18n): require immutable translation projections
seonghobae Sep 3, 2026
035fbc8
fix(i18n): freeze published translation projections
seonghobae Sep 3, 2026
a56458f
docs(adr): bind translation value-object immutability
seonghobae Sep 3, 2026
ea95121
test(i18n): reject poisoned exact-version cache copy
seonghobae Sep 3, 2026
3495598
fix(i18n): bind cache copy to PostgreSQL digests
seonghobae Sep 3, 2026
1e9d6f9
test(i18n): model PostgreSQL cache integrity digests
seonghobae Sep 3, 2026
dc5e374
test(i18n): verify PostgreSQL copy digests
seonghobae Sep 3, 2026
22251bc
docs(adr): bind Valkey copy to PostgreSQL evidence
seonghobae Sep 3, 2026
c34f94b
test(i18n): preserve cache digest admission contract
seonghobae Sep 3, 2026
888a6f1
test(i18n): expose locale-dependent Unicode whitespace admission
seonghobae Sep 3, 2026
2b921e0
fix(i18n): make whitespace admission collation independent
seonghobae Sep 3, 2026
f0ad89d
fix(i18n): pin application whitespace repertoire
seonghobae Sep 3, 2026
e33ad22
test(i18n): align hosted whitespace contract
seonghobae Sep 3, 2026
caec5b7
docs(adr): pin collation-independent whitespace contract
seonghobae Sep 3, 2026
5e71da3
test(i18n): bind explicit whitespace repertoire
seonghobae Sep 3, 2026
8588bcc
test(i18n): reject resource versions outside bigint
seonghobae Sep 3, 2026
11326a2
fix(i18n): align resource version with bigint identity
seonghobae Sep 3, 2026
7222994
test(i18n): reject non-UTF-8 cache copy
seonghobae Sep 3, 2026
ac175dc
fix(i18n): fail cache surrogate copy closed
seonghobae Sep 3, 2026
ab5270f
test(i18n): reject non-string translation identities
seonghobae Sep 3, 2026
42e0af0
fix(i18n): fail closed on malformed identity types
seonghobae Sep 3, 2026
dbe484b
test(i18n): reject float cache version identity
seonghobae Sep 3, 2026
a46bf61
fix(i18n): enforce integer cache version identity
seonghobae Sep 3, 2026
1edab5c
test(i18n): reject non-PostgreSQL text identities
seonghobae Sep 3, 2026
6679d12
fix(i18n): align identity strings with PostgreSQL text
seonghobae Sep 3, 2026
0206d6a
test: require translation ledger rollback recovery
seonghobae Sep 3, 2026
7d47074
fix: add translation ledger rollback recovery
seonghobae Sep 3, 2026
14dd852
test: forbid destructive translation ledger rollback
seonghobae Sep 3, 2026
4de0353
fix: guard translation rollback against data loss
seonghobae Sep 3, 2026
2ad7877
test(i18n): expose rollback insert race
seonghobae Sep 3, 2026
7b60ad4
fix(i18n): serialize rollback emptiness guard
seonghobae Sep 3, 2026
be42d9b
test(i18n): pin rollback lock ordering
seonghobae Sep 3, 2026
4f3b809
test(i18n): pin TranslationScreen alias immutability RED
seonghobae Sep 4, 2026
83e4c65
fix(i18n): make TranslationScreen own immutable copy
seonghobae Sep 4, 2026
0ce3422
test(i18n): reject mismatched translation cache identity
seonghobae Sep 4, 2026
718f86d
fix(i18n): bind translation value object to cache identity
seonghobae Sep 4, 2026
80e9eba
test: require replay-safe translation rollback
seonghobae Sep 4, 2026
99521ba
test: preserve rollback replay tolerance
seonghobae Sep 4, 2026
f6f3758
fix: make translation rollback replay-safe
seonghobae Sep 4, 2026
0d3d858
test(i18n): reject invalid TranslationScreen projections
seonghobae Sep 4, 2026
223aca5
fix(i18n): enforce TranslationScreen projection invariants
seonghobae Sep 4, 2026
2e83785
fix(test): restore TranslationScreen regression syntax
seonghobae Sep 4, 2026
906f7e1
docs(gaps): refresh translation delivery evidence
Sep 4, 2026
ceed87e
feat(i18n): expose authenticated screen translations
Sep 4, 2026
249b59e
docs(gaps): record authenticated translation slice
Sep 4, 2026
cbc18ce
test(i18n): reject ambiguous duplicate cache members
seonghobae Sep 4, 2026
f516869
fix(i18n): reject duplicate cache JSON members
seonghobae Sep 4, 2026
503da98
test(i18n): keep translation API fixture off psycopg2
seonghobae Sep 4, 2026
f0924b7
test(i18n): verify API read through asyncpg boundary
seonghobae Sep 4, 2026
04ef4fc
fix(i18n): keep API integration on asyncpg
seonghobae Sep 4, 2026
494c005
test(i18n): pin rollback locale-preference admission
seonghobae Sep 4, 2026
e23c21d
fix(i18n): guard rollback locale preferences
seonghobae Sep 4, 2026
1b252eb
test(i18n): assert rollback locale lock ordering
seonghobae Sep 4, 2026
686e481
test(i18n): reject recursive cache payloads
seonghobae Sep 4, 2026
6e3129e
test(i18n): force decoder recursion RED
seonghobae Sep 4, 2026
c44cf49
fix(i18n): treat recursive cache JSON as miss
seonghobae Sep 4, 2026
bf37d39
test(i18n): prove recursive cache fixture
seonghobae Sep 4, 2026
b0d764b
test(i18n): pin published truncate immutability RED
seonghobae Sep 4, 2026
d9cc274
fix(i18n): guard published ledger from truncate
seonghobae Sep 4, 2026
bf04fbf
chore(i18n): add replay-safe truncate guard rollback
seonghobae Sep 4, 2026
77554c1
test(i18n): verify truncate guard migration behavior
seonghobae Sep 4, 2026
b481967
test(i18n): cover truncate guard admission and rollback
seonghobae Sep 4, 2026
d08e27f
fix(i18n): converge 0246 rollback after truncate guard
seonghobae Sep 4, 2026
aca158d
test(i18n): pin rollback convergence for truncate guard
seonghobae Sep 4, 2026
af049ae
test(i18n): require non-vacuous translation HTTP contract
seonghobae Sep 4, 2026
70d3436
test(i18n): exercise authenticated translation HTTP route
seonghobae Sep 4, 2026
9e4df93
test(i18n): align immutable cache fixture evidence
Sep 4, 2026
c53d055
test(i18n): pin gap baseline to live API slice
seonghobae Sep 4, 2026
fe8693b
docs(i18n): restore code-current gap baseline
seonghobae Sep 4, 2026
063a6d9
test(i18n): bound optional cache I/O
seonghobae Sep 4, 2026
12b8f75
fix(i18n): bound optional cache latency
seonghobae Sep 4, 2026
5e8f433
docs(i18n): record bounded cache failure path
seonghobae Sep 4, 2026
9604251
test(i18n): serialize publish with child truncate
seonghobae Sep 4, 2026
6db4b2a
fix(i18n): serialize publish with truncate guard
seonghobae Sep 4, 2026
85a9a93
test(i18n): pin truncate publication lock order
seonghobae Sep 4, 2026
3e10376
docs(i18n): record truncate publication serialization
seonghobae Sep 4, 2026
22788ad
test(i18n): reject truncate lock-order deadlock
seonghobae Sep 4, 2026
e618b51
test(i18n): pin nonblocking truncate admission
seonghobae Sep 4, 2026
f97145d
fix(i18n): fail truncate lock contention closed
seonghobae Sep 4, 2026
68baf19
docs(i18n): record nonblocking truncate admission
seonghobae Sep 4, 2026
bad21a9
test(i18n): align cache timeout helper call
Sep 4, 2026
f1877b8
docs(gaps): refresh exact-head delivery evidence
Sep 4, 2026
92850af
test(docs): pin draft and history formatting contracts
seonghobae Sep 4, 2026
d8d3e55
docs(product): restore draft evidence boundary
seonghobae Sep 4, 2026
834776c
docs(product): restore traceability after status repair
seonghobae Sep 4, 2026
7a8a648
docs(history): preserve raw archive behind lint-clean index
seonghobae Sep 4, 2026
e7509b4
test(docs): prove historical archive byte identity
seonghobae Sep 4, 2026
df3266f
fix(i18n): make translation rollback replay-safe
Sep 4, 2026
b941635
docs(gaps): refresh translation exact-head evidence
Sep 4, 2026
597528f
test(i18n): distinguish translation request validation failures
seonghobae Sep 4, 2026
f3524ad
refactor(i18n): type translation request validation failures
seonghobae Sep 4, 2026
84b7b5e
codex: address PR review feedback (#929)
Sep 4, 2026
4139858
fix(observability): replace deprecated log handler
Sep 4, 2026
fc53004
test(i18n): pin one-query exact-version cache miss RED
seonghobae Sep 4, 2026
a741c2f
docs(gaps): refresh exact-head verification evidence
Sep 4, 2026
a3c8e9d
perf(i18n): reuse exact-version PostgreSQL projection
seonghobae Sep 4, 2026
4ec808a
test(i18n): align immutable miss query budget
seonghobae Sep 4, 2026
655fee2
test(i18n): restore real recursion cache evidence
seonghobae Sep 4, 2026
3acd976
docs(gaps): align exact-version query-budget evidence
seonghobae Sep 4, 2026
ab2652b
test(i18n): align one-query cache fallbacks
Sep 4, 2026
c1e7bdf
test(i18n): preserve real recursion evidence
seonghobae Sep 4, 2026
e6041cf
docs(gaps): preserve executable recursion evidence
seonghobae Sep 4, 2026
ffa45c5
test(i18n): make recursion fallback version-independent
Sep 4, 2026
989e1f4
docs(gaps): align recursion portability evidence
Sep 4, 2026
265aa32
test(i18n): preserve real recursion wire evidence
seonghobae Sep 4, 2026
12284da
docs(gaps): converge dual recursion evidence
seonghobae Sep 4, 2026
e7ec66a
test(i18n): make wire recursion evidence portable
Sep 4, 2026
d6d9df6
test(i18n): RED pin real wire recursion evidence
seonghobae Sep 4, 2026
3ca4d77
fix(i18n): restore real decoder recursion proof
seonghobae Sep 4, 2026
65a7df7
docs(gaps): restore exact-head wire evidence boundary
seonghobae Sep 4, 2026
a6aecea
chore(main): non-force converge protected #930
seonghobae Sep 4, 2026
69a1bc4
chore(main): non-force converge protected #931
seonghobae Sep 4, 2026
2d730ae
test(i18n): make deep JSON cache evidence runtime-portable
Sep 4, 2026
7edbd4f
test(i18n): require actual deep JSON decoder exhaustion
seonghobae Sep 4, 2026
5df3120
fix(i18n): restore real decoder-exhaustion evidence
seonghobae Sep 4, 2026
ad83c4a
docs(gaps): restore strict translation wire evidence
seonghobae Sep 4, 2026
adf312b
test(i18n): preserve cache hit and miss query budgets
seonghobae Sep 4, 2026
15c344e
fix(i18n): preserve exact-version cache value
seonghobae Sep 4, 2026
49cc023
test(i18n): align corrupt-cache fallback budget
seonghobae Sep 4, 2026
e200e41
docs(adr): preserve cache-hit and miss economics
seonghobae Sep 4, 2026
49a0ee7
docs(gap): align translation cache query economics
seonghobae Sep 4, 2026
1de835d
test(i18n): align exact-head regression assertions
Sep 4, 2026
3e11cee
test(i18n): restore exact-head cache regressions
Sep 4, 2026
fbce5b1
docs(gap): refresh translation delivery boundary
Sep 4, 2026
e32098a
docs(gap): record adjacent exact-head evidence
Sep 4, 2026
26ced49
docs(gap): refresh PostgreSQL candidate head
Sep 4, 2026
722c6ed
docs(gap): reconcile TLS ADR collision
Sep 4, 2026
1d7d9a9
docs(gap): refresh TLS delivery state
Sep 4, 2026
42e1e2e
docs(gap): keep Customer Master acceptance state current
seonghobae Sep 4, 2026
cee066a
docs(gap): record current coordination queue
Sep 4, 2026
4c645a1
test(i18n): tighten current evidence alignment
seonghobae Sep 4, 2026
f70c7a7
docs(gap): adopt live postgres candidate head
seonghobae Sep 4, 2026
9a189fb
test(i18n): parse scoped baseline blockquote
Sep 4, 2026
953a569
test(i18n): tighten candidate evidence semantics
seonghobae Sep 4, 2026
3849803
docs(i18n): align current candidate evidence state
seonghobae Sep 4, 2026
481a53f
test(i18n): admit repaired candidate review state
seonghobae Sep 4, 2026
6042c37
docs(i18n): align ready validation boundary
seonghobae Sep 4, 2026
f07a755
docs(gaps): refresh live queue snapshot
seonghobae Sep 4, 2026
2a8ed5d
test(i18n): address review quality findings
Sep 5, 2026
0f4fd26
docs(gaps): refresh 2026-09-07 live queue snapshot
Sep 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 60 additions & 0 deletions backend/app/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,14 @@
PrimaryVoiceAssignmentError,
persist_additional_voice_assignment,
)
from backend.app.translation_ledger import (
TranslationCoverageError,
TranslationIdentityError,
TranslationResourceNotFound,
TranslationResourceVersionError,
UnsupportedTranslationLocale,
read_translation_screen,
)
from lineageweave.adjudication_client import (
AdjudicationClientError,
ContextualOrchestratorAdjudicationClient,
Expand Down Expand Up @@ -818,6 +826,58 @@ async def read_tenant_settings(
return {"brandName": "LineageWeave"}
return {"brandName": row["brand_name"]}


@app.get("/api/translations/{screen_key}")
async def read_ui_translations(
screen_key: str,
locale: str = Query(...),
resource_version: int | None = Query(default=None, ge=1),
_account: CurrentAccount = Depends(get_current_account),
pool: asyncpg.Pool = Depends(get_pool),
valkey: redis.Redis = Depends(get_valkey),
) -> dict[str, Any]:
"""Return one complete, published interface-copy version for a screen."""
try:
screen = await read_translation_screen(
pool,
valkey,
product_key="lineageweave",
screen_key=screen_key,
locale=locale,
resource_version=resource_version,
)
except UnsupportedTranslationLocale as exc:
raise HTTPException(
status.HTTP_422_UNPROCESSABLE_CONTENT,
"Choose one of the supported interface languages.",
) from exc
except TranslationIdentityError as exc:
raise HTTPException(
status.HTTP_422_UNPROCESSABLE_CONTENT,
"The translation screen identifier is invalid.",
) from exc
except TranslationResourceVersionError as exc:
raise HTTPException(
status.HTTP_422_UNPROCESSABLE_CONTENT,
"Choose a translation resource version within the supported range.",
) from exc
except TranslationResourceNotFound as exc:
raise HTTPException(
status.HTTP_404_NOT_FOUND,
"This screen version is not available. Refresh and try the latest version.",
) from exc
except TranslationCoverageError as exc:
raise HTTPException(
status.HTTP_409_CONFLICT,
"This screen is not yet available in the selected language. Choose another language.",
) from exc
return {
"screen_key": screen.screen_key,
"resource_version": screen.resource_version,
"locale": screen.locale,
"translations": dict(screen.translations),
}

@app.patch("/api/settings", response_model=dict)
async def update_tenant_settings(
payload: dict,
Expand Down
Loading
Loading