Skip to content

v1.6.0 release: qualify telemetry, soak, and publish #1105

Open

Description

@jeffhuber

Part of #1066.

Goal

Qualify and publish one immutable v1.6.0 candidate after every v1.6 implementation dependency has merged.

Entry criteria

Qualification

  • Built and retained one immutable source distribution and wheel from release commit ac585cb65ab910a48866ae784e09dab193dc8ec6 in first-attempt candidate run 35679417608.
  • Run the complete CI, release-integrity, privacy, documentation, package, Graphify, Board, Slack, and cloud capability checks against that exact candidate (candidate run 35679417608, plus independent Python 3.12/3.13 installed-wheel qualification).
  • Run one bounded private Slack telemetry canary and reconcile local Board state with authenticated hosted totals.
  • Verify the metadata-only privacy boundary, tenant isolation, capability gating, retention, export/deletion, and rollback behavior.
  • Exercise clean install, v1.5.2 upgrade, rollback, basic Slack, Graphify, Board service, and public-package installation.
  • Soak the retained candidate for at least 24 hours.
  • Obtain two independent installation/adoption passes against the retained candidate.
  • Obtain independent exact-head Code Mower release audits with every P0/P1/P2 resolved (PR Prepare v1.6.0 immutable release qualification #1110 exact reviewed head 98eea9a793cd3e2739175016693d2e447b852ac8: Claude PASS and Codex PASS).
  • Publish GitHub/PyPI artifacts from the retained candidate and verify public checksums and installation.
  • Update release facts, release notes, current-state roadmap, and milestone/epic state.

Rollback

Retain the v1.5.2 package and documented rollback path. Production telemetry emission must remain capability-gated and independently disableable from the hosted consumer.

Delivery

This issue is serial-release work. Do not publish or enable production telemetry until all entry criteria and exact-candidate evidence are complete.

Activity

  1. added this to the v1.6.0 milestone on Sep 21, 2026
  2. added
    enhancementNew feature or request
    tier:RCode Mower generated label
    serial-releaseSerialize because it changes release, gate, or final adoption posture
    v1.6Code Mower v1.6 operational clarity and minimum telemetry
    on Sep 21, 2026
  3. jeffhuber commented on Sep 22, 2026

    @jeffhuber
    ContributorAuthor

    Immutable v1.6.0 candidate retained

    The one allowed candidate build completed successfully on its first attempt:

    • release PR: Prepare v1.6.0 immutable release qualification #1110
    • release merge/source SHA: ac585cb65ab910a48866ae784e09dab193dc8ec6
    • candidate run: https://github.com/codemower-ai/code-mower/actions/runs/35679417608
    • wheel: code_mower-1.6.0-py3-none-any.whl
    • wheel SHA-256: 3dfa8ac0c5c72fce2d18c186153820e97e01ad35ac756cccf665b5f0e59f4698
    • sdist: code_mower-1.6.0.tar.gz
    • sdist SHA-256: 58165ebc84eb31f6444d7865d2b803e782f21cd168b7fa3cb08b493b77346ce4
    • candidate manifest SHA-256: 7b442c53fd6260a2288722f1afbaca0c863f25147b298513de0e17989b9668f1
    • rehearsal manifest SHA-256: 8c782062b00b80f2e745a8c91e1fdbde01a39b2db8a68b16ef046baa3c87596f

    release_candidate.py verify --require-candidate passed against the retained download. candidate.json binds version 1.6.0, PR #1110, the exact source SHA, both artifact digests, required modules/docs, and full wheel/sdist inventories. rehearsal.json is status: pass, binds the same source and wheel digest, verifies the digest-pinned v1.5.2 rollback wheel, and records ten installed-wheel rehearsals including Graphify, Slack-free defaults, state-preserving upgrade/rollback, and uninstall.

    No rerun will be attempted. Live Slack/capability canary, 24-hour soak, and independent adoption remain open.

  4. jeffhuber commented on Sep 22, 2026

    @jeffhuber
    ContributorAuthor

    Exact-candidate upgrade and rollback qualification

    An independent disposable qualification passed against the retained candidate:

    • release source: ac585cb65ab910a48866ae784e09dab193dc8ec6
    • v1.6.0 wheel SHA-256: 3dfa8ac0c5c72fce2d18c186153820e97e01ad35ac756cccf665b5f0e59f4698
    • canonical v1.5.2 rollback wheel SHA-256: 44c7082b1fec2983d85ac7ce7feb7cf54b2b7d26e020e073716614d480118147
    • clean Python 3.13.12 disposable environment
    • v1.5.2 safe initialization produced 48 synthetic state files; doctor had zero failures
    • upgrade to the retained v1.6.0 wheel preserved all 48 files byte-for-byte and passed package identity and dependency checks
    • v1.6 doctor, synthetic Graphify generation/query, and disposable loopback Board identity/health/version checks passed
    • offline Slack readiness stayed fail-closed; the generated command-only manifest was credential-free and mode 0600
    • forced rollback to the exact v1.5.2 wheel passed with all state unchanged
    • uninstall removed the package and entry point while preserving state

    No live service, Slack workspace, provider, or paid work was used. This is upgrade/rollback evidence; it does not substitute for the retained-candidate live Slack canary or the two independent adoption passes during soak.

  5. jeffhuber commented on Sep 22, 2026

    @jeffhuber
    ContributorAuthor

    Exact-candidate clean/offline qualification

    A separate Python 3.12.13 plain-pip run passed against the retained v1.6.0 wheel 3dfa8ac0c5c72fce2d18c186153820e97e01ad35ac756cccf665b5f0e59f4698 from source ac585cb65ab910a48866ae784e09dab193dc8ec6:

    • installed identity and code-mower --version both reported 1.6.0
    • checkout-free and synthetic-repository safe initialization passed without applying changes
    • share-safe adoption doctor exited successfully and exposed no disposable local path
    • two transient candidate Boards proved repository filtering, identity confidence, invoking/serving/installed version parity, and stale 1.5.x recovery guidance
    • an installed Graphify generation with a valid doc_ref node passed all four query types; bounded partial output stayed usable and reported truncation
    • 27 installed-package audit-history/control-marker tests passed, including large histories, adaptive pagination/restart, stable terminal proof, mutation/budget refusal, malformed controls, and explanatory marker prose
    • Slack setup produced a mode-0600 command-only manifest; both offline doctor paths remained not-ready with dispatch_authorized: false
    • the current hosted health capability matched the installed contract; a local metadata-only summary validated, omitted the raw session identifier, suppressed a timestamp-only poll, and emitted a meaningful lifecycle-count transition; no upload occurred
    • uninstall removed package/import/entry point while preserving synthetic repository state

    No provider, paid work, live Slack message, repository edit, candidate mutation, or cloud upload occurred. Together with first-attempt candidate workflow rehearsals, exact-head release audits, green Python 3.12–3.14 CI, and the independent v1.5.2 upgrade/rollback run, the complete offline candidate check row is satisfied. Live canary, privacy control exercises, soak, adoption, and publication remain separate.

  6. jeffhuber commented on Sep 22, 2026

    @jeffhuber
    ContributorAuthor

    Independent external installation/adoption pass 1 of 2 is complete against the retained v1.6.0 candidate.

    • Evaluator: Cursor Agent 2026.09.08-6caf4ff at launch (self-updated after the evaluation to 2026.09.18-9a7762b).
    • Exact wheel SHA-256: 3dfa8ac0c5c72fce2d18c186153820e97e01ad35ac756cccf665b5f0e59f4698.
    • Installed version: code-mower 1.6.0.
    • Result: PASS, 5/5.
    • Clean install/init and share-safe doctor passed; local paths were redacted.
    • Graphify produced a complete graph containing a valid doc_ref node, and the v1.6 reader returned an available code_mower.contextPacket.v1 query packet.
    • A disposable Board reported v1.6.0 identity and health and left no listener after shutdown.
    • Offline Slack readiness correctly remained non-dispatching with transport, campaign, and live probe disabled.
    • No Slack message, provider session, cloud mutation, candidate-byte change, or repository mutation occurred.

    Public-safe evidence archive SHA-256: df631228c64e395b958d1ed51e295ad8dce18c611bd6b5d2eaa535c0197902fd; content bundle SHA-256: 69587119dcf4b90a2fb61bfdcc2006e6102209d6bf44377ce75542d3d32858d6. The retained local evidence was rescanned and contains no username, home path, or original absolute candidate path.

  7. jeffhuber commented on Sep 22, 2026

    @jeffhuber
    ContributorAuthor

    Independent external installation/adoption pass 2 of 2 is complete against the retained v1.6.0 candidate.

    • Evaluator: Claude Code 2.1.274.
    • Exact wheel SHA-256: 3dfa8ac0c5c72fce2d18c186153820e97e01ad35ac756cccf665b5f0e59f4698.
    • Clean Python 3.12.13 environment installed code-mower 1.6.0.
    • Result: PASS after correcting the evaluator criterion to the documented Graphify reader contract.
    • Safe initialization and share-safe doctor passed; 16 fake sentinels produced zero leaks.
    • The graph contained two valid doc_ref nodes. The exact v1.6 reader parsed it without ReaderIncompatible; symbol, dependency, and impact queries were available.
    • Disposable Board identity/health returned 200 and the process/listener were removed afterward.
    • Offline Slack setup/doctor completed without contacting Slack, starting OAuth, sending a message, or creating a provider session.

    Transparency: the first Claude run is retained as FAIL because its prompt incorrectly required doc_ref nodes to appear in answer packets. Code Mower deliberately excludes non-code nodes from those packets. That run nevertheless demonstrated the intended #1007 behavior: a valid graph containing doc_ref parsed successfully. First-run evidence manifest SHA-256: 10fe40d54ac8ec2ac677c502f1dbf05b2ddb58193d18a4093eb3f84bacdf6057; corrected sanitized evidence manifest SHA-256: e4427e3a8bfd355c412a7e88243f5ea4551edb9160b6eaefe3e1fcc2d895111b.

    Nonblocking adoption findings for later follow-up: group-writable Homebrew Cellar ancestry makes Graphify fail closed unless a private interpreter is used; /tmp versus /private/tmp realpath strictness is visible on macOS; init --graphify retains a v1.4.1 docs URL; and the combined doctor --slack --share-safe flags are rejected even though Slack doctor output is already redacted.

  8. jeffhuber commented on Oct 13, 2026

    @jeffhuber
    ContributorAuthor

    Bounded Slack canary — blocked before task creation

    The retained v1.6.0 candidate remains unchanged at ac585cb65ab910a48866ae784e09dab193dc8ec6 (wheel SHA-256 3dfa8ac0c5c72fce2d18c186153820e97e01ad35ac756cccf665b5f0e59f4698).

    The private production canary completed OAuth reconnection, restored the same private user/repository/channel policy, registered a ready code_mower.supervisor.v2 orchestrator, and exercised signed /codemower start code-mower commands. The commands reached the production ingress, but the start modal did not open because the durable hosted admission exceeded Slack's acknowledgement budget under the current hosted database capacity.

    Observed after pausing the two background refresh jobs:

    • no modal submission, Slack task, provider session, campaign reservation, or ACU spend occurred;
    • the campaign remained at reserved_tasks=0 and reserved_acu=0 throughout;
    • Supabase's metrics exporter repeatedly timed out while scanning query statistics, and unrelated lightweight PostgREST calls also timed out;
    • resetting only pg_stat_statements counters cleared the long exporter statement, but the first post-reset slack_hosted_interaction_commit still took about 5.9 seconds while slack_runtime_credential averaged about 105 ms—longer than the 2.5-second application acknowledgement budget;
    • the campaign was then disabled with retained evidence showing enabled=false, reserved_tasks=0, and reserved_acu=0;
    • production rollback is complete: Slack interaction/hosted-bridge flags are off, the source-sync and staged-refresh cron flags are restored, and the OAuth ingress relay remains closed.

    This is a release blocker, not a failed paid provider canary. Before publication, the hosted lane should either provision enough database capacity for the durable admission path or reduce that path to a reliably sub-budget operation, then rerun the same one-task/2-ACU canary. Do not count the current run as the required successful Slack telemetry canary.

  9. jeffhuber commented on Oct 14, 2026

    @jeffhuber
    ContributorAuthor

    Retained-candidate Slack telemetry canary accepted

    The bounded private v1.6.0 canary completed against retained source ac585cb65ab910a48866ae784e09dab193dc8ec6 and wheel SHA-256 3dfa8ac0c5c72fce2d18c186153820e97e01ad35ac756cccf665b5f0e59f4698.

    Sanitized results:

    • one owner-authorized private lifecycle exercised start, status, two bounded clarification answers, and confirmed cancellation;
    • 10 meaningful lifecycle summaries were accepted, and the authenticated hosted aggregate delta was exactly 10;
    • the local Board exposed exactly one current projection with complete coverage, final lifecycle terminated, and counts dispatch 1 / message 2 / cancel 1 / collect 0; the latest hosted summary was the same terminated state with outcome cancelled;
    • every durable hosted attempt had a stored receipt, the task settled as requester-cancelled, provider exit was independently observed as terminated, and settled usage was 0.0 ACU within the two-ACU cap;
    • stored events used only the frozen closed dimension, metric, and Code Mower provenance fields, advertised metadata_only, and remained bound to the authenticated tenant and codemower-ai/code-mower;
    • aggregate freshness is fresh; the one-task campaign is disabled and retains its accounting and receipts;
    • production was restored to reviewed CodeMower.com commit 89a700c2ba6cd099bd22cce232a9dcb88674557d: Slack hosted bridge and interaction flags are off, source-sync and staged-refresh jobs are on, the deployment is Ready, and /api/health still advertises the exact accepted v1 contract.

    The accepted terminal summary was observed at 2026-10-14T01:33:41Z. Per the immutable runbook, the post-canary soak therefore completes no earlier than 2026-10-15T01:33:41Z. Publication remains blocked only on that soak, the final pre-publication recheck, and release publication/reinstall.

  10. jeffhuber commented on Oct 14, 2026

    @jeffhuber
    ContributorAuthor

    Owner-only canary evidence has been sealed into a seven-file sanitized evidence manifest. Manifest SHA-256: 53be3acd28714a60091606ef271dfb9f53507214a3686b006e433195bc06800c. The manifest binds the retained source, candidate run, wheel/sdist digests, accepted terminal timestamp, soak boundary, and individual evidence-file digests; it contains no Slack, task, campaign, provider-session, tenant, credential, or local-path identifiers.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestserial-releaseSerialize because it changes release, gate, or final adoption posturetier:RCode Mower generated labelv1.6Code Mower v1.6 operational clarity and minimum telemetry

    Type

    No type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions