Skip to content

Reconcile v0.1.3 promotion fixes from main into dev - #126

Merged
joefeser merged 4 commits into
devfrom
codex/promote-main-to-dev-dd8a12430467
Sep 10, 2026
Merged

Reconcile v0.1.3 promotion fixes from main into dev#126
joefeser merged 4 commits into
devfrom
codex/promote-main-to-dev-dd8a12430467

Conversation

@joefeser

@joefeser joefeser commented Sep 10, 2026

Copy link
Copy Markdown
Owner

Closes no issue automatically; this is a branch promotion from main to dev.

Promotion Evidence

  • Repository: joefeser/artifact-memory
  • Source: origin/main @ dd8a12430467617cb10768e1b17bea033594dec2
  • Promotion snapshot baseline: codex/promote-main-to-dev-dd8a12430467 starts at dd8a12430467617cb10768e1b17bea033594dec2
  • Target: origin/dev @ eb08ece794d65cc04cb4f2d42ab957307d9e0483
  • Commits ahead: 3
  • Commits behind target: 0
  • Merge method: merge_commit

Commits To Promote

Validation / Handoff

  • Exact source dd8a124; promotion head 2e9f04d passed 639 tests, contract/conformance validation, public-safety, the seven-runtime SQLite matrix, and macOS/Linux/Windows CI.
  • PR-loop handoff: agent-control pr-loop --repo joefeser/artifact-memory --pr <PR_NUMBER> --base dev --require-codex-review --quiet --json
  • PR body newline check: verify this body contains real Markdown newlines, not escaped newline sequences.

Security Impact

  • No new execution, mutation, disclosure, credential, network, or shell authority is introduced.
  • Literal search uses a connection-local generated FTS table over already validated public record fields; canonical records and durable identity remain unchanged.
  • Query receipts continue to omit raw query text and bind its exact UTF-8 bytes by SHA-256; low-entropy query digests remain guessable as already disclosed.

Compatibility Impact

  • The unpublished v0.1.3 development candidate now requires query_mode in valid v1 search receipts. Earlier development-candidate receipts that omit it fail validation and must be regenerated.
  • Published v0.1.2 contracts are unchanged. Default raw search behavior remains unchanged; optional literal, supersession-filter, and BM25 behavior is additive at the API surface.

Policy Notes

  • Use a merge commit. Do not squash; promotion should preserve dev evidence and commit history.
  • Apply review fixes only to the source-bound promotion branch; do not patch main while the dev PR is under review.
  • This v2 readback ends at promotion-PR admission; it does not certify post-merge source reconciliation. If review fixes must return to main, use a separate source-based PR with explicit commit identities and evidence; never infer a range or merge unrelated dev-only work.

Post-Merge Reconciliation

  • This v2 handoff records promotion-PR admission only. It does not select reconciliation commits or declare source reconciliation complete.
  • If review fixes must return to main, open a separate source-based branch/PR that names each selected commit and its review evidence. Do not infer dd8a12430467617cb10768e1b17bea033594dec2..HEAD, merge unrelated dev-only work, or patch/force-push main during this promotion.

Summary by Sourcery

Reconcile v0.1.3 search, receipt, validation, and measurement fixes into the development branch.

New Features:

  • Improve literal search to support multiword phrases and expanding Unicode case-fold equivalence while preserving punctuation-sensitive matching.
  • Expose optional BM25 ranking consistently for raw and literal searches with non-authoritative deterministic ordering.
  • Require search receipts to identify their query mode and strengthen receipt and slice-schema validation.

Bug Fixes:

  • Correct ranked-search measurements by warming both search modes before collecting timings.
  • Ensure cross-SQLite validation retains distinct runtimes with matching versions, bounds subprocesses, and requires incapable runtimes to fail with projection-unavailable.

Enhancements:

  • Update search contracts, release notes, decision records, fixtures, and validation evidence for the v0.1.3 behavior and compatibility changes.

Documentation:

  • Document expanded literal-search semantics, required receipt query modes, BM25 behavior, and revised cross-runtime and performance evidence.

Tests:

  • Add coverage for Unicode case-folded literal matching, mandatory receipt query modes, schema outcome bindings, warmed ranking measurements, and cross-runtime matrix handling.

@sourcery-ai

sourcery-ai Bot commented Sep 10, 2026

Copy link
Copy Markdown

Reviewer's Guide

This promotion merges the v0.1.3 fixes from main into dev, preserving promotion history while improving literal-search Unicode semantics, tightening receipt and slice contracts, recalibrating ranked-search performance evidence, and strengthening cross-runtime SQLite validation.

Sequence diagram for Unicode-aware literal search

sequenceDiagram
    participant Caller
    participant Search as search_records
    participant SQLite
    participant Filter as LifecycleFilter

    Caller->>Search: search_records(index, query, literal=True)
    Search->>SQLite: _LITERAL_SOURCE_QUERY
    Search->>SQLite: CREATE VIRTUAL TABLE temp.literal_records_fts
    Search->>SQLite: INSERT folded summary and labels
    Search->>SQLite: _LITERAL_FOLDED_MATCH_QUERY
    SQLite-->>Search: Candidate records
    Search->>Filter: Apply folded containment and lifecycle filter
    Filter-->>Search: Matching record IDs
    Search-->>Caller: Literal search results
Loading

Flow diagram for warmed ranked-search measurements

flowchart LR
    A[Generate deterministic corpus] --> B[project_records]
    B --> C[_warm_search_modes]
    C --> D[search_records unranked]
    C --> E[search_records rank=True]
    D --> F[Measure median timings]
    E --> F
    F --> G[Compare bm25 and unranked cost]
Loading

File-Level Changes

Change Details Files
Promote the three source commits from main to dev while preserving their merge history and promotion evidence.
  • Records the exact source, target, commit count, merge method, validation evidence, and reconciliation constraints in the PR handoff.
  • Requires a merge commit rather than a squash and separates any future main reconciliation into an explicit source-based PR.
PR description
Expand literal search to support full Unicode case folding and multiword literal phrases without exposing raw FTS5 syntax.
  • Builds a connection-local folded FTS5 table from validated summary and label rows before matching.
  • Retains punctuation-sensitive containment filtering, lifecycle exclusion, ranked ordering, and receipt behavior.
  • Adds Straße/STRASSE/ß fixtures and coverage for library, ranked, receipt, and slice paths.
artifact_memory/projection.py
artifact_memory/cli.py
artifact_memory/search_literal_slice.py
tests/test_projection.py
tests/test_search_literal_slice.py
fixtures/synthetic/search-literal/v1/records/record-0005.json
fixtures/synthetic/search-literal/v1/records/record-0006.json
fixtures/synthetic/search-literal/v1/records/record-0007.json
fixtures/synthetic/search-literal/v1/expected-receipt.json
docs/contracts/v0-filesystem-and-projections.md
docs/decisions/0025-literal-search-and-error-code-classification.md
docs/release/v0.1.3-release-notes.md
Finalize receipt and slice schema contracts so published receipts identify query grammar and enforce internally consistent outcomes.
  • Makes v1 receipt query_mode required and updates raw/literal fixtures and validation tests.
  • Adds schema bindings between top-level outcomes and operation outcomes across integrity, search, ranking, receipt, and supersession slices.
artifact_memory/schemas/core/search-receipt.v1.schema.json
artifact_memory/schemas/core/search-receipt-slice-receipt.v1.schema.json
artifact_memory/schemas/core/search-literal-slice-receipt.v1.schema.json
artifact_memory/schemas/core/search-ranking-slice-receipt.v1.schema.json
artifact_memory/schemas/core/search-supersession-slice-receipt.v1.schema.json
artifact_memory/schemas/core/projection-integrity-slice-receipt.v1.schema.json
fixtures/synthetic/search-receipt/v1/expected-receipt.json
tests/test_projection.py
tests/test_projection_integrity_slice.py
docs/decisions/0024-digest-bearing-search-receipts.md
Reconcile ranked-search measurements using warmed comparable runs and strengthen cross-SQLite runtime evidence.
  • Warms ranked and unranked modes before timing and validates positive repeat/trial counts.
  • Retains distinct executable paths and image digests even when SQLite versions match, adds subprocess timeouts, and requires incapable runtimes to fail with projection-unavailable.
  • Adds tests for warming, argument validation, runtime retention, timeouts, and failure classification.
scripts/measure_ranked_search.py
docs/contracts/v0-performance-baseline.md
docs/decisions/0027-conditional-bm25-ranking.md
scripts/run_cross_sqlite_matrix.py
tests/test_ranked_search_measurement.py
tests/test_cross_sqlite_matrix.py
docs/release/v0.1.3-release-notes.md

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@sourcery-ai sourcery-ai 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.

Hey - I've found 1 issue

Prompt for AI Agents
Please address the comments from this code review:

## Individual Comments

### Comment 1
<location path="scripts/measure_ranked_search.py" line_range="132-136" />
<code_context>
     return round(statistics.median(samples), 3)


+def _warm_search_modes(index: Path, query: str) -> None:
+    """Pay one-time validation, connection, and page costs before timing."""
+    search_records(index, query)
+    search_records(index, query, rank=True)
+
+
 def _parse_scales(text: str) -> list[int]:
</code_context>
<issue_to_address>
**issue (testing):** The warm-up does not remove connection setup or connection-local schema/runtime costs from the timed measurements: each call to `search_records` opens and closes its own SQLite connection, and the timed calls create fresh connections after `_warm_search_modes` returns. The benchmark therefore still measures per-call cold connection costs despite claiming that connection costs are excluded.

**Triggers:** When interpreting the ranked-versus-unranked timing results as warmed measurements.

**Suggested fix:** Reuse one connection for the warm-up and all timed queries, or change the documentation and generator profile to state precisely which process- and OS-level caches are warmed.
</issue_to_address>

Sourcery assessment

Needs a human reviewer. 1 finding to address first, and if the new literal-matching or receipt-contract behavior is wrong, searches could return incorrect results or valid consumers could reject receipts lacking the new mode field. Reverting restores the prior behavior, while already-issued receipts or cached search results would need to be regenerated or repaired.

Blocking findings: scripts/measure_ranked_search.py:136


Sourcery is free for open source - if you like our reviews please consider sharing them ✨

Comment thread scripts/measure_ranked_search.py
@qodo-code-review

Copy link
Copy Markdown

PR Summary by Qodo

Fix Unicode literal search and harden v0.1.3 promotion evidence

🐞 Bug fix 🧪 Tests 📝 Documentation 🕐 40+ Minutes

Grey Divider

AI Description

• Preserve expanding Unicode case-fold equivalence in literal search and ranked receipts.
• Enforce receipt outcome consistency and required query-mode binding.
• Harden ranked benchmarks and cross-SQLite promotion evidence.
Diagram

graph TD
  CLI["CLI Flags"] --> API["Search API"]
  API --> RAW[("Durable FTS")] --> RES["Result IDs"] --> REC["Search Receipts"]
  API --> ROWS["Validated Rows"] --> TEMP[("Folded FTS")] --> RES
Loading
High-Level Assessment

The following are alternative approaches to this PR:

1. Persist a folded search index
  • ➕ Avoids rebuilding the temporary FTS table for every literal query
  • ➕ Retains FTS phrase and BM25 behavior
  • ➖ Requires a projection schema and compatibility migration
  • ➖ Expands durable integrity validation and cross-SQLite test scope
2. Scan case-folded text in Python
  • ➕ Provides direct Unicode case-fold containment semantics
  • ➕ Avoids creating a temporary SQLite virtual table
  • ➖ Loses native FTS phrase selection and BM25 ranking
  • ➖ Requires a full corpus scan for each literal query

Recommendation: Keep the connection-local folded FTS approach for v0.1.3. It fixes expanding Unicode folds without changing the durable projection contract and preserves FTS phrase and ranking semantics; a persistent folded index is worth reconsidering only if measured literal-search cost becomes material.

Files changed (28) +471 / -128

Bug fix (8) +92 / -48
projection.pyImplement Unicode-complete literal FTS matching +38/-36

Implement Unicode-complete literal FTS matching

• Builds a connection-local FTS5 table from fully case-folded validated rows for literal searches. Applies punctuation containment, lifecycle filtering, deterministic ordering, and BM25 ranking against the folded data.

artifact_memory/projection.py

projection-integrity-slice-receipt.v1.schema.jsonBind projection slice outcomes to operations +5/-1

Bind projection slice outcomes to operations

• Rejects complete receipts containing failed operations and failed receipts without a failed operation.

artifact_memory/schemas/core/projection-integrity-slice-receipt.v1.schema.json

search-literal-slice-receipt.v1.schema.jsonRequire Unicode case-fold evidence +10/-2

Require Unicode case-fold evidence

• Adds required phrase and symbol case-fold evidence fields. Also enforces consistency between the receipt outcome and operation outcomes.

artifact_memory/schemas/core/search-literal-slice-receipt.v1.schema.json

search-ranking-slice-receipt.v1.schema.jsonBind ranking slice outcomes to operations +5/-1

Bind ranking slice outcomes to operations

• Adds conditional schema constraints ensuring top-level ranking outcomes agree with operation results.

artifact_memory/schemas/core/search-ranking-slice-receipt.v1.schema.json

search-receipt-slice-receipt.v1.schema.jsonBind search receipt slice outcomes +5/-1

Bind search receipt slice outcomes

• Adds conditional validation for consistency between the slice outcome and its operation outcomes.

artifact_memory/schemas/core/search-receipt-slice-receipt.v1.schema.json

search-receipt.v1.schema.jsonRequire query mode in search receipts +1/-1

Require query mode in search receipts

• Makes query_mode mandatory so every valid v1 receipt identifies whether raw or literal grammar produced its results.

artifact_memory/schemas/core/search-receipt.v1.schema.json

search-supersession-slice-receipt.v1.schema.jsonBind supersession slice outcomes to operations +5/-1

Bind supersession slice outcomes to operations

• Enforces agreement between the top-level supersession outcome and individual operation outcomes.

artifact_memory/schemas/core/search-supersession-slice-receipt.v1.schema.json

measure_ranked_search.pyWarm both ranking modes before measurement +23/-5

Warm both ranking modes before measurement

• Adds symmetric warm-up calls before timing and advances the generator profile. Rejects nonpositive repeat and trial counts during argument parsing.

scripts/measure_ranked_search.py

Tests (11) +264 / -8
search_literal_slice.pyValidate expanding Unicode case folds +21/-1

Validate expanding Unicode case folds

• Extends the conformance slice with Straße/STRASSE and ß/ss scenarios across search and receipt APIs. Records the new evidence and limitation wording in the generated receipt.

artifact_memory/search_literal_slice.py

expected-receipt.jsonRefresh literal-search conformance receipt +17/-4

Refresh literal-search conformance receipt

• Adds Unicode case-fold evidence and the new verification operation. Updates projection counts, digests, limitations, and the receipt identifier.

fixtures/synthetic/search-literal/v1/expected-receipt.json

record-0005.jsonAdd uppercase STRASSE fixture +18/-0

Add uppercase STRASSE fixture

• Adds an accepted synthetic record covering the uppercase expanded form of Straße.

fixtures/synthetic/search-literal/v1/records/record-0005.json

record-0006.jsonAdd sharp-s phrase fixture +18/-0

Add sharp-s phrase fixture

• Adds an accepted synthetic record containing Straße for expanding case-fold equivalence testing.

fixtures/synthetic/search-literal/v1/records/record-0006.json

record-0007.jsonAdd standalone sharp-s fixture +18/-0

Add standalone sharp-s fixture

• Adds an accepted synthetic record verifying that literal ss can match a case-folded ß token.

fixtures/synthetic/search-literal/v1/records/record-0007.json

expected-receipt.jsonRefresh search receipt ranking evidence +2/-2

Refresh search receipt ranking evidence

• Updates the ranking limitation text and regenerates the receipt identifier.

fixtures/synthetic/search-receipt/v1/expected-receipt.json

test_cross_sqlite_matrix.pyTest runtime retention and fail-closed classification +70/-0

Test runtime retention and fail-closed classification

• Verifies distinct executable paths remain represented despite matching SQLite versions, CLI calls use timeouts, and incapable runtimes return the required failure code.

tests/test_cross_sqlite_matrix.py

test_projection.pyTest expanding Unicode literal search +33/-0

Test expanding Unicode literal search

• Covers Straße/STRASSE and ß/ss equivalence for ranked, unranked, and receipt searches. Also verifies that query_mode is mandatory in search receipts.

tests/test_projection.py

test_projection_integrity_slice.pyTest slice outcome consistency constraints +25/-1

Test slice outcome consistency constraints

• Mutates each affected receipt type to verify schemas reject inconsistent top-level and operation outcomes.

tests/test_projection_integrity_slice.py

test_ranked_search_measurement.pyTest benchmark warm-up and argument validation +34/-0

Test benchmark warm-up and argument validation

• Confirms both search modes are warmed and rejects zero, negative, or invalid repeat and trial counts before measurement.

tests/test_ranked_search_measurement.py

test_search_literal_slice.pyAssert Unicode case-fold receipt evidence +8/-0

Assert Unicode case-fold receipt evidence

• Checks that the replayed literal-search receipt contains the expected phrase and standalone-symbol matches.

tests/test_search_literal_slice.py

Documentation (8) +70 / -51
cli.pyClarify literal query CLI semantics +2/-2

Clarify literal query CLI semantics

• Updates search and search-receipt help text to describe literal input as one query string rather than one term.

artifact_memory/cli.py

search_receipt_slice.pyCorrect ranking limitation evidence +1/-1

