Skip to content

fix(privacy): redact temporal analysis logs - #1055

Draft
seonghobae wants to merge 12 commits into
developfrom
fix/temporal-log-privacy
Draft

seonghobae wants to merge 12 commits into
developfrom
fix/temporal-log-privacy

Conversation

@seonghobae

@seonghobae seonghobae commented Aug 29, 2026 •

Copy link
Copy Markdown
Collaborator

Canonical temporal privacy / integrity owner

This Draft remains the canonical owner for TemporalAnalyzer log privacy, production temporal orchestration, source-content cache integrity and the bounded local temporal result contract.

  • Protected base: develop@314ddeae7b775a4957594b599358c8255617eb2e
  • Exact current head: 9d458b5277ba55769f64650f5881a7bb396bd73d
  • Open / Draft / mergeable
  • Current head remains 12 commits ahead / 0 behind protected develop; no source movement is made in this owner while active prerequisite fix(audio): establish canonical local-audio resource policy #866 is still unmerged.

Existing product contract retained

  • TemporalAnalyzer progress/failure logs use generic selected-local-audio context and do not emit the source path.
  • Failure logs expose the exception type, not decoder exception text.
  • The old temporary CLI temporal probe is absent; temporal metadata belongs to the production analysis orchestration path.
  • BPM, tempo stability and sustained changes propagate through the local rehearsal contract and native parser.
  • Final-analysis/reusable-feature/stem-work caches use bounded source-content identity so same-size replacement does not reuse stale evidence.
  • Legacy feature caches require verifiable content identity; source change during analysis fails closed before mixed-result persistence.
  • Native tempo admission requires finite positive BPM values, non-negative change times and known stability labels.

Current verification boundary

Historical local verification on this exact tree includes Python 690 passed / 24 skipped with 100% coverage, desktop-core tests, frontend coverage, lint/type/security/bootstrap checks and focused post-reconciliation tests. Ruff format also reproduced the protected-base one-file defect owned by #1176, so those results are not a final merge-GREEN claim and the foreign formatter delta is not copied here.

Every future source movement invalidates predecessor checks/reviews. Final acceptance still requires one unchanged exact head after prerequisites have reached protected ancestry.

Preserved log-injection findings

#1211 remains a weaker preservation branch for the CR/LF log-forging class. Its repr(path) approach is not accepted here because it still discloses the selected local path. Canonical GREEN remains path-free: generic context + exception type at the log sink, with attacker-shaped path/identifier and decoder text unable to create records or disclose local path information.

Fresh review of #1237 found a second, distinct valid delta and a new single-writer conflict.

#1237 conflict

#1237 exact 4ad88b6abb738a8a450d980bb7ebf003bd643721 edits this owner's temporal/analyzer.py and cli.py. Its current analyzer logs a bounded/escaped path and its CLI reintroduces the temporary TemporalAnalyzer probe plus buyer filename logs. Those are weaker than this owner's privacy/orchestration contract and must not be merged or transplanted here.

#1237 has therefore been converted to Open / Draft preservation rather than remaining a second canonical temporal source writer.

#1237 valid delta to absorb later

The current canonical analyzer still wraps a decoder failure with:

ValueError(f"Temporal analysis failed: {e}")

That calls dependency-controlled __str__ while already handling an exception. #1237 carries a valid RED showing that a hostile/broken __str__ can mask the intended failure and that a very large exact-string exception argument can create an unbounded wrapped diagnostic. Its useful repair evidence is the bounded, no-dependency-str/repr message boundary and the corresponding tests—not its path/filename logging or CLI probe.

After prerequisites are actually protected, this owner must adopt/adapt the valid evidence while retaining the stronger privacy contract:

  1. add the broken-__str__ and oversized wrapped-error regression on this path-free analyzer;
  2. bound the caller-visible wrapped error without invoking dependency __str__/__repr__;
  3. keep the log sink generic and exception-type-only—no raw or escaped path, buyer filename or decoder message;
  4. keep the temporary CLI temporal probe absent;
  5. keep the original exception chained as __cause__ for debugging without trusting its representation;
  6. obtain fresh 100% owned-production coverage plus repository/security/SAST/SBOM/CodeQL and qualifying independent non-author review on the resulting unchanged exact head.

