Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
141 commits
Select commit Hold shift + click to select a range
ce4663c
feat: name Weekly VOC and focus Event Lineage (v2.13.0)
seonghobae Aug 19, 2026
03a1167
feat: open Calendar commitments onto Event Lineage (v2.14.0)
seonghobae Aug 19, 2026
d25eeda
feat: open Customer master related posts onto Event Lineage (v2.15.0)
seonghobae Aug 19, 2026
0aaf992
feat: open Ask Agent cited posts onto Event Lineage (v2.16.0)
seonghobae Aug 19, 2026
3e5bfca
feat: keep GNB Event Lineage focus on a linked DAG node (v2.17.0)
seonghobae Aug 19, 2026
8966294
ci: repair analysis-run DAG cutoff context
seonghobae Aug 19, 2026
943ab63
ci: run buyer-surface cutoff repair test-first
seonghobae Aug 19, 2026
8e5be3e
ci: cover direct and DAG cutoff navigation
seonghobae Aug 19, 2026
3f4c41e
ci: restore canonical tests workflow
seonghobae Aug 19, 2026
4b80c87
ci: remove temporary cutoff repair workflow
seonghobae Aug 19, 2026
c96fa28
ci: repair analysis-run DAG cutoff context
seonghobae Aug 19, 2026
c23b81a
ci: repair analysis-run cutoff navigation
seonghobae Aug 19, 2026
b78b8c5
chore: remove one-shot repair workflow
seonghobae Aug 19, 2026
be0a544
chore: remove duplicate cutoff repair workflow
seonghobae Aug 19, 2026
aad290b
ci: execute PR 264 cutoff repair
seonghobae Aug 19, 2026
8cf3491
ci: run PR 264 cutoff repair on branch push
seonghobae Aug 19, 2026
4e4dae5
ci: repair ontology-grounded semantic paths on PR 264
seonghobae Aug 19, 2026
1b73e66
ci: run cutoff repair through canonical tests workflow
seonghobae Aug 19, 2026
796af57
ci: stage deterministic PR 264 cutoff repair
seonghobae Aug 19, 2026
a409895
ci: execute deterministic cutoff repair
seonghobae Aug 19, 2026
821432a
fix(ui): preserve analysis-run cutoff across DAG navigation
github-actions[bot] Aug 19, 2026
c616a4a
ci: guard PR 264 against the unrelated ontology writer
seonghobae Aug 19, 2026
f74377f
ci: restore canonical PR 264 verification
seonghobae Aug 19, 2026
3e37f02
ci: add direct ontology semantic-path repair
seonghobae Aug 19, 2026
f010d9b
ci: remove completed cutoff repair helper
seonghobae Aug 19, 2026
6cf7f3b
ci: replace stale semantic repair workflow
seonghobae Aug 19, 2026
f68b8d7
ci: execute ontology semantic-path repair
seonghobae Aug 19, 2026
af9d25a
test: stage ontology semantic-path repair
seonghobae Aug 19, 2026
06a5b37
ci: run test-first ontology semantic-path repair
seonghobae Aug 19, 2026
8431998
ci: move semantic-path repair out of PR 264
seonghobae Aug 19, 2026
4e601f6
ci: remove relocated semantic-path repair helper
seonghobae Aug 19, 2026
757757b
ci: consolidate PR 264 Knowledge Graph semantic repair
seonghobae Aug 19, 2026
2234fc7
ci: keep semantic repair exact-head safe
seonghobae Aug 19, 2026
0664679
test: align semantic repair fixtures with production schema
seonghobae Aug 19, 2026
4c3e99a
chore: stage project-history RED-GREEN payload (1/4)
seonghobae Aug 20, 2026
7bb9a36
chore: stage project-history RED-GREEN payload (2/4)
seonghobae Aug 20, 2026
0814949
chore: stage project-history RED-GREEN payload (3/4)
seonghobae Aug 20, 2026
ad1d5fa
chore: stage project-history RED-GREEN payload (4/4)
seonghobae Aug 20, 2026
c75f37b
chore: run project-history RED-GREEN verification
seonghobae Aug 20, 2026
c910478
feat: name Weekly VOC and focus Event Lineage (v2.13.0)
seonghobae Aug 19, 2026
85db4e1
fix: reject impossible Weekly VOC dates
seonghobae Aug 20, 2026
8daa419
feat: open Calendar commitments onto Event Lineage (v2.14.0)
seonghobae Aug 19, 2026
156a507
fix: stop auto-drilled Keyman panel from stealing Event Lineage focus
seonghobae Aug 20, 2026
5267614
fix: keep Calendar scroll with Event Lineage
seonghobae Aug 20, 2026
dc00316
feat: open Customer master related posts onto Event Lineage (v2.15.0)
seonghobae Aug 19, 2026
15c82c7
test: keep customer master router specific
seonghobae Aug 20, 2026
8fb0fea
feat: open Ask Agent cited posts onto Event Lineage (v2.16.0)
seonghobae Aug 19, 2026
7f36683
feat: keep GNB Event Lineage focus on a linked DAG node (v2.17.0)
seonghobae Aug 19, 2026
a731551
fix(ui): preserve analysis-run cutoff across DAG navigation
seonghobae Aug 20, 2026
4d6494d
fix: ignore stale post detail responses
seonghobae Aug 20, 2026
860d07b
ci: make project-history repair observable on the stacked PR
seonghobae Aug 20, 2026
176dc74
merge: restack project lifecycle on current PR 264
seonghobae Aug 20, 2026
219acfb
feat: name Weekly VOC and focus Event Lineage (v2.13.0)
seonghobae Aug 19, 2026
4fc6e7c
fix: reject impossible Weekly VOC dates
seonghobae Aug 20, 2026
ba3a62a
feat: open Calendar commitments onto Event Lineage (v2.14.0)
seonghobae Aug 19, 2026
fda93f3
fix: stop auto-drilled Keyman panel from stealing Event Lineage focus
seonghobae Aug 20, 2026
9aac2b7
fix: keep Calendar scroll with Event Lineage
seonghobae Aug 20, 2026
acb56ab
feat: open Customer master related posts onto Event Lineage (v2.15.0)
seonghobae Aug 19, 2026
159627c
test: keep customer master router specific
seonghobae Aug 20, 2026
59963dc
feat: open Ask Agent cited posts onto Event Lineage (v2.16.0)
seonghobae Aug 19, 2026
d104a88
feat: keep GNB Event Lineage focus on a linked DAG node (v2.17.0)
seonghobae Aug 19, 2026
cd793b9
fix(ui): preserve analysis-run cutoff across DAG navigation
seonghobae Aug 20, 2026
e85b0d2
fix: ignore stale post detail responses
seonghobae Aug 20, 2026
fc1bcbc
feat: name Weekly VOC and focus Event Lineage (v2.13.0)
seonghobae Aug 19, 2026
31b0dea
fix: reject impossible Weekly VOC dates
seonghobae Aug 20, 2026
621e0e3
feat: open Calendar commitments onto Event Lineage (v2.14.0)
seonghobae Aug 19, 2026
02e06e9
fix: stop auto-drilled Keyman panel from stealing Event Lineage focus
seonghobae Aug 20, 2026
88c6ae5
fix: keep Calendar scroll with Event Lineage
seonghobae Aug 20, 2026
c52cdcc
feat: open Customer master related posts onto Event Lineage (v2.15.0)
seonghobae Aug 19, 2026
41c0161
test: keep customer master router specific
seonghobae Aug 20, 2026
f5021b1
feat: open Ask Agent cited posts onto Event Lineage (v2.16.0)
seonghobae Aug 19, 2026
04c043e
feat: keep GNB Event Lineage focus on a linked DAG node (v2.17.0)
seonghobae Aug 19, 2026
338d8f8
fix(ui): preserve analysis-run cutoff across DAG navigation
seonghobae Aug 20, 2026
7bd992d
fix: ignore stale post detail responses
seonghobae Aug 20, 2026
dfcd442
merge: restack project lifecycle on latest PR 264
seonghobae Aug 20, 2026
1d3f87b
merge: restack project lifecycle on production PR 264 head
seonghobae Aug 20, 2026
287e630
feat: name Weekly VOC and focus Event Lineage (v2.13.0)
seonghobae Aug 19, 2026
e854c93
fix: reject impossible Weekly VOC dates
seonghobae Aug 20, 2026
a5c948d
feat: open Calendar commitments onto Event Lineage (v2.14.0)
seonghobae Aug 19, 2026
f007b80
fix: stop auto-drilled Keyman panel from stealing Event Lineage focus
seonghobae Aug 20, 2026
fc39af1
fix: keep Calendar scroll with Event Lineage
seonghobae Aug 20, 2026
527661b
feat: open Customer master related posts onto Event Lineage (v2.15.0)
seonghobae Aug 19, 2026
2114cc5
test: keep customer master router specific
seonghobae Aug 20, 2026
b2340c6
feat: open Ask Agent cited posts onto Event Lineage (v2.16.0)
seonghobae Aug 19, 2026
f6a61ac
feat: keep GNB Event Lineage focus on a linked DAG node (v2.17.0)
seonghobae Aug 19, 2026
58d5eeb
fix(ui): preserve analysis-run cutoff across DAG navigation
seonghobae Aug 20, 2026
e829ac9
fix: ignore stale post detail responses
seonghobae Aug 20, 2026
d8bd836
merge: restack project lifecycle on exact PR 264 head
seonghobae Aug 20, 2026
6044965
chore: restack project history on current Event Lineage head
seonghobae Aug 20, 2026
3a1f025
ci: pin project history to the live parent head
seonghobae Aug 20, 2026
2c957e7
test(projects): define evidence-bound project history contract
seonghobae Aug 20, 2026
ec840ba
chore(projects): remove cancelled one-shot project-history workflow
seonghobae Aug 20, 2026
5477377
chore(projects): remove cancelled project-history payload part 1
seonghobae Aug 20, 2026
3760e72
chore(projects): remove cancelled project-history payload part 2
seonghobae Aug 20, 2026
fc7d138
test(ui): define accessible project-history timeline contract
seonghobae Aug 20, 2026
32084a4
test(projects): classify every visible VOC record
seonghobae Aug 20, 2026
ef4bd59
feat(projects): port evidence-bound history core for RED repair
seonghobae Aug 20, 2026
aa76282
fix(projects): keep lifecycle projection evidence-bound
seonghobae Aug 20, 2026
105d098
fix(ui): keep project-history selection and tab semantics current
seonghobae Aug 20, 2026
4f2d4ad
fix(ui): make project-history evidence and time semantics explicit
seonghobae Aug 20, 2026
4cae152
Merge commit 'b065fb80b05ef37c550c5983e4606825e64e0842' into HEAD
seonghobae Aug 20, 2026
95a8ac5
Merge remote-tracking branch 'origin/feat/event-lineage-node-keeps-gn…
seonghobae Aug 20, 2026
4e3e2f9
Merge remote-tracking branch 'origin/feat/event-lineage-node-keeps-gn…
seonghobae Aug 20, 2026
093b816
Merge remote-tracking branch 'origin/feat/event-lineage-node-keeps-gn…
seonghobae Aug 20, 2026
bb009da
docs: assign unique ADR number to Valkey operation decision
seonghobae Aug 20, 2026
8febf13
merge: retain concurrent project-history updates
seonghobae Aug 20, 2026
93537f8
merge: propagate current Event Lineage branch head
seonghobae Aug 20, 2026
76af029
merge: propagate current semantic-source Event Lineage base
seonghobae Aug 20, 2026
4eaeb23
ci: export exact project history source for local verification
seonghobae Aug 20, 2026
b77bea4
ci: move source export off the saturated Linux queue
seonghobae Aug 20, 2026
654faa3
test(projects): expose truth and identity boundary gaps
seonghobae Aug 20, 2026
eac418a
fix(projects): preserve identity and evidence truth boundaries
seonghobae Aug 20, 2026
7c9e2b2
fix(projects): enforce exact identity and evidence truth at the read …
seonghobae Aug 20, 2026
13b869e
fix(projects): render observed and inferred responsibility evidence h…
seonghobae Aug 20, 2026
cbb959c
fix(projects): expose per-evidence truth in the timeline
seonghobae Aug 20, 2026
c7f49af
feat(projects): wire authorized history into buyer surfaces
seonghobae Aug 20, 2026
de07aad
test(projects): distinguish observed and inferred responsibility evid…
seonghobae Aug 20, 2026
ba1de00
docs(storybook): show project-history truth states
seonghobae Aug 20, 2026
9a4ca86
merge: retain concurrent project-history truth fixes
seonghobae Aug 20, 2026
6004a7a
fix(projects): keep timeline compatible with persisted evidence
seonghobae Aug 20, 2026
367c40a
Merge remote-tracking branch 'origin/pr-285-head' into codex/integrat…
seonghobae Aug 20, 2026
0a76b25
fix(projects): focus timeline on opened source post
seonghobae Aug 20, 2026
30dae74
fix(project-history): preserve exact identity and isolate matches
seonghobae Aug 20, 2026
5d0e412
docs: refresh project gap exact-head checkpoint
seonghobae Aug 20, 2026
d925f53
Merge remote-tracking branch 'origin/feat/event-lineage-node-keeps-gn…
seonghobae Aug 20, 2026
c264674
Merge remote-tracking branch 'origin/feat/project-lifecycle-history' …
seonghobae Aug 20, 2026
c92c5d1
chore: remove completed project history bootstrap
seonghobae Aug 20, 2026
cfc125c
chore: align project history release version
seonghobae Aug 20, 2026
9bfa181
Merge remote-tracking branch 'origin/feat/event-lineage-node-keeps-gn…
seonghobae Aug 21, 2026
68ca6cb
Merge remote-tracking branch 'origin/feat/event-lineage-node-keeps-gn…
seonghobae Aug 21, 2026
0c8e8d0
fix: preserve project history evidence truth in buyer UI
seonghobae Aug 21, 2026
f754c36
Merge remote-tracking branch 'refs/remotes/origin/feat/event-lineage-…
seonghobae Aug 21, 2026
6a35ca8
fix: bound and explain project history loading
seonghobae Aug 21, 2026
f365821
Merge remote-tracking branch 'refs/remotes/origin/feat/project-histor…
seonghobae Aug 21, 2026
12f92e9
Merge remote-tracking branch 'refs/remotes/origin/feat/event-lineage-…
seonghobae Aug 21, 2026
ccaeaa1
test: align project history document clock copy
seonghobae Aug 21, 2026
df5c36e
Merge remote-tracking branch 'origin/feat/event-lineage-node-keeps-gn…
seonghobae Aug 21, 2026
326f7ea
chore: restack project history on current parent
seonghobae Aug 21, 2026
4f36013
fix: preserve project history focus across key normalization
seonghobae Aug 21, 2026
a8f56d0
feat: recover TEPP validation on canonical Project history (v2.19.0) …
seonghobae Aug 21, 2026
073e5e2
Merge base event-lineage stack into project history
seonghobae Aug 21, 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
5 changes: 5 additions & 0 deletions CHANGELOG.d/2.20.0-global-ask-cutoff-safety.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
### Fixed

