Skip to content
Merged
Show file tree
Hide file tree
Changes from 12 commits
Commits
Show all changes
156 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
106bc00
feat: add evidence-honest Global Ask knowledge cutoff (v2.23.0)
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
d1dcaca
fix: match Global Ask cutoff candidates on retained revisions
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
30182c1
merge: restack onto feat/event-lineage-node-keeps-gnb-focus-v2170
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
f6a02bc
Merge current event-lineage base into knowledge-cutoff feature
seonghobae Aug 20, 2026
76a8b92
fix: keep ADR numbers unique after restack
seonghobae Aug 20, 2026
7422282
Merge current event-lineage base into knowledge-cutoff feature
seonghobae Aug 20, 2026
bb009da
docs: assign unique ADR number to Valkey operation decision
seonghobae Aug 20, 2026
29d80b8
merge: propagate current protected Event Lineage base
seonghobae Aug 20, 2026
1a25993
merge: propagate current Event Lineage branch head
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
59ccdf9
merge: propagate current semantic-source knowledge-cutoff base
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
7203115
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
7a5fc4b
Merge remote-tracking branch 'origin/feat/event-lineage-node-keeps-gn…
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
d51093c
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
7b43227
fix: scope ticket mutations to owning post
seonghobae Aug 21, 2026
df5c36e
Merge remote-tracking branch 'origin/feat/event-lineage-node-keeps-gn…
seonghobae Aug 21, 2026
7751925
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
13a1f2e
chore: restack knowledge cutoff on current project history parent
seonghobae Aug 21, 2026
7512c0e
fix: keep incomplete cutoff events in global ask timeline
seonghobae Aug 21, 2026
bdef29a
fix: enforce cutoff and ticket authorization boundaries
seonghobae Aug 21, 2026
9eb0888
chore: restack knowledge cutoff on current parent
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 AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,11 @@ invent a cited post.
A linked Event Lineage node opened from that focused popup keeps the
originating flags (ADR 0097). Do not invent a cited post.

Ask Agent accepts an optional knowledge cutoff (ADR 0101). A dated
question uses retained revisions and never substitutes a live body. A
live query is never labeled as-of. Do not invent a cutoff body or a
TEPP theta.


## Tests

Expand Down
4 changes: 3 additions & 1 deletion ARCHITECTURE.md
Original file line number Diff line number Diff line change
Expand Up @@ -286,7 +286,9 @@ Calendar commitments use the same Event Lineage focus path (ADR 0094),
Customer master related posts use the same Event Lineage focus path
(ADR 0095). Ask Agent cited posts use the same Event Lineage focus path
(ADR 0096). A linked Event Lineage node opened from a focused popup keeps
those flags (ADR 0097), and the full detail popup includes Korean
those flags (ADR 0097). Ask Agent accepts an optional knowledge cutoff
and uses retained `source_post_revision` bodies for that clock (ADR 0101);
a live query is never labeled as-of. The full detail popup includes Korean
summary/key-events/R&R, VOC evidence excerpts, an Event Lineage panel
(direct vs. indirect links; a link opens that post), the Keyman
affiliate tree (resolved ancestors plus unresolved org roots), Keyman +
Expand Down
6 changes: 6 additions & 0 deletions CHANGELOG.d/2.23.0-global-ask-knowledge-cutoff.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# 2.23.0 Global Ask knowledge cutoff

Ask Agent can name a dated question. Retrieval keeps only source posts
that existed by that clock and matches the covering
`source_post_revision` text. A missing historical body is an explicit
limitation. Live queries stay live-only.
10 changes: 10 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,16 @@ All notable changes to this project are documented here. Format follows
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versioning follows
[Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [2.23.0] - 2026-08-20

### Added

- Ask Agent now accepts an optional knowledge cutoff. A dated question
matches retained source-post revisions from that clock and never
substitutes a live body or live rewrite text. Fully, partly, and
live-only answers are named separately. No TEPP theta is invented. No
as-of label is applied to a live query (ADR 0101 / ADR 0016 / ADR 0025).

## [2.17.0] - 2026-08-19

### Added
Expand Down
8 changes: 8 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -105,3 +105,11 @@ cited post.
From a GNB-focused popup, open a linked Event Lineage node: Event Lineage
stays focused and names the new post as current (ADR 0097). A home-list
DAG walk does not. Do not invent a theta.

## Ask Agent knowledge cutoff (v2.23.0)

Open Ask Agent. Optionally set a knowledge cutoff. A dated question uses
retained source-post revisions from that clock. A live query stays
live-only and is never labeled as-of. A missing historical body is named
and the live rewrite is not used (ADR 0101). Do not invent a theta or a
cutoff body.
46 changes: 36 additions & 10 deletions backend/app/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,8 +73,12 @@
ChatSourceDocument,
ContextualOrchestratorPostChatClient,
NullPostChatClient,
ask_grounding_status,
ask_next_action,
cited_post_citations,
cited_post_evidence,
cited_post_summaries,
historical_body_limitations,
render_global_ask_context,
)
from lineageweave.post_content_normalization import normalize_post_body
Expand Down Expand Up @@ -2533,6 +2537,7 @@ class GlobalAskRequest(BaseModel):

