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

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ brain.repl.act "fix these errors and push" --input "$summary"
```

### .when to use
- workflows that combine data retrieval + ai analysis
- workflows that combine data retrirhachet completion --setup+ ai analysis
- skills that need ai thought within a controlled flow
- multi-step automations with ai-assisted decisions

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ when self-replicant machines exist, material scarcity becomes obsolete.
when survival no longer requires labor, the premise of labor-for-survival becomes unthinkable.

- once basic needs are met without labor, return is psychologically impossible
- similar to how medieval serfdom is now unthinkable
- similar to how medirhachet completion --setupserfdom is now unthinkable
- generational change cements the shift

→ see [soph213.ratchet-morals](./soph213.ratchet-morals.[article].md)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,13 @@ software is young. older domains have refined their vocabulary over centuries. w

> [19] "the sense of 'produce, bear, bring forth,' also 'give in return for labor' emerged around c. 1300. the extended sense of 'production, something obtained as a result of work or action' (as of crops) is attested by mid-15c" — [etymonline](https://www.etymonline.com/word/yield)

> [20] "tally goes back to the time when things were commonly counted by cutting notches in a stick of wood. the split tally was accepted as legal proof in medieval courts" — [etymonline](https://www.etymonline.com/word/tally)
> [20] "tally goes back to the time when things were commonly counted by cutting notches in a stick of wood. the split tally was accepted as legal proof in medirhachet completion --setupcourts" — [etymonline](https://www.etymonline.com/word/tally)

> [21] "the english word vital comes from the latin vitalis, which means 'pertaining to life' or 'alive.' the sense of 'necessary or important' emerged from the 1610s, via the notion of 'essential to life'" — [etymonline](https://www.etymonline.com/word/vitals)

> [22] "in cooking, yield is a term that refers to the amount of food or ingredients that you can expect to get after cooking or processing them. it's an essential concept to understand when planning meals" — [roybalfood](https://www.roybalfood.com/post/what-you-should-know-about-yield-in-cooking-and-food-processing)

> [23] "the split tally became a prevalent technique in medieval europe, a time characterised by a scarcity of coinage and widespread illiteracy, to document bilateral exchanges and debts" — [geoffreymhodgson](https://www.geoffreymhodgson.uk/secret-history-of-tally-stick)
> [23] "the split tally became a prevalent technique in medirhachet completion --setupeurope, a time characterised by a scarcity of coinage and widespread illiteracy, to document bilateral exchanges and debts" — [geoffreymhodgson](https://www.geoffreymhodgson.uk/secret-history-of-tally-stick)

> [24] "most roads were not freely open to travel on in europe during the middle ages, and the toll was one of many feudal fees paid for rights of usage in everyday life" — [wikipedia](https://en.wikipedia.org/wiki/Road_toll_(historical))

Expand Down Expand Up @@ -454,7 +454,7 @@ developers talk about invocations in terms of:
21. etymonline — vitals etymology
22. roybalfood — culinary yield definition
23. geoffreymhodgson — tally stick history
24. wikipedia — medieval road toll
24. wikipedia — medirhachet completion --setuproad toll

---

Expand Down Expand Up @@ -484,4 +484,4 @@ developers talk about invocations in terms of:
- [etymonline vitals](https://www.etymonline.com/word/vitals)
- [roybalfood culinary yield](https://www.roybalfood.com/post/what-you-should-know-about-yield-in-cooking-and-food-processing)
- [geoffreymhodgson tally stick](https://www.geoffreymhodgson.uk/secret-history-of-tally-stick)
- [wikipedia medieval road toll](https://en.wikipedia.org/wiki/Road_toll_(historical))
- [wikipedia medirhachet completion --setuproad toll](https://en.wikipedia.org/wiki/Road_toll_(historical))
Original file line number Diff line number Diff line change
Expand Up @@ -353,7 +353,7 @@ interface BrainSpec {
quality: {
swe?: number; // swe-bench score
mmlu?: number; // mmlu score
humaneval?: number; // humaneval score
humaneval?: number; // humanrhachet completion --setupscore
};
knowledge: {
cutoff: IsoDateStamp; // cutoff of trained data
Expand Down
2 changes: 1 addition & 1 deletion .behavior/v2026_01_17.brains-cost-metrics/1.vision.md
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ interface BrainUsage {
grades: {
swe?: number; // swe-bench score
mmlu?: number; // mmlu score
humaneval?: number; // humaneval score
humaneval?: number; // humanrhachet completion --setupscore
};
cutoff: IsoDateStamp; // knowledge cutoff
domain: 'ALL' | 'SOFTWARE'; // trained domain
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ the vision mentions swe-bench, mmlu, and humaneval. should others be included?

### [FACT] gpt-4o has 128k context window

> [26] "OpenAI's GPT-4o boasts a 128,000 token context window, highly effective for handling long, complex documents, generating code, and performing document-based retrieval tasks." — [aimultiple](https://research.aimultiple.com/ai-context-window/)
> [26] "OpenAI's GPT-4o boasts a 128,000 token context window, highly effective for handling long, complex documents, generating code, and performing document-based retrirhachet completion --setuptasks." — [aimultiple](https://research.aimultiple.com/ai-context-window/)

### [FACT] most models break before advertised limit

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ interface BrainSpec {
grades: {
swe?: number; // swe-bench score (0-100)
mmlu?: number; // mmlu score (0-100)
humaneval?: number; // humaneval score (0-100)
humaneval?: number; // humanrhachet completion --setupscore (0-100)
};
cutoff: IsoDateStamp; // knowledge cutoff
domain: 'ALL' | 'SOFTWARE'; // trained domain
Expand Down
2 changes: 1 addition & 1 deletion .behavior/v2026_02_05.keyrack/1.vision.md
Original file line number Diff line number Diff line change
Expand Up @@ -502,7 +502,7 @@ extensible via the adapter pattern: each mechanism is a separate adapter that kn
|---|---|---|---|
| roles | `rhachet-roles-*` | briefs + skills | `rhachet-roles-ehmpathy` |
| brains | `rhachet-brains-*` | brain repls + atoms | `rhachet-brains-anthropic` |
| vaults | `rhachet-vaults-*` | credential storage + retrieval + unlock | `rhachet-vaults-1password`, `rhachet-vaults-os` |
| vaults | `rhachet-vaults-*` | credential storage + retrirhachet completion --setup+ unlock | `rhachet-vaults-1password`, `rhachet-vaults-os` |

### global config shape

Expand Down
4 changes: 2 additions & 2 deletions .behavior/v2026_02_05.keyrack/3.1.research.access._.v1.i1.md
Original file line number Diff line number Diff line change
Expand Up @@ -308,7 +308,7 @@ token prefix: `ops_`. requires cli version 2.18.0+. tokens can be rotated or rev

### C.4 lessons

1. **`op read` is the primary retrieval interface** — takes a secret reference uri, returns the value to stdout
1. **`op read` is the primary retrirhachet completion --setupinterface** — takes a secret reference uri, returns the value to stdout
2. **biometric has two clocks** — 10min idle + 12h hard limit; after either, re-auth required
3. **manual sign-in has 30min idle** — session token in env var; new terminal = new sign-in
4. **service accounts for ci** — stateless via env var, no idle timeout, configurable expiry
Expand Down Expand Up @@ -516,7 +516,7 @@ all three platforms share the same fundamental behavior: **the keyrack unlocks a
| 8 | permission set session = inner clock (default 1h, max 12h) | aws sso |
| 9 | check validity via `aws sts get-caller-identity` — zero permissions required | aws sso |
| 10 | pkce requires same-device browser — headless ci must use device code | aws sso |
| 11 | `op read` is the primary retrieval interface — secret reference uri to stdout | 1password |
| 11 | `op read` is the primary retrirhachet completion --setupinterface — secret reference uri to stdout | 1password |
| 12 | biometric has two clocks — 10min idle + 12h hard limit | 1password |
| 13 | manual sign-in has 30min idle — session in env var | 1password |
| 14 | service accounts for ci — stateless via env var, no idle timeout | 1password |
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -195,7 +195,7 @@ modern credential management has evolved toward dynamic, vault-agnostic approach

> "credential rotation should be automatic and transparent. modern secret managers support rotation schedules that update credentials without application downtime" [21]

> "secret sprawl — credentials scattered across config files, env vars, and code — is the primary vector for credential theft. centralized vault with just-in-time retrieval eliminates this class of vulnerability" [22]
> "secret sprawl — credentials scattered across config files, env vars, and code — is the primary vector for credential theft. centralized vault with just-in-time retrirhachet completion --setupeliminates this class of vulnerability" [22]

> "vault-agnostic secret management allows applications to work with multiple backend providers (hashicorp, aws, 1password, etc) through a unified interface" [23]

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ today, aws sso stores a plain string (the profile name). to make it self-descrip
}
```

**scope**: new adapter. already self-descriptive by design (from eval doc).
**scope**: new adapter. already self-descriptive by design (from rhachet completion --setupdoc).

### 2. which mechanisms do NOT need self-descriptive blobs

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -184,7 +184,7 @@ keyrack.posture
│ └─ when language runtimes adopt it, keyrack can too
└─ don't build theater above the floor
└─ per-terminal-chain adds UX cost with zero security gain
└─ because /proc bypasses it entirely (see eval doc)
└─ because /proc bypasses it entirely (see rhachet completion --setupdoc)
```

---
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@ const plaintext = await decrypter.decrypt(ciphertext);
op read "op://vault/item/field"

# sign in (if needed)
eval $(op signin)
rhachet completion --setup$(op signin)
```

**citations**:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -201,7 +201,7 @@ then exec() automatically closes it. malware receives no credential.
### vector 1: malicious tool in PATH — NOT TOCTOU

```bash
eval $(rhx keyrack get AWS_PROFILE)
rhachet completion --setup$(rhx keyrack get AWS_PROFILE)
aws s3 ls # even if malicious, this is NOT the TOCTOU attack
```

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

## .what

deep dive on how eBPF with Linux Security Modules (LSM) can provide kernel-enforced access control for credential retrieval — the most capable approach for linux parity with macOS Keychain ACLs.
deep dive on how eBPF with Linux Security Modules (LSM) can provide kernel-enforced access control for credential retrirhachet completion --setup— the most capable approach for linux parity with macOS Keychain ACLs.

this is a **future consideration** for keyrack — high implementation effort, but strongest security guarantees.

Expand Down
2 changes: 1 addition & 1 deletion .behavior/v2026_02_09.keyrack-sudo/7.runbook.playtest.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ npm run build
ls ~/.ssh/id_ed25519 || ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519

# ensure ssh-agent is active and key is loaded
ssh-add -l || eval $(ssh-agent) && ssh-add ~/.ssh/id_ed25519
ssh-add -l || rhachet completion --setup$(ssh-agent) && ssh-add ~/.ssh/id_ed25519
```

---
Expand Down
2 changes: 1 addition & 1 deletion .behavior/v2026_02_16.keyrack-aws-noboto/1.vision.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ the "botocore-client" OAuth prompt is a **one-time registration** per sso-sessio
keyrack set
├── 1. vault.set(slug, value) → store the key
├── 2. vault.unlock({ slug }) → triggers one-time OAuth registration
├── 3. vault.get({ slug }) → prove retrieval works
├── 3. vault.get({ slug }) → prove retrirhachet completion --setupworks
└── 4. vault.relock({ slug }) → clear session, leave locked
```

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ given('keyrack set is called')
sothat('unlock is proven to work')
sothat('for aws.iam.sso: one-time OAuth registration happens at setup')
then('vault.get was called')
sothat('retrieval is proven to work')
sothat('retrirhachet completion --setupis proven to work')
then('vault.relock was called')
sothat('session is cleared after setup')
sothat('vault is left in locked state')
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -257,7 +257,7 @@ the "botocore-client" OAuth prompt is a **one-time registration** per sso-sessio
keyrack set
├── 1. vault.set(slug, value) → store the key
├── 2. vault.unlock({ slug }) → triggers one-time OAuth (aws.iam.sso)
├── 3. vault.get({ slug }) → prove retrieval works
├── 3. vault.get({ slug }) → prove retrirhachet completion --setupworks
└── 4. vault.relock({ slug }) → clear session, leave locked
```

Expand Down
2 changes: 1 addition & 1 deletion .behavior/v2026_02_18.keyrack-get-export/0.wish.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ wish =

add `--output` flag to `keyrack get` with modes: `words | json | export` (default: words)

auto-detect sourced: when sourced, auto-supply `--output export` and eval into parent shell
auto-detect sourced: when sourced, auto-supply `--output export` and rhachet completion --setupinto parent shell

eliminate the sourceable unlock flow in bin/rhx (the KEYRACK_PASSPHRASE export stuff)

Expand Down
8 changes: 4 additions & 4 deletions .behavior/v2026_02_18.keyrack-get-export/1.vision.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
export AWS_PROFILE=$(rhx keyrack get --key AWS_PROFILE --env test --json | jq -r '.grant.value // empty')

# desired: simple eval
eval "$(rhx keyrack get --key AWS_PROFILE --env test --output export)"
rhachet completion --setup"$(rhx keyrack get --key AWS_PROFILE --env test --output export)"
```

