proofpress 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/skills/README.md CHANGED
@@ -2,109 +2,72 @@
2
2
  # Proofpress harness adapters
3
3
 
4
4
  [//]: # (ob:93121540)
5
- The skill captures rich decision context when an accepted Markdown or static
6
- HTML artifact version is still fresh. The hook is only a best-effort fallback. `ingest`
7
- backfills Git history, and the embedded capsule carries portable history beyond
8
- Git.
5
+ Install the adapter for your agent:
9
6
 
10
7
  [//]: # (ob:1744e48a)
11
- | Layer | What it knows | Attribution rule |
12
- |---|---|---|
13
- | Skill | accepted version, claims, why, consequential rejection | supplies known actor roles and basis |
14
- | Hook / `capture` | Git candidates, admitted ledger paths, or explicit files | supplies only `recorded_by` |
15
- | `ingest` | committed content and Git author | attributes from Git metadata |
16
- | Portable capsule | admitted records attached to the artifact | preserves recorded fields; invents none |
8
+ ```sh
9
+ npm install --save-dev proofpress
10
+ npx --no-install proofpress setup --agent codex
11
+ ```
17
12
 
18
13
  [//]: # (ob:50c32349)
19
- ## Shared contract
14
+ Use `--agent claude`, `cursor`, or `all` for another supported harness. Agents
15
+ never download Proofpress implicitly.
20
16
 
21
17
  [//]: # (ob:666c5555)
22
- Before editing an existing target, run `capture --recorder
23
- <harness>-preflight <file>` so any human drift becomes a separate unattributed
24
- version. Then:
18
+ ## Every accepted edit
25
19
 
26
20
  [//]: # (ob:a2f15f7d)
27
21
  1. Work only on Markdown or static HTML knowledge artifacts, never source code.
28
- 2. Read the artifact policy. Enable `portable` once when requested; it stays on
29
-
30
- [//]: # (ob:23c62cea)
31
- until explicitly changed.
32
-
33
- [//]: # (ob:7109fe56)
34
- 3. Preserve carrier-native block anchors (Markdown `ob` markers; static HTML
35
-
36
- [//]: # (ob:f8ee70a6)
37
- `data-proofpress-id`), run `anchor`, and write honest claims for touched or
38
- removed blocks.
39
-
40
- [//]: # (ob:9d481ea6)
41
- 4. Snapshot accepted, meaningful versions—not every turn or save—with `--why`
42
-
43
- [//]: # (ob:9710997f)
44
- and explicit known actors.
22
+ 2. Read the policy; enable `portable` once when requested.
23
+ 3. Preserve anchors, run `anchor`, and claim only touched or removed blocks.
24
+ 4. Snapshot meaningful accepted versions with `--why`, then run `verify`.
45
25
 
46
26
  [//]: # (ob:c8f43a25)
47
- 5. Use `--rejected` only for consequential dead branches. Never infer rejected
48
-
49
- [//]: # (ob:41bb2485)
50
- paths from casual discussion or store raw prompts/transcripts.
51
-
52
- [//]: # (ob:3991a868)
53
- 6. Run `verify` and report its output verbatim. A mismatch is evidence, not a
54
-
55
- [//]: # (ob:a08bfb00)
56
- reason to manufacture another snapshot.
27
+ ## When needed
57
28
 
58
29
  [//]: # (ob:a8bc86e1)
59
- 7. On receipt of a portable artifact, run `inspect` before `import`.
30
+ - Before editing, `capture` human drift as a separate unattributed version.
31
+ - On receipt of a portable artifact, run `inspect` before `import`.
32
+ - Use `--rejected` only for consequential dead branches; never store raw
33
+ prompts or transcripts.
34
+ - For parallel copies, preserve every original, run `merge-plan`, resolve only
35
+ genuine conflicts, then run `merge` and `verify`.
36
+
37
+ [//]: # (ob:f20cc96e)
38
+ Different artifact IDs are ingredients and use `merge-lineage`, never `merge`.
60
39
 
61
40
  [//]: # (ob:f5f3a858)
62
- ## Install
41
+ ## What each layer knows
63
42
 
64
43
  [//]: # (ob:8a9fcf71)
65
- The npm installer is the recommended path. It installs package-aware adapters
66
- that use `npx --no-install`, so agents never download the package implicitly:
67
-
68
- [//]: # (ob:5ee2d540)
69
- ```sh
70
- npm install --save-dev proofpress
71
- npx --no-install proofpress setup --agent codex
72
- ```
73
-
74
- [//]: # (ob:3328131b)
75
- Use `--agent claude`, `--agent cursor`, or `--agent all` for the other supported
76
- harnesses. Add `--badge README.md` only when the repository owner wants a
77
- visible Proofpress provenance mark.
44
+ | Layer | What it knows | Attribution rule |
45
+ |---|---|---|
46
+ | Skill | accepted version, claims, reason | supplies known roles and basis |
47
+ | Hook / `capture` | candidate or explicit files | supplies only `recorded_by` |
48
+ | `ingest` | committed content and Git author | uses Git metadata |
49
+ | Capsule | admitted records in the artifact | preserves fields; invents none |
78
50
 
79
51
  [//]: # (ob:041482f5)
52
+ ## Manual adapter paths
53
+
54
+ [//]: # (ob:880f4f15)
80
55
  For a vendored `proofpress.py`, install adapters manually:
81
56
 
82
57
  [//]: # (ob:0e468706)
83
58
  - Claude Code: copy `claude-code/proofpress/` to `.claude/skills/` and merge
84
-
85
- [//]: # (ob:225dd61c)
86
59
  `claude-code/hooks-example.json` into `.claude/settings.json`.
87
-
88
- [//]: # (ob:3e5fba6b)
89
60
  - Codex: append `codex/AGENTS-snippet.md` to `AGENTS.md` and merge
90
-
91
- [//]: # (ob:3ef5e70c)
92
61
  `codex/config-hooks.toml` into the Codex configuration.
93
-
94
- [//]: # (ob:9d561c7d)
95
62
  - Cursor: copy `cursor/proofpress/` to `.cursor/skills/proofpress/` or
96
-
97
- [//]: # (ob:9cddddf2)
98
63
  `.agents/skills/proofpress/`, then start a new Agent chat.
99
-
100
- [//]: # (ob:2202e132)
101
64
  - Pi: install `pi/proofpress-skill.md`; `pi/extension-skeleton.ts` is an
102
-
103
- [//]: # (ob:cc2d6144)
104
65
  intentionally untested extension sketch whose event API should be checked
105
66
  against the installed Pi version.
106
67
 
107
68
  [//]: # (ob:c883ac9d)
108
69
  Adapters expect `proofpress.py` at the repository root.
109
70
 
110
- [//]: # (proofpress:meta:eyJhcnRpZmFjdF9pZCI6InBwX2U3NGJlMDlhOWQyOGYxODU1ZGI0YTAwNyIsInBvbGljeSI6ImxvY2FsIiwicHJvb2ZwcmVzcyI6MX0)
71
+ [//]: # (proofpress:meta:eyJhcnRpZmFjdF9pZCI6InBwX2U3NGJlMDlhOWQyOGYxODU1ZGI0YTAwNyIsInBvbGljeSI6InBvcnRhYmxlIiwicG9ydGFibGVfaGVhZCI6Ijk2NzFjMDVhIiwicG9ydGFibGVfaGVhZF9ldmVudCI6InBwZV8wYzQ2Yzc3NTU4YzA2YWUwZGU3OTFhODMiLCJwb3J0YWJsZV9saW5lYWdlX2lkIjoicHBsX2Y1N2FjODMwNGFiODk5NTdjZGM2MTQzNiIsInByb29mcHJlc3MiOjF9)
72
+ [//]: # (proofpress:discovery:Verifiable revision history by Proofpress | https://github.com/chenmingtang830/proofpress)
73
+ [//]: # (proofpress:capsule:eNrtXXuP20hy_yqN2X8SZCTz_ZAPBzheZ3eB857hdXIIboxRsx8j7kikjqQ8ntgG8iHyCfNJUtVsPjSiqOdI8Z0Wu4sRSXVXV1dX_-pX1dSXK5oVsaSsuI351ehqPr8VvhMJI6QhtwJpBq7LI4cahn91fRWl_PGWx3ciL-DZfEIt1xsFtmlK0w89abtGEJmBYxgeD2REuROFvkd9z-C2JdyIG4IyGlkBs6QRSZ-ajhFyaJfHOUs_iezxavQFPxS3Bb2DHqa0wK6u4Y9ITOHCf4gsljGNpoJk4lOcx2lCJvB8mj2S6JG8y9JUzjOR5_CdOWX39E7goJYuZ-nvAoa7yLDBSVHM89GLF3dxMVlEQ5bOXrCJSGZxclfQ5C6wjRdL387E3xYx_H27yEV2y9IkFwnoosgW4tv11URQVGLo-SYzXHpVXrkVn9RDoFxxazDHY77vugEzPCoMLvzQpIGNkqVZgUO7ncaJAMmrGZneStenDGRxaBSEoeszzjzTsb1yOFq6W0bn-WIKA7ZQTpZmPL8a_fXLle7-yxXMcprl-Fd5W_DbCFT-1yuWcvH56iOMoLIGnN77eDrNX7x_8-rHt2-GM5ynXWyFFkUWR4sCpug2onmco7ZplqCkcA_mVagmF8UkzVCm-zjBVvNHuDODOwmd4eSVsl1f5fBFaOtqlCymU5CUTWB-RDnCaJqye3iWS9_gMgjgcZiaQnzGcTRGQXT_hHI6L0SGE6p7pZwrceZoVuIBrvxA-r9YPM5RPJxgMJarb9eNGKFtWqbrGMcQ48NEEDUTBKa3WMD3SRazCeGCleaveyAPYLaEwr-MCWiVk7e0kXJOM7okouk7jnACegwRv5I_0UeRka_kLxNakLgg90n6kMPnV40NkAxMk3y9Sb4OBoP6P_jYCKmMf0lK12C2ZTvhkpS_gWwwPLyQoaX2zeEPZPXpnonzPI-58M--_f2rkGkmiOBxAU3jbIjP4J3w74Jmd6K4BjUkZKynkgwGeiFmN8kfemaLWtJ0pc_3lcsckr-k2T1Jk-kj_A9MI7vn6UNC0ozkBS1iRn7-8PZPat6mgt8JUq30_LoRawpDWRLLsplnMUH3FYsQskiKeApamk9jFhcgXbms-bBHG75phFK43r7d2kNY2gL89ycBiyrLYpENElACfFRdwLwx8Ek5-adaT-M0GpMZfOrRhgyE8A3qHaCNMacFHTQufRDz8T9rmymFGl-DdJw8ZHEhyCSFNVoQNu1b6SF3AlPsL5YzJL8lsLNM0qL2LddkJmgCZi0XUwL7Njqi_H__-38SeEbgPk7AvJV19egrxHkMfXmAvlAVle0o40X3h3tcn_mwQDo2IJd9-3WH5N9zQca4eBFJCD4uFxasfaIQwd8WsOHGdApOmnISZTh1Ih-SX0WPOhwziiwncA9Qx5wWk5zILJ2BXecLFACA1ULtm-VSR--U0QcCJjabF_kLaDXJWdajLTtEeOIF-4rlDcl7NN9PiNwex2rKMoFQBzaKnKSLYr4o0IYiWIGzIXlFZnE-owVscXGPtiggTRkZxgHaygTNQS9FCgs7WaCzQ5dMwYYnsJnl2ub7LIkGEQs8Ye4rhD8kf4aNUTARzwuSSkJJhQFrB6xXf5zkc7C1MYnKLWbc54gsg7HQE_uKFcBugWAix6UMRlTLxNJ5DPgjx6YU1NAyqkktQWuPWKAry3PN6IApS7P4Lk5AJGVFqJeZgG11MJ-CNB9evf_pzQfYU9UCeP3nd_85HA7HYFGAoHsmUbrSpoG7bOC_JLAtTqcbsEXzVA-mCGgomfTNXdtH4JfMZyQuHwWTjHMCpon2ks5mIoEvqBU_JL8U1VM5UVFPz3BdISz-FJtuIc54PM4nN0lLItB0Tj-JARefSLNl4SOf4VaSDqrn4GYjEML5ZQdjW4FpPzGLLQTSPhjipERtgQsuYHNsriyyXG2X4Pfqi9DkGN10j34Mx3QCS7q7ivNv0A8FP5bwFA163GhkOH8EMSplVIBaOR248DjqE0Y4XuAb3q7CDMhrpRDyGrQ9wnX7CKBTXRrgBLRi2hdj9IDjYXn3Rd6HcCzL5dwz2a7ikOXOJ2l6nw_EZzqbT8Xwd3DCY1DPkhSiQNCcw82-rUm4MqJetId2MKYcEQoBOTiSsQoxX7z66c2vH34b5EkMlwsIeEvNlJfVR_A6PdqxhXQBAO6lHSUAfEvGdwOlnmGRzqZaLbjolcSkfGKRUYyohr2gz4V5ehIwbKcatW5qm1GfusylvKE5AnW_D-oxDv9Iaw_VDNXKzZd60pJco2YSDGAATFCSiAfyqlz7EIb2aceyDEuYtrW7dt7Fo3olj-dxS5yBEhDN5KW6A42KBIEX3BBTUfRohzELVpXj7K4dMA9EmmmCjgRjKcWqkLpvAn0jknqYpOAtFQ9EXr37BXbwXnwc2JSFO9vOq8qzASIHqPLUBRJa6O1rnuaxYuzg_uo8fbyuCKsrHVncMoBqJVuk7lTsk7il1HCo5J4fch5KM7Bsn7qeit8Bxqk2K-yiOTWwDcHu5yloTlGEmeoJKaXqEzJKH5GMg6jisdVCm6BrNaKovz25uzyVxa0ERyeyeRZrijCPzJE0fSeMAicyXc8TAE9E4JqMC486XJjC5hJgOfNtW3pSmJFpOq4VmYIxDnFNFKGmMKxXVF85USPb-gaKRhIOjN8bGP7A8j4Y_sixR1bwL4YxUlhaaxxxAphkGIBRfmtd_XJEflCZW0nfTSgY5OiKB34Y8cjzhZpr1UaL0dOWuAcvp9uXAIoNx3fDyPGq9ltUnW7_EMLtKatykyhapcbJWpGI5PICu5DQPAA47BPdPt5QoSQFnJ8XAyElBkoSVl4EuG6IcQCS7-ObBD9LnADyE8S-mgMvyQFcZWIWCZx4oklhTXTkDZivaXPxmCb8JoFmunym1h11DN_07YhbnlXprsUhat0dxgSS35TavzYa1fq6RnwXz_Jr0DmMcTnGLoNwbPcryRew4nCULS4AvMwUrqBiFA2teiY_o7Zf1EzcGL6MemTwWMwx6wCq5LO4QCkUI5aV0bXCkzXlABMg8na_avLGLXZ9XHZXzRs8i-C9bFcZUlJGT9h5SYXj-LWyhA7m8eZMFBTZobK9d3VIpqf3ayOupv6xFQqOihMNIWor_Ermmv7KSSUqDEVMef4SthR0sTlJ0gRa7SJntUVEBoUFZQS-iIzKIlp8bbVat2RgdaOWkLYjKI04qxttkbK60YNoVu0y_jgAJchpfDcpyB9wHv84JnkKbT2SyQKwOeFZLAtYHTBfaD4QDeOaKARss_X8wLLRJqrWcDJav4AiWwQsdAJbhFE1shatq0d2CFELAOgTEhfpImMYq3MxvEmsIXmPJNSSAZR725C8SZQNjSufgDwWfFU5Nkx0KTTxEpcx9P2I1t2BYvT4XGq6NIgC2IZoNb4WP6zHtyPjW-kuNCwGmx7so_XG0CKBdduH0LowiS_bCl4_TksEBgQdPgStopKlxfw249ybywVHp6jEIl2o5ZuC1Sq6apZ-go_lvtmjLcMUZsg9iwdGvYZaJLCW8DBaFwN_uPEQFxOMrsEtj3tUZtvCsK2IeSrNWQrUkL-Nynaic3XjHgAj0-K2DGg92hbDqxs_hLPFRRUnEv5ffXf9UAPbNUPTjDyv0X2L2G2GujdVG8PfPeqQoRmCiwlNw5GVAC0KVwtwCCkL-P5TzAU4CvA4aDzrtcFDxzM54FLPaHxeQ9w22tifiq28j2O4QjJhA2ate2rYWd3TIXxrPMNHx8P1o2WOIz0vDAyHu7VnaKhYLcMh5CpovNq5y_XY4459D-CflLC71C6zRcA2qt-bUn1EJANmHIPwykHphDw4tfxe7TdYIkFoBNZEICxfwBAUgQHLu9BeTEfwSz5RtVUKsab_0m1WxjskP8YSVqdCUpXOfvkRtuyslAv8GeCPWKEa_OJsAX52gd6gHKnW7bjaQMvL4x5rCyTnAQtM0w39eqYbGrmBPr0EceUdA5MZ0rCEw-qopMUZt6KSfdlgGCN9UFalo6SbpEB4rnTwlK0FNSAMuitBoFIIbpXTVIMI3SKB9aA38B7QA2jO8MHzeJ5Vj61FQOuxHUYtV6FgLorFnNT0L_JlNwk03UE9V1uH4YWR6UuXMVb7yoaN1tIdwjMrjWknBiECLHWEjBqB4u7yinP8VkQRytWRtN6bFA57QpnAVEBjD1QZM6BPCEnRebRCYlAJIHiKQA6RTY8Z8yAMLUFFaMt6r2jR33r8RyW2q2gSN23PNwV3zLrnhuvWPR_CYitqotzY1HJe7ymjyIMNgQtHRrWNtoju2lPuT2HDzb7IOnSlYxghE6zeulrMdqOLvTnrTRowDWqEViikkEYjQU1mtzRwLJq6QqoGC1lgSBg_a5BqzVw3Q9-bk67ut1M-T4dPweDDKAIIyWpv3iKsm-Efk4quVB8y0wC0LjwraoyvZqdrDezPO8MEFPkYdwvaE72FTsREALAsdOrorUVL1zrYn3BOF1OA1Zp_RS8IcP-O4piU4VT7GoehVqFHH96jQRDYnmezIGxQf81ba3mPxUh_w547qiiRgHhaQ6kqMvmCrV7vrrksS0qVGvWN9zEYTcb_n5RjKpvfrxpz_zLIWcpjGbcDrSMWMK42vpKT7qw7PJbknUWGb1R4XROfaFl9jXYVGnQWCe7Y7nYlfoc22lmSdmijnWVdKtRKhChzVbups6u4Z8v2VoULvVAGgdjcWFeaT1MACDE3sAC18B5EEw719-lvQBDyYZPgj6c6Ln0aedZx4_VS0NijAsCVIbVEsJ8KngaQS6FjGbAtR4V9FT9d9VFbzux25UMq-yEobIRTlQ9RWZBdDbCzcGjnlleLqjsrXN4q0F45tJKe2llggHIO-KAdGj5RHU1nxXAjhaZWz1Yk3C_Jc9UFd5XfbpRkr4rbztLWjV2drJq1X5JTFrBu1MnhNaudVZgb-32OwsvOSsR-SU5bhNgvyzHrDyEKKBM_6_Dzqh_W9S1vVU6o8q56sCruJjLO8pI9vsvSxVzoJKAC-JgqrRKyeHBOqiAkYY_DdSD7TBK0kPiZJGjB9TNJ0AL2Z5KgFQWcSYJWyHAmCVrxxbnsoIlIzqWDJox5AuBOo4AmqjlH960I5hzdt8KWM01_K9Y5kwStmOhMErSip3PpoAmzzmGGrVhqBR2dxgqbEOo8ArQip_MI0IqnziNAK4w6jwCt6Ok8ArTCqPMI0IqezmQDTch0QgE-tgK0L1cPE6zQn9F7UWbapYyZquFK2WIGAVfZF1XlwYOmSwiiY4EFdiRnNMEK961PHLgGDxh3aeSFIRN2YAWGJSJO60G3jxK0y-jbxwu-XNIll3TJJV1ySZdc0iWXdMklXXJJl1zSJZd0ySVdsku6ZPuDwE8PwjrXjX8emfZ1Le0o_NZ9AHbTaeCjHPlVB3cdBrEENx3DF5xbRsSdMOKG7YqImb4p4RmB5ykc18FIQQQetyJpgbOg5s4jfXoW2DRHrj8y_Y6zwIxywzFo-Hd0FjhyA1C3bRnc8tefBdb1-2VsqrdkLOt-TBdZWSO_Y_H76pHZcxW_MxEaVJqUR1aw_vjmmlW7tFrrYvfar1al7tWUDMtiWBzD8oGC1uw15wl6yj6FT8PINlwvNMP1x0N_-IF0R0frzYHK0GPg0Zjl8DOdzixdzEsitjmU2XcMiaF3DszQdP31BzHbeE1Dsy6ApLLS5Xib44jrjyI-lUVyw6W-FbjMDrY7itg6gPj0FHhO2scN2wHNahDzVBAPgl0mBLPDps569ZQgGM5yXNPzLgGLMcczfYs1ZxpXD5wNyPJR5evWgfP2KWO69oBxXQt9kwwOP7yGjex1DvJlZb4ViFyvatuwIj80TYez-lRJK56vS8m3j9Krmm_PskPY2kXo168gaAXutcr3D8cBnYFdwZPpFJ5Evawfpi9xP46kY3n12YVWzF4P8xiReLVnCSsMfMAGAEjXHzBcfxpu5STcQYfgbB4oAOJHjug9BLcuBl-_uGBGPRhYYEFMv_5I3LO_bEJHDyuvldj2hRL1yyRO8c4ImMu840URr9e_HyJO1r8WYue3QfjUtAIHtp4gcNefJQNrWENwrDeGrlNqLerkckrtckrtckrtckrtckrttKfUsvKUGv5IwglOquViKm9pDrvT8Y-pHTVztX0maYvGOl__uWvqoeM9lR2vzTy41c43Th7cauebGg9utTO9uInU3T2r2JnC29TNMTN3ne9r3STAM72qtePdqJslOfprUbveQ7pRjOd4BWnnOz83SXK81312HzjYpsD4dYqmUOiCHZBuMF9EYKgQ3C0S6Lv-WR6d-KEx4nFcgppnAmPZVNV7il5bvvWEvbZ87wl7bfnmE_ba8t0n7HW1RH2lLO34na5Whp-g05Z3P12nLUd-uk5bbvt0nbY89DN32lXTyPZquk5ILPexU4WjEMKODDMKhRNa0vU9AzwWjcS6Csc6Obi5wvGCtC9I-4K0L0j7Hwxpb19CXldwNHUbXqtsw_vWXZXx3RWorB_eSlWKPTL8kWV0VaVYvudYjF2qUi5VKZeqlEtVyqUq5QogceCYhnQjN_xHrErBfM1G9LjylupIUFsy2AJ8caq6EhT0APy5kh2-VIZcKkMulSEnqwwxhelR5gAQtE5UGYIO41i1HSuVFcwHXM99GFT0nLUd5RgOjDRXawIAZQmLSind567OUAM4Qoy6Akh8L7D9wA6Y5T1_fQWO4lwVEqu_GnOpkPgOKiSe46j0Ucng5-FvO09zb38OctcIZtcj4P2SHBK_7Eq790vyTCekO9n1TZI8yy-_djLyGyV5jh9a7WTxN0lyvB81XVNWsMX7635Nsxmdxv-l3hfyO2W44Sxns_TPdOmYMMtwIwBU-_MiAsefcNFRWLBFOcNz9LtNacFz9Lv6lr6VjOVzdLv6ar6TdLtaNnKSblcrOE6k5KclHCfpdrWG4_m67UqDJ0dpfKf8t8Ecj_m-6wbM8KgwuPDxELy9Nv9dpSG2yH9fcNQFR11w1AVHbYGjtq_K6ciq2uuTxnXS9DtOGtubk8amNXLcjqRx6PkmM1x6SRpfksZ_n0njyAtE5AoRWIH4LpLGN8kx0743yfeYuKUmOFZmBKYduZfE7VLiFju5pF4vqddL6vWSekUzpKZBLc6lMOzvJfWKLuyMyVPV_dnTnyjFJYF5aALz47f_A-UX_ck)
@@ -20,28 +20,16 @@ preserves any human drift without guessing its author or reason. Then:
20
20
 
21
21
  [//]: # (ob:04e1285c)
22
22
  1. Read `python3 proofpress.py policy <file>`. If the user asks for portability,
23
-
24
- [//]: # (ob:0fab4251)
25
23
  run `policy <file> portable` once; it remains sticky. If Git history exists
26
24
  without a ledger, run `ingest <file>`.
27
-
28
- [//]: # (ob:a5e7461c)
29
25
  2. Preserve carrier-native anchors while editing: Markdown uses
30
-
31
- [//]: # (ob:01348595)
32
26
  `[//]: # (ob:xxxxxxxx)`; static HTML uses `data-proofpress-id`. Run
33
27
  `anchor <file>` and inspect inherited/new/gone IDs.
34
-
35
- [//]: # (ob:ac191e68)
36
28
  3. Write claims JSON with one honest entry per touched or removed block; do not
37
-
38
- [//]: # (ob:29b54f6f)
39
29
  enumerate untouched blocks.
40
-
41
- [//]: # (ob:4623b792)
42
30
  4. Snapshot the accepted version with `--why`, claims, and explicit actors:
43
31
 
44
- [//]: # (ob:c89d4269)
32
+ [//]: # (ob:c89d4269)
45
33
  ```sh
46
34
  python3 proofpress.py snapshot <file> --kind agent --author claude \
47
35
  --produced-by claude --recorded-by claude \
@@ -50,14 +38,12 @@ preserves any human drift without guessing its author or reason. Then:
50
38
  --rejected "<consequential dead branch — reason>"
51
39
  ```
52
40
 
53
- [//]: # (ob:3b3f299e)
41
+ [//]: # (ob:3b3f299e)
54
42
  Omit `--rejected` unless the dead branch matters to future collaborators.
55
43
  Never infer it from casual discussion or include raw prompts/transcripts.
56
44
 
57
- [//]: # (ob:64c98298)
45
+ [//]: # (ob:64c98298)
58
46
  5. Run `verify <file>` and report its output verbatim. Never re-snapshot merely
59
-
60
- [//]: # (ob:0928adea)
61
47
  to force green.
62
48
 
63
49
  [//]: # (ob:e96a23df)
@@ -67,8 +53,18 @@ canonical project URL, and ask whether to install `proofpress`. Never
67
53
  download or execute it without explicit consent. If the CLI is available, run
68
54
  `inspect` before trusting the capsule and then `import`.
69
55
 
56
+ [//]: # (ob:50e05b0b)
57
+ For parallel portable copies of the same artifact, preserve every input and run
58
+ `merge-plan TARGET --from COPY...`. Apply compatible block changes, ask the
59
+ user only about reported semantic conflicts, then `anchor` the resolved target,
60
+ write merge-relative claims, run `merge TARGET --from COPY...` with explicit
61
+ actors/reason, and `verify`. Different artifact IDs or portable lineages are
62
+ ingredients; use `merge-lineage` for them.
63
+
70
64
  [//]: # (ob:3bec4947)
71
65
  Fallback `capture` records only `recorded_by`; it cannot know authorship or
72
66
  reasoning. Never snapshot source-code files.
73
67
 
74
- [//]: # (proofpress:meta:eyJhcnRpZmFjdF9pZCI6InBwXzhmOWYxNjA4MjZlMzM2YTQ2ZWI2MmJkNCIsInBvbGljeSI6ImxvY2FsIiwicHJvb2ZwcmVzcyI6MX0)
68
+ [//]: # (proofpress:meta:eyJhcnRpZmFjdF9pZCI6InBwXzhmOWYxNjA4MjZlMzM2YTQ2ZWI2MmJkNCIsInBvbGljeSI6InBvcnRhYmxlIiwicG9ydGFibGVfaGVhZCI6IjZkNTA0MjRjIiwicG9ydGFibGVfaGVhZF9ldmVudCI6InBwZV9lYjM2NDliNzI2MDA0OWM2YTM0N2YwMjIiLCJwb3J0YWJsZV9saW5lYWdlX2lkIjoicHBsX2EyMTFhZDFhMDU1MzliODQ4M2JjYWIyMCIsInByb29mcHJlc3MiOjF9)
69
+ [//]: # (proofpress:discovery:Verifiable revision history by Proofpress | https://github.com/chenmingtang830/proofpress)
70
+ [//]: # (proofpress:capsule:eNrtXOtuG8cVfpUB86MJSlJ7v9BBADdOE6dObChOgyI0yNmZWXKi5SyzF8msYKD_-gJFHqEP1h8F-hY9Z_YqiaIkKpJzoX_Y5F5mzvU735kD-nxAs0LGlBUzyQeTwXo9C-IwNj0jsDxh2x51PBF5VsSdwXAQpXwz43Ih8gKezZfUcr1JJLgbwyOUGmFguG7kBIHpuBa8Rqljc-aYJvc8FrihH8ATlPvCcR0urDgQBg1gXS5zlp6KbDOYnOOXYlbQBeyQ0AK3GsKHSCRw4a8ik7GkUSJIJk5lLlNFlvB8mm1ItCGvsjSN15nIc3hnTdkJXQhU6sLlLP1BgLplhgsui2KdT46OFrJYltGYpasjthRqJdWioGoR2MbRhbcz8WMp4fOszEU2Y6nKhQJbFFkp3g0HS0HRiB53Dcdy2KC6MhOn-iEwrpiJyPacMPItzzCckHnUdvzYsCyULM0KVG2WSCVA8sYjyYxapkm5ScG6dhgFTmBHjEaWUalTSzdjdJ2XCShsoZwszXg-mHx_Pqi3Px-Al9Msx0_VbcFnEZj8-wFLuXg7eAMaNNGA7j2RSZIfsYSWXIzwkZ4pjr75y_MXL8YrPhjeKYJoUWQyKgtw3CyiuczRBzRTKD_cA28LvWRZLNMMJT2RClfNN3BnBXcUXaFLK4mHgxxehLUGE1UmCcjPluA1UekdJSk7wWcjy40M34THwWGFeIvaffjfn_75v3__9BFcrLegnOu91xhZ4gyujEajqcINJ6TTfKq4yFkm16jDBEJOQCScCpJmRKp8DaFFuGAQmrBUsVnr-KMZHbwbdhJZbmyCz8MLEl0I3mtl-uBikNc7YJhByF7YBNWmhmPuscmxDg9CGRNrcAj5imYnPD1TqGRe0EIy8sXrr16QxvMEchfdkJOzXWrzwAoc3wguSPRdmp3ESXq2U-kPSO-xHTr7gRW63Lr7Dn8ScZoJIrgsYE1CFRFvAVfwc0GzhSiGJCvVVM3XG4hMZfcCYrzeobLhCNMKXHZngcwxOQYFydYNN2SdJpJtyMexTMQn8zF5HpNiKQiiEqGdPAnocFGemEaO5Zp3locQNACI09-YNJA1J6li4gmRBeDyikIiQJxIdrLRku2wD3WF73jm3e1jjbvUYzTLpMhGCiITvlLFADwgFpcgY-PSSRfE5S77mLYDhcrdxz7z74-O3kzIB-TDNJq8rf98NH9yIWXAQzmZc1rQUevRXfZhZmgK7-4BbY_Jd5kswDgJlaucfPnNy68hO4sleEoQiCiAWgJ1AQrnGmKmSEuoexwTPBM77GOFkevEXryPfYQqVyKDkk5K1eyn183HOyzgeJYd-aF15x2dMflGQUlcpoXOjRbNarCqrDEfjc6Wm_mwttMQooeTXRZgQcgdywv3ipD5PF9OFXzantV5I2-dXqMRrkaQxbQCYeW7IJAd2bEVhmIfgV6uIGPBBJlATiT4HFyTgDDaYBzxJ8owncgKizPkVJGSuCzKbIfDPIeFAMN3D1kXIA8h5hRJXott2iGZQKQBeMlJWhbrUlecCLJqNSZfA7_JdqV0aAUUdNnHPqhumjFBFpkQaleYitCjls3vnhh_hpSDciMVcE8sN6h1FZoU0LYNj0nLkefgjOwEcjYqd8jjGsIA1hPtJQ-uliQiafGdsHQtAbjSqszkwIna4j8k6waId8hjR4I5oePfXR6QJAIqT-bAbyHyoNbU5BaQLNmQeY_LznUFYlQpyKETlV6W582wIcODGgRmLBO04pz6TsNhxSyAXsbiZhz7gcco88CevhHa6GBYXa_ZGKfm6wQQjZ2sU6kK3X5keickps035KVvkOhjDe2t0Cf_vUV0W7FnX5CncTGLIaBEts5k3X7kkTlxOOW2YJYH3DAOAFxNO4psatum59keqBkLz6c0sCxmu74d-o7BGI15EIWAMi6mEdYz3UZU3pqYITBvvDKwDMsbGf7I8l4b_sSxJ1bwR8OYGChRbXHMlYC7NGAeBEh39fzBe4-q1ujWYEnzJRJSZnimK3gUmIjneo1et1BH6f3agF6HClDSsRCEtT4xgHA9SwRfdImVVzDQUfYx-TYHbID-lOiwRbhA9NCFTdNWshJUwae4TLoGGUAMAObps-MhiJTLhSI8ZUPy6vjZkBx_9vTZV58NQRIszIsNwdgednkPVu4lekf_x8tilRzh310TIEEpAAoVywWkaQXauUTN9ZtabkhWIU8rWTXSIRgAX6yubIO7Gu2eEIU4j_xJ2zFPS8BlHRp6oXw8VeCoLQhU-zpwfS-2A9MLDbvxda8Pq319c3tVLydi6nqRoIHNnH7o1B1Xvdx9GilwPXilZIh5fKqwN5arVG105OgaKRnF6BuTZyn6raMPQhsOTIvL6WdoQmCdrRWsVshwTcdjZmwGntEo1GvYGvvc1Ik1qzkARx5Yx47dZrVec1avdq-uCxSsCgJB_qJrQEZqxIBH4kQulkXXIb2GLJyqplTlsNmGLMsV7MnBlIU2OHALsijxSAEkQLJRnUNUrJjmaOrXEMWTHVbkRuTEUWQJmzV693rAWu_7NHf5Sa4ToEpRmchiM9zCfhqECyyTRdwVAeOtPF0PWMtzn-buc7jcAJz2Xq4JbmNOSjSoZcNqByxIeeeV6w3JfW4I04290I4awXvNYi34fbrAvN94XbGbcJjgluVQJ27t1vWGnd32bvrykeRzzXi1veaVvBdYb1NIpFoK7OX4kRJnRwts4J4_y3cYLxJhaJl-HEE1b43XdZK19PdpEVeAzXX39gTKCcLP9cakfmxGzA1sV4gWertGsjPm3TrEenWX2wYXrhly12tW7zWN9er36QbfriEtIMyr89PJDkVNh8WBsIEotaL0-sVe1OzdCKoCvtSwVIEdmU71SgRuwCq8hMAdRZvmbguO_Yu9V3onsiN9Iksun8fCQ8gKyHTwcXW8mqSLT6aD_iJ1BH1c_Tv-AaAShQZb4ltgt5ImNYReerPpPPXqeJz-Ywk6Sni8337-5x__6l6v8mU-39IT135wOMdjdduwAr_xQ69N7vywd_-LxCVJaJRCtEJMjLVMuhOFbI3x74LEWboCVMpRd6QzpT6qrhgiS9ANGT1Dx6_WRX4EBExVhHJXsJvMsKjp-hb12lTqNdy1ZvfppOGJURt-kI0i2eyASScOfSocy-iVl67f7gx9cyPd8CrbZQanHoBFS9N6vXW94n2a5gLAigCogFc-ffF8iMwqSboCqxtIrCR5TbK2TpuAMS_TM_1WtfAfoOxB45kqiQvXQyby7fGLCkOgbCMBhucRSBHZC-hr-7LOa_tDYwHlKUmpRlrxVrASck92BKWFo3r61PID0IZA-tJTKhMUuiFPdRmZk6iiW0Aqa461xKqph0ZayAIZ-lyuMEJ21ebIoAa1jNi1_ZYq9s4bej7a9yChIrBSYXzqqNWKQDQugNsl4PnXT48__-w14IdOsk9fvvrbeDwGEz6FthiZ72oNIY376fJB6rHQUPsBNp4q7Wt9gABJXBZ1XgAO5UBxFFZu7GTA0AW8VRmmqtBzLTgImiZYAmueOlVnupRWIkLSVCSkKSOa--h710heBW_j2qmqSs1RhXlVCNXZDEo-kzFADJaCtm8APkBaUtgdSUA0ZKAsOBt6CIknEE90B1Wbsn5qrgklqLXa4XSsY75rGi7rinjvUKdx-j1Oa85qup0v5RqUmapKexC-gaYWl652f1eOet6h7FtGn8gELw8-9RhVF87L17cPSqs5sC6O9Y1MQohlHGfG722OmoskntEcAvuaIaqmD_vNUG85x1qlHBBT737dcewtJz63Wel2s5FbrHTLI-tbrLR1vtatUBPnx5isbZ1k3SjJQ8ywts6MbpRkv2nR1sP-G_e6gZ1AvldAfl1KXI2P-oj4UyhEicCygkUD9hytywjcTAAMkFa2tKKmZlTiwRlGVd2_Ivhdlz6PuWuXao-4ay8tH3HXXgpfiZqH27TL1sfbtJeYj6hpl6EPvOmbHgacD6AX1TVvn6XbQ6OLe-D84tbzJNN3gBj5VuBZ1A4Cbrh-zKnht2r3B0X9IUl_eHR-KM6H4nwozttmurea3LaTyzZaJs6w3XjivNs-prxpZvuLG8xer97lMa1pTwx_YhlbxrSBy30exPZhTHsY0x7GtIcx7W9oTGuH3DNjwzbdyHu8Ma0eErzvQevlI3yoHsyz_TA0ulnJzz5orUY2v4RR6WX1AQrswAIKBCX10UalWo1bcajL4h6GnYdh5-9m2GkbDjA-ZkOrHD3asFMrd23PcTkJDuPKw7jyMK48jCsP48rf07hy95nVA_00beuJ6m5JHuhHYFt_krVbkp_zx1j7j-O-TrMVTeTfYV_Kf6AMMeni2X5VHavWDVIpw6oIjdcXZQQmUdC63mIgd2We8SDbXpnIPcq2Pdc_-Lbb5jfqZ1n8ToObHb_Y3zq4aY9N3_vg5gBT7xmmbj8C3HJyb_ZO7u132w_mf8WDicvqbRlMmNbE8bYMJtr_X-MwmDgMJg6DicNg4rczmAAkdQTzTSui8e9iMDFVv_LRwlQ98nBgqg7H-4fj_cPx_uF4_3C8fzjePxzv_0qO99-8-z9pC-GI)
@@ -17,28 +17,16 @@ reason. Then:
17
17
 
18
18
  [//]: # (ob:d181cc6e)
19
19
  1. Read `python3 proofpress.py policy <file>`. If the user asks for portability,
20
-
21
- [//]: # (ob:6c0f813b)
22
20
  run `policy <file> portable` once; it remains sticky. Use `ingest <file>` for
23
21
  Git history not yet represented in the ledger.
24
-
25
- [//]: # (ob:0ba00342)
26
22
  2. Preserve carrier-native block anchors while editing: Markdown uses invisible
27
-
28
- [//]: # (ob:0b96e11b)
29
23
  `ob` markers; static HTML uses `data-proofpress-id`. Then run `anchor <file>`
30
24
  and inspect inherited/new/gone IDs.
31
-
32
- [//]: # (ob:55bb7174)
33
25
  3. Write claims JSON with one honest item per touched or removed block. Do not
34
-
35
- [//]: # (ob:3b3c1156)
36
26
  enumerate untouched blocks.
37
-
38
- [//]: # (ob:311b1408)
39
27
  4. Snapshot with `--why`, claims, and explicit actors:
40
28
 
41
- [//]: # (ob:08f435e4)
29
+ [//]: # (ob:08f435e4)
42
30
  ```sh
43
31
  python3 proofpress.py snapshot <file> --kind agent --author codex \
44
32
  --produced-by codex --recorded-by codex \
@@ -47,14 +35,12 @@ reason. Then:
47
35
  --rejected "<consequential dead branch — reason>"
48
36
  ```
49
37
 
50
- [//]: # (ob:b521eb3e)
38
+ [//]: # (ob:b521eb3e)
51
39
  Omit `--rejected` unless the dead branch matters later. Never infer it from
52
40
  casual discussion or capture raw prompts/transcripts.
53
41
 
54
- [//]: # (ob:cd72eb83)
42
+ [//]: # (ob:cd72eb83)
55
43
  5. Run `verify <file>` and report its output verbatim. Never re-snapshot just to
56
-
57
- [//]: # (ob:358e67a9)
58
44
  force green.
59
45
 
60
46
  [//]: # (ob:bc88257e)
@@ -64,8 +50,18 @@ canonical project URL, and ask whether to install `proofpress`. Never
64
50
  download or execute it without explicit consent. If the CLI is available, run
65
51
  `inspect` before trusting the capsule and then `import`.
66
52
 
53
+ [//]: # (ob:4d83fd2a)
54
+ For parallel portable copies of the same artifact, keep every original and run
55
+ `merge-plan TARGET --from COPY...`. Apply compatible block changes, ask the
56
+ user only about reported semantic conflicts, then `anchor` the resolved target,
57
+ write merge-relative claims, run `merge TARGET --from COPY...` with explicit
58
+ actors/reason, and `verify`. Use `merge-lineage`, not `merge`, when artifact IDs
59
+ or portable lineages differ.
60
+
67
61
  [//]: # (ob:08efea88)
68
62
  Fallback `capture` records only `recorded_by`; it cannot know authorship or
69
63
  reasoning.
70
64
 
71
- [//]: # (proofpress:meta:eyJhcnRpZmFjdF9pZCI6InBwXzcwM2MzZmE5MjZhYmI1MTJlNzE5OTMzMiIsInBvbGljeSI6ImxvY2FsIiwicHJvb2ZwcmVzcyI6MX0)
65
+ [//]: # (proofpress:meta:eyJhcnRpZmFjdF9pZCI6InBwXzcwM2MzZmE5MjZhYmI1MTJlNzE5OTMzMiIsInBvbGljeSI6InBvcnRhYmxlIiwicG9ydGFibGVfaGVhZCI6ImYyN2Y4ODQ5IiwicG9ydGFibGVfaGVhZF9ldmVudCI6InBwZV9kNDQ2ZmNmNzJhZjFlZGNmMDNmOGY5ZmEiLCJwb3J0YWJsZV9saW5lYWdlX2lkIjoicHBsXzhkZTU1ZDI2NDlmMjAzZTgyZjQxNzAwMyIsInByb29mcHJlc3MiOjF9)
66
+ [//]: # (proofpress:discovery:Verifiable revision history by Proofpress | https://github.com/chenmingtang830/proofpress)
67
+ [//]: # (proofpress:capsule:eNrtXNmOG8cV_ZUK_ZAEITnd1TstGHBkW3Zgy4YtJwhMgayVbE2zm-5FI0YQkLf8QOBPyIflIUD-IvdWL-yZ4VDjGXIkO3zRkL1Unbr7uRfU6wHLy1gzUc5iOZgM1utZYDnC0SyiPuPcs6kK7ChyHDoYDngmNzMZL1RRwrPFklHPn0jqBIGKKONUWtyylRdyy-eUSStgOvACSQMlPS4CakdawqqhRb0gciOfKq08WFfGhcheqnwzmLzGL-WsZAvYIWElbjWED1wlcOHPKo91zHiiSK5exkWcpWQJz2f5hvAN-SbPMr3OVVHAO2smztlC4aEuXc6zFwqOW-W44LIs18Xk7GwRl8uKj0W2OhNLla7idFGydBE61tmlt3P1YxXD51lVqHwmsrRQKciizCv1ZjhYKoZC1DTQYehGg_rKTL00D4Fw1Uy6rq-FDijTtpJCW44OdaQZIsvyEo82S-JUAfJWI8kslMrzJPXdSFPLUSHVrh1YllMfp0E3E2xdVAkcmCJOkeWyGEx-eD1otn89AC1neYGf6ttKzjiI_IeByKR6NXgOJ2itAdV7HidJcWbunX385NOnz74bFWkMhyjHKzkY_izLYWWZx7wqQWEzzoq4QNmzPEXccA-0rMySVbnMckR4Hqe4arGBOyu4k7IVqrJGOhwU8CKsNZikVZIAbrEEban6vDzJxDk-63iW4A6KFhRVqld4qt_956d__PdfP_0eLjZbMCnN3mu0KHUBVx79ZjQiH8NBU0nKjNRnhzOTf__9n6Rcqp6dEVw5ByEQneXkcYOu3KyN3bGcDd4Mt4g8mwnqcu8Sou1iE5IouVA5-Yrl5zK7SAkDBEXJyliQz_ch_uADcttlnn31JTlPswvzDAEdbvGisYLhX4JsW9T3tCcPDvkzkBcTQq1B80OyUiyFrXWVdI5doOy7ZeHp7Qn2iJjpSGlJ6cHx_lGBhhVRMi4BKLxG1CuIPPi5ZPlClUOSV-k0na83YMOpQ7aeOV7vASzt0BbCVwcHbI_Jt6BQshPQhqyzJBYb8kjHifpoPiZfaGPaGNcI2-JN4IyX8PrC0qHt8IPjJQQFCHD7wEgbFOckS4X6kMQlGMiKxWAeIHxxvhmT7wu1R74WZxAp3cMbBB2DzykQ10tFBMvzWOWjFF6Dr2ZvWEhAMCvIxRJO0hrOxGy0R74Wj3xl20eR7zzjc7KCF1VefHgpIoDaCzKXrGSjrZmMYgmG8Qzy4b6Y5nEe2IF7cLzOmPwlj0sQbsLiVUH-9N3XT8kF5GmwBEXAoiFpgDmoFVnD8mVWQeKWGCdykzBukq_DHWHbnn8M-aq0WqkcihZSpS0gs28x3iNBB7Rtu1Z4cETumHyXQlGwzMpacPPR6GK5mQ8bkQ7NSurVGhwO_KouDyb7bDPUruMp9yi2OZ8Xy2kKn3bHq6I9SRMYRiNcjWCF1wHG6uASYO5RW3FHHQPw1yuQGUg0V1hPKjkHpSdYEmAYlRh5eY4hABwOChyIA1jN5mPydI8pCBlQxUPn4Hg9SAYYXF9iAd1FffN6rjDGgicVJKvKdVUSeIjDkivACrVjvs-ZvFD5AYuOIV9It0KRRa5Uus97uAhDoBPqOAVKSuIUSAFmeRRZ7UYMktR2g468tKGV8GoPXleGDhQo7Ch4cbckUUmXNqE-XccQ2rM6uxdQRZO2bh-Sc6XW5LKKr-fPEEgaCw8fnT4DpBw4GpkDcSmrHFJ8w1ogwCcbMu-RlLlJ_IKlKQQAqF6v4n0-bFnOAE6D1eNM5IrVpMLcaUkKMDAJAcETnuv7UgAJZcJVzGOYcGF1s2YrvIaIEQjk4nydxWlpeGVudkLm0X5D4vEcGRyWLr0V-qyut4jhi3ckfEWmy5kGg1T5Oo8bXllwexIyZXs04n7kBG7gaVvygEdSe1QzLwj9SAA5pzqigQME1PUVtWBNzSMtpLAFKhjVZvhhra2JHQK1wisDCjRgZAUj6j-zgonrTGj0B8uaWBa81Ugca1ntU6EUBwPaXn19NFJZp1bD-ZasWGKYozLktrI810ZkZo0eDWys9378DlMOaHwMGeijHX7TIGFMh04Ugd6oapH06F-D5D68zYip2M3eGhCRLR2lQ88XXLcgeoSuAXEfJtbDNE07UCDHFMMKKbIKgziqG66JJCsUCDiGXJhl6zH5JCPo0F1qx3c2Uwi4KVoPw24BSwjEhp0ZoDmkplRYtnIiJbpD9lhgc8h70bcNaUIUwXRvolJuDvUKqmWlk3ixLLdM6hkccJquG25QwF4bsqxWsKWE5At1FlwihcJzQKXY-InJLJB_yaLC1gbAwoRc90NA5NMUwlmRpXU5PrlZGpa0uKs5p8oRrTR6FLORxn24YXFeGGeoo1ecxOVmuKNEaPFQ4YaBsB1HdtrpUcgGz324H5ljMCw6BSA4U0c-gefb5iCa2Ubh-0YvkMckZHZzqtrp9hiYom7ouxSCiiXbI_RYZXOE-9BB41eGgsUpulydOW6QKFUu49qm0nPDLZyONG4leme2V-uixttK1UgU4xFIfw31LvxdKqRn8ixVF2cL5GRffFLsEaOkUrmhpaXDO8vskccG931YH1RhDd9qQ8vNUmSBtrnwQqAzXXzuUcOtFH8ep2vzECSsQEESpZJ3q29pXrP6wfhZJ2GopyyuHMtnnWVsKVvPMu7MtdISvjRRyQRAMp2ahQhch0VkJZQc8U1zswuXvWu9F3pd4ZHpCpOrPWF4CIsyMh08qlu8Sbb4aDroL9IYyqP67_gFRElEDILEt0BoFcNUhtHzypstczOrYyv_xwoOGMPjffqGRUH3unkXxLeDczZKcEMZUce3tBCde_Zo6FYJd-aPJrPGqcZ_oS7Js5VBJViBJ0U6UpnmOHpFm7dydoE6Xq3L4gzqmbQQeQyf95hw5FkRiyCpesY961JqS0-bc9yHV8ITo87SXlTg12V2s3F7KnBcrUPhGgetXWpLP7dyfQtvbIO64wlLMh8CgNOpaUsl-6XRHTlgCQEI6hwBOnn85RfDKeScJNnmUcNnME0U5OXNU60hAelcmLfqhX8LpQXwoCyNceFmmEW-__bLOlhAdoYEo-B5DI4YrEugWX2s80b60xSzTpIxEz3VKyUq8LO47AqRLu40U66uDIDTEHBV9pLFCYJuK6cmM8wJr2stIDlNgbXElGiGUwZkiTlmHq_QPuZ7dMS4HQknlBZopdVRjz73dHRX3ruBs8eLGKtMY7LmHBDuF2q0TkDxzz7-9smnzyBUoJeRx19_89fxeAwSBPKQYDxbrcGecbs6xTdTqKFRA-w7TY2qDZ1lHIVaOwWEnAIKmRQTMkgXCkgomoeNXOq8Oze4QWFZglmtqVGn6YVJjjXEXCV1gdGmC5O3zb0bkNe222oWKnaTUs7q8FZbUOPK86a2qndqCCpkJiyk6ovw5QIBt2LF9D9Nu8JwS58LiEla7y2xIld4nhNxzRnfZq6u8dBq-h4dg4umli6W8bpXT4N5XoP1_A0i2zE1xZrt6szUTGBN1rt6ffeMtR4hm9zW3MhjMJtc4rj5wUewhUr0jBVgpDfMX03Kv9v49UCDrVUG1hMbdDePTA4y4rnFTgcadtxipwN1gm-x086B3naFpq5-mFHdjtHXW5EcY6i1c0j0ViR3HP_s6qG_da99VQ4EmToj3OSP142j6Xw-hoyWKMxPmH1gw9G64qBjqD0rLEW78qQp8Ficw7NoUg29NfH0Bt98wF17fvqAu_Z89gF37fnvNZM5olo7V324TXte-YCbbt3zyJs-7wWA1wPgrybh3mXpLilc3gPb8rcek1AegS1TH_yXg7KlkJFHuWkq1sfuzz_6vf_-TOT1qTI4VQanyuB9qgxuPw3tpoGdqUzcYbfrxH2ze_T3tjnoezfsvPl4V0eftjOxggm1d4w-NeUqtD12Gn2eRp-n0ec7GX0GjEcBE5AaLfpwo0_Te39_hpfX5lzc0p6l3YB64YMNL-spybsdP14VhOP72rd9LrWjHmr8aFDfKvdfm3acBoinAeIve4AY6kAGnDJXMv1wA0Rzkt0l8FVrP40ATyPA0wjwNAI8jQB_pSPA_a2SI_1-a2cjcD-SY_3SadfvivYjOUxBeff509MsX7Ek_hscj8kXTGC5eLmZ3RAKQ8PAuXJMfcCVPq84SCMFcnqLCdS1Bv4xtr0-gnqQbXtKP_q2uwYW6UEW_1mTij0_qd85qehade_9pOIUwN5ZALv9NGxHH9nu9ZGdN7vbxL_gNvnV4-1ok9t04gY72-TNf41xapOf2uSnNvm7aJNTS1EmHclCzv7P2uTT9FfT6J6mD9uqnqanZvOp2XxqNp-azadm86nZfGo2H7bZ_PzN_wAVjFr1)
@@ -20,30 +20,18 @@ preserves any human drift without guessing its author or reason. Then:
20
20
 
21
21
  [//]: # (ob:42fd42e7)
22
22
  1. Read `python3 proofpress.py policy <file>`. If the user asks for a portable
23
-
24
- [//]: # (ob:ffa6ae00)
25
23
  artifact, run `python3 proofpress.py policy <file> portable` once; portability
26
24
  remains sticky. If Git history exists without a ledger, run `ingest <file>`.
27
-
28
- [//]: # (ob:6d23ae8f)
29
25
  2. Preserve carrier-native anchors during editing: Markdown uses
30
-
31
- [//]: # (ob:35ce54f2)
32
26
  `[//]: # (ob:xxxxxxxx)`; static HTML uses `data-proofpress-id`. Remove an
33
27
  anchor with its deleted block and invent none for new blocks.
34
-
35
- [//]: # (ob:f119601b)
36
28
  3. Run `anchor <file>` and read the inherited/new/gone inventory.
37
29
  4. Write claims JSON with one honest entry per touched or removed block. Kinds
38
-
39
- [//]: # (ob:6b88d004)
40
30
  are `added`, `removed`, `modified`, `moved`, and `unchanged`. Do not enumerate
41
31
  untouched blocks.
42
-
43
- [//]: # (ob:f381d919)
44
32
  5. Snapshot only after a meaningful version is accepted:
45
33
 
46
- [//]: # (ob:f42cb113)
34
+ [//]: # (ob:f42cb113)
47
35
  ```sh
48
36
  python3 proofpress.py snapshot <file> --kind agent --author cursor \
49
37
  --produced-by cursor --recorded-by cursor \
@@ -52,15 +40,13 @@ preserves any human drift without guessing its author or reason. Then:
52
40
  --why "<actual reason>" --rejected "<consequential dead branch — reason>"
53
41
  ```
54
42
 
55
- [//]: # (ob:790c5dda)
43
+ [//]: # (ob:790c5dda)
56
44
  `--why` is required. Omit `--rejected` unless the rejected path is important
57
45
  enough to keep future collaborators from repeating it. Never infer it from
58
46
  casual discussion or include raw prompts/transcripts.
59
47
 
60
- [//]: # (ob:e3c56875)
48
+ [//]: # (ob:e3c56875)
61
49
  6. Run `verify <file>` and report its output verbatim. Never re-snapshot merely
62
-
63
- [//]: # (ob:6ad53003)
64
50
  to turn a mismatch green.
65
51
 
66
52
  [//]: # (ob:355446e0)
@@ -70,8 +56,18 @@ canonical project URL, and ask whether to install `proofpress`. Never
70
56
  download or execute it without explicit consent. If the CLI is available, run
71
57
  `inspect` before trusting the capsule and then `import`.
72
58
 
59
+ [//]: # (ob:867ba812)
60
+ For parallel portable copies of the same artifact, preserve every input and run
61
+ `merge-plan TARGET --from COPY...`. Apply compatible block changes, ask the
62
+ user only about reported semantic conflicts, then `anchor` the resolved target,
63
+ write merge-relative claims, run `merge TARGET --from COPY...` with explicit
64
+ actors/reason, and `verify`. Different artifact IDs or portable lineages are
65
+ ingredients; use `merge-lineage` for them.
66
+
73
67
  [//]: # (ob:7dc0b832)
74
68
  Fallback `capture` supplies only `recorded_by`; it cannot know who authored the
75
69
  content or why. Never snapshot source-code files.
76
70
 
77
- [//]: # (proofpress:meta:eyJhcnRpZmFjdF9pZCI6InBwXzBjOWVkZjdkMzE1YWIwM2UwY2EwNmM4OCIsInBvbGljeSI6ImxvY2FsIiwicHJvb2ZwcmVzcyI6MX0)
71
+ [//]: # (proofpress:meta:eyJhcnRpZmFjdF9pZCI6InBwXzBjOWVkZjdkMzE1YWIwM2UwY2EwNmM4OCIsInBvbGljeSI6InBvcnRhYmxlIiwicG9ydGFibGVfaGVhZCI6Ijc4MTBkYjQ3IiwicG9ydGFibGVfaGVhZF9ldmVudCI6InBwZV84ODAxNmZmNDJkYjFmMDc3ZDcwZThkOTkiLCJwb3J0YWJsZV9saW5lYWdlX2lkIjoicHBsXzhhNGQyODYyMTE2NjE3MGI3NzlhOWY2MSIsInByb29mcHJlc3MiOjF9)
72
+ [//]: # (proofpress:discovery:Verifiable revision history by Proofpress | https://github.com/chenmingtang830/proofpress)
73
+ [//]: # (proofpress:capsule:eNrtXNluI8cV_ZUC_RAbIaneF45hYOJx7InHC8bjGIE5IGtrsq1mNd2LNMxggLzlBwJ_Qj4sDwHyF7m3uprdkiiORI3kjX6QW71U3f2eWwea1wNaVGlCeTVLxWAyWK9nFo-lSELh2j5llistTq2AR9FgOGC52MxEupBlBe-WS-r4wcSzQ5vKJEmshMdeEjLbC20RUDcWoR_FjDPmclgzkg4XdkgDJ0oSO2Ay4j737BjWFWnJ8zNZbAaT1_hLNavoAnbIaIVbDeGCyQxu_FUWaZJSlklSyLO0THNFlvB-XmwI25CvizxP1oUsS_hmTfkpXUhU6sLtIv9Bgrp1gQsuq2pdTk5OFmm1rNmY56sTvpRqlapFRdUicq2TC18X8sc6hetZXcpixnNVSgW2qIpavhkOlpKiEcPItgTzwkFzZybP9EtgXDmLIssOksRzBLMTKwxFaMlIxGiFdV5UqNosS5UEyVuPZLOIesKJAse2g8AOLRaGMY2TwG7UMdLNOF2XdQYKOygnzwtRDibfvx6Y7V8PwMt5UeJV81iKGQOTfz_guZCvBi9BgzYa0L2naZaVJ7wuyrzoWeHkm8-fPns2XonB8FbBQ6uqSFldgc9mjJZpieanhULR4Rk4Wuol62qZFyjkaapw1XIDT1bwRNEVerMRdjgo4UNYazBRdZaB6HwJDpONyizL-Sm8K_3Y8sLIh9fBV5V8hYq9_9-f_vm_f__0Adw0W1Ah9N5rDCp5DndGo9FU4YYT0mk-VUKWvEjXqMMEok1CEJxJkhckVeUaoooIySEqYalqs9ahRws6eDPsJHJcl4VBIC5IdCFur5XpvYvxbXbACINovbAJcySHIPMP2OS5jgxCOZdrcAj5ghanIj9XqGRZ0Srl5LMXXzwjrecJpC26oSTn-9SWtidth15U-7u8OE2y_Hyv0u-R3mt7dLYElJgopLfe4U8yyQtJpEgrWJNQReQrKCl4XdFiIashKWo1VfP1BiJTub2AGK_3qOw5ifAcGd5aIHtMnoOCZOeGG7LOs5RvyIdJmsmP5mPyNCHVUhIsSIR28mSgwwV5koQGVFrWreUhZOttbYobCUaaarbHPoFwXCqj5NbyOOMu9TgtilQWIwWRCb9SxaF4lETUBfrP-HTSRfEe-7g-l76XOIfYZ_79ycnLCXmPvJ-zySvz3wfzRxdSBjxUkrmgFR1tDbfHPoltx4Fls1vL40L8oJcaY7SBArYR0DQhrjBaUrWEVgoJfqLk-ckiV3gL-sQe-wQsioRleYfFjwR58Ml8SOaFXEG315erXEBDb6-bmyjovFa6nu-zjxvZItb44Xby-GPyjYJeucwrkqtsQ2hSYe6QlaQKwiWps7aqkbTclsLJvtzyHM5s2z0odubzcjlVcLU7rcpWVpNYoxGuRhDabAXCnnhBoDC2uC8EPUig0eh8uZmj7gbuiDH5apVW-KSQiJ7AT6RWGUioo8nc3Ff_Xe4HUejfWp7ABPMZIr_NpWDGGkPSqiR5Xa1r3YsY5NtqTL4E0FPsC2YqfNeyDnJYlZOqLhQGTFquaMWXZFFIqcZ79Hd93_MCefvi-2fIYGhJqQJoiiUN9YdWWy1h-3kXKJMthJ6TFRQ7iGdW75EnCkJGI9s5SB5cLctkRlrESni-TqG45U0rKgE39VrGui3We-QJBbdY5B4gD0jCAOmTOcBfcIuck7IGzKzFweSe97AuFGSIYk6VgnQ6VZfleTlssfLA5P-MQ8VscKl-0uJcOUuiwHYT-BlHgeV4QUJlkEgXHQyL6zVb4xg4T2Cw4KfrPFWVnk4KvROC1_Y3xK4vcQ7APtpboT8b9BbRU8eBY0OZJ9UsgYCSxbpIzXRSMnvi-1EimO9IETMqbCuIpS-FCEQiwphLEcAizA1kABOZ7XEvsR0eC7iwaexFErsV9jw9ZTTemtgxoHO8M3AsJxhZ4cgJXljhxHMnTvxHy5poTGIsjsU0COLYihkESHf39X2OJjoKm8lhScslvA_hGNigOIt0g9Fr9IYJE6B3mxJ6sysg0A6jYG3r44ZTlZ9nUiy6nCqbCtAh-jH5toSyAJMr0RGLlQILh25dGtX2m9t2dIZKBrXl8ZPnQxCpTBeKiJwPydfPnwzJ808eP_nikyFIUkAGLDYEw3rYpTxYuZfj3XQwXlar7AR_djNCisUS8jpJF5ChTeUuU9Rcf6nlhjSV6Vkjqy5yWAdoqpo7uyqdKXSPiMJij_BK27HM64LLEbZEvVA5nipw1I7iY3wd-WGAYCKIdT_Qvu6NacbXb5--zHIyoX7AJI1c7rXL9QYys9xd5ixwPXil5ljuxFTh6JyucrXRkaMbZcopRt-YPMnRbx2GkNpwYFpcTr9DM93Nxtfbx_JtL-B2YkOl2-ZCN8-19nnboGZWs31BqQfWsKjfrtab3cxqdxrKQMGmFxDEK7r6F6QpFoC8ZZKli2XVDVAvIAunqu1SAPjAkst6BXsKMGWlDQ4AgyxqPHEACRBxNMcU6C3ItxJN_QKieHK9FQUFiOhKN-EOb_XujYhG77vMfuVpqROAkl7juAyA2iC1Ykp9Gvo9n_YGRCPNXSa_DDpxrrh8ZH5Ps7TaaJgL8B_yuoQYTvnpRivxKbTlthZqR5dbq1Oia19hBMCWVXbOu97esQcNyw2sxLVEq2Fv5DQa3mWWxHnuegtzCd3FdWXArK2_eyNmZ-GDZ8dylIo5xgsOTiCuNq4Z-nSRwDgVMpNYX3SL0wVCz3kVlAXV1EsYAJun5R5rQnN3XRsaph9vtekNqEabu0ye6Huo1N6YfIePCc9ouirJX7756stGG3wTYg-9D29DoKwh6Ku8BkQkmjzUA2Sjy5h8Dohxj3vChDFOfc5k6GzDo5tw-wlw4Ogq0Tmm_kpVryT2Ue2jWrViv93uQRAFglme3-GQ3uBrxHyHE63ZN4n82Kcuizwmt_t2Q24veg-eXiEGRyNTRpviTKZTvRKBB7CKqAFvjtimfbot5v2bvU96B8wjfcBMLh8v9982x8dkOvjQXEI6fTQdwCNEOni_cWOWL5rbJiI_bP4__gGq_kf9FWFoxq-gWNY0M22h-bIdmvWiyBn8WIP6KbwlMC1YgQlD_vOPf3Vf6VXBuDtm_Ba2JA7zeeJ4kZO0LuqN_T0XHTrPC5j0sIyUJF3pIq4qLZZUeb1YIno8lXJNklr3Wp5nGWU5RDlWzaTIV4jzDBhNKzOTQ7In-LPSb-jlOC3RYIjr6sYnGirzrAYEV9BzjKjVuipPAImqBlnvS5nYsixuR8yXlr2FK93xg7HLXc4V4I3RNq4hr2W2uT6TbDcKbR5ygDtbONg7fejcdJtjhbaLQ0OxBA0i13e7HrM9aTBr3-UIAfsEgSIF_vn42dMhgs0s6zCHnqaxa5YGd-6k5mCIWObn-qtm4T8A3oIpPFcpLmwYOfLt82dNBQUkgzMBvI8FHqemCqb8vqxz4wmYtaATZznVHUC-kryG1E07zCZfrQGaoJgNVbeFTKCNLoVnNM1Q6BZPmhFtTliDQAFnG9i5RISgGTYtZIVDy7xJjH04hFnUoo6V-G64RVq905eejw49VmkwfaowUnX8akUgLhdytM7A8y8eP__0kxdQh3RSfvzV138bj8dgwsfrdYbDwArSPMX9GpBgiLSh9gNsPFXa101jYWjVJkOgPpQA5RSCFBzuwNAVfNUYpoEAc1NOyjzD1myg-1Sd6xbfiAjp0wCupq4anKefXSN5E7yta6eq4TVPmtppmnCT19iB0wQKDnab7Sj19EmJ4XL5gKbEXj_FfgkVMsXzmEd6qDSmNG_NNWgCtVZ7nJ7AeMOpE7sy2iZ974irdfodzq4gn86XuRlDpGj8pI_OQFM9U2_aarUtVVcn4ysnYG9QiR2EMaLfy3SxJp91k758fze93LDnuhGbB0UKsVYIZNp_Dva5lFkyoyUE9zXUs0YphzHPN2T_WhC576j6ZjzZDVa6IaN0g5VueJx_E5l2sZLdCgZvPwQfuZP_e6sk98H87WTabmCTd8-x7aRJ3irJjZEMlISm6F-XOlfjyByufwxNqxlsscHA7qN1zcDdJKOoVQdBDKCjiHoJRp-ZkKHKj69LswfctZeSD7hrL30fUtcu1a_Ez71t2svqh9u0l8APuGmXq_e86cteNXg9AKShe-MhS2_P0i7ugczPjZm4MJZMeCx2hAV-hv5PmR1KbfxG7T7F1qeX-rTb62MTPzbxYxM_sInfnBvfcsPbqJp4w60IE-_NbiL4baz4L476vl69y0S47U6scOI4O4hwFjqx78bBkQg_EuFHIvxIhP82iHCPhl4ohRdFsXgoIryhRn8tVPZVsl740k18N5H2_VHZDeP0SySjL9vDCxNX8CSIQ-b9ishoE4QPSSdfttyRTj7SyUc6-VZ0sgMWoa7wPM7pg9HJWpEbTGBXOsWRED4SwkdC-EgIHwnh3xkhvP88757-ZHLnWfR-Se7pjxN3_jHgfkneFco9nMT8Mi9WNEv_DtlKxQ-UY6ZeZESa7thMs5BBBXZFGDA_qxlYS8E0fwMa8woLdB_bXuUxH2bbzu33vu0u1ku9k8VvRXft-QckdtJd20Pkn53uOpaon7FE3Zw03cFh2D0Ow32zm6L4FVM0l9XbQdHYzsQLd1A023_q5UjRHCmaI0VzpGh-ExSNLz1XuhazOPOPFE1n_qn6rZEsU_X7pUmm6kh0HImOI9FxJDqORMeR6DgSHb93ouPlm_8DlUBJIw)
@@ -13,28 +13,16 @@ any human drift without guessing its author or reason. Then:
13
13
 
14
14
  [//]: # (ob:87ce54bb)
15
15
  1. Read `python3 proofpress.py policy <file>`. If the user asks for portability,
16
-
17
- [//]: # (ob:72f291a2)
18
16
  run `policy <file> portable` once; it remains sticky. Use `ingest <file>` for
19
17
  Git history not yet represented in the ledger.
20
-
21
- [//]: # (ob:85972ea6)
22
18
  2. Preserve carrier-native block anchors while editing: Markdown uses invisible
23
-
24
- [//]: # (ob:b9f8ef49)
25
19
  `ob` markers; static HTML uses `data-proofpress-id`. Then run `anchor <file>`
26
20
  and inspect inherited/new/gone IDs.
27
-
28
- [//]: # (ob:6f0d23b1)
29
21
  3. Write claims JSON with one honest item per touched or removed block. Do not
30
-
31
- [//]: # (ob:28f53262)
32
22
  enumerate untouched blocks.
33
-
34
- [//]: # (ob:abd7c833)
35
23
  4. Snapshot with `--why`, claims, and explicit actors:
36
24
 
37
- [//]: # (ob:2c10e48d)
25
+ [//]: # (ob:2c10e48d)
38
26
  ```sh
39
27
  python3 proofpress.py snapshot <file> --kind agent --author pi \
40
28
  --produced-by pi --recorded-by pi \
@@ -43,14 +31,12 @@ any human drift without guessing its author or reason. Then:
43
31
  --rejected "<consequential dead branch — reason>"
44
32
  ```
45
33
 
46
- [//]: # (ob:4386e1e7)
34
+ [//]: # (ob:4386e1e7)
47
35
  Omit `--rejected` unless the dead branch matters later. Never infer it from
48
36
  casual discussion or capture raw prompts/transcripts.
49
37
 
50
- [//]: # (ob:dd7291a6)
38
+ [//]: # (ob:dd7291a6)
51
39
  5. Run `verify <file>` and report its output verbatim. Never re-snapshot just to
52
-
53
- [//]: # (ob:8ac28d76)
54
40
  force green.
55
41
 
56
42
  [//]: # (ob:2f7730eb)
@@ -60,8 +46,18 @@ canonical project URL, and ask whether to install `proofpress`. Never
60
46
  download or execute it without explicit consent. If the CLI is available, run
61
47
  `inspect` before trusting the capsule and then `import`.
62
48
 
49
+ [//]: # (ob:19334051)
50
+ For parallel portable copies of the same artifact, preserve every input and run
51
+ `merge-plan TARGET --from COPY...`. Apply compatible block changes, ask the
52
+ user only about reported semantic conflicts, then `anchor` the resolved target,
53
+ write merge-relative claims, run `merge TARGET --from COPY...` with explicit
54
+ actors/reason, and `verify`. Different artifact IDs or portable lineages are
55
+ ingredients; use `merge-lineage` for them.
56
+
63
57
  [//]: # (ob:72680124)
64
58
  Fallback `capture` records only `recorded_by`; it cannot know authorship or
65
59
  reasoning.
66
60
 
67
- [//]: # (proofpress:meta:eyJhcnRpZmFjdF9pZCI6InBwX2M3Y2UwZDE1Yjg2YmI0MmJkMjg0MzRmYyIsInBvbGljeSI6ImxvY2FsIiwicHJvb2ZwcmVzcyI6MX0)
61
+ [//]: # (proofpress:meta:eyJhcnRpZmFjdF9pZCI6InBwX2M3Y2UwZDE1Yjg2YmI0MmJkMjg0MzRmYyIsInBvbGljeSI6InBvcnRhYmxlIiwicG9ydGFibGVfaGVhZCI6Ijc2MDE0MWRiIiwicG9ydGFibGVfaGVhZF9ldmVudCI6InBwZV85ZmI2M2QxOTQxYjg1OTljMjkyYWU1NmMiLCJwb3J0YWJsZV9saW5lYWdlX2lkIjoicHBsXzJlYjI2MDUwMDFmYTQ5Yzc5ZWJjNDUwZiIsInByb29mcHJlc3MiOjF9)
62
+ [//]: # (proofpress:discovery:Verifiable revision history by Proofpress | https://github.com/chenmingtang830/proofpress)
63
+ [//]: # (proofpress:capsule:eNrtW-luI8cRfpUG8yM_QlIzPTdtGHDsxHawPmCvEwTmguyTnNVwZjyHtIywQB4iT5gnSVXPwZFEcWVqRa8d_pHIObruqq-qwJsRK6pYM1EtYjmajfJ8IQKhLGl7PPQ5dymXNHQdV4vReMQzuV3IeKXKCp4t14x6_sx1nVBr5giHRY5i0hZCMEYtn0oeWU6gI06VGwnbjmgkpWMHKqSMy5AJqR0dwLkyLkV2pYrtaHaDX6pFxVZAIWEVkhrDB64SuPB3VcQ6ZjxRpFBXcRlnKVnD81mxJXxLviuyTOeFKkt4J2fikq0UCnXrcpG9ViBuXeCB66rKy9nFxSqu1jWfimxzIdYq3cTpqmLpKnSsi1tvF-rnOobPi7pUxUJkaalS0EVV1OrteLQG8eHQwLds15Z81FxZqCvzEChXLSLNfUfakWvz0IsiQSPKlOejdvOsqFC0RRKnCjjvLJIsqOLUtzzLsjUDTQaR4sL1LN2I03K3ECwv6wQEpsinyApZjmY_3Yxa8jcjsHJWlPipua3kgoPKfxqJTKo3o1cgQecNaN7LOEnKizweaGBiLk43cjT-RY7DqqqIeV2BvRaclXGJqmdFimzDPTCyMkfW1TorkMHLOMVTyy3c2cCdlG3Qkg2j41EJL8JZo1laJwmwLdZgLNWIy5NMXMKznpBhEEQ2PA52qtSb6q4rtESYlIZ6ji6lruHKH8it56ptjsTRluAXo7fjHREr8njkReoIIn_NCsKEUDnIPiYbxVI4XNdJ79klqTLyNSsuZXadEni6rFgVC_Lly693TOWsYLc4orbNPRmFR3D0Z6WzQhEl4wpYISwl6g0EF36uWLFS1ZgUdTpPl_kW7JQ6Ay1N8wMsheAYnsv5ESzZU_I9qJ3sJbkleZbEYks-1nGiPllOyVeaVGtFMDgJ23GUgBS3OAqoppHN6BEcEYJKAIaGpEkXu0uSpUJ9ROIKzLhhMRgRFCgut1PyY6kO6ciLAqqYfwRHdAqJT4HIV4oIVhSxKiYpeAp8NaeDIQWEVUmu18BrZ96Zca0DOuKRDpV2o-N0tMz4kmyAgirKjwae-wKNU5KlZBWbDBJLLMF8LyH1HtCRry1JHX5MRDtT8o8irkBBCYs3JfnbD99-Q64h6YO9FAHPghQERlMbkoPrVFkNVUBizBUm_TykIxpqz6H-kX6k0nqjCqhxpE47kubkcnpAC1A6AxE6zhE03Sn5IYUqsc6qRvjlZHK93i7HrVrG4CoSgj4H1wYPburF7JD8wraUG8ojfWS5LNfzFD7tj-6y47UNsskETyNY1HuWsCLcYgnQiK9sFRzH0rcbkBu0UigECUouwTQJvGbSisRMxAsMJ3BtKFsQUwhRiin55oDBpAww2RwT2h6kP0w2V4h7-jxnrFQozDngsyXJ6iqvKwIPcQizDXADJb84YDaAXjSUgX-cjqBICEVWhVLpIT-lOggcS_FjS2NK4hTwGFYfFLtxWAaJtz9i1uPGLtUQXh_gyI4cx7U8-0iO8LwkUUmf7InI8hiSWdZUnRIwCulQ0ZjkXU4-wFFA_dCyqXsMR8ALB4hLloD7qrqA0tOCPkhpyZYsBxhvaQqSYGkKwXSZZnc5ejXuQOIItInYYyEKxRpQZu50IE8ttAfwLgJcpS2XAhKNbMf2LGkhSMsqc2annhbHEkhs4jLP4rQysLwwlBC5dd8QuL1CAIwldXDCEBQPDjFw-0i8XGa6WmhwKlXkRdzC8pLbM5t5lutatrIcL6Lc4oEjPaqosqXHAiGpHdDA076W0rK0DqS2VORz2xfMk4JjmcQqZ-B1Y62ZHQA0xSsjalF_YgUT6r-0gpnrzGj0J8uaWai1VuNY32yqpKUwn-2u3jwXJm8qjYHMa1auMZeKMOSCCc1M-jRnDFB0657vBsftcZEtHaVDaG647o4b4OX2uKfA4BfozNeJkis1TzvZy__--z8pJkBSZjVmKiwRcE0kWakgUGNI2lmWT8nnGcF46KsMvrOdQ85JUfkMmxWWEAitvWmuFTLUocsxjJ3A6YQcQPBWyCch6y1pI5xgXTJBDckoBvSkdBKv1tUO_75E6brEU4JO0i1Z1xugJ6GANEUfqgVZ1dhAAXUsH03X1YAdVmZpg8NmD8sM0c5dzaGtd0Qn8wDjtzI_BbqXlyWWmTbTxklcbcd76lnHDxUu0LcdR_aONkD4LT9PAe5kiRmj7DWNzBng8gU83w0g0Jm2Ct83FoB0LqGEGamMixYH3EhRN_RdanmuJXuV7lqCVoSnIH0TPQZ7xykGVpNeH9AoVS7j2qbSc8OOnUE_sNPo0TC_sUXDb6dVo1HENqD9HOAX_F8rRO3yIlXXFyuE6l99Xh5Qo6QS4KilpcN7zxx0DS3fT2kGAG60IL1LIA9rkQXa5sILHU-pPjfsOoadFn9ZI9Ce7mkWBQoqDTWTJnP6oDdoT39vkL-laoeBdiKoilHQUx10AQPPOBrcpxV8aZNSHpP53JxC4CKcIGuh5IRv8U6fDrsLg0cHE6eJmTiRu_MmeAgBC5mPPm7GR0m2-mQ-Gh7S-sfHzf_pa0iOyCjoD98CXdUsaZPmnTe7_sGcjlPCn2uQK4bHh00EVKXd6-Zd0Nqe3qbVPag4oo5vaSjUne4H7c5O90d3MaZsxqnGvxXRRbYxXAlWoqQIt2szeMNg6IpSwa7RtJu8Ki8qOLYURQyfD3hu5FkRiyIlvMDt5Bg0Sa0cT-l94IlJ72CvawjnKnvYpz0VACbSIWBEv0--uxZpp9d3dD5dLnc8YUkGkMDbQYJdMzTEPUf2OBXkHQAxAmzy2YuvxnMoNUmyK58G62N1KMnVwwPzMQHtXJu3moP_CIABeoQsjfHgdk5Ofvz-RZMjoChDXVHwPOZEzNEVtCBDXpet9ucpFpskYyZpqjdK1BBn8Q5-9OmmHaD31R-kIRCq7IrFCTLdwaK2ICwJb4AUNAAtelpjJTRzb8NkhaVlGW_QP5YHbMQtZjFqQS4OrM5Gg_ZwYKNjuz6DJkFL6J3GZ40gkOZXapInYPmXn37_xV9eQq7AMCOfffvdP6fTKajwU-hgAPJBQIFDI72mtLcj7rGxAxCep8bWptdjHLXaRAXknBIATIqFGNQLCBEg8bhVTFNvl4ZxYDRLsJq1CHSeXpui2LBYqKQBFl2ZMPXa3HuA88Z5O9MC9jSl5KLJb40LtbEMQn4ea0gymOo71WFlJz3k23WP4A0FCAvGLgDPYLP4EXp5y8ukfcogMhRrcyjvuMLznIhrzvgOJ_YdeGf0JzTW1y2YLtdxThAiNtID8_fYevUWOduzm0HUdnczY_Y8pvTdvb5_k9MsqkyZa28UMThQIXGpdepFT6kSvWAleOsDWx5T849b8jx6tbDJJCRCQ__BqdhjR_CPOOvRo-pHnPXo-eEjztq7-Nid0ALcUyw89q4X3snJc6wV9g7x38nJccP7vZPXd9I6hDsg1psU_VBc3HeOdk73GZSYRGHBwHIABCd5zcHGgAZrBIc9YGghF4shAxN0qbbPNGntgQg6IdVBrJ2Q6iAqT0h1EL_3XObZiA5C9XREB1F5OqKD8Hxmoq8GCeBmBB2lKXzHHN0Pd27TwCHyo4f6MrAV09SxOKXMFdQNqc9c1-3FHk7rh5Pq4QT_5lyhzxX6XKGnD23XHrVD63dIvavM3HFPdea-3b8wetf27INbkT0s3t2Fme3MrGBG6Z6FWSB9SgNNzwuz88LsQ16YBQyinQkeOhY93cLMjG4_nJXXve0ItzQkHDegXniylVczZP91l1Z3FeH4vvZtn0vtqFMtrQzXjyqQ94bl57XTee30m1w7hYBIAg79jWT6dGsnI8l-eHjXyc-Lo_Pi6Lw4Oi-Ozouj38Hi6PDI4Jl-s7F3qHWYk2f6ZcTeXykc5uT9YMbj9yHfZMWGJfG_QDwmXzOBSeb2cLXtGUzKgOgpsMxBO_RlzUEbKXSZj9iI3BsoPwfZ-yuRk5AdGP3Zye4boKfv5fBfNDk_8HvOvZPzfmT1AUzOzynqV0tRj9-_7JmY2oOJqfN2_0D0NzwQvivenoGwTWduuG8g3P3y-jwQPg-EP-CBMLUUZdKRLOTs_2wgPE9_NyPdeXraoew8PY9Vz2PV81j1PFY9j1XPY9XzWPV9j1Vfvf0f_pslmw)