gentle-pi 4.2.0 → 4.3.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/README.md +336 -137
- package/assets/agents/gentle-ai-explore.md +1 -0
- package/assets/agents/gentle-ai-verify.md +6 -4
- package/assets/agents/gentle-ai-worker.md +7 -1
- package/assets/orchestrator-delegation-reference.md +163 -0
- package/assets/orchestrator-delegation.md +25 -176
- package/assets/orchestrator-tracking.md +1 -1
- package/assets/orchestrator-verification.md +14 -8
- package/assets/orchestrator-writer.md +5 -1
- package/assets/orchestrator.md +9 -9
- package/bin/gentle-shell.mjs +170 -22
- package/contracts/review-provider-contract-mirror/provider-contract.lock.json +8 -7
- package/contracts/review-provider-contract-mirror/{v1.3.0 → v1.4.0}/bundle/README.md +7 -0
- package/contracts/review-provider-contract-mirror/{v1.3.0 → v1.4.0}/bundle/manifest.json +11 -2
- package/contracts/review-provider-contract-mirror/v1.4.0/bundle/routing/pi.md +92 -0
- package/contracts/review-provider-contract-mirror/{v1.3.0 → v1.4.0}/generated/provider-capabilities.baseline.json +8 -1
- package/contracts/review-provider-contract-mirror/{v1.3.0 → v1.4.0}/generated/provider-roles.baseline.json +1 -1
- package/docs/assets/diagrams/agent-orchestration.svg +54 -15
- package/docs/assets/diagrams/gentleman-workflow.svg +69 -11
- package/docs/assets/diagrams/measured-routing.svg +49 -0
- package/docs/assets/diagrams/native-review.svg +52 -12
- package/docs/assets/diagrams/odd-workflow.svg +128 -66
- package/docs/assets/diagrams/permission-modes.svg +51 -0
- package/docs/assets/features/audio-notifications.png +0 -0
- package/docs/assets/features/command-palette.png +0 -0
- package/docs/bundled-install.md +33 -3
- package/docs/delegated-verification.md +10 -8
- package/docs/gentle-agents-activity.md +11 -5
- package/docs/gentle-shell-uninstall.md +8 -1
- package/docs/gentle-shell.md +5 -4
- package/docs/install-wizard.md +8 -1
- package/docs/permission-modes.md +1 -1
- package/docs/readme-reference.md +107 -19
- package/docs/yolo-mode.md +21 -8
- package/extensions/codegraph-tools.ts +68 -6
- package/extensions/gentle-agents.ts +99 -12
- package/extensions/gentle-ai.ts +284 -52
- package/extensions/gentle-herdr-activity.ts +2 -3
- package/extensions/gentle-shell.ts +27 -12
- package/extensions/gentle-todo.ts +43 -9
- package/extensions/quiet-tools.ts +1 -1
- package/extensions/session-scratch.ts +365 -0
- package/extensions/startup-banner.ts +2 -3
- package/lib/agent-home.ts +8 -3
- package/lib/agents-protocol.ts +3 -0
- package/lib/agents-runner.ts +55 -6
- package/lib/agents-view.ts +3 -1
- package/lib/bounded-writer-admission.ts +51 -0
- package/lib/command-palette-catalog.ts +0 -4
- package/lib/commit-slice-signal.ts +100 -0
- package/lib/context-backstop.ts +84 -0
- package/lib/delivered-test-lint.ts +80 -0
- package/lib/destructive-command-guard.ts +120 -9
- package/lib/gauge-theme.ts +146 -0
- package/lib/gentle-ai-binary.ts +28 -7
- package/lib/gentle-shell-bundled.ts +39 -3
- package/lib/gentle-shell-import-pi.ts +233 -0
- package/lib/gentle-shell-launcher.ts +145 -11
- package/lib/gentle-shell-uninstall.ts +18 -1
- package/lib/herdr-activity.ts +24 -0
- package/lib/native-review-cli.ts +9 -1
- package/lib/orchestrator-discovery.ts +5 -1
- package/lib/orchestrator-presence.ts +9 -0
- package/lib/orchestrator-scope.ts +21 -3
- package/lib/provider-contract-bundle.ts +99 -53
- package/lib/review-candidate-view-owner.ts +29 -19
- package/lib/review-candidate-view.ts +36 -2
- package/lib/review-risk-assessment.ts +43 -38
- package/lib/review-session-standing-permission.ts +3 -1
- package/lib/session-profile-freeze.ts +30 -1
- package/lib/session-scratch.ts +474 -0
- package/lib/shell-bar.ts +25 -25
- package/lib/shell-changes-view.ts +80 -13
- package/lib/shell-gauge.ts +49 -6
- package/lib/shell-todo.ts +23 -4
- package/lib/shell-usage-view.ts +5 -1
- package/lib/shell-usage.ts +7 -7
- package/lib/verifier-admission.ts +29 -0
- package/lib/yolo-temp-scratch.ts +69 -0
- package/package.json +1 -2
- package/runtime/gentle-ai-binary.mjs +28 -7
- package/runtime/gentle-shell-bundled.mjs +38 -2
- package/runtime/gentle-shell-import-pi.mjs +234 -0
- package/runtime/gentle-shell-launcher.mjs +143 -9
- package/runtime/gentle-shell-uninstall.mjs +18 -1
- package/runtime/native-review-cli.mjs +8 -0
- package/runtime/review-risk-assessment.mjs +43 -38
- package/scripts/build-runtime-modules.mjs +1 -0
- package/scripts/bundled-engram-migration.mjs +125 -0
- package/scripts/gentle-ai-installer.mjs +10 -10
- package/scripts/installer-server.mjs +14 -4
- package/scripts/main-channel.mjs +3 -2
- package/scripts/run-test-suite.mjs +5 -0
- package/scripts/verify-package-files.mjs +19 -13
- package/skills/gentle-ai/SKILL.md +3 -3
- package/skills/work-unit-commits/SKILL.md +5 -3
- package/tests/agent-risk-escalation.test.ts +37 -10
- package/tests/agents-runner.test.ts +260 -3
- package/tests/autonomous-guard.test.ts +122 -0
- package/tests/bounded-writer-admission.test.ts +11 -3
- package/tests/card-content-policy.test.ts +19 -9
- package/tests/child-safety.test.ts +39 -0
- package/tests/codegraph-tools.test.ts +123 -2
- package/tests/command-palette.test.ts +14 -4
- package/tests/commit-slice-signal.test.ts +162 -0
- package/tests/context-backstop.test.ts +159 -0
- package/tests/delegate-for-reason-contract.test.ts +91 -24
- package/tests/delivered-test-lint.test.ts +105 -0
- package/tests/destructive-command-guard.test.ts +85 -1
- package/tests/engram-safety.test.ts +1 -1
- package/tests/fixtures/primary-session-prompt/gentleman.golden.md +143 -0
- package/tests/fixtures/provider-contract-bundle/v1.4.0/README.md +29 -0
- package/tests/fixtures/provider-contract-bundle/v1.4.0/manifest.json +83 -0
- package/tests/fixtures/provider-contract-bundle/v1.4.0/orchestration/pi.md +70 -0
- package/tests/fixtures/provider-contract-bundle/v1.4.0/routing/pi.md +92 -0
- package/tests/fixtures/provider-contract-bundle/v1.4.0/schemas/lens.schema.json +16 -0
- package/tests/fixtures/provider-contract-bundle/v1.4.0/schemas/refuter.schema.json +1 -0
- package/tests/fixtures/provider-contract-bundle/v1.4.0/schemas/targeted-validator.schema.json +1 -0
- package/tests/fixtures/provider-contract-bundle/v1.4.0/vectors/lens.json +1 -0
- package/tests/fixtures/provider-contract-bundle/v1.4.0/vectors/refuter.json +1 -0
- package/tests/fixtures/provider-contract-bundle/v1.4.0/vectors/targeted-validator.json +1 -0
- package/tests/gauge-theme.test.ts +120 -0
- package/tests/gentle-agents.test.ts +282 -3
- package/tests/gentle-ai-binary.test.ts +1 -1
- package/tests/gentle-ai-child-guards.test.ts +61 -0
- package/tests/gentle-ai-doctor-herdr.test.ts +94 -0
- package/tests/gentle-ai-installer.test.ts +51 -51
- package/tests/gentle-shell-bin.test.ts +163 -0
- package/tests/gentle-shell-bundled.test.ts +169 -6
- package/tests/gentle-shell-import-pi.test.ts +262 -0
- package/tests/gentle-shell-launcher.test.ts +79 -0
- package/tests/gentle-shell-uninstall.test.ts +30 -0
- package/tests/gentle-shell.test.ts +42 -9
- package/tests/gentle-todo.test.ts +179 -0
- package/tests/headless-delivery-question.test.ts +58 -0
- package/tests/herdr-activity.test.ts +34 -1
- package/tests/installer-server.test.ts +10 -2
- package/tests/installer-windows-bootstrap.test.ts +33 -4
- package/tests/native-review-capability-contract.test.ts +7 -1
- package/tests/native-review-parity.test.ts +22 -1
- package/tests/no-self-pause-contract.test.ts +5 -2
- package/tests/odd-integration.test.ts +5 -1
- package/tests/odd-routing-canonical-ratchet.test.ts +127 -162
- package/tests/odd-routing-contract.test.ts +115 -30
- package/tests/orchestrator-budget.test.ts +19 -8
- package/tests/orchestrator-discovery.test.ts +29 -0
- package/tests/orchestrator-rdd-ownership.test.ts +3 -1
- package/tests/orchestrator-scope.test.ts +66 -0
- package/tests/orchestrator-status-publication-contract.test.ts +12 -8
- package/tests/package-manifest.test.ts +24 -20
- package/tests/pi-update-launcher.test.ts +21 -2
- package/tests/primary-session-prompt.test.ts +101 -0
- package/tests/provider-contract-bundle.test.ts +118 -0
- package/tests/provider-contract-mirror.test.ts +24 -0
- package/tests/quiet-tool-rendering.test.ts +23 -0
- package/tests/rdd-aware-verification-contract.test.ts +29 -11
- package/tests/rdd-status-line.test.ts +79 -0
- package/tests/review-agent-end-preflight.test.ts +6 -0
- package/tests/review-candidate-view.test.ts +49 -0
- package/tests/review-contract-prompt.test.ts +5 -2
- package/tests/review-controller-native-routing.test.ts +14 -1
- package/tests/review-controller.test.ts +1 -1
- package/tests/review-host-relay-routing.test.ts +59 -2
- package/tests/review-loadout-rdd-off-sdk.test.ts +237 -0
- package/tests/review-owner-identity.test.ts +132 -0
- package/tests/review-risk-assessment.test.ts +163 -76
- package/tests/review-session-standing-permission-controller.test.ts +14 -1
- package/tests/review-session-standing-permission.test.ts +27 -1
- package/tests/run-test-suite.test.ts +15 -0
- package/tests/runtime-harness.mjs +16 -6
- package/tests/session-changes-shell.test.ts +1 -1
- package/tests/session-profile-freeze.test.ts +23 -0
- package/tests/session-scratch.test.ts +945 -0
- package/tests/session-subject-routing-contract.test.ts +2 -1
- package/tests/shell-bar.test.ts +7 -0
- package/tests/shell-changes-view.test.ts +137 -1
- package/tests/shell-gauge.test.ts +42 -0
- package/tests/small-task-inline-contract.test.ts +37 -0
- package/tests/standalone-config-home.test.ts +324 -0
- package/tests/startup-banner.test.ts +5 -4
- package/tests/startup-home-repo.test.ts +34 -0
- package/tests/support/orchestrator-modules.ts +1 -0
- package/tests/task-size-routing-contract.test.ts +69 -9
- package/tests/test-scratch-contract.test.ts +102 -0
- package/tests/test-strength-contract.test.ts +36 -1
- package/tests/tool-batching-contract.test.ts +64 -0
- package/tests/verification-proportionality.test.ts +46 -0
- package/tests/verifier-admission.test.ts +137 -0
- package/tests/verify-agent-contract.test.ts +8 -8
- package/tests/windows-hidden-processes.test.ts +5 -0
- package/tests/writer-edit-surface-scope.test.ts +3 -0
- package/tests/writer-feature-document-admission.test.ts +156 -0
- package/tests/yolo-mode.test.ts +18 -0
- package/tests/yolo-temp-scratch.test.ts +71 -0
- package/scripts/mirror-odd-routing.mjs +0 -242
- /package/contracts/review-provider-contract-mirror/{v1.3.0 → v1.4.0}/bundle/orchestration/pi.md +0 -0
- /package/contracts/review-provider-contract-mirror/{v1.3.0 → v1.4.0}/bundle/schemas/lens.schema.json +0 -0
- /package/contracts/review-provider-contract-mirror/{v1.3.0 → v1.4.0}/bundle/schemas/refuter.schema.json +0 -0
- /package/contracts/review-provider-contract-mirror/{v1.3.0 → v1.4.0}/bundle/schemas/targeted-validator.schema.json +0 -0
- /package/contracts/review-provider-contract-mirror/{v1.3.0 → v1.4.0}/bundle/vectors/lens.json +0 -0
- /package/contracts/review-provider-contract-mirror/{v1.3.0 → v1.4.0}/bundle/vectors/refuter.json +0 -0
- /package/contracts/review-provider-contract-mirror/{v1.3.0 → v1.4.0}/bundle/vectors/targeted-validator.json +0 -0
|
@@ -1,74 +1,136 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" width="
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="1000" height="500" viewBox="0 0 1000 500" role="img" aria-labelledby="odd-title odd-desc">
|
|
2
2
|
<title id="odd-title">Organic Driven Development workflow</title>
|
|
3
3
|
<desc id="odd-desc">One feature moves through the seven ODD protocol steps. Authorize, explore, resolve uncertainty, then classify: small understood work stays light with no durable artifacts, while substantial work is tracked in one feature document before the first write. Both paths implement task by task and close with verified proof. The same feature document carries progress across sessions so work resumes instead of restarting.</desc>
|
|
4
4
|
<defs>
|
|
5
|
-
<linearGradient id="odd-bg" x1="0" y1="0" x2="1" y2="1"><stop stop-color="#
|
|
6
|
-
<
|
|
5
|
+
<linearGradient id="odd-bg" x1="0" y1="0" x2="1" y2="1"><stop stop-color="#0f0b13"/><stop offset="1" stop-color="#1a0e19"/></linearGradient>
|
|
6
|
+
<radialGradient id="odd-glow" cx="0.12" cy="0" r="0.7"><stop stop-color="#f095c8" stop-opacity="0.16"/><stop offset="1" stop-color="#f095c8" stop-opacity="0"/></radialGradient>
|
|
7
|
+
<linearGradient id="odd-card" x1="0" y1="0" x2="0" y2="1"><stop stop-color="#1d1520"/><stop offset="1" stop-color="#151017"/></linearGradient>
|
|
8
|
+
<linearGradient id="odd-accent" x1="0" y1="0" x2="1" y2="1"><stop stop-color="#3a1932"/><stop offset="1" stop-color="#1e1020"/></linearGradient>
|
|
9
|
+
<pattern id="odd-dots" width="22" height="22" patternUnits="userSpaceOnUse"><circle cx="1" cy="1" r="1" fill="#ffffff" fill-opacity="0.045"/></pattern>
|
|
10
|
+
<filter id="odd-shine" x="-30%" y="-30%" width="160%" height="160%"><feGaussianBlur stdDeviation="10"/></filter>
|
|
11
|
+
<marker id="odd-arrow" markerUnits="userSpaceOnUse" markerWidth="8" markerHeight="8" viewBox="0 0 8 8" refX="7" refY="4" orient="auto"><path d="M0 0.5 7 4 0 7.5z" fill="#f095c8"/></marker>
|
|
7
12
|
</defs>
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
<
|
|
11
|
-
<
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
<
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
<
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
<path d="M822 290V310H594V330"/>
|
|
27
|
-
<path d="M708 470V490"/>
|
|
28
|
-
<path d="M610 550H464"/>
|
|
29
|
-
</g>
|
|
30
|
-
<g fill="none" stroke="#f095c8" stroke-width="3" stroke-linecap="round">
|
|
31
|
-
<path d="M594 450V470H708"/>
|
|
32
|
-
<path d="M822 450V470H708"/>
|
|
33
|
-
</g>
|
|
34
|
-
<g font-family="Arial, Helvetica, sans-serif" font-size="20" fill="#d7a0b8" opacity="0.85">
|
|
35
|
-
<text x="56" y="198">01</text>
|
|
36
|
-
<text x="284" y="198">02</text>
|
|
37
|
-
<text x="512" y="198">03</text>
|
|
38
|
-
<text x="740" y="198">04</text>
|
|
39
|
-
<text x="740" y="358">05</text>
|
|
40
|
-
<text x="626" y="518">06</text>
|
|
41
|
-
<text x="284" y="518">07</text>
|
|
42
|
-
</g>
|
|
43
|
-
<g font-family="Arial, Helvetica, sans-serif" text-anchor="middle">
|
|
44
|
-
<g fill="#fff7f1" font-size="30" font-weight="700">
|
|
45
|
-
<text x="138" y="222">Authorize</text>
|
|
46
|
-
<text x="366" y="222">Explore</text>
|
|
47
|
-
<text x="594" y="222">Resolve</text>
|
|
48
|
-
<text x="822" y="222">Classify</text>
|
|
49
|
-
<text x="822" y="382">Track</text>
|
|
50
|
-
<text x="594" y="382">Stay light</text>
|
|
51
|
-
<text x="708" y="542">Implement</text>
|
|
52
|
-
<text x="366" y="542">Close</text>
|
|
13
|
+
|
|
14
|
+
<!-- canvas -->
|
|
15
|
+
<rect width="1000" height="500" rx="24" fill="url(#odd-bg)"/>
|
|
16
|
+
<rect width="1000" height="500" rx="24" fill="url(#odd-dots)"/>
|
|
17
|
+
<rect width="1000" height="500" rx="24" fill="url(#odd-glow)"/>
|
|
18
|
+
<rect x="0.5" y="0.5" width="999" height="499" rx="23.5" fill="none" stroke="#f095c8" stroke-opacity="0.16"/>
|
|
19
|
+
|
|
20
|
+
<g font-family="ui-sans-serif, -apple-system, BlinkMacSystemFont, 'Segoe UI', Inter, Roboto, 'Helvetica Neue', Arial, sans-serif">
|
|
21
|
+
|
|
22
|
+
<!-- eyebrow -->
|
|
23
|
+
<text x="36" y="52" fill="#f095c8" font-size="12.5" font-weight="700" letter-spacing="2.6">ORGANIC DRIVEN DEVELOPMENT</text>
|
|
24
|
+
<text x="964" y="52" fill="#8e7987" font-size="13" text-anchor="end">small work stays light · substantial work gets tracked</text>
|
|
25
|
+
|
|
26
|
+
<!-- phase brackets -->
|
|
27
|
+
<g fill="#8e7987" font-size="11" font-weight="700" letter-spacing="2" text-anchor="middle">
|
|
28
|
+
<text x="220" y="94">UNDERSTAND</text>
|
|
29
|
+
<text x="552" y="94">DECIDE</text>
|
|
30
|
+
<text x="844" y="94">DELIVER</text>
|
|
53
31
|
</g>
|
|
54
|
-
<g fill="#
|
|
55
|
-
<
|
|
56
|
-
<
|
|
57
|
-
<
|
|
58
|
-
<text x="822" y="262">substantial?</text>
|
|
59
|
-
<text x="822" y="422">one document</text>
|
|
60
|
-
<text x="594" y="422">small work</text>
|
|
61
|
-
<text x="708" y="582">task by task</text>
|
|
62
|
-
<text x="366" y="582">verified proof</text>
|
|
32
|
+
<g fill="none" stroke="#f095c8" stroke-opacity="0.28" stroke-width="1">
|
|
33
|
+
<path d="M36 110V104H404V110"/>
|
|
34
|
+
<path d="M420 110V104H684V110"/>
|
|
35
|
+
<path d="M724 110V104H964V110"/>
|
|
63
36
|
</g>
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
<
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
37
|
+
|
|
38
|
+
<!-- flow lines -->
|
|
39
|
+
<g fill="none" stroke="#f095c8" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" marker-end="url(#odd-arrow)">
|
|
40
|
+
<path d="M148 250H162"/>
|
|
41
|
+
<path d="M276 250H290"/>
|
|
42
|
+
<path d="M404 250H418"/>
|
|
43
|
+
<path d="M532 250H544Q552 250 552 242V200Q552 192 560 192H570"/>
|
|
44
|
+
<path d="M532 250H544Q552 250 552 258V300Q552 308 560 308H570"/>
|
|
45
|
+
<path d="M684 192H696Q704 192 704 200V242Q704 250 712 250H722"/>
|
|
46
|
+
<path d="M684 308H696Q704 308 704 300V258Q704 250 712 250H722"/>
|
|
47
|
+
<path d="M836 250H850"/>
|
|
48
|
+
</g>
|
|
49
|
+
<path d="M628 386V410" fill="none" stroke="#f095c8" stroke-opacity="0.45" stroke-width="1.5" stroke-dasharray="2 5" stroke-linecap="round"/>
|
|
50
|
+
|
|
51
|
+
<!-- branch labels -->
|
|
52
|
+
<g fill="#c99bb4" font-size="12" font-weight="600" letter-spacing="0.6" text-anchor="middle">
|
|
53
|
+
<text x="628" y="134">small</text>
|
|
54
|
+
<text x="628" y="378">substantial</text>
|
|
55
|
+
</g>
|
|
56
|
+
|
|
57
|
+
<!-- accent glows -->
|
|
58
|
+
<g fill="#f095c8" opacity="0.22" filter="url(#odd-shine)">
|
|
59
|
+
<rect x="430" y="204" width="92" height="92" rx="16"/>
|
|
60
|
+
<rect x="582" y="270" width="92" height="76" rx="16"/>
|
|
61
|
+
</g>
|
|
62
|
+
|
|
63
|
+
<!-- cards -->
|
|
64
|
+
<g stroke-width="1">
|
|
65
|
+
<rect x="36" y="194" width="112" height="112" rx="14" fill="url(#odd-card)" stroke="#f095c8" stroke-opacity="0.22"/>
|
|
66
|
+
<rect x="164" y="194" width="112" height="112" rx="14" fill="url(#odd-card)" stroke="#f095c8" stroke-opacity="0.22"/>
|
|
67
|
+
<rect x="292" y="194" width="112" height="112" rx="14" fill="url(#odd-card)" stroke="#f095c8" stroke-opacity="0.22"/>
|
|
68
|
+
<rect x="420" y="194" width="112" height="112" rx="14" fill="url(#odd-accent)" stroke="#f095c8" stroke-width="1.5"/>
|
|
69
|
+
<rect x="572" y="144" width="112" height="96" rx="14" fill="#130e15" stroke="#d7a0b8" stroke-opacity="0.55" stroke-dasharray="5 5"/>
|
|
70
|
+
<rect x="572" y="260" width="112" height="96" rx="14" fill="url(#odd-accent)" stroke="#f095c8" stroke-width="1.5"/>
|
|
71
|
+
<rect x="724" y="194" width="112" height="112" rx="14" fill="url(#odd-card)" stroke="#f095c8" stroke-opacity="0.22"/>
|
|
72
|
+
<rect x="852" y="194" width="112" height="112" rx="14" fill="url(#odd-card)" stroke="#f095c8" stroke-opacity="0.45"/>
|
|
73
|
+
</g>
|
|
74
|
+
|
|
75
|
+
<!-- step numbers -->
|
|
76
|
+
<g fill="#f095c8" fill-opacity="0.13">
|
|
77
|
+
<rect x="48" y="206" width="30" height="18" rx="9"/>
|
|
78
|
+
<rect x="176" y="206" width="30" height="18" rx="9"/>
|
|
79
|
+
<rect x="304" y="206" width="30" height="18" rx="9"/>
|
|
80
|
+
<rect x="432" y="206" width="30" height="18" rx="9" fill-opacity="0.26"/>
|
|
81
|
+
<rect x="584" y="272" width="30" height="18" rx="9" fill-opacity="0.26"/>
|
|
82
|
+
<rect x="736" y="206" width="30" height="18" rx="9"/>
|
|
83
|
+
<rect x="864" y="206" width="30" height="18" rx="9"/>
|
|
84
|
+
</g>
|
|
85
|
+
<g fill="#f5b8da" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" font-size="11" font-weight="700" text-anchor="middle">
|
|
86
|
+
<text x="63" y="219">01</text>
|
|
87
|
+
<text x="191" y="219">02</text>
|
|
88
|
+
<text x="319" y="219">03</text>
|
|
89
|
+
<text x="447" y="219">04</text>
|
|
90
|
+
<text x="599" y="285">05</text>
|
|
91
|
+
<text x="751" y="219">06</text>
|
|
92
|
+
<text x="879" y="219">07</text>
|
|
93
|
+
</g>
|
|
94
|
+
|
|
95
|
+
<!-- icons (24px grid) -->
|
|
96
|
+
<g fill="none" stroke="#f095c8" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round">
|
|
97
|
+
<g transform="translate(116 203) scale(0.8)"><path d="M12 3 19 6v5c0 4.5-3 8-7 10-4-2-7-5.5-7-10V6z"/><path d="M9 12l2 2 4-4"/></g>
|
|
98
|
+
<g transform="translate(244 203) scale(0.8)"><circle cx="11" cy="11" r="6"/><path d="M15.5 15.5 20 20"/></g>
|
|
99
|
+
<g transform="translate(372 203) scale(0.8)"><path d="M4 5h16v11h-9l-4 4v-4H4z"/><path d="M10 9.2a2 2 0 1 1 2.6 1.9c-.4.2-.6.5-.6.9"/><path d="M12 13.6v.1"/></g>
|
|
100
|
+
<g transform="translate(500 203) scale(0.8)"><path d="M12 3l9 9-9 9-9-9z"/><path d="M12 8v5M12 16v.1"/></g>
|
|
101
|
+
<g transform="translate(652 153) scale(0.8)"><path d="M20 4C12 4 6 10 6 18"/><path d="M6 18c8 0 14-6 14-14"/><path d="M4 20l2-2M9 15l6-6"/></g>
|
|
102
|
+
<g transform="translate(652 269) scale(0.8)"><path d="M7 3h7l5 5v13H7z"/><path d="M14 3v5h5M10 13h6M10 17h6"/></g>
|
|
103
|
+
<g transform="translate(804 203) scale(0.8)"><path d="M9 8l-4 4 4 4M15 8l4 4-4 4"/></g>
|
|
104
|
+
<g transform="translate(932 203) scale(0.8)"><circle cx="12" cy="12" r="9"/><path d="M8 12.5l3 2.5 5-5.5"/></g>
|
|
105
|
+
</g>
|
|
106
|
+
|
|
107
|
+
<!-- titles -->
|
|
108
|
+
<g fill="#fbeff5" font-size="17" font-weight="650">
|
|
109
|
+
<text x="48" y="266">Authorize</text>
|
|
110
|
+
<text x="176" y="266">Explore</text>
|
|
111
|
+
<text x="304" y="266">Resolve</text>
|
|
112
|
+
<text x="432" y="266">Classify</text>
|
|
113
|
+
<text x="584" y="202">Stay light</text>
|
|
114
|
+
<text x="584" y="318">Track</text>
|
|
115
|
+
<text x="736" y="266">Implement</text>
|
|
116
|
+
<text x="864" y="266">Close</text>
|
|
117
|
+
</g>
|
|
118
|
+
<g fill="#a8939f" font-size="12.5">
|
|
119
|
+
<text x="48" y="288">read-only</text>
|
|
120
|
+
<text x="176" y="288">code and needs</text>
|
|
121
|
+
<text x="304" y="288">uncertainty</text>
|
|
122
|
+
<text x="432" y="288">substantial?</text>
|
|
123
|
+
<text x="584" y="222">small work</text>
|
|
124
|
+
<text x="584" y="338">one document</text>
|
|
125
|
+
<text x="736" y="288">task by task</text>
|
|
126
|
+
<text x="864" y="288">verified proof</text>
|
|
127
|
+
</g>
|
|
128
|
+
|
|
129
|
+
<!-- resume band -->
|
|
130
|
+
<rect x="36" y="410" width="928" height="56" rx="14" fill="#f095c8" fill-opacity="0.06" stroke="#f095c8" stroke-opacity="0.22"/>
|
|
131
|
+
<g fill="none" stroke="#f095c8" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" transform="translate(56 426) scale(1)">
|
|
132
|
+
<path d="M20 12a8 8 0 1 1-2.3-5.6"/><path d="M20 4v5h-5"/>
|
|
133
|
+
</g>
|
|
134
|
+
<text x="92" y="443" font-size="15.5"><tspan fill="#fbeff5" font-weight="650">Resume where you stopped</tspan><tspan fill="#a8939f" dx="10">One feature document, mirrored in Engram across sessions.</tspan></text>
|
|
73
135
|
</g>
|
|
74
136
|
</svg>
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="1000" height="400" viewBox="0 0 1000 400" role="img" aria-labelledby="modes-title modes-desc">
|
|
2
|
+
<title id="modes-title">Permission modes</title>
|
|
3
|
+
<desc id="modes-desc">Three permission modes. Normal keeps the standard prompts. Auto checks eligible actions with an independent inference using the current session model; ordinary checks are tool-free, an eligible script check can inspect at most two complete files, and unavailable or stale decisions do not run the action. YOLO gives standing permission for ordinary already-scoped work while destructive actions still ask. In every mode, explicit restrictions, destructive guards, and independent consent remain, and none of the modes is a sandbox.</desc>
|
|
4
|
+
<defs>
|
|
5
|
+
<linearGradient id="modes-bg" x1="0" y1="0" x2="1" y2="1"><stop stop-color="#0f0b13"/><stop offset="1" stop-color="#1a0e19"/></linearGradient>
|
|
6
|
+
<radialGradient id="modes-glow" cx="0.12" cy="0" r="0.7"><stop stop-color="#f095c8" stop-opacity="0.16"/><stop offset="1" stop-color="#f095c8" stop-opacity="0"/></radialGradient>
|
|
7
|
+
<linearGradient id="modes-card" x1="0" y1="0" x2="0" y2="1"><stop stop-color="#1d1520"/><stop offset="1" stop-color="#151017"/></linearGradient>
|
|
8
|
+
<linearGradient id="modes-accent" x1="0" y1="0" x2="1" y2="1"><stop stop-color="#3a1932"/><stop offset="1" stop-color="#1e1020"/></linearGradient>
|
|
9
|
+
<linearGradient id="modes-bar" x1="0" y1="0" x2="1" y2="0"><stop stop-color="#c46b9e"/><stop offset="1" stop-color="#f095c8"/></linearGradient>
|
|
10
|
+
<pattern id="modes-dots" width="22" height="22" patternUnits="userSpaceOnUse"><circle cx="1" cy="1" r="1" fill="#ffffff" fill-opacity="0.045"/></pattern>
|
|
11
|
+
<filter id="modes-shine" x="-30%" y="-30%" width="160%" height="160%"><feGaussianBlur stdDeviation="10"/></filter>
|
|
12
|
+
<marker id="modes-arrow" markerUnits="userSpaceOnUse" markerWidth="8" markerHeight="8" viewBox="0 0 8 8" refX="7" refY="4" orient="auto"><path d="M0 0.5 7 4 0 7.5z" fill="#f095c8"/></marker>
|
|
13
|
+
<marker id="modes-arrow-soft" markerUnits="userSpaceOnUse" markerWidth="8" markerHeight="8" viewBox="0 0 8 8" refX="7" refY="4" orient="auto"><path d="M0 0.5 7 4 0 7.5z" fill="#d7a0b8"/></marker>
|
|
14
|
+
</defs>
|
|
15
|
+
<rect width="1000" height="400" rx="24" fill="url(#modes-bg)"/>
|
|
16
|
+
<rect width="1000" height="400" rx="24" fill="url(#modes-dots)"/>
|
|
17
|
+
<rect width="1000" height="400" rx="24" fill="url(#modes-glow)"/>
|
|
18
|
+
<rect x="0.5" y="0.5" width="999" height="399" rx="23.5" fill="none" stroke="#f095c8" stroke-opacity="0.16"/>
|
|
19
|
+
<g font-family="ui-sans-serif, -apple-system, BlinkMacSystemFont, 'Segoe UI', Inter, Roboto, 'Helvetica Neue', Arial, sans-serif">
|
|
20
|
+
<text x="36" y="52" fill="#f095c8" font-size="12.5" font-weight="700" letter-spacing="2.6">PERMISSION MODES</text>
|
|
21
|
+
<text x="964" y="52" fill="#8e7987" font-size="13" text-anchor="end">/gentle:mode · /gentle:yolo</text>
|
|
22
|
+
<path d="M36 96H956" stroke="#f095c8" stroke-opacity="0.35" stroke-width="1.5" marker-end="url(#modes-arrow)"/>
|
|
23
|
+
<text x="36" y="86" fill="#8e7987" font-size="11" font-weight="700" letter-spacing="0.4" text-anchor="start">more questions</text>
|
|
24
|
+
<text x="964" y="86" fill="#8e7987" font-size="11" font-weight="700" letter-spacing="0.4" text-anchor="end">fewer questions</text>
|
|
25
|
+
<rect x="36" y="120" width="288" height="160" rx="14" fill="url(#modes-card)" stroke="#f095c8" stroke-opacity="0.22"/>
|
|
26
|
+
<g transform="translate(292 129) scale(0.8)" fill="none" stroke="#f095c8" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><rect x="5" y="11" width="14" height="10" rx="2"/><path d="M8 11V8a4 4 0 0 1 8 0v3"/></g>
|
|
27
|
+
<text x="48" y="200" fill="#fbeff5" font-size="20" font-weight="650">Normal</text>
|
|
28
|
+
<text x="48" y="222" fill="#a8939f" font-size="12.5">standard prompts</text>
|
|
29
|
+
<text x="48" y="240" fill="#a8939f" font-size="12.5">the default</text>
|
|
30
|
+
<rect x="48" y="132" width="145" height="18" rx="9" fill="#f095c8" fill-opacity="0.13"/>
|
|
31
|
+
<text x="120.4" y="145" fill="#f5b8da" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" font-size="11" font-weight="700" text-anchor="middle">/gentle:mode normal</text>
|
|
32
|
+
<rect x="356" y="120" width="288" height="160" rx="14" fill="url(#modes-card)" stroke="#f095c8" stroke-opacity="0.22"/>
|
|
33
|
+
<g transform="translate(612 129) scale(0.8)" fill="none" stroke="#f095c8" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="8"/><circle cx="12" cy="12" r="3"/></g>
|
|
34
|
+
<text x="368" y="200" fill="#fbeff5" font-size="20" font-weight="650">Auto</text>
|
|
35
|
+
<text x="368" y="222" fill="#a8939f" font-size="12.5">an independent check decides</text>
|
|
36
|
+
<text x="368" y="240" fill="#a8939f" font-size="12.5">unavailable or stale: does not run</text>
|
|
37
|
+
<rect x="368" y="132" width="130" height="18" rx="9" fill="#f095c8" fill-opacity="0.13"/>
|
|
38
|
+
<text x="433.2" y="145" fill="#f5b8da" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" font-size="11" font-weight="700" text-anchor="middle">/gentle:mode auto</text>
|
|
39
|
+
<rect x="686" y="130" width="268" height="140" rx="16" fill="#f095c8" opacity="0.22" filter="url(#modes-shine)"/>
|
|
40
|
+
<rect x="676" y="120" width="288" height="160" rx="14" fill="url(#modes-accent)" stroke="#f095c8" stroke-width="1.5"/>
|
|
41
|
+
<g transform="translate(932 129) scale(0.8)" fill="none" stroke="#f095c8" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="M13 3 5 14h6l-1 7 8-11h-6z"/></g>
|
|
42
|
+
<text x="688" y="200" fill="#fbeff5" font-size="20" font-weight="650">YOLO</text>
|
|
43
|
+
<text x="688" y="222" fill="#a8939f" font-size="12.5">standing permission for scoped work</text>
|
|
44
|
+
<text x="688" y="240" fill="#a8939f" font-size="12.5">destructive actions still ask</text>
|
|
45
|
+
<rect x="688" y="132" width="145" height="18" rx="9" fill="#f095c8" fill-opacity="0.13"/>
|
|
46
|
+
<text x="760.4" y="145" fill="#f5b8da" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" font-size="11" font-weight="700" text-anchor="middle">/gentle:yolo enable</text>
|
|
47
|
+
<rect x="36" y="308" width="928" height="56" rx="14" fill="#f095c8" fill-opacity="0.06" stroke="#f095c8" stroke-opacity="0.22"/>
|
|
48
|
+
<g transform="translate(56 324.0) scale(1)" fill="none" stroke="#f095c8" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3 19 6v5c0 4.5-3 8-7 10-4-2-7-5.5-7-10V6z"/><path d="M9 12l2 2 4-4"/></g>
|
|
49
|
+
<text x="92" y="341.5" font-size="15.5"><tspan fill="#fbeff5" font-weight="650">In every mode</tspan><tspan fill="#a8939f" dx="10">explicit restrictions, destructive guards, and independent consent remain. Not a sandbox.</tspan></text>
|
|
50
|
+
</g>
|
|
51
|
+
</svg>
|
|
Binary file
|
|
Binary file
|
package/docs/bundled-install.md
CHANGED
|
@@ -268,12 +268,42 @@ A later launch treats the store as Shell's own only when all hold:
|
|
|
268
268
|
|
|
269
269
|
#### Recovery and setup
|
|
270
270
|
|
|
271
|
-
When the running server's `/health` reports a valid 32-hex `instance_id` and a canonical numeric `x.y.z` version (optional `v` prefix, no leading zeros, at most four digits per component) older than 3.4.0, and `/compatibility` does not answer ready, the notice names that version and asks to back up the data, update **that server** to 3.4.0 or later with its own installation method, and restart it. The version only selects this wording: memory stays disabled, and any other version string is never shown. Otherwise, when disabled, Shell explains that it **could not verify safe store or server reuse**. Matching versions or updating alone do not prove compatibility. Reuse requires the verified active `/compatibility` contract or matching Shell-provisioned store identity under the rules above. Back up existing data before manual changes; do not delete the store, fabricate provenance, or bypass the safety check. Shell rechecks on every launch and remains usable without memory.
|
|
271
|
+
When the running server's `/health` reports a valid 32-hex `instance_id` and a canonical numeric `x.y.z` version (optional `v` prefix, no leading zeros, at most four digits per component) older than 3.4.0, and `/compatibility` does not answer ready, the notice names that version and asks to back up the data, update **that server** to 3.4.0 or later with its own installation method, and restart it. The version only selects this wording: memory stays disabled, and any other version string is never shown. Otherwise, when disabled, Shell explains that it **could not verify safe store or server reuse**. Matching versions or updating alone do not prove compatibility. Reuse requires the verified active `/compatibility` contract or matching Shell-provisioned store identity under the rules above. Back up existing data before manual changes; do not delete the store, fabricate provenance, or bypass the safety check. Shell rechecks on every launch and remains usable without memory. Ordinary startup performs no migration, deletion, or process termination. Recovery is a separate, explicitly confirmed command below.
|
|
272
272
|
|
|
273
273
|
Engram 3.3.2 does not expose `/compatibility`, so reinstalling that version cannot authorize reuse of an existing global store. [Engram 3.4.0](https://github.com/Gentleman-Programming/engram/releases/tag/v3.4.0) includes the endpoint from PR #1792. Back up the existing store before updating its server through its own installation method, then restart that server and Shell. Updating Shell's bundled binary does not replace an already-running global server. Reuse still requires a valid ready response, not just the version number; a token-protected server cannot provide it to Shell's unauthenticated probe. Do not disable authentication to bypass this policy or use an unpublished build.
|
|
274
274
|
|
|
275
275
|
The memory decision never skips or fails setup: `gentle-shell setup` always publishes the verified core, runs Gentle AI and pins the companion, as before. Gentle AI 4.0.0 `install --agent pi` runs no `engram setup` for Pi, and `pi-engram init` only edits settings, so neither opens a store. Setup reclassifies after publishing the core, and the decision only selects the Engram environment its children and the launched Pi receive. On a new machine the wizard publishes the runtime without Engram, so the first `gentle-shell setup` publishes the core and the following launch is the fresh one that records provenance. Setup and every launch pin `npm:gentle-engram@0.4.2` through Pi's own `install` command (configuration only) and verify the declaration plus `engram.startupPolicy: 1`; a failed check is reported and Shell still starts, protected by the guard. `setup --dry-run` installs nothing.
|
|
276
276
|
|
|
277
|
+
#### Session-owned local servers
|
|
278
|
+
|
|
279
|
+
An admitted local store now starts only through a private session-owned server. Before provisioning a fresh identity, Shell requires both `engram.sessionOwned: 1` in every selected companion's package metadata (including mixed local/npm selections) and `serve --session-owned` in the verified core's config-free help, checked with an isolated temporary home. It then selects `ENGRAM_SERVER_MODE=session-owned`, without URL, port or socket overrides. The companion must validate the actual `engram-session-owned-v1` readiness record, authenticate every HTTP route, and retain its child's stdin pipe. Pi exit or parent death closes that pipe; EOF cancels startup-lock waits and drains a started server. Reload releases transport without ending the conversation; multiple hosted roots release the child only after the last owner exits.
|
|
280
|
+
|
|
281
|
+
**Release dependency:** the currently pinned core 3.4.0 and companion 0.4.2 do not establish these capabilities. Local memory therefore remains disabled with explicit supporting-release guidance; Shell does not silently launch an old detached daemon. These source changes must not be presented as a working deployed fix until supporting published pins are available. No release version or checksum is invented here.
|
|
282
|
+
|
|
283
|
+
Already verified running shared servers remain explicit URL reuse, never session-owned processes; Shell does not terminate them. Explicit bin, URL, port, socket or data selections are preserved and never probed. An explicit empty, whitespace or conflicting server mode disables local memory rather than overriding the selection; unset it or select exactly `session-owned`. Explicit owned mode cannot be combined with shared URL reuse; unset it when using an already running shared service. Non-bundled installations retain their existing shared default unless they opt in to session-owned mode.
|
|
284
|
+
|
|
285
|
+
#### Explicit recovery after a core upgrade
|
|
286
|
+
|
|
287
|
+
For a **Shell-provisioned store**, stop every Engram client and server using the directory, retain a complete backup (including WAL and configuration), then run:
|
|
288
|
+
|
|
289
|
+
```sh
|
|
290
|
+
gentle-shell memory migrate --confirm-quiescent
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
**Release dependency:** this requires a published bundled core advertising `migrate-copy`. The currently pinned Engram 3.4.0 does not implement it. Shell checks help in an isolated home and refuses without invoking an unknown migration command or changing the source/provenance. Do not substitute an unpublished binary, edit hashes, or assume equal schema versions authorize recovery.
|
|
294
|
+
|
|
295
|
+
When supported, the provider copies the complete directory to a new sibling and validates/migrates only that copy. Shell checks the provider's directory and identity evidence, renames the original to the reported `backup_dir`, promotes the copy, and atomically replaces its core-bound provenance. Success prints one JSON record with `status: "migrated"`, `instance_id`, and `backup_dir`. Keep that backup until you have verified your records in Shell. Provider failures preserve the original and provenance; any incomplete copy is identified and retained, never promoted. Explicit foreign data locations or endpoints are not adopted by this command.
|
|
296
|
+
|
|
297
|
+
The confirmation is an operator assertion, not a process lock: source hashes detect observed changes but do not establish that every writer has stopped. Never run recovery while another integration is using the store.
|
|
298
|
+
|
|
299
|
+
#### Recovering an interrupted migration
|
|
300
|
+
|
|
301
|
+
A marker at `<prefix>/config/engram-migration.json` blocks memory before probes or fresh provisioning. It records the `source`, `output`, `backup` paths and `originalProvenance`. **Keep clients stopped and do not simply remove this marker.** Preserve all paths while inspecting them.
|
|
302
|
+
|
|
303
|
+
To roll back an interrupted promotion, first verify the paths and recorded instance identity. If `backup` exists, it is the original directory: retain any current `source` under a separate quarantine name, then restore `backup` to `source`. If no backup exists, do not replace the original source with the incomplete output. Restore `originalProvenance` atomically to `<prefix>/config/engram-provenance.json`, preserving the old core hash exactly. Only after source identity and provenance are reconciled may the marker be removed. Retain the migration output for diagnosis. If these facts cannot be established, leave the marker and request recovery assistance rather than guessing.
|
|
304
|
+
|
|
305
|
+
Restoring the old provenance does not authorize the newer core to open it. Use the matching prior bundle or retry explicit migration after a supporting published bundle is installed. No automatic retry, store deletion, or server termination is performed.
|
|
306
|
+
|
|
277
307
|
#### Known limits
|
|
278
308
|
|
|
279
309
|
- **Shared-store residuals.** Provenance proves Shell's core created the store, not that no other Engram opened it since. A different Engram that changed the store without raising `user_version` (for example same-schema repairs) is not detected without reading the database, and changes still only in the WAL are not visible in the header.
|
|
@@ -289,7 +319,7 @@ S9. Everything Gentle AI and gentle-pi keep lives in the prefix, except Engram's
|
|
|
289
319
|
| Process | Gets |
|
|
290
320
|
|---|---|
|
|
291
321
|
| `gentle-shell setup` (the pinned `gentle-ai install --agent pi`) | `GENTLE_AI_HOME=<prefix>/gentle-ai`, `GENTLE_AI_PI_CONFIG_DIR=<prefix>/config/gentle-ai`, `GENTLE_AI_ENGRAM_BIN=<prefix>/runtime/engram-<v>/engram`, `GENTLE_AI_NO_SELF_UPDATE=1` and `GENTLE_PI_CONFIG_HOME=<prefix>/config`. |
|
|
292
|
-
| Pi and its subagents | `GENTLE_SHELL_PREFIX=<prefix>` and the memory startup policy; `ENGRAM_BIN` is the verified `<prefix>/runtime/engram-<v>/engram` when memory is allowed locally, otherwise the Shell guard (plus `ENGRAM_URL` for verified reuse). An explicit `ENGRAM_BIN` or `ENGRAM_URL` is kept as is ([Engram startup safety](#engram-startup-safety)). No `GENTLE_AI_*` variable, and `GENTLE_PI_CONFIG_HOME` is left as the user has it. |
|
|
322
|
+
| Pi and its subagents | `GENTLE_SHELL_PREFIX=<prefix>` and the memory startup policy; verified private local launches also receive `ENGRAM_SERVER_MODE=session-owned`; `ENGRAM_BIN` is the verified `<prefix>/runtime/engram-<v>/engram` when memory is allowed locally, otherwise the Shell guard (plus `ENGRAM_URL` for verified reuse). An explicit `ENGRAM_BIN` or `ENGRAM_URL` is kept as is ([Engram startup safety](#engram-startup-safety)). No `GENTLE_AI_*` variable, and `GENTLE_PI_CONFIG_HOME` is left as the user has it. |
|
|
293
323
|
| gentle-pi's own `gentle-ai` runs (review, telemetry trigger, runtime metrics) | The same five variables as setup. |
|
|
294
324
|
| The agent's shell | Pi's environment: the user's own plus the Pi row above. |
|
|
295
325
|
|
|
@@ -302,7 +332,7 @@ S9. Everything Gentle AI and gentle-pi keep lives in the prefix, except Engram's
|
|
|
302
332
|
- **gentle-engram.** The gentle-engram Pi extension finds Engram only through `ENGRAM_BIN`, read once when it loads, and otherwise runs `engram` from `PATH`. So Pi gets `ENGRAM_BIN` (the core or the guard), and no `PATH` entry is added. An `ENGRAM_BIN` the user set is kept. The agent's shell inherits `ENGRAM_BIN` too, so an Engram MCP launcher started there through `ENGRAM_BIN` uses the same core or guard.
|
|
303
333
|
- **Personas.** Setup snapshots and restores the persona Gentle AI may rewrite: the prefix's `config/gentle-ai/persona.json`, and also the user's `~/.pi/gentle-ai/persona.json`. A Gentle AI release without the variables still writes the user's file, and restoring an unchanged file does nothing. The managed-asset record is restored only in the user's `~/.gentle-ai/state.json`; the prefix's record belongs to the pinned Gentle AI.
|
|
304
334
|
- **pi-pretty and prompt history.** In bundled mode only, the pi-pretty wrapper passes `deps.sdk` with Pi's five tool factories and `getAgentDir`, so its FFF database lands in `<agent home>/pi-pretty/fff`, and prompt history keeps its store under `<agent home>/history` ([Prompt history](prompt-history.md)). Elsewhere both keep their existing locations: Pi's deps reach pi-pretty unchanged (`$HOME/.pi/agent/pi-pretty/fff`, or no store without `HOME`), and history stays under `~/.pi/agent/history`, also in the isolated home of a pnpm or npm install, so existing histories are not left behind.
|
|
305
|
-
- **Effective with a later Gentle AI.** gentle-pi pins Gentle AI 4.
|
|
335
|
+
- **Effective with a later Gentle AI.** gentle-pi pins Gentle AI 4.2.0 today (`INSTALLER_VERSION`); the following are historical compatibility notes for Gentle AI 4.0.0, which ignores the four `GENTLE_AI_*` variables. Whether 4.2.0 includes gentle-ai#5462 is unverified here. Until gentle-pi pins a Gentle AI release that contains gentle-ai#5462:
|
|
306
336
|
- Setup still writes `~/.gentle-ai` and `~/.pi/gentle-ai`, with the restores above, and still acquires Engram its own way.
|
|
307
337
|
- The persona goes to the user's `~/.pi/gentle-ai/persona.json` (Gentle AI 4.0.0 resolves it from the OS home) and is restored there. The prefix's `config/gentle-ai/persona.json` is not created by setup.
|
|
308
338
|
- The background-subagents policy already lands in `<prefix>/config/gentle-ai/` through `GENTLE_PI_CONFIG_HOME=<prefix>/config` (see above).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Delegated verification
|
|
2
2
|
|
|
3
|
-
How the Gentle Pi orchestrator decides who verifies a bounded writer's work. The always-on parent prompt renders a `Receipt-driven development: on|off|unknown` line; the verification module (`assets/orchestrator-verification.md`, Verification rule) keys the verification rule on it. This page is package-owned; `docs/review-integration.md` mirrors the Gentle AI contract and must stay byte-identical to it.
|
|
3
|
+
How the Gentle Pi orchestrator decides who verifies a bounded writer's work. The always-on parent prompt renders a `Receipt-driven development: on|off|unknown` line; the verification module (`assets/orchestrator-verification.md`, Verification rule) keys the verification rule on it. Because the line sits in the cached system-prompt prefix, a session keeps the first line it rendered and re-renders it only when RDD turns off or back on (which also drops or restores the review execution contract); an `unknown` to `on` flip or a deciding-source change keeps the original text, and review tools always read the live mode. While the pinned line reads `off`, the parent request also carries a lean review loadout: `gentle_review` keeps its schema but its snippet, guidelines, and description cover only `assess`, and the `gentle_review_capture`, `gentle_review_capture_group`, and `gentle_review_scope` declarations are hidden (they stay registered and active). The loadout follows the pinned line, so it changes only at the next run after RDD turns off or back on, together with the review execution contract; `on` and `unknown` keep the full registered text. This page is package-owned; `docs/review-integration.md` mirrors the Gentle AI contract and must stay byte-identical to it.
|
|
4
4
|
|
|
5
5
|
## Receipt-driven development on
|
|
6
6
|
|
|
@@ -23,7 +23,7 @@ A recorded outcome is keyed by the candidate's own target identity, never by rep
|
|
|
23
23
|
|
|
24
24
|
### How `assess` resolves the writer profile (gentle-pi#1175)
|
|
25
25
|
|
|
26
|
-
The writer profile comes from the runtime-recorded model and effort of the pending mutations for the root (`writerProfileSource: runtime`). Caller `writerModelId`/`writerEffort` are only a fallback when no runtime evidence exists (`caller`); with neither, the profile is small (`fallback`).
|
|
26
|
+
The writer profile comes from the runtime-recorded model and effort of the pending mutations for the root (`writerProfileSource: runtime`). Caller `writerModelId`/`writerEffort` are only a fallback when no runtime evidence exists (`caller`); with neither, the profile is small (`fallback`). The writer profile is reported but never adds a verifier: a `mini` model or `low` effort gets the same plan as any other writer.
|
|
27
27
|
|
|
28
28
|
### What `assess` projects
|
|
29
29
|
|
|
@@ -31,18 +31,20 @@ When native reports them, `assess` projects `reviewDue`, `reviewDueReason`, `can
|
|
|
31
31
|
|
|
32
32
|
## Receipt-driven development off or unknown (gentle-pi#662)
|
|
33
33
|
|
|
34
|
-
The host exposes one read-only native operation: `gentle-ai review assess --cwd <repo> [--base-ref <ref> --committed-only] --json` (gentle-ai#4295). It is decoded by `lib/review-risk-assessment.ts` and wired through `lib/native-review-cli.ts` exactly like the existing `reviewMode` STATUS reader -- a bounded subprocess with a typed decode, never a mutation. A non-zero exit, a failure envelope, or an older binary without the verb all
|
|
34
|
+
The host exposes one read-only native operation: `gentle-ai review assess --cwd <repo> [--base-ref <ref> --committed-only] --json` (gentle-ai#4295). It is decoded by `lib/review-risk-assessment.ts` and wired through `lib/native-review-cli.ts` exactly like the existing `reviewMode` STATUS reader -- a bounded subprocess with a typed decode, never a mutation. A non-zero exit, a failure envelope, or an older binary without the verb all report native risk `unassessable`, which informs only: the plan is medium and adds no independent verifier unless the agent escalates.
|
|
35
35
|
|
|
36
36
|
The `gentle_review` tool's `assess` operation (`extensions/gentle-ai.ts`) combines that assessment with the rendered `Receipt-driven development:` line to decide whether a delegated writer's change needs a separate `gentle-ai-verify` run, following this tier table:
|
|
37
37
|
|
|
38
|
-
|
|
|
38
|
+
| Tier | Verification when RDD is `off`/`unknown` |
|
|
39
39
|
| --- | --- |
|
|
40
40
|
| passive | structural readback by the parent; no separate verifier, no tests |
|
|
41
|
-
| medium | writer self-verification stands;
|
|
42
|
-
| high | writer self-verification plus
|
|
43
|
-
| unknown
|
|
41
|
+
| medium | writer self-verification stands; no separate verifier, whatever model wrote the change |
|
|
42
|
+
| high | only through `escalate` naming a Task Size high-risk item: writer self-verification plus one separate `gentle-ai-verify` run |
|
|
43
|
+
| native high, unknown, or assess failed | informs only: writer self-verification stands; escalate when a named high-risk item applies |
|
|
44
44
|
|
|
45
|
-
|
|
45
|
+
The plan risk (`risk`) is high only with an escalation; otherwise a native passive stays passive and every other native tier is medium. The native tier stays visible as `nativeRisk`. The independent verifier is for concrete occasions: the plan adds it only when `escalate` names a Task Size high-risk item, never for size, a native tier alone, a failed assessment, or the model or effort that wrote the change.
|
|
46
|
+
|
|
47
|
+
This table applies in every RDD state; a closed native review never removes a verifier the tier requires. An unknown RDD line never lowers a tier below `off`. The parent's own spot check (re-running one reported command before delivery) stays required in every tier.
|
|
46
48
|
|
|
47
49
|
A native code review is not a substitute for applicable functional checks: tests, builds, and functional verification such as browser checks for UI changes still run when applicable. Review outcomes never authorize delivery; human consent for native review and the user-owned RDD switch are unchanged.
|
|
48
50
|
|
|
@@ -104,7 +104,9 @@ receipts. Complete model-facing output and permissions remain unchanged.
|
|
|
104
104
|
|
|
105
105
|
`orchestrator_session_id` also accepts optional `state`: strings named `objective`,
|
|
106
106
|
`progress`, `decisions`, and `blockers` (2,048 UTF-8 bytes total). An object replaces
|
|
107
|
-
all fields, `null` withdraws, and omission leaves the current record unchanged.
|
|
107
|
+
all fields, `null` withdraws, and omission leaves the current record unchanged. An object
|
|
108
|
+
without `progress` keeps the automatic todo progress line still published (dropped only
|
|
109
|
+
when the merge would exceed the byte budget); an explicit `progress` replaces it.
|
|
108
110
|
Extra keys, controls, and oversized input are rejected before naming or persistence;
|
|
109
111
|
records additionally fit 4 KiB. Never include credentials, internal instructions,
|
|
110
112
|
or raw prompts. Whitelisting is not automatic secret redaction.
|
|
@@ -266,10 +268,14 @@ are unchanged; caller replacement prevents a stale `recorded` result.
|
|
|
266
268
|
Call `orchestrator_consult` with required stable `recipient_session_id`, optional
|
|
267
269
|
`kind: "metadata"` (default), and optional existing opaque catalog `cursor`.
|
|
268
270
|
No free-form question, owner request, human picker or read-consent dialog is used
|
|
269
|
-
for this profile's explicitly published data.
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
271
|
+
for this profile's explicitly published data. Declare a `subject` before work beyond
|
|
272
|
+
small direct tasks. Progress is published automatically: after each todo write the
|
|
273
|
+
runtime sets `progress` to `<done>/<total> done`, merged into the owner's curated
|
|
274
|
+
fields, so the model never spends a turn reporting status. Todo titles are private work
|
|
275
|
+
text and are never published; a cleared list removes the line, and a withdrawn state
|
|
276
|
+
stays withdrawn until the owner publishes again.
|
|
277
|
+
Keep small direct tasks exempt. Do not add a model turn solely to publish or emit
|
|
278
|
+
per-tool/token updates.
|
|
273
279
|
|
|
274
280
|
Use `objective` for the goal, `progress` for current and next scope, and `blockers`
|
|
275
281
|
for anything preventing progress. Use `state.work` for relevant area/topic and
|
|
@@ -36,6 +36,11 @@ In this order:
|
|
|
36
36
|
`GENTLE_SHELL_HOME` directory is removed only when Gentle Shell created it
|
|
37
37
|
(its `.gentle-shell-home` marker, or its setup record in
|
|
38
38
|
`~/.gentle-shell/config.json`); otherwise it is listed as kept.
|
|
39
|
+
- `~/.gentle-shell/gentle-ai`: the isolated home's own settings (profiles,
|
|
40
|
+
banner and the other preferences). The `gentle-ai` folder next to a
|
|
41
|
+
`GENTLE_SHELL_HOME` is only listed as kept, since it may not be Gentle
|
|
42
|
+
Shell's. When `GENTLE_PI_CONFIG_HOME` names it, the config home rules
|
|
43
|
+
below apply instead.
|
|
39
44
|
- `~/.gentle-shell/config.json`: the launcher settings.
|
|
40
45
|
2. **Shared Gentle AI configuration**, only when you accept it (see below).
|
|
41
46
|
3. **The `gentle-pi` package**, with the package manager that owns it:
|
|
@@ -43,7 +48,9 @@ In this order:
|
|
|
43
48
|
`npm uninstall -g gentle-pi`.
|
|
44
49
|
4. **`~/.gentle-shell`**, only when it is empty.
|
|
45
50
|
|
|
46
|
-
The config home is `GENTLE_PI_CONFIG_HOME`, or `~/.pi/gentle-ai
|
|
51
|
+
The config home is `GENTLE_PI_CONFIG_HOME`, or `~/.pi/gentle-ai`: the one Pi
|
|
52
|
+
with Gentle AI, `--link` and custom homes use, and where the main channel keeps
|
|
53
|
+
its builds. The isolated home's own folder is removed with the data above.
|
|
47
54
|
|
|
48
55
|
## Shared configuration
|
|
49
56
|
|
package/docs/gentle-shell.md
CHANGED
|
@@ -8,7 +8,7 @@ Source map: [shell extension](../extensions/gentle-shell.ts), [shell bar](../lib
|
|
|
8
8
|
|
|
9
9
|
## Updating Pi safely
|
|
10
10
|
|
|
11
|
-
Run `gentle-shell update` to update the Pi this launcher runs. Shell verifies npm/pnpm global listing JSON and canonical package roots before installing exactly one supplying package. This supports pnpm v11 linked stores without relying on `PNPM_HOME` containment. When the launcher runs its adjacent Pi peer, the supplier is the listed `gentle-pi` package itself: Shell is reinstalled at its current version so the package manager re-resolves the peer, because updating a separate global Pi never changes the peer a Shell install runs. A Pi found on `PATH` or through `GENTLE_SHELL_PI` is updated through its own listed global package; a package-manager shim is followed to the single `cli.js` it names. Pi and Shell are never combined into a comma install.
|
|
11
|
+
Run `gentle-shell update` to update the Pi this launcher runs. It also works when that Pi is older than the required minimum version, which every other command refuses. Shell verifies npm/pnpm global listing JSON and canonical package roots before installing exactly one supplying package. This supports pnpm v11 linked stores without relying on `PNPM_HOME` containment. When the launcher runs its adjacent Pi peer, the supplier is the listed `gentle-pi` package itself: Shell is reinstalled at its current version so the package manager re-resolves the peer, because updating a separate global Pi never changes the peer a Shell install runs. A Pi found on `PATH` or through `GENTLE_SHELL_PI` is updated through its own listed global package; a package-manager shim is followed to the single `cli.js` it names. Pi and Shell are never combined into a comma install.
|
|
12
12
|
|
|
13
13
|
Unknown or ambiguous ownership, npm source/link packages, and pnpm groups shared with other top-level packages refuse without installation changes. Separate groups in one aggregated listing are allowed. After the install, Shell reads the supplied Pi version back from a fresh listing and reports whether it changed. pnpm installs only releases older than its `minimumReleaseAge` setting (pnpm 11 defaults to 4320 minutes), so a very recent Pi release is picked up once it is old enough; Shell reports that rule instead of overriding it. Package managers run from the system temporary directory so a project's `packageManager` pin never changes which pnpm answers. Use the supplying package manager for source checkouts or unsupported layouts. `gentle-shell update --extensions-only` remains an extension-only Pi command; prefix-bundled Pi still updates with `gentle-shell upgrade`. See [managing packages](readme-reference.md#managing-packages) for the ownership contract.
|
|
14
14
|
|
|
@@ -21,7 +21,7 @@ The [v2.6.0 release](https://github.com/Gentleman-Programming/gentle-pi/releases
|
|
|
21
21
|
- The Agents List and Details views preserve the orchestrator/session hierarchy and completion, abort, and lost-exit history. Parent-child queries and notifications have an explicit handoff path, while model, effort, and usage stay observable per task.
|
|
22
22
|
- Named `/gentle:profiles` atomically route the orchestrator separately from packaged and review roles; see the [technical reference](readme-reference.md#agent-model-profiles) for the profile model.
|
|
23
23
|
|
|
24
|
-
The source checkout prepares `gentle-pi` `4.0.0` with a package-local Gentle AI `v4.
|
|
24
|
+
The source checkout prepares `gentle-pi` `4.0.0` with a package-local Gentle AI `v4.2.0` pin; this does not imply that the package release has been published.
|
|
25
25
|
|
|
26
26
|
## Shell interactions and runtime behavior
|
|
27
27
|
|
|
@@ -90,9 +90,10 @@ Captured evidence (`gentle-pi.session-change/v1`) is still stored for session st
|
|
|
90
90
|
|
|
91
91
|
### Browse changes
|
|
92
92
|
|
|
93
|
-
`/gentle:changes` or `alt+g` opens the two-pane viewer. Worktrees are accordion groups on the left; each file row leads with its
|
|
93
|
+
`/gentle:changes` or `alt+g` opens the two-pane viewer full screen, like Gentle Agents. Worktrees are accordion groups on the left; each file row leads with its status marker (`M` modified, `A` new and staged, `U` new and untracked, `D` deleted, `R` renamed), then its name, its line counts and its directory. Selecting a file shows its full path on the first row of the right pane (clipped from the left so the name stays visible) and its diff against HEAD below it; untracked files show their full content.
|
|
94
94
|
|
|
95
95
|
- `j`/`k` or arrows navigate. On a group, Enter, Space or Right expands it; Left returns to its parent or collapses it. `ctrl+j/k` or Page Up/Down scroll the diff; Escape or `q` closes.
|
|
96
|
+
- `F` toggles diff-only mode at any width: the file list and its separator hide so the diff uses the full width. There `j`/`k` still move between files (across worktrees; the path row shows which), the scroll keys and the wheel scroll the diff, `o`/Enter and `r` keep working, the first Escape returns to the file list, and `q` closes. Every opening starts with the file list visible.
|
|
96
97
|
- Fullscreen left-click selects files; mouse wheels scroll the file list and diff independently. Hovering an unselected row (worktree or file, in either pane's list) paints it in the same shared hover role every clickable surface in the shell uses; it never opens or selects the file, and never overrides the already-selected row's own role.
|
|
97
98
|
- Opening, pressing `r`, and the overlay's refresh cadence re-read each root's Git status; a same-line-count edit reloads the open diff.
|
|
98
99
|
- On a file, `o` or Enter opens the actual current file in `$VISUAL` or `$EDITOR`, with its worktree as cwd.
|
|
@@ -291,7 +292,7 @@ The `todo` tool and its card replace the third-party todo extension (remove `npm
|
|
|
291
292
|
The runtime helps keep the list current beyond a static tool description:
|
|
292
293
|
|
|
293
294
|
- `write` replaces the whole list in one call, so the model rewrites the plan instead of patching it; `add`, `update`, `clear`, and `list` remain for single moves.
|
|
294
|
-
- Each agent run's system prompt carries the same byte-stable rules block (in_progress before starting, done right after finishing, update before ending the run), so the cached prompt prefix never changes because of the list. While tasks stay open, the current list reaches the model as a hidden
|
|
295
|
+
- Each agent run's system prompt carries the same byte-stable rules block (in_progress before starting, done right after finishing, update before ending the run), so the cached prompt prefix never changes because of the list. While tasks stay open, the current list reaches the model as a hidden conversation message appended whenever the list changes, and closing the list appends a hidden "no open tasks" marker; the list never enters the system prompt and requests stay append-only, so status, title, note and ordering changes cost only the tail of the conversation and keep the provider prompt cache (Anthropic breakpoints, openai-codex input deltas) warm. When the conversation no longer holds the current list (after compaction, branch navigation, or in a session recorded before this behavior), the next request carries it once and it is appended again.
|
|
295
296
|
- A list that goes two agent runs untouched while pending or in-progress tasks remain turns amber with `stale · N turns` on the card; that age is shown to the human only.
|
|
296
297
|
- Within a long run, after four tool-use model turns without a successful todo write, the next model request receives one hidden, request-local reminder to review the plan. A successful `write`, `add`, `update`, or `clear` resets and rearms it; `list` and rejected writes do not. The turn containing the write does not count toward the threshold. Empty, finished and blocked-only plans receive no reminder. Reminder tracking restarts when the session loads; it does not change the existing card freshness, persist a message, start an extra model turn, change task statuses, or connect to subagents.
|
|
297
298
|
|
package/docs/install-wizard.md
CHANGED
|
@@ -59,7 +59,7 @@ it lets the window close.
|
|
|
59
59
|
Current requirements come from `package.json` and
|
|
60
60
|
[`gentle-ai-installer.mjs`](../scripts/gentle-ai-installer.mjs): Node ≥22.19.0,
|
|
61
61
|
Pi ≥1.2.0, pnpm acquisition 11.1.1, Gentle Shell package 4.0.0 and package-local
|
|
62
|
-
Gentle AI 4.
|
|
62
|
+
Gentle AI 4.2.0. Windows native source builds require Go ≥1.25.10 when the
|
|
63
63
|
required usable native binary is missing. A reusable binary does not require Go.
|
|
64
64
|
When a build needs Go and the user's Go is missing, older or unchecked, the installer uses
|
|
65
65
|
its own [pinned Go](#pinned-go) instead of blocking.
|
|
@@ -1029,6 +1029,13 @@ again, or add `$PNPM_HOME/bin` to PATH manually. For `acquire-go`, a detail
|
|
|
1029
1029
|
starting with `Conflicting Go destination: ` selects
|
|
1030
1030
|
`guidance.goDestinationConflict`: a folder from an earlier, interrupted run is in
|
|
1031
1031
|
the way and is never replaced; remove that folder and run the installer again.
|
|
1032
|
+
For `install-version` and `install-global`, a detail with `spawn UNKNOWN` selects
|
|
1033
|
+
`guidance.codeIntegrityBlocked`: libuv reports a Windows code integrity refusal
|
|
1034
|
+
(Smart App Control, CodeIntegrity event 3077) of the `gentle-ai.exe` that
|
|
1035
|
+
gentle-pi's postinstall builds as `spawn UNKNOWN`. Windows has no per-program
|
|
1036
|
+
exception, so the guidance offers WSL or turning Smart App Control off (on
|
|
1037
|
+
Windows 11 it cannot be turned back on without reinstalling Windows) instead of
|
|
1038
|
+
network and registry advice.
|
|
1032
1039
|
`scripts/installer-runner.mjs` exports the frozen
|
|
1033
1040
|
arrays `blockedReasons` and `failedSteps`; a test requires guidance for exactly
|
|
1034
1041
|
those entries, and the runner tests check that every reason and step their
|
package/docs/permission-modes.md
CHANGED
|
@@ -52,7 +52,7 @@ Changing the default does **not** change the current session. To return this ses
|
|
|
52
52
|
| --- | --- |
|
|
53
53
|
| **Normal** | Existing permission behavior; the default when no valid global preference exists. |
|
|
54
54
|
| **Auto** | A separate reviewer using the current session model checks eligible actions against live user intent before execution. Local reads are classified too; locality does not exempt an action from explicit restrictions. |
|
|
55
|
-
| **YOLO** | Standing permission for ordinary already-authorized work and delivery; no Auto classifier. Destructive and independent consent boundaries remain. [Full YOLO details](yolo-mode.md). |
|
|
55
|
+
| **YOLO** | Standing permission for ordinary already-authorized work and delivery; no Auto classifier. Destructive and independent consent boundaries remain, except recursive removal of the session's own [temp scratch](yolo-mode.md#temp-scratch-removal). [Full YOLO details](yolo-mode.md). |
|
|
56
56
|
|
|
57
57
|
## Commands and menu
|
|
58
58
|
|