Skip to content

Commit 3b29909

Browse files
committed
Prepare 1.5.2 release
1 parent 1a807df commit 3b29909

9 files changed

Lines changed: 91 additions & 13 deletions

File tree

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<p align="center">
44
<a href="./LICENSE"><img src="https://img.shields.io/badge/license-MIT-4C8BF5" alt="MIT License" /></a>
5-
<img src="https://img.shields.io/badge/version-v1.5.1-4C8BF5" alt="Version 1.5.1" />
5+
<img src="https://img.shields.io/badge/version-v1.5.2-4C8BF5" alt="Version 1.5.2" />
66
<img src="https://img.shields.io/badge/React-19-61DAFB?logo=react&logoColor=white" alt="React 19" />
77
<img src="https://img.shields.io/badge/TypeScript-Strict-3178C6?logo=typescript&logoColor=white" alt="TypeScript Strict" />
88
<img src="https://img.shields.io/badge/local--first-deepvault-0F766E" alt="Local first" />

changelogs/CHANGELOGS_1_5_2.md

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# Changelog (`1.5.1 -> 1.5.2`)
2+
3+
Release date: 2026-05-06
4+
5+
## Major Highlights
6+
7+
- DeepVault Nexus 1.5.2 is a focused worker extraction patch over 1.5.1.
8+
- Microsoft Graph file-content downloads now follow redirects, restoring real binary/text retrieval for SharePoint content endpoints that return a download location instead of the file body directly.
9+
- Worker coverage now proves the Graph client is initialized with redirect following before extract-backed export logic consumes downloaded content.
10+
11+
### Worker Extraction
12+
13+
- `GraphClient` now creates its `httpx.Client` with `follow_redirects=True`.
14+
- The live export service can follow Graph `/content` redirects when downloading SharePoint file bodies for extract artifact creation.
15+
- Added a focused worker test that captures the Graph client initialization and verifies downloaded bytes and content type still flow through `get_bytes`.
16+
17+
## Validation and Regression Evidence
18+
19+
- `rtk python3 -m pytest worker/tests/test_live_export_service.py`
20+
- `rtk npm run test -- tests/changelogs.spec.ts`
21+
- `rtk npm run typecheck`
22+
- `rtk npm run lint`
23+
- `rtk npm run build`
24+
- `rtk npm run test`
25+
26+
## Notes
27+
28+
- This release does not change the corpus schema or the browser UI.
29+
- Existing extract artifacts do not need migration; rerunning live export is enough to benefit from redirected content downloads.

logics/INDEX.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
| [adr_011_observability_audit_and_answer_traceability](architecture/adr_011_observability_audit_and_answer_traceability.md) | Observability, audit, and answer traceability | Proposed | | architecture/adr_011_observability_audit_and_answer_traceability.md |
1818
| [adr_012_local_companion_runtime_for_explorer_and_chat](architecture/adr_012_local_companion_runtime_for_explorer_and_chat.md) | DeepVault - Navy runtime for explorer and chat | Proposed | | architecture/adr_012_local_companion_runtime_for_explorer_and_chat.md |
1919
| [adr_013_hosted_backend_and_teams_chat_channel](architecture/adr_013_hosted_backend_and_teams_chat_channel.md) | Hosted backend and Teams chat channel | Proposed | | architecture/adr_013_hosted_backend_and_teams_chat_channel.md |
20-
| [Sub](architecture/adr_014_deepvault_retrieval_ranking_quality_and_cost_policy.md) | Minimum threshold | Proposed | | architecture/adr_014_deepvault_retrieval_ranking_quality_and_cost_policy.md |
20+
| [adr_014_deepvault_retrieval_ranking_quality_and_cost_policy](architecture/adr_014_deepvault_retrieval_ranking_quality_and_cost_policy.md) | Minimum threshold | Proposed | | architecture/adr_014_deepvault_retrieval_ranking_quality_and_cost_policy.md |
2121
| [adr_015_deepvault_security_audit_logging_and_retention_boundaries](architecture/adr_015_deepvault_security_audit_logging_and_retention_boundaries.md) | DeepVault security audit logging and retention boundaries | Proposed | | architecture/adr_015_deepvault_security_audit_logging_and_retention_boundaries.md |
2222
| [adr_016_deepvault_persistence_and_storage_layout](architecture/adr_016_deepvault_persistence_and_storage_layout.md) | DeepVault persistence and storage layout | Proposed | | architecture/adr_016_deepvault_persistence_and_storage_layout.md |
2323
| [adr_017_bishop_llm_orchestration_after_local_grounding](architecture/adr_017_bishop_llm_orchestration_after_local_grounding.md) | Bishop LLM orchestration after local grounding | Accepted | | architecture/adr_017_bishop_llm_orchestration_after_local_grounding.md |
@@ -186,7 +186,7 @@
186186
| [task_001_v1_local_companion_vertical_slice](tasks/task_001_v1_local_companion_vertical_slice.md) | V1 — DeepVault - Navy vertical slice | Done | 100% | tasks/task_001_v1_local_companion_vertical_slice.md |
187187
| [task_002_v1_ingestion_sync_and_retrieval_hardening](tasks/task_002_v1_ingestion_sync_and_retrieval_hardening.md) | V1 — Ingestion, sync, and retrieval hardening | Done | 100% | tasks/task_002_v1_ingestion_sync_and_retrieval_hardening.md |
188188
| [task_005_v1_local_development_and_validation_milestone](tasks/task_005_v1_local_development_and_validation_milestone.md) | V1 — Local development and validation milestone | Done | 100% | tasks/task_005_v1_local_development_and_validation_milestone.md |
189-
| [Pre](tasks/task_008_v1_retrieval_evaluation_set_and_quality_gates.md) | evaluation checklist (must pass before starting) | Done | 100% | tasks/task_008_v1_retrieval_evaluation_set_and_quality_gates.md |
189+
| [task_008_v1_retrieval_evaluation_set_and_quality_gates](tasks/task_008_v1_retrieval_evaluation_set_and_quality_gates.md) | Pre-evaluation checklist (must pass before starting) | Done | 100% | tasks/task_008_v1_retrieval_evaluation_set_and_quality_gates.md |
190190
| [task_009_local_hardening_and_v1_scope_evolution](tasks/task_009_local_hardening_and_v1_scope_evolution.md) | What is already done in V1 (do not re-implement) | Done | 100% | tasks/task_009_local_hardening_and_v1_scope_evolution.md |
191191
| [task_011_nexus_v1_1_shell_and_live_state_delivery](tasks/task_011_nexus_v1_1_shell_and_live_state_delivery.md) | Nexus V1.1 shell and live state delivery | Done | 100% | tasks/task_011_nexus_v1_1_shell_and_live_state_delivery.md |
192192
| [task_012_nexus_v1_1_remaining_polish_orchestration](tasks/task_012_nexus_v1_1_remaining_polish_orchestration.md) | Nexus V1.1 remaining polish orchestration | Done | 100% | tasks/task_012_nexus_v1_1_remaining_polish_orchestration.md |
@@ -219,4 +219,4 @@
219219
| [task_041_orchestrate_post_v1_3_consolidation_enrichment_ci_and_configuration_portability](tasks/task_041_orchestrate_post_v1_3_consolidation_enrichment_ci_and_configuration_portability.md) | Wave map | Done | 100% | tasks/task_041_orchestrate_post_v1_3_consolidation_enrichment_ci_and_configuration_portability.md |
220220
| [task_042_orchestrate_python_worker_foundation_and_runtime_migration](tasks/task_042_orchestrate_python_worker_foundation_and_runtime_migration.md) | Progress notes | Done | 100% | tasks/task_042_orchestrate_python_worker_foundation_and_runtime_migration.md |
221221
| [task_043_orchestrate_hosted_auth_access_and_deployment](tasks/task_043_orchestrate_hosted_auth_access_and_deployment.md) | Progress notes | Done | 100% | tasks/task_043_orchestrate_hosted_auth_access_and_deployment.md |
222-
| [task_044_orchestrate_extract_backed_analysis_pipeline](tasks/task_044_orchestrate_extract_backed_analysis_pipeline.md) | Orchestrate extract-backed analysis pipeline | Done | 100% | tasks/task_044_orchestrate_extract_backed_analysis_pipeline.md |
222+
| [task_044_orchestrate_extract_backed_analysis_pipeline](tasks/task_044_orchestrate_extract_backed_analysis_pipeline.md) | Wave map | Done | 100% | tasks/task_044_orchestrate_extract_backed_analysis_pipeline.md |

logics/backlog/item_089_worker_text_extract_artifacts_for_sharepoint_documents.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
## item_089_worker_text_extract_artifacts_for_sharepoint_documents - Worker text extract artifacts for SharePoint documents
22

3-
> From version: 1.5.1
3+
> From version: 1.5.2
44
> Schema version: 1.0
55
> Status: Done
6-
> Understanding: 98%
7-
> Confidence: 94%
8-
> Progress: 100%
6+
> Understanding: 99%
7+
> Confidence: 95%
8+
> Progress: 100% (release validation refreshed)
99
> Complexity: High
1010
> Theme: Data / Worker / Corpus
1111
> Reminder: Update status, understanding, confidence, progress and linked request/task references when you edit this doc.
@@ -58,4 +58,5 @@ flowchart LR
5858
- Implemented `RuntimeStore.extract_artifact_relative_path(...)` and worker live export extract artifact writing under the configured runtime store.
5959
- Corpus documents now carry `extractionStatus`, `extractionReason`, and `extractPath` when exported from the Graph worker path.
6060
- Extended worker extraction beyond text-like files by downloading bounded binary content and extracting OOXML body text for DOCX/PPTX/XLSX, with optional PDF text extraction through `pypdf`.
61+
- Patched `GraphClient` to follow Microsoft Graph content download redirects, with focused test coverage proving extract downloads use `follow_redirects=True`.
6162
- `rtk python3 -m pytest worker/tests/test_live_export_service.py` passed with coverage for successful text extract, metadata-only unsupported source, and empty text download classified as unreadable.

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "deepvault-nexus",
3-
"version": "1.5.1",
3+
"version": "1.5.2",
44
"private": true,
55
"type": "module",
66
"scripts": {

src/data/changelogs.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,12 @@ export interface ParsedChangelog {
1212
}
1313

1414
const CHANGELOG_ENTRIES: ChangelogEntry[] = [
15+
{
16+
version: '1.5.2',
17+
title: 'DeepVault Nexus 1.5.2',
18+
fileName: 'CHANGELOGS_1_5_2.md',
19+
load: () => import('../../changelogs/CHANGELOGS_1_5_2.md?raw').then((module) => module.default as string),
20+
},
1521
{
1622
version: '1.5.1',
1723
title: 'DeepVault Nexus 1.5.1',

worker/app/services/live_export_service.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ def __init__(self, *, base_url: str, access_token: str, timeout_seconds: int) ->
4848
self._base_url = base_url.rstrip("/")
4949
self._access_token = access_token
5050
self._timeout_seconds = timeout_seconds
51-
self._client = httpx.Client(timeout=timeout_seconds)
51+
self._client = httpx.Client(timeout=timeout_seconds, follow_redirects=True)
5252

5353
def close(self) -> None:
5454
self._client.close()

worker/tests/test_live_export_service.py

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from worker.app.config import Settings
1010
from worker.app.infra.runtime_store import RuntimeStore
1111
from worker.app.services.corpus_service import CorpusService
12-
from worker.app.services.live_export_service import LiveExportConfig, LiveExportService
12+
from worker.app.services.live_export_service import GraphClient, LiveExportConfig, LiveExportService
1313

1414

1515
def build_service(tmp_path) -> LiveExportService:
@@ -22,6 +22,48 @@ def build_service(tmp_path) -> LiveExportService:
2222
return LiveExportService(settings=settings, runtime_store=runtime_store, corpus_service=corpus_service)
2323

2424

25+
def test_graph_client_follows_download_redirects(monkeypatch) -> None:
26+
captured: Dict[str, object] = {}
27+
28+
class FakeResponse:
29+
status_code = 200
30+
text = "downloaded text"
31+
content = b"downloaded bytes"
32+
headers = {"content-type": "application/octet-stream"}
33+
34+
@staticmethod
35+
def json() -> dict[str, object]:
36+
return {}
37+
38+
class FakeHttpClient:
39+
def __init__(self, *, timeout: int, follow_redirects: bool) -> None:
40+
captured["timeout"] = timeout
41+
captured["follow_redirects"] = follow_redirects
42+
43+
def request(self, method: str, url: str, headers: dict[str, str]) -> FakeResponse:
44+
captured["method"] = method
45+
captured["url"] = url
46+
captured["headers"] = headers
47+
return FakeResponse()
48+
49+
def close(self) -> None:
50+
captured["closed"] = True
51+
52+
monkeypatch.setattr("worker.app.services.live_export_service.httpx.Client", FakeHttpClient)
53+
54+
client = GraphClient(base_url="https://graph.microsoft.com/v1.0", access_token="token", timeout_seconds=17)
55+
content, content_type = client.get_bytes("/drives/drive-1/items/item-1/content")
56+
client.close()
57+
58+
assert captured["follow_redirects"] is True
59+
assert captured["timeout"] == 17
60+
assert captured["url"] == "https://graph.microsoft.com/v1.0/drives/drive-1/items/item-1/content"
61+
assert captured["headers"] == {"Authorization": "Bearer token"}
62+
assert content == b"downloaded bytes"
63+
assert content_type == "application/octet-stream"
64+
assert captured["closed"] is True
65+
66+
2567
def test_live_export_service_runs_graph_export_and_publishes_artifacts(tmp_path, monkeypatch) -> None:
2668
service = build_service(tmp_path)
2769
progress: list[tuple[str, int, str]] = []

0 commit comments

Comments
 (0)