- Bind the Global Ask knowledge cutoff in the final authorized-source query.
- Give the post-chat cutoff migration a unique `0054` identity and remove
self-modifying stabilization workflows.
26 changes: 23 additions & 3 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,29 @@ All notable changes to this project are documented here. Format follows
and commitment-derived ticket writes enforce the owning-post authorization
boundary before provider work.

## [2.20.0] - 2026-08-21

### Added

- Post-scoped Ask and Global Ask now attach exact project-history links derived
only from currently authorized cited posts. Opening a link reuses the canonical
Project history timeline and its optional TEPP validation at the answer cutoff.

### Security

- Persisted post answers are withheld when any citation is no longer visible, and
stale Global Ask sessions are restarted before hidden prior prose can re-enter
conversation context (ADR 0113).

## [2.19.0] - 2026-08-21

### Added

- Recovered the credential-free TEPP project-history validation boundary on top of
the canonical Buyer timeline. TEPP may return only cutoff-safe temporal
associations over the exact authorized events; the timeline remains readable
when TEPP is absent, and no result is labelled as a cause (ADR 0127).

## [2.18.0] - 2026-08-20

### Added
Expand All @@ -28,8 +51,6 @@ All notable changes to this project are documented here. Format follows
bounded, authorized exact-project chronology. The release remains pending
protected-main review and Checks (ADR 0111).

