Skip to content

feat: add read-only case growth convergence verifier - #87

Draft
raylee-hawkins wants to merge 65 commits into
mainfrom
feature/hoxline-case-growth-convergence-v1
Draft

feat: add read-only case growth convergence verifier#87
raylee-hawkins wants to merge 65 commits into
mainfrom
feature/hoxline-case-growth-convergence-v1

Conversation

@raylee-hawkins

@raylee-hawkins raylee-hawkins commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

Repair objective

Close the adversarial convergence findings owned by this repository and make its trust-boundary verification fail closed under exact content identity and reviewed source selection.

Findings closed

PP-PLATFORM-001, PP-PLATFORM-002, PP-PLATFORM-003, INT-002, INT-003

Authority surface

platform contract and read-only mechanical convergence truth only

Before / after attack behavior

Before: content-addressed currentness, rewrite projections, and zero-mutation enforcement admitted one or more malformed, ambiguous, stale, unbound, or CI-unenforced states identified by the adversarial packet.

After: closed schemas, canonical identity and path checks, recursive claim controls, content-addressed provenance, reverse inventory, replay/pair binding, and required CI reject the attacks while preserving only the bounded authority surface.

Files changed (19)

  • .github/workflows/governance-gate.yml
  • .github/workflows/hoxline-main-checks.yml
  • .github/workflows/hoxline-private-canary.yml
  • .github/workflows/hoxline-schedule-gated-collection.yml
  • .github/workflows/hoxline-source-checks.yml
  • .github/workflows/hoxline-trusted-runtime-verify.yml
  • .github/workflows/local-gpu-triage-gate.yml
  • .github/workflows/runtime-case-collector-v0-linux.yml
  • .github/workflows/runtime-case-collector-v0-windows.yml
  • contracts/examples/hoxline-remote-lab-authority-v1.controlled.json
  • contracts/hoxline-case-growth-source-manifest-v1.json
  • contracts/public-status-source-contract-v1.json
  • docs/factory/DETECTION_FACTORY_CONTROLLER_V0.md
  • scripts/ho_factory.py
  • scripts/verify-public-status-source-contract.py
  • tests/test_hoxline_case_growth_convergence.py
  • tests/test_hoxline_private_reviewer_cockpit.py
  • tests/test_hoxline_runtime_ops.py
  • tests/test_verify_public_status_source_contract.py

Positive tests

  • python -B scripts/ho_factory.py hoxline-case-growth-convergence-verify --repo-root .. --format json
  • python -B scripts/verify-public-status-source-contract.py --format json
  • python -B -m unittest discover -s tests

Hostile tests

  • detached/unselected revisions, arbitrary ancestors, dirty authority, wrong repository, changed blob, extra path, foreign projection, nested claims, and mutation-boundary probes

Required CI and current results

Clean room

PASS — Canonical GitHub clones at the exact seven final heads were tracked-clean and passed the command-center source set, 77 detection tests, 134 validation tests, 81 proof tests, 215 Platform tests, atomic Case Growth generation and verification, aligned Hoxline batch replay, Website generation and verification, and the declared claim and mutation boundaries.

Cross-repository dependency state

  • command-center source manifest
  • detection, validation, proof, Website, and Hoxline content identities

Related PRs:

Generated artifact state

No pre-merge semantic regeneration remains. The Hoxline JSON/Markdown pair is atomic and current by authority blob identity; Website generation verifies at its sealed content identity. After each separately authorized merge wave, record the actual main heads and rerun owning and seven-repository convergence checks. If authority blobs are unchanged, only freshness observations require refresh; final GitHub merge SHAs remain unknown before merge.

Known limitations

  • POST_MERGE_FOLLOW_UP — Website dependency advisories: npm audit reports three high and zero critical advisories: Next 14.2.35 via PostCSS 8.4.31 and Sharp 0.33.5; npm proposes semver-major Next 16.2.11 and Sharp 0.35.3, so no unrelated major upgrade was taken in this repair scope.
  • ENVIRONMENT_ONLY — Playwright default browser cache: The default browser cache lacked the declared Chromium binary; an isolated install under the approved Data root produced 5/5 passing visual tests.
  • ENVIRONMENT_ONLY — Python cache directories: Only attributed untracked scripts/tests pycache directories remain in detections, validation, and Platform; no tracked or overlapping dirt exists.
  • NON_ISSUE_WITH_EVIDENCE — Platform ledger job skip: The mutation-capable ledger job is intentionally excluded from pull-request execution; required source and convergence checks ran and succeeded, and the skip cannot satisfy or mask them.
  • NON_ISSUE_WITH_EVIDENCE — Atomic generated-pair parent observations: The final pair verifies with zero errors. Its command-center and Hoxline observed heads are explicitly classified as expected historical context created by committing the pair and then sealing its immutable head; their authoritative blobs are current.
  • MERGE_BLOCKING — Eligible independent human review: All seven PRs have zero submitted reviews and zero unresolved threads. Visible eligible human review and explicit MERGE_APPROVED remain required; green CI and Codex review are not approval.

Private-data and claim-boundary scans

  • Private scan: PASS; zero credential, private-key, MUFG, customer-identifier, or raw private-evidence exposure; five lexical hits were verifier patterns, negative fixtures, or explicit do-not-publish guidance
  • Claim-boundary scan: PASS; promotion vocabulary appears only in blocked-claim data, bounded proof ceilings, verifier deny-lists, and hostile tests
  • Banned tracked vocabulary: PASS; zero tracked hits across 246 changed files

Replacement review packet

  • Path: C:\Raylee\Work\HawkinsOperations\repair-sprint-v1\FINAL_REVIEW_AND_MERGE_REHEARSAL.md
  • SHA-256: BCD3041112E4B845F604794B240449C64ED6AA265420F727FEAFB5A6A201F32A

Governance boundary

Proof ceiling: CONTROLLED_REPO_CONVERGENCE_AND_LOCAL_FIXTURE_REVIEW_ONLY

Green CI is not approval. No merge is authorized. Independent eligible human review and explicit MERGE_APPROVED remain required.

@raylee-hawkins
raylee-hawkins marked this pull request as ready for review July 24, 2026 05:53

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 6ab0e6029f

ℹ️ 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".

Comment thread scripts/ho_factory.py
@@ -1521,7 +1539,7 @@ def build_sample_case_event(repo_root: Path) -> dict[str, Any]:
"ledger_version": CASE_LEDGER_VERSION,
"case_id": packet["case_id"],
"detection_id": packet["detection_id"],
"truth_class": "SYNTHETIC_TEST_CASE",
"truth_class": "CONTROLLED_TEST_CASE",

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Migrate the ledger before renaming its truth class

When the factory operates on the tracked evidence/autosoc-case-ledger-v0.sqlite, this new value violates the database's persisted case_events.truth_class CHECK constraint, which still permits SYNTHETIC_TEST_CASE rather than CONTROLLED_TEST_CASE; CREATE TABLE IF NOT EXISTS does not update that schema. Consequently, sample initialization and controlled manual-fire/correction appends fail with an SQLite integrity error, while the updated metrics no longer count the four existing rows using the old value. Migrate the existing table and rows, or support both values during a transition, before emitting the renamed class.

Useful? React with 👍 / 👎.

@raylee-hawkins
raylee-hawkins marked this pull request as draft July 24, 2026 13:17

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: ff827f459a

ℹ️ 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".

flags=re.IGNORECASE,
)
for clause in clauses:
bounded_clause = clause_negation.search(clause) is not None

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Bind negation to each promotional match

When a prose value contains any negation earlier in the same punctuation-delimited clause, bounded_clause suppresses every later promotional match, even across a conjunction. For example, not stale and customer deployed passes this verifier, and the convergence scanner has the same behavior, so an authority-boundary or freshness-policy string can assert a blocked public claim without either required CI gate rejecting it. Scope the negation to each matched phrase or split conjunctions into separate clauses.

Useful? React with 👍 / 👎.

Comment thread scripts/ho_factory.py Outdated
parsed = datetime.fromisoformat(value.replace("Z", "+00:00"))
except ValueError:
return None
return parsed if parsed.tzinfo is not None else parsed.replace(tzinfo=timezone.utc)

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Reject timezone-free freshness timestamps

When the website status supplies a timestamp such as 2026-07-22T12:00:00 without an offset, this branch silently interprets it as UTC instead of classifying freshness as unresolved. A producer emitting local wall-clock time can therefore shift the calculated age by its timezone offset and make stale data appear fresh; require an explicit timezone as the standalone contract verifier already does.

Useful? React with 👍 / 👎.

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