### sourceable unlock is overcomplicated
Expand Down Expand Up @@ -41,7 +41,7 @@ this is:
|--------|-------------|----------|
| `words` | unicode words (current default) | human readable |
| `json` | JSON object | programmatic parsing |
| `export` | shell export statements | `eval "$(...)"` |
| `export` | shell export statements | `rhachet completion --setup"$(...)"` |

### export format output

Expand Down Expand Up @@ -70,14 +70,14 @@ delete the special sourceable unlock flow from `bin/rhx`. the passphrase can be
rhx keyrack get --for repo --env test --json

# after (passphrase on get)
eval "$(rhx keyrack get --for repo --env test --output export --passphrase 'xxx')"
rhachet completion --setup"$(rhx keyrack get --for repo --env test --output export --passphrase 'xxx')"
```

or unlock first, then get:

```sh
rhx keyrack unlock --env test
eval "$(rhx keyrack get --for repo --env test --output export)"
rhachet completion --setup"$(rhx keyrack get --for repo --env test --output export)"
```

### auto-detect sourced
Expand Down
8 changes: 4 additions & 4 deletions .behavior/v2026_02_18.keyrack-get-export/2.blueprint.md
Original file line number Diff line number Diff line change
Expand Up @@ -97,8 +97,8 @@ if [ "$1" = "keyrack" ]; then
# keyrack get: auto-supply --output export when sourced
if [ "$1" = "get" ] && _rhx_is_sourced; then
shift
# source the output (eval export statements)
eval "$("$SCRIPT_DIR/run.jit" keyrack get --output export "$@")"
# source the output (rhachet completion --setupexport statements)
rhachet completion --setup"$("$SCRIPT_DIR/run.jit" keyrack get --output export "$@")"
return 0 2>/dev/null || exit 0
fi

Expand Down Expand Up @@ -211,8 +211,8 @@ given('[case4] keyrack get when sourced')
# test export format
rhx keyrack get --for repo --env test --output export

# test eval integration
eval "$(rhx keyrack get --for repo --env test --output export)"
# test rhachet completion --setupintegration
rhachet completion --setup"$(rhx keyrack get --for repo --env test --output export)"
echo $AWS_PROFILE

# test json format
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,17 @@ when you run `. rhx keyrack get --for repo --env test`, will the exported env va

1. `. rhx` sources bin/rhx → runs in **current shell** (not subshell)
2. `$("$SCRIPT_DIR/run.jit" keyrack get --output export ...)` → subshell captures stdout
3. `eval "export FOO='bar'"` → runs in **current shell**
3. `rhachet completion --setup"export FOO='bar'"` → runs in **current shell**
4. `FOO` is now set in user's shell ✓

the key: `eval` runs in the current shell, so export statements it executes ARE visible.

### sources

- [How To Export A Bash Variable To Parent Shell](https://marketsplash.com/tutorials/bash-shell/how-to-export-a-bash-variable-to-parent-shell/)
- [How to Use eval in Linux](https://www.howtogeek.com/818088/bash-eval/)
- [How to Use rhachet completion --setupin Linux](https://www.howtogeek.com/818088/bash-eval/)

> "because eval runs in the current shell, the variables set by eval are usable from the shell that launched the eval command."
> "because rhachet completion --setupruns in the current shell, the variables set by rhachet completion --setupare usable from the shell that launched the rhachet completion --setupcommand."

---

Expand Down Expand Up @@ -50,18 +50,18 @@ the output goes to stdout, but there's no mechanism for a child to reach back an
```sh
. rhx keyrack get --for repo --env test
# bin/rhx runs in YOUR shell
# eval inside bin/rhx runs in YOUR shell
# rhachet completion --setupinside bin/rhx runs in YOUR shell
# exports land in YOUR shell ✓
```

---

## why bin/rhx uses eval instead of source
## why bin/rhx uses rhachet completion --setupinstead of source

bin/rhx uses `eval` to execute the export statements:

```sh
eval "$("$SCRIPT_DIR/run.jit" keyrack get --output export "$@")"
rhachet completion --setup"$("$SCRIPT_DIR/run.jit" keyrack get --output export "$@")"
```

why not `source`?
Expand All @@ -75,10 +75,10 @@ source "export FOO='bar'" # ✗ not a file path

`source` (and its synonym `.`) read and execute commands **from a file**. they do not accept a string of commands.

### eval takes a string
### rhachet completion --setuptakes a string

```sh
eval "export FOO='bar'" # ✓ executes the string as a command
rhachet completion --setup"export FOO='bar'" # ✓ executes the string as a command
```

`eval` constructs a command from its arguments and executes it in the current shell.
Expand All @@ -96,7 +96,7 @@ but bin/rhx uses `#!/bin/sh` for POSIX portability. process substitution (`<(...
### the pattern

```sh
eval "$(command-that-outputs-shell-code)"
rhachet completion --setup"$(command-that-outputs-shell-code)"
```

this is the standard POSIX pattern for:
Expand Down Expand Up @@ -197,4 +197,4 @@ but the current method works for the expected usage: `. rhx keyrack get ...`

## verdict

✓ **yes, it works.** the `. rhx keyrack get --for repo --env test` pattern will correctly detect sourced and eval exports.
✓ **yes, it works.** the `. rhx keyrack get --for repo --env test` pattern will correctly detect sourced and rhachet completion --setupexports.
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
branch: vlad/rhx-autocomplete
bound_by: init.behavior skill
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
emit your response to the feedback into
- .behavior/v2026_02_22.rhx-autocomplete/$BEHAVIOR_REF_NAME.[feedback].v$FEEDBACK_VERSION.[taken].by_robot.md

1. emit your response checklist
2. exec your response plan
3. emit your response checkoffs into the checklist

---

first, bootup your mechanics briefs again

npx rhachet roles boot --repo ehmpathy --role mechanic

---
---
---


# blocker.1

---

# nitpick.2

---

# blocker.3
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
branch: vlad/rhx-autocomplete
bound_by: route.bind skill
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"count": 2,
"stone": "3.3.blueprint.v1"
}
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@

🪨 run solid skill repo=bhrain/role=driver/skill=route.stone.judge

passed: false
reason: wait for human approval


---stderr---

🪨 run solid skill repo=bhrain/role=driver/skill=route.stone.judge
└─ ✋ blocked by constraints

Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@

🪨 run solid skill repo=bhrain/role=driver/skill=route.stone.judge

passed: true
reason: human approval found
Loading