This owner does not cherry-pick #1237 wholesale. It preserves only verified semantic/test evidence that is compatible with the existing privacy and orchestration boundary.

Dependency / source-lane order

#1176 remains the one-file Ruff formatter prerequisite. Active Resource Admission owner #866 is still Open and unmerged; its current contract explicitly blocks competing temporal source mutation until it is released. Therefore this run records the validated #1237 delta here but does not mutate production source, create a parallel temporal successor, force-push, or rebase.

Normal order remains:

#1176 protected integration → #866 protected integration → ordinary/non-force reconciliation of this owner → canonical adoption of the valid #1211/#1237 regressions → fresh exact-head verification/review → normal protected merge.

Security Notes

  • Untrusted inputs include operator-selected local-audio identity and decoder/native-library exceptions.
  • Log privacy is stricter than record escaping: selected local paths and decoder text are excluded rather than merely escaped.
  • Caller-visible wrapped failures must also fail safely; diagnostic rendering may not execute dependency-controlled representation code or emit unbounded routine text.
  • Fingerprinting persists only bounded SHA-256 content identity, not raw audio.
  • No new network, model, URL, generic subprocess or credential authority is introduced by this preservation decision.

Merge gate

Keep Draft. Do not merge until #1176 and #866 are protected prerequisites, the valid #1211/#1237 evidence is absorbed without privacy/orchestration regression, one unchanged final head has every applicable repository/central CI/build/security/SAST/SBOM/supply-chain/coverage/review gate terminal-success, all valid findings are resolved, and a qualifying independent non-author last-push approval exists.

No self-approval, admin bypass, force-push, destructive rebase, synthetic status, gate weakening, no-op freshness commit, blind rerun, or predecessor-evidence transfer.

@coderabbitai

coderabbitai Bot commented Aug 29, 2026 •

Copy link
Copy Markdown
Contributor

Review Change StackReview Change Stack

📝 Walkthrough

Walkthrough

로컬 오디오 분석이 템포 안정성과 지속적 템포 변화를 생성합니다. 콘텐츠 지문 기반 캐시와 검증된 상태 계약을 추가하고, 데스크톱 안내 및 차트 요약 JSON에 결과를 전달합니다.

Changes

템포 안정성 분석 및 전달

Layer / File(s) Summary
템포 계약과 검증
apps/desktop/core/src/lib.rs, packages/shared-types/src/index.ts, services/analysis-engine/src/bandscope_analysis/api.py
템포와 템포 안정성 타입을 추가합니다. 유한성, 양수성, 허용 라벨, 템포 변화 값을 검증합니다. 분석 제한 시간을 120초로 변경합니다.
분석 및 콘텐츠 기반 캐시 흐름
services/analysis-engine/src/bandscope_analysis/api.py, services/analysis-engine/src/bandscope_analysis/temporal/analyzer.py, services/analysis-engine/tests/*
로컬 오디오 콘텐츠 지문으로 분석·기능·스템 캐시를 키잉합니다. 레거시 기능 캐시를 마이그레이션합니다. 분석 전후 소스 변경을 감지합니다. 템포 분석 결과를 생성하고 경로가 로그에 노출되지 않도록 변경합니다. 관련 API, CLI, 캐시, 로그 테스트를 추가합니다.
데스크톱 표시와 내보내기
apps/desktop/src/features/workspace/*, apps/desktop/src/lib/export.*, apps/desktop/src/locales/*, ARCHITECTURE.md, CHANGELOG.md
워크스페이스에 템포 안정성 안내를 표시합니다. 템포 데이터를 차트 요약 JSON에 포함합니다. 영어·한국어 문구와 아키텍처·변경 기록을 갱신합니다.

Estimated code review effort: 4 (Complex) | ~60 minutes

Suggested reviewers: copilot

Merge Risk: 🟡 Moderate · up to 9d458

Changed or unreadable local audio can return cached analysis for different content. Cache reuse should be disabled when content identity cannot be verified before merge.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed Docstring coverage is 87.67% which is sufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 73 functions across 13 files. (4 skipped: 4…
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed 제목은 TemporalAnalyzer 로그의 로컬 오디오 경로 비식별화 변경을 정확히 설명합니다. 캐시, 템포 계약, 분석 기한 등 추가 변경은 포함하지 않지만 제목에는 모든 세부 사항이 필요하지 않습니다.
✨ Finishing Touches 💡 1
🛠️ Fix failing CI checks 💡
  • Create stacked PR
  • Commit on current branch
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/temporal-log-privacy

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@devin-ai-integration devin-ai-integration Bot left a comment •

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Note

This report is out of date. Scroll down for Devin Review's latest report on this PR.

✅ Devin Review: No Issues Found

Devin Review analyzed this PR and found no bugs or issues to report.

Devin Review

@seonghobae

Copy link
Copy Markdown
Collaborator Author

@opencode-agent review

@seonghobae

Copy link
Copy Markdown
Collaborator Author

Protected-gate evidence for current head b11b1e0:\n\n- deterministic, security, SBOM, coverage, build, release, macOS, and Windows checks pass.\n- Strix run 33243678538 completed at 2026-08-29T08:52:28Z with failure; job 99077269073 reached the quick scan step and uploaded artifact strix-reports.\n- The artifact contains three bounded attempts against contextual-orchestrator/openai/orchestrator/free, each returning HTTP 500 internal_error; no vulnerability report was produced. The workflow explicitly fails closed when only log markers exist.\n- opencode-review is also failure because no current-head formal verdict was available.\n- No independent qualifying approval exists; merge remains blocked. I am not bypassing required gates or self-approving.

@seonghobae

Copy link
Copy Markdown
Collaborator Author

Queued @opencode-agent for PR #1055 at head b11b1e0c1756921c64524d691fb4fac440abc65b. Central exact-name Actions artifacts are the durable dispatch ledger; existing review workflows remain authoritative for the final verdict and failure evidence.

@opencode-agent opencode-agent Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

OpenCode reviewed the current-head product diff. Coverage is a separate gate.

Changed files

  • CHANGELOG.md — repository behavior
  • services/analysis-engine/src/bandscope_analysis/temporal/analyzer.py — Python module behavior
  • services/analysis-engine/tests/test_temporal.py — regression suite

Changed behavior

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Repository file: CHANGELOG.md"]
  S1 --> I1["repository behavior"]
  I1 --> R1["Review risk: Repository file: CHANGELOG.md"]
  R1 --> V1["required checks"]
  Evidence --> S2["Python: analyzer.py"]
  S2 --> I2["Python module behavior"]
  I2 --> R2["Review risk: Python: analyzer.py"]
  R2 --> V2["pytest plus coverage"]
  Evidence --> S3["Test: test_temporal.py"]
  S3 --> I3["regression suite"]
  I3 --> R3["Review risk: Test: test_temporal.py"]
  R3 --> V3["targeted test run"]
Loading

Findings

No source-backed product finding is synthesized from the coverage gate. A coverage miss belongs in the status comment.

  • Head SHA: b11b1e0c1756921c64524d691fb4fac440abc65b
  • Workflow run: 33244973878
  • Workflow attempt: 1
  • Coverage gate: failure

Review outcome

Coverage is a gate, not the review. This body reviews the changed product files.

Changed-File Evidence Map

flowchart LR
  PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
  Evidence --> S1["Repository file: CHANGELOG.md"]
  S1 --> I1["repository behavior"]
  I1 --> R1["Review risk: Repository file: CHANGELOG.md"]
  R1 --> V1["required checks"]
  Evidence --> S2["Python: analyzer.py"]
  S2 --> I2["Python module behavior"]
  I2 --> R2["Review risk: Python: analyzer.py"]
  R2 --> V2["pytest plus coverage"]
  Evidence --> S3["Test: test_temporal.py"]
  S3 --> I3["regression suite"]
  I3 --> R3["Review risk: Test: test_temporal.py"]
  R3 --> V3["targeted test run"]
Loading

@opencode-agent

opencode-agent Bot commented Aug 29, 2026 •

Copy link
Copy Markdown
Contributor

OpenCode Review Overview

Coverage evidence did not pass, so approval is blocked. The formal pull-request review is the source-backed diff review, not this status comment.

Copy link
Copy Markdown
Collaborator Author

@opencode-agent review

Fresh exact-head re-dispatch requested for b11b1e0c1756921c64524d691fb4fac440abc65b. The prior central review run 33244973878 used .github@3a7941aa92de00b8b39fd11cbe7bf3da2fbbeddc; current central main is 6c8ee24046d743b3981c566c6e29f99f09137f6a. Repository-native coverage-evidence on this same BandScope head was terminal success, while that later central dispatch reported COVERAGE_BLOCKED. Re-evaluate the unchanged head under the current central coverage/review contract; do not inherit the predecessor verdict.

…ty-cue

feat(tempo): surface tempo movement rehearsal cues
devin-ai-integration[bot]

This comment was marked as resolved.

devin-ai-integration[bot]

This comment was marked as resolved.

@devin-ai-integration devin-ai-integration Bot left a comment •

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Note

This report is out of date. Scroll down for Devin Review's latest report on this PR.

Devin Review found 5 new potential issues.

Devin Review

Comment thread services/analysis-engine/src/bandscope_analysis/api.py Outdated
Comment thread services/analysis-engine/src/bandscope_analysis/api.py Outdated
Comment thread services/analysis-engine/src/bandscope_analysis/api.py
Comment thread apps/desktop/src/features/workspace/Workspace.tsx
Comment thread services/analysis-engine/src/bandscope_analysis/api.py

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Devin Review found 2 new potential issues.

Devin Review

Comment thread services/analysis-engine/src/bandscope_analysis/api.py
Comment thread services/analysis-engine/src/bandscope_analysis/api.py

Copy link
Copy Markdown
Collaborator Author

Dependency-owner handoff for the current exact BandScope head 9b435f5159e1389e0e122b0a12e1a630fba1950f over develop@749511c3ad4000090048718f685c6bee6b3d2c25:

Required Strix job 99212031836 reached the trusted central review boundary rather than failing in this PR's product code. The job materialized central .github workflow source 6c8ee24046d743b3981c566c6e29f99f09137f6a, started the contextual-orchestrator sidecar successfully, completed authenticated health and /v1/chat/completions preflight, installed Strix, and then failed at Strix's own configured-endpoint validation with the exact first causal error:

ERROR: LLM_API_BASE must be an https URL when configured.

The trusted wrapper intentionally supplies the same-job contextual-orchestrator loopback endpoint as http://127.0.0.1:18080. There is no correct BandScope-local source repair: changing BandScope product code cannot alter that central wrapper/Strix endpoint contract, and adding a local HTTPS-validation bypass, direct-provider fallback, or gate suppression here would duplicate/undermine central authority.

Owner-side acceptance test: the central Strix integration must admit only the explicitly trusted loopback contextual-orchestrator gateway while retaining HTTPS-only validation for non-loopback/external configured endpoints, then a fresh exact-head BandScope Strix run must proceed through an authoritative scan rather than failing during endpoint admission. Until that owner-side contract is repaired and this unchanged head is rerun, this Strix result remains non-passing dependency evidence, not a BandScope vulnerability finding.

Copy link
Copy Markdown
Collaborator Author

@opencode-agent review

Fresh exact-head re-dispatch for 9b435f5159e1389e0e122b0a12e1a630fba1950f after the central review-control repair shipped to protected .github/main via #1546 (merged as 5686de41660d51a7a7f22b8840dfa6ccfe5ff3f1; current protected central main is b73b841f561832b864fb2ae597eac9cc364bf663). The predecessor OpenCode job 99613607660 exhausted its old fixed polling window without a current-head verdict. Treat that predecessor failure as stale control-plane evidence; review this unchanged BandScope head under the current protected central contract. No branch update, auto-merge, or bypass is requested.

Copy link
Copy Markdown
Collaborator Author

@opencode-agent review

Central causal repair ContextualWisdomLab/.github#1586 is now protected main@035269a76ffa6e176ee467f452467cbf4c2158a8. Re-evaluate unchanged exact head 9b435f5159e1389e0e122b0a12e1a630fba1950f using the repaired scheduler. The authoritative Strix rerun target is the strix CheckRun, never the publish-manual-pr-evidence-status sibling. Preserve existing source/security gates and publish only current-head evidence.

Copy link
Copy Markdown
Collaborator Author

Resource Admission / single-writer finding from the live #866 sweep: this branch currently implements cache/source-content authority inside the temporal/privacy lane (_local_audio_content_fingerprint, feature/final/stem-work cache keying, legacy cache migration, source-change rejection). That overlaps canonical #781/#866 and should not become a second writable Resource Admission/cache owner.

There is also a concrete resource bypass in the current fingerprint implementation: _local_audio_content_fingerprint calls source_path.stat().st_size, accepts the value when it is <= MAX_AUDIO_FILE_BYTES, then reopens the pathname and iterates read(1 MiB) until physical EOF. A file that grows after the size observation can therefore make the fingerprint read beyond the admitted extent; the function does not bind the hash to the already-admitted descriptor/logical EOF that #866 now owns. Same-path replacement between stat() and open() is also not excluded. This is exactly the TOCTOU/resource-authority class that the canonical local-audio boundary is meant to prevent.

Please keep this PR Draft and preserve its unique temporal/privacy/tempo evidence, but do not land the fingerprint/cache-authority implementation as-is. Move the semantic requirement — cache keys and persisted evidence must bind to exact admitted source content, and a source change during analysis must fail closed — to #866/Project Persistence through an ordinary released/protected contract. The canonical implementation should hash the admitted immutable publication identity or a descriptor/snapshot with a bounded logical EOF, not re-stat and re-read a mutable pathname. Do not copy mutable #866 internals here. The existing tests for same-size replacement and source mutation are valuable acceptance evidence and should be preserved in the eventual canonical owner.

Copy link
Copy Markdown
Collaborator Author

Single-writer handoff: canonical Resource Admission/cache source-identity owner #866 is now Draft exact 917860893addbe4dc4ae69e96e13b2f9f6e4eb74. It carries the native-verified publication SHA-256 into the owned Python child, scopes persisted cache lookup under that verified digest, and validates the complete request before cache namespace transformation so invalid path authority cannot be sanitized away. #1055 should preserve its unique temporal/privacy/tempo evidence, but must not become a second cache/source-content authority. In particular, do not promote pathname stat() + later pathname re-open/fingerprint as canonical identity: #866's remaining prerequisite is a crash-safe versioned manifest binding verified native source digest + one bounded metadata snapshot + one private NPZ snapshot. After that reaches protected ancestry, adapt #1055's unique temporal behavior to the released contract rather than copying fingerprint/cache logic. Keep Draft; no close until every unique tempo/privacy delta and regression is demonstrably inherited.

Copy link
Copy Markdown
Collaborator Author

Owner-boundary refresh from canonical #866: keep #1055's unique tempo/privacy semantics, but do not retain a second source-fingerprint/cache-work authority. Resource Admission now carries native verified content identity into Python, scopes persisted cache by source digest, and scopes mutable stem work by source + hashed job identity so equal-metadata replacement audio and concurrent same-source jobs cannot share execution artifacts. Tempo/privacy code should consume that released/protected boundary rather than re-open/stat/hash mutable source paths independently.

seonghobae added a commit that referenced this pull request Sep 16, 2026
The CR/LF log-forging finding is valid, but this generated implementation remains weaker than the canonical temporal privacy contract: it still emits the selected local-audio path and raw decoder exception text. The same finding is already preserved in #1211 for canonical owner #1055, which requires path-free bounded context plus exception type after the active #866 source lane releases.

Restore this duplicate branch to the protected develop tree as an ordinary descendant so it cannot become a second temporal source writer. Preserve the finding through the existing canonical/preservation path rather than merging a weaker repr(path) implementation.

No force update, destructive rebase, self-approval, gate weakening, or security-completion claim.
seonghobae added a commit that referenced this pull request Sep 16, 2026
The CR/LF log-forging finding is valid, but this branch's repr(path) implementation still discloses the selected local-audio path and preserves raw decoder exception text. Its focused test only asserts repr(path) on the info call and does not establish the stronger path-free failure contract.

Restore the duplicate branch to protected develop as an ordinary descendant. Preserve the valid finding in #1211 for canonical temporal privacy owner #1055, which already specifies attacker-shaped path plus decoder-exception RED and path-free, exception-type-only GREEN after active source owner #866 releases.

Also remove the foreign #1176 formatter delta. No force update, destructive rebase, self-approval, gate weakening, or security-completion claim.
seonghobae added a commit that referenced this pull request Sep 16, 2026
This generated lane mixes a valid TemporalAnalyzer CR/LF finding with a harmless numeric-BPM logging style change and a foreign #1176 formatter delta. Its repr(path) mitigation still discloses the local-audio path and logs repr(str(exception)), which is weaker than the canonical #1055 path-free, exception-type-only privacy contract preserved by #1211.

Restore all net changes to protected develop as an ordinary descendant. Keep the valid finding in the canonical preservation/owner path instead of maintaining another temporal source writer.

No force update, destructive rebase, self-approval, gate weakening, or security-completion claim.

Copy link
Copy Markdown
Collaborator Author

Dependency-order refinement — warning-policy owner

Fresh changed-file review shows #1232 legitimately owns analysis warning visibility but also changes this lane's temporal/analyzer.py. To avoid reverting either owner's semantic delta, treat the body order as refined to:

#1176 prerequisite → protected #866 Resource Admission → ordinary/non-force #1232 warning-policy reconciliation → ordinary/non-force #1055 privacy/tempo reconciliation + valid #1211/#1237 adoption → fresh exact-head gates/review.

#1232 must preserve #866 behavior while removing pre-evidence warning suppression; this owner must then preserve #1232's warning policy while keeping path-free/type-only log semantics and adding only the valid bounded wrapped-error evidence from #1237. No source movement is authorized by this comment.

Copy link
Copy Markdown
Collaborator Author

Fresh single-writer review found new overlapping PR #1252. Exact preservation head is now 88bf453c420907ba09c9a4c4664b62fed527ee8a, Open / Draft / mergeable, after ordinary descendant removal of the unrelated #1176 test_supply_chain_policy.py formatter delta.

#1252 identifies a valid CWE-117-class finding on protected develop, but its proposed implementation is weaker than this owner: repr(path_str) still discloses the selected local path, logger.error(..., e) still renders dependency-controlled exception text, and the caller-visible ValueError(f"...{e}") still executes dependency-controlled __str__. Do not cherry-pick #1252 wholesale.

Route only its valid raw-path/error log-forging regression intent here after #1176 and #866 become protected prerequisites. Canonical adoption should retain this lane's path-free generic log context and exception-type-only log diagnostics, keep the temporary CLI temporal probe absent, and combine the stronger #1237 broken-__str__ / oversized-message / bounded caller-visible failure evidence. No source movement is made here before those prerequisites; mention-only review dispatch is not source repair.

Copy link
Copy Markdown
Collaborator Author

2026-09-23 preservation receipts: two weaker TemporalAnalyzer branches moved again after prior owner-boundary repairs. #1229 intervening 19b30c8c763b94d5a8407bd7903713baa7b2c22b and #1211 intervening eb59d92f92b26dfd510076e3d11fd0fdc3e812be each changed only foreign-owner services/analysis-engine/tests/test_supply_chain_policy.py (+1/-3); neither added stronger temporal/privacy semantics. Ordinary non-force descendants b3b8f9d3279603601d5e4e67c3e8381f6ec3cbc6 (#1229) and 3f4bd36650222ea123e816d0a0412c5548094b85 (#1211) restore their validated preservation trees while retaining intervening history. Their current protected-base diffs are again limited to Temporal preservation source/metadata. Canonical path-free/exception-text-free ownership stays in #1055; no preservation checks/reviews transfer.

seonghobae added a commit that referenced this pull request Sep 23, 2026
…rvation lane

Restore the validated #1229 preservation tree while retaining the generated test commit in ancestry. The intervening test asserted repr(path) disclosure as safe, which conflicts with canonical #1055 path-free logging and would encode the weaker implementation as expected behavior.

Signed-off-by: Seongho Bae <me@seonghobae.me>

Copy link
Copy Markdown
Collaborator Author

#1229 fresh live continuation 9302dca5434739a5dd5f9409806bacce50e4109d added a regression that explicitly treated repr(str(path)) reaching the log sink as the safe behavior. That evidence conflicts with this canonical owner's stronger path-free privacy contract, so it was not adopted.

Ordinary non-force descendant #1229 40a81109742fde3da0088f0d5523974fe9df7cf3 restores the validated preservation tree exactly while retaining 9302dca... in ancestry. Fresh compare from prior validated b3b8f9d... to 40a8110... has zero file delta.

When prerequisites permit source adoption here, keep the canonical RED/GREEN boundary unchanged: attacker-shaped CR/LF source identity and decoder-controlled text must be exercised, but success must assert no source-path disclosure and no injected log-record boundary. repr(path) reaching the sink is explicitly rejected as a success criterion. #1211/#1237 remain the useful preservation inputs for CR/LF, broken __str__, bounded caller-visible diagnostics and chained-cause behavior.

seonghobae added a commit that referenced this pull request Sep 24, 2026
Retain the generated regression commit in ancestry while removing the test that treats repr(path) disclosure as safe. Canonical #1055 keeps local-audio paths out of the log sink; this preservation lane must not encode the weaker disclosure contract as expected behavior.

Signed-off-by: Seongho Bae <me@seonghobae.me>
seonghobae added a commit that referenced this pull request Sep 24, 2026
Remove the generated repr(path)/raw-exception logging implementation from the active diff. Canonical #1055 already owns the stronger path-free log sink and a stronger caplog regression that covers decoder failure without disclosing the selected local path. Keep the generated finding in ancestry for provenance until protected succession satisfies PR-0.

Signed-off-by: Seongho Bae <me@seonghobae.me>
seonghobae added a commit that referenced this pull request Sep 24, 2026
…-only

Remove the duplicate TemporalAnalyzer/sentinel/test delta from the active diff. Canonical #1055 already owns the stronger path-free log sink and a stricter caplog regression covering decoder failure without local-path disclosure; #1237 preserves the separate bounded caller-visible diagnostic finding. Keep this branch history as provenance until verified protected succession satisfies PR-0.

Signed-off-by: Seongho Bae <me@seonghobae.me>
seonghobae added a commit that referenced this pull request Sep 24, 2026
Remove the regenerated weaker log-forging implementation and the foreign Ruff formatter delta from this preservation lane. Preserve the intervening commit in ancestry and restore the protected develop tree so #1055 remains the canonical temporal privacy owner and #1176 remains the formatter owner.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working priority: high High-priority or P1 work type: bug Defect or incorrect behavior

Projects

Status: In Progress

Development

Successfully merging this pull request may close these issues.

1 participant