question: str
session_id: str | None = None
knowledge_cutoff: str | None = None


def global_ask_timeline(sources: list[ChatSourceDocument]) -> list[dict[str, str | None]]:
Expand Down Expand Up @@ -2663,6 +2668,15 @@ async def ask_agent(
UUID(request.session_id)
except ValueError:
raise HTTPException(status.HTTP_404_NOT_FOUND, "Global Ask session not found") from None
knowledge_cutoff = None
if request.knowledge_cutoff is not None and request.knowledge_cutoff.strip():
try:
knowledge_cutoff = parse_as_of_clock(request.knowledge_cutoff)
except ValueError as exc:
raise HTTPException(
status.HTTP_422_UNPROCESSABLE_ENTITY,
"knowledge_cutoff must be an ISO-8601 timestamp",
) from exc
client = _post_chat_client()
if not client.available:
raise HTTPException(
Expand All @@ -2681,6 +2695,7 @@ async def ask_agent(
lambda row: _can_see_post(account, row),
account.corporate_entity_ids,
question=question,
knowledge_cutoff=knowledge_cutoff,
)
if conversation.compress_turns:
compressor = getattr(client, "compress_context", None)
Expand Down Expand Up @@ -2712,7 +2727,11 @@ async def ask_agent(
conversation.summary,
conversation.recent_turns,
)
if not sources:
grounding_status = ask_grounding_status(sources, knowledge_cutoff)
limitations = historical_body_limitations(sources)
cutoff_text = knowledge_cutoff.isoformat() if knowledge_cutoff is not None else None
llm_sources = [source for source in sources if not source.historical_body_unavailable]
if not llm_sources:
async with pool.acquire() as conn:
await persist_global_ask_turn(conn, conversation.session_id, question, "", ())
await publish_operation_event(
Expand All @@ -2725,17 +2744,20 @@ async def ask_agent(
"session_id": conversation.session_id,
"answer_text": "",
"cited_post_ids": [],
"cited_posts": [],
"source_post_ids": [],
"cited_posts": cited_post_citations(sources, [source.post_id for source in sources]),
"source_post_ids": [source.post_id for source in sources],
"cited_post_evidence": [],
"timeline": [],
"next_action": "No authorized source posts are available for this question.",
"timeline": global_ask_timeline(sources),
"knowledge_cutoff": cutoff_text,
"grounding_status": grounding_status,
"limitations": limitations,
"next_action": ask_next_action(grounding_status, has_sources=bool(sources)),
Comment thread
devin-ai-integration[bot] marked this conversation as resolved.
Resolved

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📝 Info: No-answer Ask path now returns all sources as cited posts

The empty-llm_sources branch now populates cited_posts, source_post_ids, and timeline from all sources rather than empty lists, so a cutoff query with only unavailable historical bodies renders cited posts under an empty answer. Appears intentional per the timeline commit; the frontend renders each with the "historical body unavailable" note.

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

}
try:
answer = await asyncio.to_thread(
client.answer,
question,
sources,
llm_sources,
conversation_context=conversation_context,
)
except (HttpClientError, KeyError, OSError, ValueError) as exc:
Expand All @@ -2762,10 +2784,14 @@ async def ask_agent(
"session_id": conversation.session_id,
"answer_text": answer.answer_text,
"cited_post_ids": cited_ids,
"cited_posts": cited_post_summaries(sources, cited_ids),
"cited_post_evidence": cited_post_evidence(sources, cited_ids),
"source_post_ids": [source.post_id for source in sources],
"timeline": global_ask_timeline(sources),
"cited_posts": cited_post_citations(llm_sources, cited_ids),
"cited_post_evidence": cited_post_evidence(llm_sources, cited_ids),
"source_post_ids": [source.post_id for source in llm_sources],
"timeline": global_ask_timeline(llm_sources),
"knowledge_cutoff": cutoff_text,
"grounding_status": grounding_status,
"limitations": limitations,
"next_action": ask_next_action(grounding_status, has_sources=True),
Comment thread
devin-ai-integration[bot] marked this conversation as resolved.
Resolved
}


Expand Down
Loading
Loading