Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
122 commits
Select commit Hold shift + click to select a range
09a9ca1
fix: preserve oidc deep links across callback storage
seonghobae Aug 20, 2026
e02cb11
fix: render buyer-facing image evidence
seonghobae Aug 20, 2026
b0edd9b
fix: label unavailable image evidence
seonghobae Aug 20, 2026
f7d11e3
docs: avoid oidc adr number collision
seonghobae Aug 20, 2026
116a8dc
Merge remote-tracking branch 'origin/fix/oidc-deep-link-locale' into …
seonghobae Aug 20, 2026
5deb067
docs: avoid buyer image adr number collision
seonghobae Aug 20, 2026
cd6301b
fix: bind summary actions to source-grounded projects
seonghobae Aug 20, 2026
3efdff3
test: cover project-bound summary action round trip
seonghobae Aug 20, 2026
1e5ac11
docs: record buyer gap checkpoint evidence
seonghobae Aug 20, 2026
313d38a
docs: align image evidence ADR heading
seonghobae Aug 20, 2026
e0dbc38
docs: align OIDC ADR heading
seonghobae Aug 20, 2026
4d1736e
fix: preserve legacy action evidence delimiters
seonghobae Aug 20, 2026
c01001d
Merge branch 'fix/project-bound-summary-actions' of https://github.co…
seonghobae Aug 20, 2026
e81aff8
docs: refresh buyer gap audit checkpoint
seonghobae Aug 20, 2026
d442287
docs: record current project action head
seonghobae Aug 20, 2026
0eb70c9
feat: bind summary events to source-grounded projects
seonghobae Aug 20, 2026
60b52f2
Merge remote-tracking branch 'origin/fix/project-bound-summary-action…
seonghobae Aug 20, 2026
a49b315
docs: record full checkpoint verification
seonghobae Aug 20, 2026
8220673
fix(summary): normalize project keys before persistence
seonghobae Aug 20, 2026
3c74f1f
Merge commit 'a49b315e6e0ad3c2369d56a77fa6fd50d2230a0a' into codex/fi…
seonghobae Aug 20, 2026
bd4e96b
docs: refresh exact-head buyer gap audit
seonghobae Aug 20, 2026
42e6230
test(summary): cover project key sentinel normalization
seonghobae Aug 20, 2026
a4d1de5
test(image): cover source placement and OCR rendering
seonghobae Aug 20, 2026
d8b7f56
fix: preserve stale summary buyer continuity
seonghobae Aug 20, 2026
2218ee7
fix: keep post content recovery alive
seonghobae Aug 20, 2026
b7ed772
test(summary): cover stale continuity and retry
seonghobae Aug 20, 2026
c914f76
feat: add explicit post content retry
seonghobae Aug 20, 2026
bff4c9d
test(queue): cover explicit retry rejection
seonghobae Aug 20, 2026
ba60842
docs(queue): complete retry command docstrings
seonghobae Aug 20, 2026
c301e2e
fix: reconcile backfill content with job ledger
seonghobae Aug 20, 2026
4016e2b
fix(ui): preserve indentation after mixed content
seonghobae Aug 20, 2026
20b9177
Merge remote-tracking branch 'origin/fix/stale-summary-buyer-continui…
seonghobae Aug 20, 2026
e219e48
docs: record post content recovery evidence
seonghobae Aug 20, 2026
8b0e1d8
docs(ui): clarify indentation matching boundary
seonghobae Aug 20, 2026
5873966
test(ui): cover missing source unit fallback
seonghobae Aug 20, 2026
4bc21e4
fix: serialize per-post vision region analysis
seonghobae Aug 20, 2026
69b96e9
Merge remote-tracking branch 'origin/fix/stale-summary-buyer-continui…
seonghobae Aug 20, 2026
d4807f0
fix(ui): preserve adjacent table boundaries
seonghobae Aug 20, 2026
d9b4b51
fix: preserve honest image evidence rendering
seonghobae Aug 20, 2026
cea0e7b
fix: separate source whitespace from explicit structure
seonghobae Aug 20, 2026
9f7574f
docs: record source indentation buyer gap
seonghobae Aug 20, 2026
f13bc3f
feat: enrich semantic hints from source catalogs
seonghobae Aug 20, 2026
adbb72d
fix: reject non-decomposed vision regions
seonghobae Aug 20, 2026
766b742
docs: refresh protected gate baseline
seonghobae Aug 20, 2026
4d3d7ae
docs: record corrected image region evidence
seonghobae Aug 20, 2026
85dbfb5
fix: trim source catalog lookup codes
seonghobae Aug 20, 2026
efd4aab
docs: record catalog hint boundary
seonghobae Aug 20, 2026
deca246
docs: record exact-head validation evidence
seonghobae Aug 20, 2026
82b7b39
docs: record live browser acceptance
seonghobae Aug 20, 2026
69b8909
docs: refresh live gate topology
seonghobae Aug 20, 2026
f922322
Merge remote-tracking branch 'origin/feat/analysis-run-name-evidence-…
seonghobae Aug 20, 2026
49d85d0
Merge remote-tracking branch 'origin/fix/oidc-deep-link-locale' into …
seonghobae Aug 20, 2026
40c9168
Merge remote-tracking branch 'origin/fix/buyer-image-evidence' into c…
seonghobae Aug 20, 2026
fc7969e
Merge remote-tracking branch 'origin/feat/analysis-run-name-evidence-…
seonghobae Aug 20, 2026
516603c
Merge remote-tracking branch 'origin/fix/oidc-deep-link-locale' into …
seonghobae Aug 20, 2026
3072e01
Merge remote-tracking branch 'origin/fix/buyer-image-evidence' into c…
seonghobae Aug 20, 2026
a903fff
Merge remote-tracking branch 'origin/fix/project-bound-summary-action…
seonghobae Aug 20, 2026
d36e106
Merge remote-tracking branch 'origin/fix/stale-summary-buyer-continui…
seonghobae Aug 20, 2026
ca3f56a
Merge remote-tracking branch 'origin/codex/fix-mixed-body-indentation…
seonghobae Aug 20, 2026
e84994e
Merge remote-tracking branch 'origin/codex/post-structure-case-fixes'…
seonghobae Aug 20, 2026
ab27898
fix: refresh content after summary ingestion
seonghobae Aug 20, 2026
e14dd95
test: cover lineage graph interactions
seonghobae Aug 20, 2026
2d7f899
fix: bound OIDC return state parsing
seonghobae Aug 20, 2026
3a32312
Merge remote-tracking branch 'origin/feat/analysis-run-name-evidence-…
seonghobae Aug 20, 2026
e5ee5db
Merge remote-tracking branch 'origin/fix/oidc-deep-link-locale' into …
seonghobae Aug 20, 2026
9e17c2a
fix: validate buyer image sources at render boundary
seonghobae Aug 20, 2026
1fa42f8
Merge remote-tracking branch 'origin/fix/buyer-image-evidence' into c…
seonghobae Aug 20, 2026
446abeb
Merge remote-tracking branch 'origin/fix/project-bound-summary-action…
seonghobae Aug 20, 2026
36a879b
Merge remote-tracking branch 'origin/fix/stale-summary-buyer-continui…
seonghobae Aug 20, 2026
bb9c78e
Merge remote-tracking branch 'origin/codex/fix-mixed-body-indentation…
seonghobae Aug 20, 2026
1e762d5
Merge remote-tracking branch 'origin/codex/post-structure-case-fixes'…
seonghobae Aug 20, 2026
9a45941
fix: expose unexpected content channel defects
seonghobae Aug 20, 2026
0816d59
Merge remote-tracking branch 'origin/codex/normalize-source-indent-se…
seonghobae Aug 20, 2026
9e59b70
fix: expose recoverable content batch failures
seonghobae Aug 20, 2026
18fdaa9
Merge remote-tracking branch 'origin/codex/normalize-source-indent-se…
seonghobae Aug 20, 2026
17fa14f
test: define directional accessible lineage graph contract
seonghobae Aug 21, 2026
3ab6ba7
test: avoid duplicate lineage marker identities
seonghobae Aug 21, 2026
c5bbb52
feat: make event lineage direction and evidence explicit
seonghobae Aug 21, 2026
6be794a
fix: keep lineage graph legible across themes and widths
seonghobae Aug 21, 2026
89daa52
fix: expose lineage evidence by default
seonghobae Aug 21, 2026
d8b7eef
Merge remote-tracking branch 'origin/feat/analysis-run-name-evidence-…
seonghobae Aug 21, 2026
4e40e26
Merge remote-tracking branch 'origin/feat/analysis-run-name-evidence-…
seonghobae Aug 21, 2026
fbecd77
Merge remote-tracking branch 'origin/fix/oidc-deep-link-locale' into …
seonghobae Aug 21, 2026
46ca533
Merge remote-tracking branch 'origin/fix/buyer-image-evidence' into c…
seonghobae Aug 21, 2026
4f029ea
test: require accessible lineage graph regions
seonghobae Aug 21, 2026
63269e4
feat: make lineage graph structure accessible
seonghobae Aug 21, 2026
b32e177
style: add lineage graph interaction states
seonghobae Aug 21, 2026
a285256
docs: add lineage graph Storybook states
seonghobae Aug 21, 2026
c5fa8c2
docs: record lineage DAG evidence improvements
seonghobae Aug 21, 2026
17ff911
Merge remote-tracking branch 'origin/fix/project-bound-summary-action…
seonghobae Aug 21, 2026
efaef8a
test: keep lineage node controls exposed to assistive technology
seonghobae Aug 21, 2026
077509e
fix: expose lineage node controls outside image semantics
seonghobae Aug 21, 2026
1fb1626
docs: record buyer lineage DAG design boundary
seonghobae Aug 21, 2026
e38df62
Merge remote-tracking branch 'origin/fix/stale-summary-buyer-continui…
seonghobae Aug 21, 2026
1faed2f
Merge remote-tracking branch 'origin/codex/fix-mixed-body-indentation…
seonghobae Aug 21, 2026
e3f00ea
Merge remote-tracking branch 'origin/codex/post-structure-case-fixes'…
seonghobae Aug 21, 2026
cabe3bb
test: cover isolated roots and fused-score labeling
seonghobae Aug 21, 2026
d668267
fix: omit empty lineage evidence tables
seonghobae Aug 21, 2026
f80998b
docs: add isolated lineage Storybook state
seonghobae Aug 21, 2026
3f3ec01
Merge remote-tracking branch 'origin/codex/normalize-source-indent-se…
seonghobae Aug 21, 2026
c19d05e
docs: record Event Lineage Figma frame IDs
seonghobae Aug 21, 2026
a157220
test: require lineage meaning and legend disclosure
seonghobae Aug 21, 2026
2d595d0
test: require five-locale lineage meaning copy
seonghobae Aug 21, 2026
94dbfeb
feat: add localized lineage meaning copy
seonghobae Aug 21, 2026
5f12e91
feat: disclose lineage legend and inference boundary
seonghobae Aug 21, 2026
5d63e1c
style: add lineage legend and inference notice
seonghobae Aug 21, 2026
e04b128
docs: record lineage meaning and legend disclosure
seonghobae Aug 21, 2026
34a3603
test: require actionable lineage empty state and Space activation
seonghobae Aug 21, 2026
088b1d5
test: require localized lineage empty-state next action
seonghobae Aug 21, 2026
507d520
feat: localize actionable lineage empty state
seonghobae Aug 21, 2026
0db9bd7
feat: make the lineage empty state actionable
seonghobae Aug 21, 2026
c883483
docs: record actionable lineage empty state
seonghobae Aug 21, 2026
86e2134
test: require mobile evidence-card labels
seonghobae Aug 21, 2026
0b0cacd
feat: label mobile lineage evidence cards
seonghobae Aug 21, 2026
f9df5ea
fix: guard lineage dag layout against cycles
seonghobae Aug 21, 2026
f4563df
docs: plan forward-only fast stabilization
seonghobae Aug 21, 2026
0d7fd47
test: reproduce lineage date specificity defect
seonghobae Aug 21, 2026
6f4712d
fix: preserve muted lineage event-date styling
seonghobae Aug 21, 2026
1fad94f
Merge protected main into Event Lineage stack
seonghobae Aug 21, 2026
6c9f86d
Merge commit 'c135c41ba65e02a5598647adcfc978002f275673' into HEAD
seonghobae Aug 21, 2026
336730f
fix: keep unauthenticated admin controls gated
seonghobae Aug 21, 2026
0e63ba0
fix: align Event Lineage shell with UI UX guide (#350)
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
8 changes: 4 additions & 4 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ reimplementing them:
tree assembly (`reconstruct.py`'s `_walk`/`thread_messages` calls).
- [RankWeave](https://github.com/ContextualWisdomLab/RankWeave) for
multi-channel score fusion (`weighted_convex_fuse` in
`reconstruct.py`) and the buyer-facing Rankings port
`reconstruct.py`) and the reader-facing Rankings port
(`rankweave_client.py`) -- never invent a fused score or a theta.
- [TEPP](https://github.com/ContextualWisdomLab/TEPP)'s published wire
contract for calibrated measurement (`tepp_client.py`) -- never
Expand Down Expand Up @@ -127,7 +127,7 @@ contextual-orchestrator owns model discovery and selection.
retaining the original asset and provenance. Recognize image DOM/visual
regions before OCR, descriptions, Keyman extraction, or embeddings. Store
region-level evidence; never show an internal LLM instruction such as
`This post is an image` to a buyer.
`This post is an image` to a reader.

## Source parsing and semantic units

Expand All @@ -146,10 +146,10 @@ contextual-orchestrator owns model discovery and selection.
- Remove presentation-only visual line alignment inside a paragraph (for
example continuation lines manually aligned after `-`, `*`, `1.`, or `.`)
from derived semantic text, while retaining the source body and meaningful
list/heading nesting. A buyer-facing post view must render semantic
list/heading nesting. A reader-facing post view must render semantic
paragraphs, not the authoring application's spacing workaround.
- Image descriptions, OCR text, and region evidence are analysis artifacts,
not buyer-facing prompt instructions. Buyer UI shows the source content and
not reader-facing prompt instructions. The workspace UI shows the source content and
useful captions/evidence only, with provenance where appropriate.

## Pluggable channels: never fake a missing signal
Expand Down
10 changes: 5 additions & 5 deletions ARCHITECTURE.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ flowchart LR
| `chunking.py` | Splits a document into meaning-identifiable units (paragraph, sentence, DOM, conversation-turn) plus embedded-image extraction, in document order |
| `embedding_client.py` | Pluggable text-embedding channel (`Null` default, `OpenAiCompatible` real impl) + `chunked_max_similarity` |
| `adjudication_client.py` | Pluggable LLM-judgment channel (`Null` default, `ContextualOrchestrator` real impl) |
| `image_content.py` | Pluggable vision channel: OCR + object recognition/tagging for embedded images (`Null` default, `OpenAiCompatibleVisionClient` real impl). The product popup (`frontend/src/PostBody.tsx`) renders each `data:image` payload in document order so the buyer sees the picture, not the base64 string; GET does not call the vision client. |
| `image_content.py` | Pluggable vision channel: OCR + object recognition/tagging for embedded images (`Null` default, `OpenAiCompatibleVisionClient` real impl). The product popup (`frontend/src/PostBody.tsx`) renders each `data:image` payload in document order so the reader sees the picture, not the base64 string; GET does not call the vision client. |
| `tepp_client.py` | TEPP's published `AnalysisRunRequest` wire contract, pluggable transport |
| `rankweave_client.py` | Fail-closed RankWeave ranking port (`weighted_reciprocal_rank_fuse` in-process; never invent a fused score or a theta) |
| `reconstruct.py` | The pipeline: group → candidate window → score → fuse → thread |
Expand Down Expand Up @@ -326,7 +326,7 @@ Keymen are affiliated with (`lineageweave/affiliate_tree.py`, loaded by
set of those leaves, not the whole company directory -- a sibling the
post never mentions is omitted. People on the tree are buttons that
reuse `GET /api/keymen/{person_id}/related` so the popup Keyman walk
starts from the affiliation the buyer clicked. A resolved organization
starts from the affiliation the reader clicked. A resolved organization
is the same walk via `GET /api/corporate-entities/{id}/related`. An affiliation that did not resolve to
a `corporate_entity` row stays as its own root (`resolved=false`); that
is the same never-guess-a-parent rule
Expand Down Expand Up @@ -467,15 +467,15 @@ truly have no dated open tickets.

## Phase 6-M2: authorized analysis-run evidence (read projection)

Issue #79's first buyer-visible Milestone 2 slice is a source-redacting
Issue #79's first reader-visible Milestone 2 slice is a source-redacting
read of the #89 registry. `GET /api/analysis-runs` and
`GET /api/analysis-runs/{id}` require `post_read` and apply the scope
in SQL: the requester always sees their own run; a corporate-entity or
process-unit scope is visible only to affiliated accounts; a
thread-group scope is visible only when the account can already see a
post in that group; `all_visible` is requester-only. Hidden runs 404. Detail also lists ABAC-visible post titles in the
run's scope whose `created_at` is at or before `knowledge_cutoff`
(ADR 0016) so a buyer can open a post the run was allowed to know
(ADR 0016) so a reader can open a post the run was allowed to know
without seeing later live rows or hidden bodies. Detail also returns
revision and configuration digest prefixes.
`POST /api/analysis-runs` records a Pending lineage run on a new
Expand Down Expand Up @@ -925,7 +925,7 @@ code. Wired into both `keyman_ingestion.py`'s affiliation loop and
## Standards-complete W3C PROV-O provenance layer

ADR 0011 separates standards-complete provenance from the compact
buyer-facing navigation graph. `lineageweave/prov_o.py` validates
reader-facing navigation graph. `lineageweave/prov_o.py` validates
and materializes all 50 normative PROV-O properties, including
literal-valued times/values and qualified Influence resources.
`migrations/0017_prov_o_standard_relations.sql` stores definitions,
Expand Down
8 changes: 8 additions & 0 deletions CHANGELOG.d/2.12.7-lineage-dag-evidence.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
### Changed

- Made the buyer Event Lineage DAG explicitly directional with parent-to-child arrowheads whose paths stop outside node circles.
- Preserved authored graph width behind a keyboard-focusable horizontal scroll region instead of shrinking deep lineages.
- Added visible event dates, a redundant visual/text legend, and an accessible exact-value evidence table for lineage relations, dates, and fused scores.
- Added five-locale buyer copy stating that reconstructed continuation edges do not prove causality or authoritative fact.
Comment on lines +1 to +6

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🔍 Changelog version 2.12.7 is below the latest 2.13.1 fragment

This adds 2.12.7-lineage-dag-evidence.md while newer fragments (up to 2.13.1-*) already exist in CHANGELOG.d/. The PR description notes it stacks on codex/normalize-source-indent-semantics, so the lower version may be intentional to slot into an earlier release line, but reviewers should confirm the version fragment is correct for the intended release rather than an accidental regression.

Open in Devin Review

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

- Replaced the internal "seed posts" empty-state language with an actionable five-locale instruction to add eligible source records and rebuild Event Lineage.
- Added synthetic Storybook states for branching, selected-root, isolated-root, and empty lineage surfaces.
20 changes: 20 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,31 @@ All notable changes to this project are documented here. Format follows

## [Unreleased]

### Changed

- Renamed "Buyer" terminology to reader/workspace naming across the frontend
shell, backend evidence helpers, and living docs (ADR 0119). LineageWeave
has no explicit buyer role, so `BuyerNav`/`BuyerDestination` became
`WorkspaceNav`/`WorkspaceDestination`, `.buyer-gnb*` CSS became
`.workspace-gnb*`, and prose referring to the reading user now says
"reader" instead of "buyer". Historical ADRs and changelog entries keep
their original wording as a point-in-time record.

### Fixed

- `make smoke` and `make seed` now run through the locked project `uv`
environment, so local OIDC and synthetic-data workflows resolve the same
pinned dependencies as CI.
- The workspace Event Lineage global Search action now retries focus after the
board finishes loading, so navigation from Customer master, Calendar, or
Ask Agent lands the cursor in the search box. The handled request is consumed,
so later board navigation does not steal focus, and Search closes an open
mobile drawer like every other destination change.
- Mobile Event Lineage evidence cards now read their translated column labels
from the rendered cells instead of hardcoded English CSS, and the two drawer
close controls have distinct accessible names.
- Event Lineage SVG edges now retain their instance-specific direction markers,
so parent-to-child arrows remain visible when multiple lineage groups render.
- All OpenAI-compatible chat-completion consumers now validate the shared
response envelope before parsing it, preventing malformed provider bodies
from escaping as raw `KeyError` or response-shape details.
Expand Down
6 changes: 3 additions & 3 deletions backend/app/analysis_run_ingestion.py
Original file line number Diff line number Diff line change
Expand Up @@ -249,7 +249,7 @@ async def fetch_outbox_deliveries(
"""Labeled claim/delivery events for one already-visible run.

Missing outbox tables mean migration 0023 is not applied. Stream
entry ids stay off the payload -- they are not buyer evidence.
entry ids stay off the payload -- they are not reader-facing evidence.
"""
try:
rows = await conn.fetch(
Expand Down Expand Up @@ -285,7 +285,7 @@ async def _serialize_runs(
conn: asyncpg.Connection,
rows: list[asyncpg.Record],
) -> list[dict[str, Any]]:
"""Project registry rows into the authorized buyer-facing payload."""
"""Project registry rows into the authorized reader-facing payload."""
if not rows:
return []
count_rows = await _counts_by_run(conn, [str(row["analysis_run_id"]) for row in rows])
Expand Down Expand Up @@ -346,7 +346,7 @@ async def fetch_visible_analysis_runs(
"""Runs the account requested or whose scope they may already walk.

Once real source-import evidence is visible, the synthetic `make seed`
Demo Corp runs stop appearing here -- a buyer must not mistake that
Demo Corp runs stop appearing here -- a reader must not mistake that
fabricated narrative for real evidence (ADR 0001 / ADR 0042).
"""
# Safe SQL: this immutable module query contains only closed schema SQL; request values remain bound below.
Expand Down
2 changes: 1 addition & 1 deletion backend/app/demo_scope.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
something to show. Once an account can see at least one post carrying real
source-import evidence, the synthetic Demo Corp tree is no longer needed to
fill an empty screen and must stop appearing next to real evidence -- a
buyer must never mistake a fabricated contact (e.g. Ada West, Priya Nair)
reader must never mistake a fabricated contact (e.g. Ada West, Priya Nair)
for a real one.
"""

Expand Down
4 changes: 2 additions & 2 deletions backend/app/entity_relationship_ingestion.py
Original file line number Diff line number Diff line change
Expand Up @@ -128,11 +128,11 @@ async def fetch_relationship_network(
can be a customer in one post, a competitor in another (their own
product line competes with ours elsewhere), the customer of our
customer in a third, or a supplier -- Customer Master's per-post
reads never rolled these up, so buyers could only see one role at
reads never rolled these up, so readers could only see one role at
a time and never the entity's whole network. This groups every
visible, eligible post's classifications by counterparty name,
keeping every distinct relationship type observed (not just the
most frequent), so a buyer can see a name marked both Customer and
most frequent), so a reader can see a name marked both Customer and
Competitor and know that reflects the real, mixed relationship
rather than a classification error.

Expand Down
2 changes: 1 addition & 1 deletion backend/app/issue_ticket_ingestion.py
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,7 @@ async def upsert_commitment_ticket(

Re-deriving the same post must not stack duplicate calendar rows --
an existing open ticket with a commitment_summary is updated in place.
A closed ticket is left alone so the buyer can keep the historical
A closed ticket is left alone so the reader can keep the historical
record and still derive a fresh open one.
"""
existing = await conn.fetchrow(
Expand Down
6 changes: 3 additions & 3 deletions backend/app/knowledge_graph.py
Original file line number Diff line number Diff line change
Expand Up @@ -576,7 +576,7 @@ async def fetch_person_role_history(
responsibility, in posts at different times (a job change, a title
change, a move between projects). ``post_summary_role`` already
carries this per post; this simply orders it chronologically for
one person instead of leaving a buyer to open every post that
one person instead of leaving a reader to open every post that
mentions them and compare manually.

``visible_post_ids`` must already be ABAC-filtered by the caller
Expand All @@ -590,7 +590,7 @@ async def fetch_person_role_history(
rows = await conn.fetch(
"""
select role.post_id, post.post_title, post.created_at,
role.responsibility, role.affiliated_organization_name
role.responsibility_text, role.affiliated_organization_name
from post_summary_role role
join source_post post on post.post_id = role.post_id
where role.cataloged_person_id = $1
Expand All @@ -605,7 +605,7 @@ async def fetch_person_role_history(
"post_id": str(row["post_id"]),
"post_title": row["post_title"],
"created_at": row["created_at"].isoformat(),
"responsibility": row["responsibility"],
"responsibility": row["responsibility_text"],
"affiliated_organization_name": row["affiliated_organization_name"],
}
for row in rows
Expand Down
Loading