## [2.19.0] - 2026-08-20

### Added

- Opening a Board Weekly VOC post, Calendar commitment, Customer master
Expand All @@ -39,7 +60,6 @@ All notable changes to this project are documented here. Format follows
does not add that focus or copy. No TEPP theta is invented. No cited
post, customer, week, or cutoff body is invented (ADR 0100 / ADR 0097
/ ADR 0016).

## [2.17.0] - 2026-08-19

### Added
Expand Down
44 changes: 20 additions & 24 deletions backend/app/analysis_run_start.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@

import hashlib
import json
from datetime import datetime, timezone
from datetime import UTC, datetime
from typing import Any
from uuid import UUID

Expand All @@ -21,13 +21,13 @@
AnalysisRunCreateError,
fetch_visible_analysis_run,
)
from backend.app.post_eligibility import SOURCE_POST_ELIGIBILITY_SQL
from backend.app.analysis_run_outbox import (
latest_outbox_delivery_is_claimed,
latest_outbox_delivery_is_delivered,
outbox_request_digest,
)
from backend.app.lineage_ingestion import records_from_source_posts
from backend.app.post_eligibility import SOURCE_POST_ELIGIBILITY_SQL
from lineageweave.adjudication_client import AdjudicationClient
from lineageweave.http_client import HttpClientError, post_json
from lineageweave.lineage_persistence import lineage_edge_specs
Expand Down Expand Up @@ -119,12 +119,12 @@ def tepp_run_request(
"""Build TEPP's published request from the frozen run, never a theta."""
cutoff = knowledge_cutoff
if cutoff.tzinfo is None:
cutoff = cutoff.replace(tzinfo=timezone.utc)
cutoff = cutoff.replace(tzinfo=UTC)
return AnalysisRunRequest(
idempotency_key=idempotency_key,
tenant_workspace_id=str(corporate_entity_id),
snapshot_id=snapshot_sha256,
knowledge_cutoff=cutoff.astimezone(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ"),
knowledge_cutoff=cutoff.astimezone(UTC).strftime("%Y-%m-%dT%H:%M:%SZ"),
model_contract_version=_TEPP_MODEL_CONTRACT,
output_profile=_TEPP_OUTPUT_PROFILE,
)
Expand Down Expand Up @@ -610,7 +610,7 @@ async def deliver_queued_analysis_run(
return await _visible_or_404(
conn, analysis_run_id, account_id, affiliated_entity_ids
)
now = datetime.now(timezone.utc)
now = datetime.now(UTC)
try:
if not latest_outbox_delivery_is_claimed(latest):
await _append_outbox_delivery(
Expand All @@ -636,9 +636,8 @@ async def deliver_queued_analysis_run(
affiliated_entity_ids=affiliated_entity_ids,
adjudication_client=adjudication_client,
)
finished = datetime.now(timezone.utc)
if finished < now:
finished = now
finished = datetime.now(UTC)
finished = max(finished, now)
await _append_outbox_delivery(
conn,
analysis_run_id,
Expand Down Expand Up @@ -699,7 +698,7 @@ async def _deliver_lineage_reconstruction(
adjudication_client: AdjudicationClient | None = None,
) -> None:
"""Persist ThreadWeave parent choices for the frozen bag."""
now = datetime.now(timezone.utc)
now = datetime.now(UTC)
member_rows = await _snapshot_member_posts(
conn,
locked["analysis_source_snapshot_id"],
Expand All @@ -715,9 +714,8 @@ async def _deliver_lineage_reconstruction(
)
edges = lineage_edge_specs(records_from_source_posts(rows), llm=adjudication_client)
digest = reconstruction_result_digest(edges)
finished = datetime.now(timezone.utc)
if finished < now:
finished = now
finished = datetime.now(UTC)
finished = max(finished, now)
await conn.execute(
"""
insert into analysis_run_reconstruction
Expand Down Expand Up @@ -759,25 +757,23 @@ async def _deliver_tepp_measurement(
tepp_client: TeppClient,
) -> None:
"""Submit the frozen snapshot through ``tepp_client``. Never persist a theta."""
now = datetime.now(timezone.utc)
now = datetime.now(UTC)
request = tepp_run_request(
idempotency_key=str(locked["idempotency_key"]),
snapshot_sha256=str(locked["snapshot_sha256"]),
knowledge_cutoff=locked["knowledge_cutoff"],
corporate_entity_id=str(locked["corporate_entity_id"]),
)
status_code, failure_code, envelope = _tepp_submission(tepp_client, request)
if status_code == _SUCCEEDED and envelope is not None:
if not await _persist_tepp_result(
conn,
analysis_run_id=analysis_run_id,
envelope=envelope,
):
status_code = _FAILED
failure_code = "tepp_result_not_persisted"
finished = datetime.now(timezone.utc)
if finished < now:
finished = now
if status_code == _SUCCEEDED and envelope is not None and not await _persist_tepp_result(
conn,
analysis_run_id=analysis_run_id,
envelope=envelope,
):
status_code = _FAILED
failure_code = "tepp_result_not_persisted"
finished = datetime.now(UTC)
finished = max(finished, now)
await _append_status(
conn,
analysis_run_id,
Expand Down
Loading
Loading