Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 8 additions & 5 deletions .agents/pm/features/pm-github-f1at.toon
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,20 @@ id: pm-github-f1at
title: Fail-closed privacy gate for automated GitHub issue imports and one reusable sync workflow
description: "Automated fleet-wide sync is disabled because the pilot workflow pushes imported issue text to a public branch before any privacy gate inspects the proposed tracker diff. Add a fail-closed scanner over the proposed tracker change, wire it into import as --gate, and ship one reusable workflow_call sync workflow fleet repos can call."
type: Feature
status: in_progress
status: closed
priority: 1
tags[5]: "area:ci","area:gates","area:import","area:privacy",changelog-unreleased
created_at: "2026-10-05T06:09:58.912Z"
updated_at: "2026-10-06T17:04:29.518Z"
updated_at: "2026-10-07T15:55:16.258Z"
closed_at: "2026-10-07T14:45:08.821Z"
completed_at: "2026-10-07T14:45:08.821Z"
author: pi-glm
acceptance_criteria: A fresh checkout installs the pinned extension and exercises a nonempty issue import; malicious issue-body credential and personal-data fixtures prevent any public branch push; completeness and idempotency are checked before mutation; a clean import opens a reviewable PR with permanent PM links; existing pilot workflows and future rollouts use one audited implementation or equivalent gate.
blocked_by: pm-github-9cjx
unblock_note: Coverage blocker pm-github-9cjx is closed (exact 100/100/100/100 verified); the feature is complete on PR 108 and waits only for review and merge.
unblock_note: "Both blockers resolved: pm-github-9cjx closed (exact 100/100/100/100) and pm-github-hptv closed with this item after #108 merged (b9e27d9)."
dependencies[2]{id,kind,created_at,author,source_kind,author_source}:
pm-github-9cjx,blocked_by,"2026-10-05T08:43:10.230Z",codex-sol,"cli:update:blocked_by",detected
pm-github-hptv,blocked_by,"2026-10-05T08:43:10.230Z",codex-sol,"cli:update:dep",detected
comments[27]{created_at,author,text}:
comments[28]{created_at,author,text}:
"2026-10-05T06:21:37.672Z",pi-glm,"Design settled: new gate.ts holds the pure scanner (credential/personal-data/host-path rules over ADDED lines only, sha256 content-hash allowlist with required written justification, fail-closed on unreadable input/git failure/malformed allowlist); unified-diff parser with toon field attribution + jsonl patch-entry attribution; git collector covers staged+working+untracked under the resolved tracker path and excludes operational locks/extensions/checkpoints subpaths. Registered as 'pm github gate' (--diff, --allowlist) and composed into import via --gate: plan completeness + provenance idempotency verified pre-mutation, tracker-change scan post-write, non-zero exit so a workflow can never push on a finding. Reusable workflow_call sync workflow added with SHA-pinned actions; caller example at docs/sync-workflow-caller.yml."
"2026-10-05T06:33:25.742Z",pi-glm,"Implementation checkpoint: gate.ts (scanner + unified-diff parser with toon/jsonl field attribution + git collector over staged/working/untracked tracker changes, operational locks/extensions/checkpoints excluded + sha256-keyed allowlist with required justification) is registered as 'pm github gate' and composed into import via --gate (plan completeness + provenance idempotency verified pre-mutation, fail-closed scan post-write, non-zero exit). Reusable workflow_call sync workflow with SHA-pinned actions + caller example added. Full package suite green: 347 tests pass, coverage 93.55 lines / 84.05 branches / 93.62 functions (repo thresholds 88/79/89 met), docstring gate 119/119, repo privacy gate clean over 3107 objects. New suites test/gate.test.ts (29) and test/import-gate.test.ts (13) include the adversarial full-sequence replay on a real git repo with a bare remote: token-in-body, token-in-comment, email, host-path, and high-entropy fixtures all fail the gated import before anything can be pushed, and the remote's ref list never gains the sync branch."
"2026-10-05T06:42:46.064Z",codex-sol,"Resumed interrupted run as codex-sol. Preserving implementation commit and README draft. Verification priorities: scanner fail-closed inputs and redaction, full bare-remote sequence, SDK-resolved tracker paths, reusable workflow input safety and existing PR updates, real public issue acceptance, and requested all-source 100 percent coverage. Previous evidence met only the existing lower thresholds; this is not the requested coverage gate."
Expand Down Expand Up @@ -42,6 +43,7 @@ comments[27]{created_at,author,text}:
"2026-10-06T11:50:22.874Z",codex-sol,"Full npm run release:check PASS on frozen implementation: all 487 tests pass without skips and all 12 authored modules measure exact 100/100/100/100 (8391 lines/statements, 2218 branches, 208 functions). Typecheck, build, docstrings, lint, zero duplication, Git-object privacy, production dependency audit (zero vulnerabilities), package dry-run, changelog and publish attestation all pass. Pinned PM strict health with required merge drivers passes. Native Bun suite and Bun-invoked full release check remain in progress."
"2026-10-06T12:13:00.910Z",codex-sol,"Full npm and Bun-invoked release:check both PASS on production implementation 5ed8c47: each full run passes 487 tests without failures/skips, exact 100/100/100/100 across all 12 authored modules, and every configured release gate. Counts: 8398 lines/statements, 2219 branches, 208 functions, all covered with zero skipped source. The full native Bun suite is re-running after four test-only mock.method portability corrections; their four focused Node/Bun cases and complete 24-case Node lock suite pass. Packed public acceptance after the transport fix passes nonempty import, gate, unchanged Node/Bun repeats and strict health without a remote."
"2026-10-06T12:42:47.528Z",codex-sol,"Final acceptance complete: npm run release:check and bun run release:check PASS, final npm coverage PASS at exact 100/100/100/100 for all 12 modules with 487 tests/no skips, and complete native npm run test:bun PASS with 487/487 cases across 30 files and exit zero. Fresh packed public snapshot import, unchanged Node/Bun repeats, privacy gate and pinned strict health pass. Nine malicious executable workflow fixtures stop before item writes, pushes or PR writes; clean workflow push and permanent-link PR creation/update pass at the local writer boundary. Existing draft PR https://github.com/unbraind/pm-github/pull/108 will receive the final receipts; no merge, publication or downstream rollout. Leaving all items open and releasing claims for orchestrator verification."
"2026-10-07T14:45:08.137Z",claude-orchestrator,"Release-gate finding (2026-10-07): Daily Release failed 10-05..10-07 at 'Run release checks' because scripts/privacy-gate.ts audits every object in the checkout store (cat-file --batch-all-objects) and CI's full fetch pulled the open feature branch, whose history held an older test/gate.test.ts blob (68d83c8) with the synthetic 61-character PEM-header rule fixture. Not a leak (no key body). The branch auto-deleted on merge; a fresh full clone at b9e27d9 passes (2583 objects audited). Long-lived PR branches that carry rule fixtures will block releases until merged or exempted."
files[11]{path,scope}:
.github/workflows/pm-github-sync.yml,project
docs/sync-workflow-caller.yml,project
Expand All @@ -61,4 +63,5 @@ tests[3]{command,scope,timeout_seconds,provenance{author,created_at,source_kind,
docs[2]{path,scope}:
docs/sync-workflow-caller.yml,project
README.md,project
close_reason: "Merged in #108 (b9e27d9): fail-closed privacy gate over proposed tracker changes (credentials, personal data, host paths incl. file:// and label-colon forms, high-entropy assignments; values never printed, content-addressed allowlist with review justification), gated import, and one reusable gated sync workflow (validate, preview, gated import, repeat-import no-op, strict health, review PR on the head repository only, closed on no-change). Final CodeRabbit full review of all 68 files at bf13c08: no findings; npm+Bun release:check at exact 100/100/100/100 (520 tests); each review fix has a fail-on-revert test."
body: ""
4 changes: 4 additions & 0 deletions .agents/pm/history/pm-github-f1at.jsonl
Original file line number Diff line number Diff line change
Expand Up @@ -48,3 +48,7 @@
{"hash_algorithm":"sha256","ts":"2026-10-06T12:42:47.528Z","author":"codex-sol","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"9aa62e730769acb6625de04f","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":null,"topic":null},"op":"comment_add","patch":[{"op":"add","path":"/metadata/comments/26","value":{"created_at":"2026-10-06T12:42:47.528Z","author":"codex-sol","text":"Final acceptance complete: npm run release:check and bun run release:check PASS, final npm coverage PASS at exact 100/100/100/100 for all 12 modules with 487 tests/no skips, and complete native npm run test:bun PASS with 487/487 cases across 30 files and exit zero. Fresh packed public snapshot import, unchanged Node/Bun repeats, privacy gate and pinned strict health pass. Nine malicious executable workflow fixtures stop before item writes, pushes or PR writes; clean workflow push and permanent-link PR creation/update pass at the local writer boundary. Existing draft PR https://github.com/unbraind/pm-github/pull/108 will receive the final receipts; no merge, publication or downstream rollout. Leaving all items open and releasing claims for orchestrator verification."}},{"op":"replace","path":"/metadata/updated_at","value":"2026-10-06T12:42:47.528Z"}],"before_hash":"1de7a09376c18a23d28f95fc1be76faed32cc588ba338572bb0bce09da8a7cc3","after_hash":"550919ef8b0fa3dc4e07157e4354f696847f9ae0d623d93adac7e51f3c7db4a7","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"0812a5cf60547f207c72845f31cdc05ddd0d3f3a32a15a48ddfe520fe99abcde"}
{"hash_algorithm":"sha256","ts":"2026-10-06T12:42:50.295Z","author":"codex-sol","author_source":"asserted","agent_harness":"codex","agent_model":"gpt-6.1-sol","agent_model_source":"probe","agent_instance":"9aa62e730769acb6625de04f","agent_provenance":{"model":{"value":"gpt-6.1-sol","source":"probe"},"effort":{"value":"high","source":"probe"},"role":{"value":"implementer","source":"argv"},"topic":null},"op":"release","patch":[{"op":"remove","path":"/metadata/claim_principal"},{"op":"remove","path":"/metadata/assignee"},{"op":"replace","path":"/metadata/updated_at","value":"2026-10-06T12:42:50.295Z"}],"before_hash":"550919ef8b0fa3dc4e07157e4354f696847f9ae0d623d93adac7e51f3c7db4a7","after_hash":"62cc2a53d6a78d1fc2d6d08013f56f62e6dabdfe09dfe3eedfbc98afa612f9cb","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"effort":{"status":"resolved","resolver":"codex_session_file","rule_version":"v1"},"version":{"status":"unavailable","reason":"harness_unavailable","resolver":"ai_agent_version","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"f35c22d36c52133ca85e9ae37662754130c39e094d18a8f329c49ee6179f0525"}
{"hash_algorithm":"sha256","ts":"2026-10-06T17:04:29.518Z","author":"claude-orchestrator","author_source":"asserted","agent_harness":"claude-code","agent_model":"claude-opus-5-5","agent_model_source":"probe","agent_instance":"1c3d835edba106c1302b3106","agent_provenance":{"model":{"value":"claude-opus-5-5","source":"probe"},"effort":{"value":"high","source":"environment"},"role":{"value":"implementer","source":"argv"},"topic":null,"version":{"value":"2.1.291","source":"probe"}},"op":"update","patch":[{"op":"replace","path":"/metadata/unblock_note","value":"Coverage blocker pm-github-9cjx is closed (exact 100/100/100/100 verified); the feature is complete on PR 108 and waits only for review and merge."},{"op":"replace","path":"/metadata/updated_at","value":"2026-10-06T17:04:29.518Z"}],"before_hash":"62cc2a53d6a78d1fc2d6d08013f56f62e6dabdfe09dfe3eedfbc98afa612f9cb","after_hash":"c66c3ede3ff09be1c1a1d773d0a631577543c318e5d384b32de78562d461399d","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"claude_session_file","rule_version":"v1"},"version":{"status":"resolved","resolver":"claude_session_file","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"bc3ebd2135a05ede7ceec0bd9d35f8172c1e84967a9168a1cfb6a85aa607be16"}
{"hash_algorithm":"sha256","ts":"2026-10-07T14:45:08.137Z","author":"claude-orchestrator","author_source":"asserted","agent_harness":"claude-code","agent_model":"claude-opus-5-5","agent_model_source":"probe","agent_instance":"1c3d835edba106c1302b3106","agent_provenance":{"model":{"value":"claude-opus-5-5","source":"probe"},"effort":{"value":"high","source":"environment"},"role":null,"topic":null,"version":{"value":"2.1.291","source":"probe"}},"op":"comment_add","patch":[{"op":"add","path":"/metadata/comments/27","value":{"created_at":"2026-10-07T14:45:08.137Z","author":"claude-orchestrator","text":"Release-gate finding (2026-10-07): Daily Release failed 10-05..10-07 at 'Run release checks' because scripts/privacy-gate.ts audits every object in the checkout store (cat-file --batch-all-objects) and CI's full fetch pulled the open feature branch, whose history held an older test/gate.test.ts blob (68d83c8) with the synthetic 61-character PEM-header rule fixture. Not a leak (no key body). The branch auto-deleted on merge; a fresh full clone at b9e27d9 passes (2583 objects audited). Long-lived PR branches that carry rule fixtures will block releases until merged or exempted."}},{"op":"replace","path":"/metadata/updated_at","value":"2026-10-07T14:45:08.137Z"}],"before_hash":"c66c3ede3ff09be1c1a1d773d0a631577543c318e5d384b32de78562d461399d","after_hash":"0099960d1e0269af97684e7afe6034b3d899af9396e930c96a89ae8196f09997","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"claude_session_file","rule_version":"v1"},"version":{"status":"resolved","resolver":"claude_session_file","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"31682f3991a8ef3bfd002ceb9e5a80470495fa92337e6155108ac21894145182"}
{"hash_algorithm":"sha256","ts":"2026-10-07T14:45:08.830Z","author":"claude-orchestrator","author_source":"asserted","agent_harness":"claude-code","agent_model":"claude-opus-5-5","agent_model_source":"probe","agent_instance":"1c3d835edba106c1302b3106","agent_provenance":{"model":{"value":"claude-opus-5-5","source":"probe"},"effort":{"value":"high","source":"environment"},"role":{"value":"implementer","source":"argv"},"topic":null,"version":{"value":"2.1.291","source":"probe"}},"op":"close","patch":[{"op":"remove","path":"/metadata/blocked_by"},{"op":"replace","path":"/metadata/updated_at","value":"2026-10-07T14:45:08.830Z"},{"op":"replace","path":"/metadata/status","value":"closed"},{"op":"add","path":"/metadata/closed_at","value":"2026-10-07T14:45:08.821Z"},{"op":"add","path":"/metadata/completed_at","value":"2026-10-07T14:45:08.821Z"},{"op":"add","path":"/metadata/close_reason","value":"Merged in #108 (b9e27d9): fail-closed privacy gate over proposed tracker changes (credentials, personal data, host paths incl. file:// and label-colon forms, high-entropy assignments; values never printed, content-addressed allowlist with review justification), gated import, and one reusable gated sync workflow (validate, preview, gated import, repeat-import no-op, strict health, review PR on the head repository only, closed on no-change). Final CodeRabbit full review of all 68 files at bf13c08: no findings; npm+Bun release:check at exact 100/100/100/100 (520 tests); each review fix has a fail-on-revert test."}],"before_hash":"0099960d1e0269af97684e7afe6034b3d899af9396e930c96a89ae8196f09997","after_hash":"615bde1fddf0a3c2cc2a877d7cda6ad1cd0bbf1591b58e2b94baaf89d4ab13b2","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"claude_session_file","rule_version":"v1"},"version":{"status":"resolved","resolver":"claude_session_file","rule_version":"v1"}}},"event_class":"substantive","record_hash_version":1,"record_hash":"378e2e33beb30f9615c25e248d9dc52f4edb18c1a130311e51829adb42eafe06"}
Comment thread
coderabbitai[bot] marked this conversation as resolved.
{"hash_algorithm":"sha256","ts":"2026-10-07T14:45:10.251Z","author":"claude-orchestrator","author_source":"asserted","agent_harness":"claude-code","agent_model":"claude-opus-5-5","agent_model_source":"probe","agent_instance":"1c3d835edba106c1302b3106","agent_provenance":{"model":{"value":"claude-opus-5-5","source":"probe"},"effort":{"value":"high","source":"environment"},"role":{"value":"implementer","source":"argv"},"topic":null,"version":{"value":"2.1.291","source":"probe"}},"op":"release","patch":[{"op":"replace","path":"/metadata/updated_at","value":"2026-10-07T14:45:10.251Z"}],"before_hash":"615bde1fddf0a3c2cc2a877d7cda6ad1cd0bbf1591b58e2b94baaf89d4ab13b2","after_hash":"cefc4ede1bacaacb813fec4cc08c55e6b92d81c68306d34b204cf7e2d98d1323","item_hash_version":3,"context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"claude_session_file","rule_version":"v1"},"version":{"status":"resolved","resolver":"claude_session_file","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"efe3df683e18c02e789cf1efd342bbbe321457358e3dfb8b26445ce80a821eb5"}
{"hash_algorithm":"sha256","ts":"2026-10-07T15:55:16.258Z","author":"claude-orchestrator","author_source":"asserted","agent_harness":"claude-code","agent_model":"claude-opus-5-5","agent_model_source":"probe","agent_instance":"1c3d835edba106c1302b3106","agent_provenance":{"model":{"value":"claude-opus-5-5","source":"probe"},"effort":{"value":"high","source":"environment"},"role":{"value":"implementer","source":"argv"},"topic":null,"version":{"value":"2.1.291","source":"probe"}},"op":"update","patch":[{"op":"replace","path":"/metadata/unblock_note","value":"Both blockers resolved: pm-github-9cjx closed (exact 100/100/100/100) and pm-github-hptv closed with this item after #108 merged (b9e27d9)."},{"op":"replace","path":"/metadata/updated_at","value":"2026-10-07T15:55:16.258Z"}],"before_hash":"cefc4ede1bacaacb813fec4cc08c55e6b92d81c68306d34b204cf7e2d98d1323","after_hash":"3ee30dce1a393a40949624498f7ee154bcdcebac4660c072e22e117a7235ef89","item_hash_version":3,"message":"Replace the pre-merge unblock note now that the feature is closed (CodeRabbit 4208962319)","context":{"agent_provenance_outcomes":{"model":{"status":"resolved","resolver":"claude_session_file","rule_version":"v1"},"version":{"status":"resolved","resolver":"claude_session_file","rule_version":"v1"}}},"event_class":"maintenance","record_hash_version":1,"record_hash":"2d6cba7068498247478fa2a3dcfd93ed47f15a2454685999a9e3d48a2d414d5e"}
Loading
Loading