Correct ranking limitation evidence

• Updates receipt evidence to acknowledge optional, non-authoritative BM25 ranking while preserving record-ID ordering by default.

artifact_memory/search_receipt_slice.py

v0-filesystem-and-projections.mdDocument folded literal search processing +8/-6

Document folded literal search processing

• Explains multiword literal queries, temporary folded FTS indexing, punctuation significance, and expanding Unicode equivalence.

docs/contracts/v0-filesystem-and-projections.md

v0-performance-baseline.mdPublish symmetrically warmed ranking measurements +10/-7

Publish symmetrically warmed ranking measurements

• Updates the benchmark profile and results after warming ranked and unranked modes equally before sampling.

docs/contracts/v0-performance-baseline.md

0024-digest-bearing-search-receipts.mdReconcile search receipt contract decisions +8/-7

Reconcile search receipt contract decisions

• Documents SQLite result-code classification, mandatory query-mode binding, and the availability and limitations of optional BM25 ranking.

docs/decisions/0024-digest-bearing-search-receipts.md

0025-literal-search-and-error-code-classification.mdDefine Unicode literal-query semantics +22/-18

Define Unicode literal-query semantics

• Revises the decision to cover multiword strings, connection-local folded FTS processing, expanding Unicode folds, and required receipt query modes.

docs/decisions/0025-literal-search-and-error-code-classification.md

0027-conditional-bm25-ranking.mdRecord corrected ranking benchmark methodology +6/-5

Record corrected ranking benchmark methodology

• Documents symmetric warm-up behavior and the reconciled v3 benchmark measurements.

docs/decisions/0027-conditional-bm25-ranking.md

v0.1.3-release-notes.mdReconcile v0.1.3 search and matrix guarantees +13/-5

Reconcile v0.1.3 search and matrix guarantees

• Clarifies Unicode literal matching, table-specific BM25 ranking, per-query folded-table cost, and cross-runtime matrix safeguards.

docs/release/v0.1.3-release-notes.md

Other (1) +45 / -21
run_cross_sqlite_matrix.pyHarden cross-SQLite runtime coverage +45/-21

Harden cross-SQLite runtime coverage

• Deduplicates runtimes by executable path or container digest instead of reported version and bounds CLI subprocesses. Requires incapable library runtimes to fail specifically with projection-unavailable.

scripts/run_cross_sqlite_matrix.py

@joefeser

Copy link
Copy Markdown
Owner Author

@codex review

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 10, 2026

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review Completed 2026-09-10T19:24:26.647194Z 5c27a85 Manual request
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@qodo-code-review

qodo-code-review Bot commented Sep 10, 2026

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (0) 📘 Rule violations (1) 🔗 Cross-repo conflicts (0) 📜 Skill insights (0)

Grey Divider


Remediation recommended

1. Failed receipts lack runtime coverage ✓ Resolved 📘 Rule violation ▣ Testability
Description
test_new_slice_schemas_bind_top_level_outcome_to_operation_outcomes edits checked-in JSON and
calls only validate(), so it never exercises a slice runner's failed-outcome behavior. The new
failed-outcome constraints across five receipt schemas therefore lack a test that induces an
operation failure through the actual implementation and asserts the emitted top-level outcome.
Code

tests/test_projection_integrity_slice.py[R47-50]

+                failed_without_failure = json.loads(json.dumps(receipt))
+                failed_without_failure["outcome"] = "failed"
+                with self.assertRaises(ValidationFailure):
+                    validate(failed_without_failure, schema)
Relevance

●● Moderate

Schema constraints received accepted negative-validation coverage, but runtime-failure coverage
expectations lack decisive precedent.

PR-#124

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
Compliance rule 3180973 requires tests for changed normative contract behavior to invoke the actual
implementation rather than only validate schema documents. The five schemas add outcome-consistency
constraints, while the shared test covers their negative cases exclusively by modifying fixture
dictionaries and passing them to validate().

Rule 3180973: Ensure normative behaviors in API contracts have matching conformance tests
tests/test_projection_integrity_slice.py[28-50]
artifact_memory/schemas/core/projection-integrity-slice-receipt.v1.schema.json[67-70]
artifact_memory/schemas/core/search-literal-slice-receipt.v1.schema.json[56-59]
artifact_memory/schemas/core/search-ranking-slice-receipt.v1.schema.json[62-65]
artifact_memory/schemas/core/search-receipt-slice-receipt.v1.schema.json[53-56]
artifact_memory/schemas/core/search-supersession-slice-receipt.v1.schema.json[50-53]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The new receipt-schema constraints bind failed top-level outcomes to failed operations, but the added negative test only mutates serialized fixtures and validates their schemas. It does not verify that the actual slice implementations emit conforming failed receipts.

## Fix Focus Areas
- tests/test_projection_integrity_slice.py[28-50]

## Recommended Fix
Add implementation-level tests that induce an operation failure in each affected slice runner, invoke the runner normally, and assert that the resulting receipt has a failed top-level outcome and at least one failed operation before validating it against the corresponding schema.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


2. Reviewers lack impact disclosures 📘 Rule violation § Compliance
Description
The PR description has no explicit security-impact or compatibility-impact statement, despite
changing query_mode from optional to required in the v1 search-receipt schema. Reviewers assessing
this promotion therefore have no declared account of security implications or of how receipts
without query_mode are handled.
Code

artifact_memory/schemas/core/search-receipt.v1.schema.json[7]

+  "required": ["schema_id", "outcome", "query_mode", "query_digest", "record_ids", "source_record_set_digest", "integrity_gate"],
Relevance

●● Moderate

Schema compatibility change is real, but no close precedent confirms acceptance of description-only
impact disclosures.

PR-#124

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
Compliance rule 3181010 requires explicit security and compatibility statements in the PR
description, including explicit no-impact statements when applicable. The supplied description
contains neither topic, while the changed schema demonstrates a compatibility-relevant
required-field change that should be disclosed.

Rule 3181010: Document security and compatibility impact in pull request descriptions
artifact_memory/schemas/core/search-receipt.v1.schema.json[7-7]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The PR description does not explicitly disclose security or compatibility impact even though the promoted changes tighten a versioned receipt contract.

## Fix Focus Areas
- artifact_memory/schemas/core/search-receipt.v1.schema.json[7-7]

## Recommended Fix
Update the PR description with clearly labeled `Security impact` and `Compatibility impact` sections. State the security effect or explicitly say none is known, and explain that valid v1 search receipts now require `query_mode`, including the treatment of earlier development-candidate receipts that omit it.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

Context sources
✅ Compliance rules (platform): 18 rules
✅ Cross-repo context — repo relationships
  Explored: repo: joefeser/what-is-the-spec (sha: 2a288b6a)
Review mode: 🧠 Deep: This promotion changes Unicode literal-search execution, receipt schemas, SQLite runtime-matrix behavior, measurement tooling, and multiple contract/test paths across 28 files, creating many independent logic sites where subtle defects could be missed in one pass.

Grey Divider

Tip of the day
💡 Did you know, you can turn these tips off under Display preferences

More tips ↗ | Customize Qodo ↗ | Qodo docs ↗

Grey Divider

Qodo Logo

Comment thread tests/test_projection_integrity_slice.py
Comment thread artifact_memory/schemas/core/search-receipt.v1.schema.json
@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Swish!

Reviewed commit: dd8a124304

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@joefeser

Copy link
Copy Markdown
Owner Author

PR review loop disposition:

  • Comment: Reconcile v0.1.3 promotion fixes from main into dev #126 (comment)
  • Reason: Qodo's top-level summary duplicates its two inline findings from source head dd8a124. The runtime failed-receipt coverage is fixed in 5c27a85, and the PR description now contains the requested security and compatibility disclosures; both inline threads are resolved.
  • Fixing commit: 5c27a85
  • Validation evidence: 640 tests pass; public JSON and contract validation, conformance, public-safety, and the seven-runtime SQLite matrix pass; PR body newline and disclosure checks pass.
  • Residual risk: The Qodo summary itself remains historical evidence for the previous head; no separate unresolved correction remains.

This note records why the loop is not waiting indefinitely on this finding state.

@sourcery-ai sourcery-ai 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.

Sourcery assessment

Approved.

@joefeser

Copy link
Copy Markdown
Owner Author

@codex review

agent-control fresh required Codex review request

  • Current head: 5c27a85
  • Prior reviewed head: dd8a124
  • Reason: agent-control clean stale-review recovery: current head 5c27a85 has no unresolved threads, actionable bot findings, failed checks, or unacceptable merge state after patching review findings

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. 👍

Reviewed commit: 5c27a856d3

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@joefeser
joefeser merged commit 214d947 into dev Sep 10, 2026
6 checks passed
@joefeser
joefeser deleted the codex/promote-main-to-dev-dd8a12430467 branch September 10, 2026 19:32
joefeser added a commit that referenced this pull request Sep 10, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant