Skip to content

WS-ART-001-03A: hidden guide source byte ingest - #215

Merged
abiorh-claw merged 12 commits into
mainfrom
codex/ws-art-001-03a-guide-source-byte-ingest
Jul 28, 2026
Merged

WS-ART-001-03A: hidden guide source byte ingest#215
abiorh-claw merged 12 commits into
mainfrom
codex/ws-art-001-03a-guide-source-byte-ingest

Conversation

@Abiorh001

@Abiorh001 Abiorh001 commented Jul 28, 2026

Copy link
Copy Markdown
Collaborator

PR Trust Bundle: WS-ART-001-03A

Chunk

WS-ART-001-03A — Guide Source Byte Ingest (L1)

Goal And Human-Approved Intent

Accept exact guide-source bytes through bounded private scratch and the existing
immutable ArtifactStore path, without binding or activating guide reads yet.

What Changed And Why

  • Added a hidden guide item artifact route that defaults to concealed denial.
  • Added server-owned guide ingest staging facts and migration 0038.
  • Reused preparation, capacity admission, put attempt, verification, ambiguity,
    and recovery paths instead of adding candidate storage.
  • Bound final durable effects to one opaque transaction-local AUTH handle and
    exact locked lineage plus server-computed digest, size, and media type.
  • Added confirmed-missing replay, downgrade refusal, focused tests, and the
    exact projects subsystem coverage gate.

Design And Scope Control

Preflight occurs before runtime construction or byte reads. Final PREP consume,
staging, capacity reservation, and put intent commit together. Provider I/O
runs afterward through the already-activated fixed-service put resolver.
Binding, materialization, setup continuation, legacy removal, and guide action
activation remain outside 03A. No provider/factory or public API expansion was
introduced.

Acceptance Proof

  • Server bytes, not caller hashes or provider references, define identity.
  • Exact replay reuses the attempt; confirmed absence reacquires released
    capacity before another conditional write.
  • Hidden malformed/missing idempotency metadata returns 404 without ingest.
  • Populated guide-ingest evidence cannot be destroyed by downgrade.
  • Nine internal reviewer tracks pass after all blocking repairs.

Tests And CI Integrity

Focused route/architecture tests, isolated PostgreSQL migration/admission/replay
tests, changed-file Ruff, compilation, stale-contract/wording/auth scans,
Markdown links, diff checks, and agent gates pass. GitHub owns the full sharded
suite, repository 78% floor, and accumulated 90% subsystem gates; thresholds
were not lowered and the exact projects 90% gate was added.

Remaining Risks And Follow-Up

The guide ingest action intentionally remains unavailable. After this PR merges,
AUTH WS-XINT-002-04A installs the exact Project Manager adapter and activates
only guide ingestion. ART-03B remains a separate explicit-start successor.

Human Review Focus And Merge Ownership

Confirm the two authorization points, commit-before-provider boundary,
confirmed-missing replay, and strict 03A scope. The user retains approval and
merge ownership for this specific PR.

Summary by CodeRabbit

  • New Features

    • Added groundwork for guide-source artifact ingestion with server-managed integrity metadata, lineage checks, idempotent replay handling, and transaction-safe storage preparation.
    • Added a concealed ingestion endpoint that remains unavailable until authorization is enabled.
  • Bug Fixes

    • Improved fail-closed behavior for invalid requests, mismatched lineage, incomplete metadata, and unauthorized ingestion attempts.
  • Documentation

    • Clarified artifact storage, verification, coverage, migration, and authorization requirements.

@coderabbitai

coderabbitai Bot commented Jul 28, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@Abiorh001, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 35 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 379443ba-95f4-433f-8d29-2e3c8a07eab3

📥 Commits

Reviewing files that changed from the base of the PR and between ab90c60 and 21337f2.

📒 Files selected for processing (8)
  • .agent-loop/initiatives/WS-ART-001-immutable-artifact-storage/REVIEW_LOG.md
  • .agent-loop/initiatives/WS-ART-001-immutable-artifact-storage/reviews/WS-ART-001-03A-external-review-response.md
  • .agent-loop/initiatives/WS-ART-001-immutable-artifact-storage/reviews/WS-ART-001-03A-pr-trust-bundle.md
  • backend/app/adapters/artifacts/__init__.py
  • backend/app/modules/artifacts/authorization.py
  • backend/app/modules/projects/router.py
  • backend/tests/test_artifact_architecture.py
  • backend/tests/test_guide_artifacts.py
📝 Walkthrough

Walkthrough

Guide-source byte ingest is added behind a fail-closed authorization boundary. The change introduces durable ingest staging and migration safeguards, transactional admission and replay-aware publishing, a hidden route, focused tests, and updated CI and review evidence.

Changes

Guide artifact ingest

Layer / File(s) Summary
Ingest contracts and authorization boundary
backend/app/interfaces/artifact_operations.py, backend/app/modules/artifacts/authorization.py, backend/app/modules/artifacts/schemas.py, backend/app/modules/artifacts/router.py
Guide ingest request/result contracts, canonical authority facts, prepared authorization, deny-only defaults, and shared authorization dependency wiring are added or updated.
Durable ingest storage and lineage
backend/alembic/versions/0038_guide_source_artifact_ingests.py, backend/app/modules/projects/models.py, backend/app/modules/artifacts/repository.py, backend/tests/test_alembic.py, backend/tests/conftest.py
A guide_source_artifact_ingests table and model are added with lineage, integrity constraints, indexes, populated-downgrade refusal, canonical lineage locking, and staged conflict-aware upserts.
Transactional ingest orchestration and route
backend/app/adapters/artifacts/__init__.py, backend/app/modules/artifacts/service.py, backend/app/modules/projects/router.py, backend/app/modules/projects/schemas.py, docs/spec_artifact_storage_service.md
Runtime dependency construction, prepared-byte admission, transaction ownership, replay-aware committed-put resumption, server-derived commitments, and a hidden streaming POST route are implemented and documented.
Ingest behavior and boundary tests
backend/tests/test_guide_artifacts.py, backend/tests/test_artifact_admission.py, backend/tests/test_artifact_internal_authorization.py, backend/tests/test_artifact_recovery.py
Tests cover fail-closed authorization, request validation, lineage drift, cleanup, replay selection, transaction boundaries, staged commitments, hidden routing, and provider-I/O behavior.
CI gates and implementation evidence
.agent-loop/..., backend/scripts/run_test_lanes.py, scripts/test_lightweight_agent_gates.py
Coverage-step verification, test-lane inventory, merge metadata, verification plans, review logs, internal evidence, and trust-bundle documentation are updated.

Estimated code review effort: 5 (Critical) | ~90 minutes

Possibly related PRs

Suggested reviewers: abiorh-claw

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Description check ⚠️ Warning The description covers the core bundle but omits several required template sections, including evidence commands/results, reviewer tables, and explicit alternatives. Fill in the missing template sections: Intent And Planning Context, Alternatives Rejected, Evidence with commands/results, Test Delta, reviewer results, CI integrity checks, and merge ownership details.
Docstring Coverage ⚠️ Warning Docstring coverage is 39.86% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title is concise and accurately summarizes the main change: hidden guide source byte ingest.
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.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch codex/ws-art-001-03a-guide-source-byte-ingest

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.

@Abiorh001
Abiorh001 force-pushed the codex/ws-art-001-03a-guide-source-byte-ingest branch from b37793d to 5d03900 Compare July 28, 2026 14:03

@coderabbitai coderabbitai 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.

Actionable comments posted: 3

🧹 Nitpick comments (5)
backend/app/modules/artifacts/authorization.py (1)

80-87: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Consider explicit keyword-only params instead of **values: UUID.

This digest is security-relevant (it must match AUTH's prepared-request binding). With **values, a mistyped or omitted keyword at a call site fails only at runtime inside guide_ingest_prepared_request_value, and type checkers can't verify arity. Mirroring the five explicit keyword-only parameters keeps the binding statically checked.

♻️ Explicit signature
-def guide_ingest_prepared_request_digest(**values: UUID) -> str:
+def guide_ingest_prepared_request_digest(
+    *,
+    project_id: UUID,
+    guide_id: UUID,
+    guide_source_snapshot_id: UUID,
+    guide_source_item_id: UUID,
+    idempotency_key: UUID,
+) -> str:
     """Match PreparedAuthorizationService's canonical request binding."""
     return canonical_json_hash(
         {
             "domain": "workstream.prepared_authorization.request.v1",
-            "request": guide_ingest_prepared_request_value(**values),
+            "request": guide_ingest_prepared_request_value(
+                project_id=project_id,
+                guide_id=guide_id,
+                guide_source_snapshot_id=guide_source_snapshot_id,
+                guide_source_item_id=guide_source_item_id,
+                idempotency_key=idempotency_key,
+            ),
         }
     )
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@backend/app/modules/artifacts/authorization.py` around lines 80 - 87, Update
guide_ingest_prepared_request_digest to declare the same five explicit
keyword-only parameters as guide_ingest_prepared_request_value, preserving their
UUID types and forwarding them to the existing request-value helper. Remove the
**values signature so callers and type checkers enforce the required names and
arity while keeping the canonical hashing behavior unchanged.
backend/tests/test_artifact_recovery.py (1)

77-85: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Duplicated test double across three suites.

The same _AllowGuidePreparedAuthorization (handle via object.__new__, consume returning the actor profile id) also appears in backend/tests/test_artifact_admission.py and backend/tests/test_artifact_internal_authorization.py. Moving it to conftest.py keeps the three copies from drifting as the prepared-authorization contract evolves.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@backend/tests/test_artifact_recovery.py` around lines 77 - 85, Move the
shared _AllowGuidePreparedAuthorization test double into the applicable
conftest.py, preserving its object.__new__(PreparedAuthorizationHandle) setup
and consume behavior. Remove the duplicate class definitions from
test_artifact_recovery.py, test_artifact_admission.py, and
test_artifact_internal_authorization.py so all three suites reuse the
centralized fixture/helper.
backend/tests/test_artifact_architecture.py (1)

37-37: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Optionally extend the structural checks to results.

CANONICAL_REQUESTS is verified against AST class names and the forbidden-field set, but CANONICAL_RESULTS is only checked for __all__ membership. A future result dataclass could expose provider_object_ref/storage_namespace without failing this guard.

♻️ Suggested addition
+    result_names = {
+        node.name
+        for node in tree.body
+        if isinstance(node, ast.ClassDef) and node.name.endswith("Result")
+    }
+    assert result_names == CANONICAL_RESULTS

Then include CANONICAL_RESULTS in the class_node.name in CANONICAL_REQUESTS filter used for forbidden_fields.

Also applies to: 287-333

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@backend/tests/test_artifact_architecture.py` at line 37, Extend the
structural forbidden-field validation to cover result classes as well as request
classes. In the AST class-name filter around CANONICAL_REQUESTS and
forbidden_fields, include CANONICAL_RESULTS so canonical result dataclasses are
rejected when exposing provider_object_ref or storage_namespace, while
preserving the existing __all__ checks.
backend/app/modules/artifacts/service.py (1)

306-347: 🚀 Performance & Scalability | 🔵 Trivial | 🏗️ Heavy lift

Byte upload happens while the PREP transaction is open.

prepare_and_admit streams and hashes the entire client body inside the authority transaction (_artifact_admission_transaction(existing=True) reuses the issuer's root transaction). With the deny adapter this is inert, but once 04A activates a real AUTH-backed adapter, a slow or stalled upload will hold an open DB transaction — and any rows locked during prepare — for the full transfer duration, risking connection-pool exhaustion and lock contention.

Worth confirming the activation plan either bounds body read time or moves preparation ahead of the transaction open.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@backend/app/modules/artifacts/service.py` around lines 306 - 347, Move the
body-consuming `prepare_and_admit` call in the artifact ingestion flow so byte
upload and hashing complete before `authority_transaction` is opened, or
otherwise enforce a strict bounded read timeout before entering the transaction.
Preserve the existing authorization preparation and admission behavior, and
update the surrounding `transaction_open` lifecycle in the containing method to
match the new ordering.
backend/app/modules/artifacts/repository.py (1)

165-213: 🚀 Performance & Scalability | 🔵 Trivial | ⚡ Quick win

stage_guide_source_ingest re-fetches lineage that the caller already locked.

admit() in service.py calls self._repo.get_guide_lineage(...) to build the authority facts, then immediately calls stage_guide_source_ingest, which calls get_guide_lineage again internally — the same FOR UPDATE query on GuideSourceSnapshotItem/GuideSourceSnapshot runs twice per admission. It's not incorrect (Postgres re-locks the already-held row for the same transaction without blocking), just a redundant round trip on the ingest hot path.

Consider accepting the previously-fetched GuideLineageFacts as a parameter so stage_guide_source_ingest doesn't need to re-query.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@backend/app/modules/artifacts/repository.py` around lines 165 - 213, Update
stage_guide_source_ingest to accept the previously fetched GuideLineageFacts
from admit instead of calling get_guide_lineage again; validate the supplied
lineage against guide_source_snapshot_id, guide_id, project_id, and
guide_source_item_id, while preserving the existing ingest conflict and
persistence behavior.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@backend/app/adapters/artifacts/__init__.py`:
- Around line 156-180: Move scratch-manager construction into the existing
cleanup-protected flow around the bootstrap setup so any
ArtifactConfigurationError from create_artifact_scratch_manager still reaches
cleanup. Ensure bootstrap.close() runs whenever bootstrap was created, while
manager.close() runs only after the manager is successfully constructed;
preserve the existing yielded services and initialization behavior.

In `@backend/app/modules/projects/router.py`:
- Around line 232-247: Parse project_id, guide_id, source_snapshot_id,
source_item_id, and the optional idempotency_key before the try block,
preserving the concealed 404 response for parsing failures. Pass the parsed UUID
values into ingest.ingest, and remove ValueError from the exception tuple so
only ArtifactAdmissionRelationshipError and ArtifactAuthorityDeniedError are
mapped to 404; unrelated ValueError instances must propagate distinctly.

In `@scripts/test_lightweight_agent_gates.py`:
- Around line 54-61: Update
test_backend_workflow_has_one_project_subsystem_coverage_gate so it extracts the
named “Project subsystem coverage” workflow step, asserts that step contains the
expected coverage command, and verifies the step appears after “Backend
full-suite coverage”; do not count the step name and command independently
across the entire workflow.

---

Nitpick comments:
In `@backend/app/modules/artifacts/authorization.py`:
- Around line 80-87: Update guide_ingest_prepared_request_digest to declare the
same five explicit keyword-only parameters as
guide_ingest_prepared_request_value, preserving their UUID types and forwarding
them to the existing request-value helper. Remove the **values signature so
callers and type checkers enforce the required names and arity while keeping the
canonical hashing behavior unchanged.

In `@backend/app/modules/artifacts/repository.py`:
- Around line 165-213: Update stage_guide_source_ingest to accept the previously
fetched GuideLineageFacts from admit instead of calling get_guide_lineage again;
validate the supplied lineage against guide_source_snapshot_id, guide_id,
project_id, and guide_source_item_id, while preserving the existing ingest
conflict and persistence behavior.

In `@backend/app/modules/artifacts/service.py`:
- Around line 306-347: Move the body-consuming `prepare_and_admit` call in the
artifact ingestion flow so byte upload and hashing complete before
`authority_transaction` is opened, or otherwise enforce a strict bounded read
timeout before entering the transaction. Preserve the existing authorization
preparation and admission behavior, and update the surrounding
`transaction_open` lifecycle in the containing method to match the new ordering.

In `@backend/tests/test_artifact_architecture.py`:
- Line 37: Extend the structural forbidden-field validation to cover result
classes as well as request classes. In the AST class-name filter around
CANONICAL_REQUESTS and forbidden_fields, include CANONICAL_RESULTS so canonical
result dataclasses are rejected when exposing provider_object_ref or
storage_namespace, while preserving the existing __all__ checks.

In `@backend/tests/test_artifact_recovery.py`:
- Around line 77-85: Move the shared _AllowGuidePreparedAuthorization test
double into the applicable conftest.py, preserving its
object.__new__(PreparedAuthorizationHandle) setup and consume behavior. Remove
the duplicate class definitions from test_artifact_recovery.py,
test_artifact_admission.py, and test_artifact_internal_authorization.py so all
three suites reuse the centralized fixture/helper.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: a0ff7be3-7eff-4e14-af07-4ddba4232ea2

📥 Commits

Reviewing files that changed from the base of the PR and between 033654a and 5d03900.

📒 Files selected for processing (30)
  • .agent-loop/initiatives/WS-ART-001-immutable-artifact-storage/PLAN.md
  • .agent-loop/initiatives/WS-ART-001-immutable-artifact-storage/REVIEW_LOG.md
  • .agent-loop/initiatives/WS-ART-001-immutable-artifact-storage/chunks/WS-ART-001-03A-guide-source-byte-ingest.md
  • .agent-loop/initiatives/WS-ART-001-immutable-artifact-storage/reviews/WS-ART-001-03A-internal-review-evidence.md
  • .agent-loop/initiatives/WS-ART-001-immutable-artifact-storage/reviews/WS-ART-001-03A-pr-trust-bundle.md
  • .agent-loop/merge-intents/WS-ART-001-03A.json
  • .github/workflows/backend.yml
  • backend/alembic/versions/0038_guide_source_artifact_ingests.py
  • backend/app/adapters/artifacts/__init__.py
  • backend/app/interfaces/artifact_operations.py
  • backend/app/modules/artifacts/authorization.py
  • backend/app/modules/artifacts/repository.py
  • backend/app/modules/artifacts/router.py
  • backend/app/modules/artifacts/schemas.py
  • backend/app/modules/artifacts/service.py
  • backend/app/modules/projects/models.py
  • backend/app/modules/projects/router.py
  • backend/app/modules/projects/schemas.py
  • backend/scripts/run_test_lanes.py
  • backend/tests/conftest.py
  • backend/tests/test_alembic.py
  • backend/tests/test_artifact_admission.py
  • backend/tests/test_artifact_architecture.py
  • backend/tests/test_artifact_authorization.py
  • backend/tests/test_artifact_internal_authorization.py
  • backend/tests/test_artifact_recovery.py
  • backend/tests/test_ci_test_lanes.py
  • backend/tests/test_guide_artifacts.py
  • docs/spec_artifact_storage_service.md
  • scripts/test_lightweight_agent_gates.py

Comment thread backend/app/adapters/artifacts/__init__.py
Comment thread backend/app/modules/projects/router.py
Comment thread scripts/test_lightweight_agent_gates.py Outdated

@coderabbitai coderabbitai 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.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@backend/tests/test_guide_artifacts.py`:
- Around line 382-415: Update
test_guide_ingest_rejects_invalid_logical_role_before_preparation to expect
ArtifactAdmissionRelationshipError instead of the broad Exception type, while
preserving the existing message match and assertions that the source is not read
and no cleanup is pending.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 91babf2e-c939-4f48-a2ad-e3df51def937

📥 Commits

Reviewing files that changed from the base of the PR and between 5d03900 and ab90c60.

📒 Files selected for processing (7)
  • .agent-loop/initiatives/WS-ART-001-immutable-artifact-storage/PLAN.md
  • .agent-loop/initiatives/WS-ART-001-immutable-artifact-storage/REVIEW_LOG.md
  • .agent-loop/initiatives/WS-ART-001-immutable-artifact-storage/chunks/WS-ART-001-03A-guide-source-byte-ingest.md
  • .agent-loop/initiatives/WS-ART-001-immutable-artifact-storage/reviews/WS-ART-001-03A-internal-review-evidence.md
  • .agent-loop/initiatives/WS-ART-001-immutable-artifact-storage/reviews/WS-ART-001-03A-pr-trust-bundle.md
  • backend/tests/test_guide_artifacts.py
  • scripts/test_lightweight_agent_gates.py
💤 Files with no reviewable changes (1)
  • scripts/test_lightweight_agent_gates.py
🚧 Files skipped from review as they are similar to previous changes (5)
  • .agent-loop/initiatives/WS-ART-001-immutable-artifact-storage/REVIEW_LOG.md
  • .agent-loop/initiatives/WS-ART-001-immutable-artifact-storage/reviews/WS-ART-001-03A-internal-review-evidence.md
  • .agent-loop/initiatives/WS-ART-001-immutable-artifact-storage/chunks/WS-ART-001-03A-guide-source-byte-ingest.md
  • .agent-loop/initiatives/WS-ART-001-immutable-artifact-storage/reviews/WS-ART-001-03A-pr-trust-bundle.md
  • .agent-loop/initiatives/WS-ART-001-immutable-artifact-storage/PLAN.md

Comment thread backend/tests/test_guide_artifacts.py
@Abiorh001
Abiorh001 requested a review from abiorh-claw July 28, 2026 16:10
@abiorh-claw
abiorh-claw merged commit bb9082a into main Jul 28, 2026
3 checks passed
@abiorh-claw
abiorh-claw deleted the codex/ws-art-001-03a-guide-source-byte-ingest branch July 28, 2026 17:02
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.

2 participants