pipulate 2.68__tar.gz → 2.69__tar.gz

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.
Files changed (98) hide show
  1. {pipulate-2.68 → pipulate-2.69}/.agents/skills/journal/references/index.md +8 -5
  2. {pipulate-2.68 → pipulate-2.69}/AGENTS.md +13 -7
  3. {pipulate-2.68 → pipulate-2.69}/PKG-INFO +1 -1
  4. {pipulate-2.68 → pipulate-2.69}/__init__.py +2 -2
  5. {pipulate-2.68 → pipulate-2.69}/imports/ascii_displays.py +9 -9
  6. {pipulate-2.68 → pipulate-2.69}/pipulate.egg-info/PKG-INFO +1 -1
  7. {pipulate-2.68 → pipulate-2.69}/pyproject.toml +1 -1
  8. {pipulate-2.68 → pipulate-2.69}/.agents/skills/gsc-readonly/SKILL.md +0 -0
  9. {pipulate-2.68 → pipulate-2.69}/.agents/skills/hello-workflow/SKILL.md +0 -0
  10. {pipulate-2.68 → pipulate-2.69}/.agents/skills/journal/SKILL.md +0 -0
  11. {pipulate-2.68 → pipulate-2.69}/.agents/skills/pipulate/SKILL.md +0 -0
  12. {pipulate-2.68 → pipulate-2.69}/.agents/skills/roles/SKILL.md +0 -0
  13. {pipulate-2.68 → pipulate-2.69}/.agents/skills/sheets-readonly/SKILL.md +0 -0
  14. {pipulate-2.68 → pipulate-2.69}/AUDIT.md +0 -0
  15. {pipulate-2.68 → pipulate-2.69}/LICENSE +0 -0
  16. {pipulate-2.68 → pipulate-2.69}/MANIFEST.in +0 -0
  17. {pipulate-2.68 → pipulate-2.69}/README.md +0 -0
  18. {pipulate-2.68 → pipulate-2.69}/apps/010_introduction.py +0 -0
  19. {pipulate-2.68 → pipulate-2.69}/apps/015_config.py +0 -0
  20. {pipulate-2.68 → pipulate-2.69}/apps/020_profiles.py +0 -0
  21. {pipulate-2.68 → pipulate-2.69}/apps/025_aspect.py +0 -0
  22. {pipulate-2.68 → pipulate-2.69}/apps/030_roles.py +0 -0
  23. {pipulate-2.68 → pipulate-2.69}/apps/040_hello_workflow.py +0 -0
  24. {pipulate-2.68 → pipulate-2.69}/apps/050_documentation.py +0 -0
  25. {pipulate-2.68 → pipulate-2.69}/apps/060_tasks.py +0 -0
  26. {pipulate-2.68 → pipulate-2.69}/apps/070_history.py +0 -0
  27. {pipulate-2.68 → pipulate-2.69}/apps/110_parameter_buster.py +0 -0
  28. {pipulate-2.68 → pipulate-2.69}/apps/120_link_graph.py +0 -0
  29. {pipulate-2.68 → pipulate-2.69}/apps/130_gap_analysis.py +0 -0
  30. {pipulate-2.68 → pipulate-2.69}/apps/200_workflow_genesis.py +0 -0
  31. {pipulate-2.68 → pipulate-2.69}/apps/210_widget_examples.py +0 -0
  32. {pipulate-2.68 → pipulate-2.69}/apps/220_roadmap.py +0 -0
  33. {pipulate-2.68 → pipulate-2.69}/apps/230_dev_assistant.py +0 -0
  34. {pipulate-2.68 → pipulate-2.69}/apps/240_simon_mcp.py +0 -0
  35. {pipulate-2.68 → pipulate-2.69}/apps/300_blank_placeholder.py +0 -0
  36. {pipulate-2.68 → pipulate-2.69}/apps/400_botify_trifecta.py +0 -0
  37. {pipulate-2.68 → pipulate-2.69}/apps/440_browser_automation.py +0 -0
  38. {pipulate-2.68 → pipulate-2.69}/apps/450_stream_simulator.py +0 -0
  39. {pipulate-2.68 → pipulate-2.69}/apps/510_text_field.py +0 -0
  40. {pipulate-2.68 → pipulate-2.69}/apps/520_text_area.py +0 -0
  41. {pipulate-2.68 → pipulate-2.69}/apps/530_dropdown.py +0 -0
  42. {pipulate-2.68 → pipulate-2.69}/apps/540_checkboxes.py +0 -0
  43. {pipulate-2.68 → pipulate-2.69}/apps/550_radios.py +0 -0
  44. {pipulate-2.68 → pipulate-2.69}/apps/560_range.py +0 -0
  45. {pipulate-2.68 → pipulate-2.69}/apps/570_switch.py +0 -0
  46. {pipulate-2.68 → pipulate-2.69}/apps/580_upload.py +0 -0
  47. {pipulate-2.68 → pipulate-2.69}/apps/610_markdown.py +0 -0
  48. {pipulate-2.68 → pipulate-2.69}/apps/620_mermaid.py +0 -0
  49. {pipulate-2.68 → pipulate-2.69}/apps/630_prism.py +0 -0
  50. {pipulate-2.68 → pipulate-2.69}/apps/640_javascript.py +0 -0
  51. {pipulate-2.68 → pipulate-2.69}/apps/710_pandas.py +0 -0
  52. {pipulate-2.68 → pipulate-2.69}/apps/720_rich.py +0 -0
  53. {pipulate-2.68 → pipulate-2.69}/apps/730_matplotlib.py +0 -0
  54. {pipulate-2.68 → pipulate-2.69}/apps/810_webbrowser.py +0 -0
  55. {pipulate-2.68 → pipulate-2.69}/apps/820_selenium.py +0 -0
  56. {pipulate-2.68 → pipulate-2.69}/apps/830_pico_slider.py +0 -0
  57. {pipulate-2.68 → pipulate-2.69}/cli.py +0 -0
  58. {pipulate-2.68 → pipulate-2.69}/config.py +0 -0
  59. {pipulate-2.68 → pipulate-2.69}/imports/__init__.py +0 -0
  60. {pipulate-2.68 → pipulate-2.69}/imports/ai_dictdb.py +0 -0
  61. {pipulate-2.68 → pipulate-2.69}/imports/ai_tool_discovery_simple_parser.py +0 -0
  62. {pipulate-2.68 → pipulate-2.69}/imports/append_only_conversation.py +0 -0
  63. {pipulate-2.68 → pipulate-2.69}/imports/botify/__init__.py +0 -0
  64. {pipulate-2.68 → pipulate-2.69}/imports/botify/code_generators.py +0 -0
  65. {pipulate-2.68 → pipulate-2.69}/imports/botify/true_schema_discoverer.py +0 -0
  66. {pipulate-2.68 → pipulate-2.69}/imports/botify_code_generation.py +0 -0
  67. {pipulate-2.68 → pipulate-2.69}/imports/crud.py +0 -0
  68. {pipulate-2.68 → pipulate-2.69}/imports/database_safety_wrapper.py +0 -0
  69. {pipulate-2.68 → pipulate-2.69}/imports/dom_processing/__init__.py +0 -0
  70. {pipulate-2.68 → pipulate-2.69}/imports/dom_processing/ai_dom_beautifier.py +0 -0
  71. {pipulate-2.68 → pipulate-2.69}/imports/dom_processing/enhanced_dom_processor.py +0 -0
  72. {pipulate-2.68 → pipulate-2.69}/imports/durable_backup_system.py +0 -0
  73. {pipulate-2.68 → pipulate-2.69}/imports/mcp_orchestrator.py +0 -0
  74. {pipulate-2.68 → pipulate-2.69}/imports/server_logging.py +0 -0
  75. {pipulate-2.68 → pipulate-2.69}/imports/stream_orchestrator.py +0 -0
  76. {pipulate-2.68 → pipulate-2.69}/imports/voice_synthesis.py +0 -0
  77. {pipulate-2.68 → pipulate-2.69}/pipulate/__init__.py +0 -0
  78. {pipulate-2.68 → pipulate-2.69}/pipulate/core.py +0 -0
  79. {pipulate-2.68 → pipulate-2.69}/pipulate.egg-info/SOURCES.txt +0 -0
  80. {pipulate-2.68 → pipulate-2.69}/pipulate.egg-info/dependency_links.txt +0 -0
  81. {pipulate-2.68 → pipulate-2.69}/pipulate.egg-info/entry_points.txt +0 -0
  82. {pipulate-2.68 → pipulate-2.69}/pipulate.egg-info/requires.txt +0 -0
  83. {pipulate-2.68 → pipulate-2.69}/pipulate.egg-info/top_level.txt +0 -0
  84. {pipulate-2.68 → pipulate-2.69}/server.py +0 -0
  85. {pipulate-2.68 → pipulate-2.69}/setup.cfg +0 -0
  86. {pipulate-2.68 → pipulate-2.69}/tests/test_apply_airlock.py +0 -0
  87. {pipulate-2.68 → pipulate-2.69}/tests/test_mck_rep2.py +0 -0
  88. {pipulate-2.68 → pipulate-2.69}/tools/__init__.py +0 -0
  89. {pipulate-2.68 → pipulate-2.69}/tools/advanced_automation_tools.py +0 -0
  90. {pipulate-2.68 → pipulate-2.69}/tools/botify_tools.py +0 -0
  91. {pipulate-2.68 → pipulate-2.69}/tools/connector_tools.py +0 -0
  92. {pipulate-2.68 → pipulate-2.69}/tools/conversation_tools.py +0 -0
  93. {pipulate-2.68 → pipulate-2.69}/tools/dom_tools.py +0 -0
  94. {pipulate-2.68 → pipulate-2.69}/tools/keychain_tools.py +0 -0
  95. {pipulate-2.68 → pipulate-2.69}/tools/llm_optics.py +0 -0
  96. {pipulate-2.68 → pipulate-2.69}/tools/mcp_tools.py +0 -0
  97. {pipulate-2.68 → pipulate-2.69}/tools/scraper_tools.py +0 -0
  98. {pipulate-2.68 → pipulate-2.69}/tools/system_tools.py +0 -0
@@ -1,8 +1,8 @@
1
1
  # The Pipulate journal, indexed
2
2
 
3
- > Auto-generated on 2026-09-28 by `scripts/articles/generate_ai_context.py` and
3
+ > Auto-generated on 2026-09-29 by `scripts/articles/generate_ai_context.py` and
4
4
  > rewritten from scratch on every release. If this date looks stale, assume
5
- > the rest of the repo is newer than this map. 1500 entries indexed.
5
+ > the rest of the repo is newer than this map. 1503 entries indexed.
6
6
 
7
7
  This repository holds the *machinery*. The *reasoning*, the running journal
8
8
  that explains why every piece exists, lives on a separate website and not in
@@ -27,6 +27,9 @@ The first 20 entries include full `index.md` URLs to establish
27
27
  the link pattern. All remaining entries are bare slugs. Reconstruct any full
28
28
  URL as: `https://mikelev.in/futureproof/{slug}/index.md`
29
29
 
30
+ - [2026-09-29] [The Deed Is Named for the Door: Engineering Replayable QA Archives for AI](https://mikelev.in/futureproof/the-deed-is-named-for-the-door-qa-archive-zip/index.md)
31
+ - [2026-09-29] [The Qamy Door and the Cellular Witness: Launching a Third Domain with Replayable Receipts](https://mikelev.in/futureproof/qamy-door-cellular-witness-replayable-receipts/index.md)
32
+ - [2026-09-28] [The Forward-Slash Test: Bridging Agent Skills to Claude Code with Verifiable Receipts](https://mikelev.in/futureproof/the-forward-slash-test-claude-skills-bridge/index.md)
30
33
  - [2026-09-28] [AGENTS.md and Agent Skills: Refactoring Pipulate for a Checkable PyPI Release](https://mikelev.in/futureproof/agents-md-agent-skills-pypi-receipts/index.md)
31
34
  - [2026-09-28] [The Cost of Forgetting: The Epistemic Price List and the Art of the Lean Codebase](https://mikelev.in/futureproof/the-forgetting-kata-and-the-epistemic-price-list/index.md)
32
35
  - [2026-09-28] [Pinball, Pachinko, and the Art of Replayable AI Workflows](https://mikelev.in/futureproof/pinball-pachinko-replayable-ai-workflows/index.md)
@@ -44,14 +47,14 @@ URL as: `https://mikelev.in/futureproof/{slug}/index.md`
44
47
  - [2026-09-19] [The Color Blue and the Pipe: Inspecting Code Before Execution](https://mikelev.in/futureproof/color-blue-pipe-inspecting-code/index.md)
45
48
  - [2026-09-19] [Edna Mode Rules for AI Workflows: Why Practical Tooling Beats Fragile Abstractions](https://mikelev.in/futureproof/edna-mode-rules-for-ai-workflows/index.md)
46
49
  - [2026-09-18] [The One-Door Threshold: Engineering Replayable AI Workflows and Quiet Shells](https://mikelev.in/futureproof/the-one-door-threshold-replayable-ai-workflows/index.md)
47
- - [2026-09-18] [The First Ten Minutes: Engineering Reproducible AI Workflows in the Age of AI](https://mikelev.in/futureproof/the-first-ten-minutes-reproducible-ai-workflows/index.md)
48
- - [2026-09-17] [The Retrieval Cue: Memory Consolidation and Selective Hydration in the Age of AI](https://mikelev.in/futureproof/retrieval-cue-memory-consolidation-selective-hydration/index.md)
49
- - [2026-09-17] [The Voice Asks First: Engineering Verifiable Consent and Silent Defaults](https://mikelev.in/futureproof/the-voice-asks-first-verifiable-consent/index.md)
50
50
 
51
51
  ## Compact slug index — pattern: https://mikelev.in/futureproof/{slug}/index.md
52
52
 
53
53
  Format: `[date] [size] slug` — fetch any entry as `https://mikelev.in/futureproof/{slug}/index.md`
54
54
 
55
+ - [2026-09-18] [292k] the-first-ten-minutes-reproducible-ai-workflows
56
+ - [2026-09-17] [184k] retrieval-cue-memory-consolidation-selective-hydration
57
+ - [2026-09-17] [239k] the-voice-asks-first-verifiable-consent
55
58
  - [2026-09-17] [122k] the-workbench-pin-and-the-help-screen-census
56
59
  - [2026-09-17] [54k] useless-machine-oauth-replayable-workflows
57
60
  - [2026-09-17] [89k] escaped-monopolies-and-replayable-receipts
@@ -5,10 +5,10 @@ This repository carries Agent Skills under https://agentskills.io/specification
5
5
  demand), with this file as the nearest-ancestor signpost that points at
6
6
  executable truth instead of duplicating it. Every tool call taught here runs
7
7
  on localhost under the POSIX conventions of a command, stdin, stdout and an
8
- exit code, so that its output lands in the sealed compile (`foo.zip`) as a
9
- receipt; a cloud-side tool call that cannot be reconstructed here is
10
- non-reproducible, non-portable, cannot be compiled into a cartridge, and is
11
- out of scope by that rule, not by taste.
8
+ exit code, so that its output lands in the sealed compile (`qamy.ai.zip`, the
9
+ QA archive zip) as a receipt; a cloud-side tool call that cannot be
10
+ reconstructed here is non-reproducible, non-portable, cannot be compiled into
11
+ that archive, and is out of scope by that rule, not by taste.
12
12
 
13
13
  This repo predates those conventions and complies with them by *pointing*,
14
14
  not duplicating. Do not add sibling status .md files; anything written here
@@ -54,9 +54,15 @@ run since the sentinels landed.
54
54
  ## Context (how this repo talks to AI)
55
55
 
56
56
  - `prompt_foo.py` compiles context payloads; `foo_files.py` is its router.
57
- - Each compile emits `foo.zip`, a portable AGENTS-class cartridge whose YAML
58
- frontmatter names its entrypoint. The actionable request is always in the
59
- final section labeled `--- START: Prompt ---`.
57
+ - Each compile emits `qamy.ai.zip`, the QA archive zip: a portable
58
+ AGENTS-class archive holding `payload.md`, `prompt.md` and `manifest.json`,
59
+ whose YAML frontmatter (`type: qa-zip-archive`) names its entrypoint. The
60
+ actionable request is always in the final section labeled
61
+ `--- START: Prompt ---`. A rotated copy, `qamy.ai_<deed>-<hash8>.zip`, is
62
+ minted beside it, the deed number first so a listing reads in order and the
63
+ domain on the file so a recipient knows where it is explained;
64
+ `python scripts/foo_cartridge.py <that zip>` verifies one with the standard
65
+ library alone.
60
66
 
61
67
  ## Edits (the executable version of "PR instructions")
62
68
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pipulate
3
- Version: 2.68
3
+ Version: 2.69
4
4
  Summary: The context compiler that helps you prompt well — local-first, Nix-reproducible, replayable. The successor to AI SEO software.
5
5
  Author-email: Mike Levin <pipulate@gmail.com>
6
6
  License-Expression: AGPL-3.0-or-later
@@ -12,7 +12,7 @@ Usage:
12
12
  pipulate
13
13
  """
14
14
 
15
- __version__ = "2.68"
15
+ __version__ = "2.69"
16
16
  # APOSTROPHES RESTORED (2026-08-04). They were stripped as a workaround for
17
17
  # flake.nix's descMatch regex, whose character class excluded ' from the
18
18
  # CAPTURE and truncated the banner to "(So)". That regex was fixed in the same
@@ -23,7 +23,7 @@ __version__ = "2.68"
23
23
  # is not a property of the system; the regex is. Blast radius is one banner:
24
24
  # nothing but flake.nix reads this name -- version_sync.py syncs __version__
25
25
  # and __description__, never this. So'wI' chu' -- "engage the cloaking device."
26
- __version_description__ = "Pipulate Claude Skill Banked"
26
+ __version_description__ = "QA My AI Exists"
27
27
  # SPDX expression, single source of truth, synced into pyproject.toml by
28
28
  # scripts/release/version_sync.py. "-or-later" (not bare AGPL-3.0, which is
29
29
  # deprecated SPDX) because the header below grants "any later version".
@@ -53,7 +53,7 @@ console = Console()
53
53
  # To add a new entry: print(binascii.crc32(your_art_string.encode('utf-8')))
54
54
 
55
55
  FIGURATE_LEDGER: dict = {
56
- "white_rabbit": 3309949418,
56
+ "white_rabbit": 509925915,
57
57
  "player_piano": 3357002674,
58
58
  "clipboard": 858911667,
59
59
  "bunny_trail": 615479347,
@@ -608,17 +608,17 @@ def _expand_color_bits_ai(text: str) -> str:
608
608
  def _figurate_white_rabbit():
609
609
  """Render white_rabbit as (human, ai) tuple for FIGURATE_REGISTRY."""
610
610
  art = r"""
611
- ( "The AI said so" is a transcript, not a record. )
612
- O /) ____ This drawing is checksummed.
613
- > Same files, same words, same bytes: o /)\__// / \ If it reaches you altered, the
614
- > a change you can replay is a change ___(/_ 0 0 | | model rewrote what it was told to
615
- > you can put your name behind. *( ==(_T_)== NPvg | copy, and that is the finding.
616
- > One diff per turn, a reading before \ ) ""\ | | Verify with nothing installed:
617
- > and after, and a digest you can check. |__>-\_>_> \____/ python scripts/foo_cartridge.py foo.zip
611
+ ( Do you put your name on it because Claude said so? )
612
+ O /) __
613
+ > Do you think the Aviation industry o /)\__// / \ "What Claude said" is a Cockpit
614
+ > vibe-codes without checking for ___(/_ 0 0 | | Voice Recorder (CVR) hear-say of a
615
+ > confident hallucinations? So then *( ==(_T_)== QA | subcontractor. This tool is a Flight
616
+ > why should you? If anyone relies on \ ) ""\ | | Data Recorder (FDR) for High Reliability
617
+ > your work then you should Q/A it. |__>-\_>_> \__/ Organizations (HROs). Use when it matters.
618
618
  """
619
619
  ai_art = _expand_color_bits_ai(art)
620
620
  human_art = _expand_color_bits_human(art)
621
- human = Panel(human_art, title="LLM Response Quality Assurance", border_style="white")
621
+ human = Panel(human_art, title="QA My AI: Is what Claude said True?", border_style="white")
622
622
  return human, ai_art
623
623
 
624
624
  def _figurate_player_piano():
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pipulate
3
- Version: 2.68
3
+ Version: 2.69
4
4
  Summary: The context compiler that helps you prompt well — local-first, Nix-reproducible, replayable. The successor to AI SEO software.
5
5
  Author-email: Mike Levin <pipulate@gmail.com>
6
6
  License-Expression: AGPL-3.0-or-later
@@ -5,7 +5,7 @@ build-backend = "setuptools.build_meta"
5
5
  [project]
6
6
  name = "pipulate"
7
7
  # VERSION NOTE: Synced from pipulate/__init__.py.__version__ via python version_sync.py
8
- version = "2.68"
8
+ version = "2.69"
9
9
  authors = [
10
10
  { name="Mike Levin", email="pipulate@gmail.com" },
11
11
  ]
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes