housebroken-cli 0.3.0__tar.gz → 0.4.0__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 (23) hide show
  1. {housebroken_cli-0.3.0 → housebroken_cli-0.4.0}/PKG-INFO +2 -1
  2. {housebroken_cli-0.3.0 → housebroken_cli-0.4.0}/README.md +1 -0
  3. {housebroken_cli-0.3.0 → housebroken_cli-0.4.0}/bin/housebroken +2 -0
  4. {housebroken_cli-0.3.0 → housebroken_cli-0.4.0}/pyproject.toml +1 -1
  5. housebroken_cli-0.4.0/scripts/claim-check.sh +67 -0
  6. {housebroken_cli-0.3.0 → housebroken_cli-0.4.0}/skills/housebroken/SKILL.md +8 -2
  7. {housebroken_cli-0.3.0 → housebroken_cli-0.4.0}/.gitignore +0 -0
  8. {housebroken_cli-0.3.0 → housebroken_cli-0.4.0}/LICENSE +0 -0
  9. {housebroken_cli-0.3.0 → housebroken_cli-0.4.0}/hatch_build.py +0 -0
  10. {housebroken_cli-0.3.0 → housebroken_cli-0.4.0}/scripts/branch-check.sh +0 -0
  11. {housebroken_cli-0.3.0 → housebroken_cli-0.4.0}/scripts/check-ai-policy.sh +0 -0
  12. {housebroken_cli-0.3.0 → housebroken_cli-0.4.0}/scripts/comment-census.sh +0 -0
  13. {housebroken_cli-0.3.0 → housebroken_cli-0.4.0}/scripts/diff-defaults.sh +0 -0
  14. {housebroken_cli-0.3.0 → housebroken_cli-0.4.0}/scripts/distinct-outside.sh +0 -0
  15. {housebroken_cli-0.3.0 → housebroken_cli-0.4.0}/scripts/file-pr.sh +0 -0
  16. {housebroken_cli-0.3.0 → housebroken_cli-0.4.0}/scripts/fork-hygiene.sh +0 -0
  17. {housebroken_cli-0.3.0 → housebroken_cli-0.4.0}/scripts/inbox.sh +0 -0
  18. {housebroken_cli-0.3.0 → housebroken_cli-0.4.0}/scripts/notes.sh +0 -0
  19. {housebroken_cli-0.3.0 → housebroken_cli-0.4.0}/scripts/pr-sweep.sh +0 -0
  20. {housebroken_cli-0.3.0 → housebroken_cli-0.4.0}/scripts/prior-art.sh +0 -0
  21. {housebroken_cli-0.3.0 → housebroken_cli-0.4.0}/scripts/verify-filed-pr.sh +0 -0
  22. {housebroken_cli-0.3.0 → housebroken_cli-0.4.0}/src/housebroken/__init__.py +0 -0
  23. {housebroken_cli-0.3.0 → housebroken_cli-0.4.0}/src/housebroken/cli.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: housebroken-cli
3
- Version: 0.3.0
3
+ Version: 0.4.0
4
4
  Summary: Agent-written pull requests that do not make a mess in someone else's house.
5
5
  Project-URL: Repository, https://github.com/lenamonj/housebroken
6
6
  License-Expression: MIT
@@ -146,6 +146,7 @@ uv tool install git+https://github.com/lenamonj/housebroken
146
146
  | `scripts/prior-art.sh` | issues and pull requests on the touched files, type stated, rulings quoted |
147
147
  | `scripts/comment-census.sh` | added code versus added comments, per branch |
148
148
  | `scripts/diff-defaults.sh` | default arguments and one-line wrappers added to keep call sites untouched |
149
+ | `scripts/claim-check.sh` | every falsifiable claim in a body or a reply, listed to re-derive |
149
150
  | `scripts/branch-check.sh` | the branch's mechanical facts: clean tree, file modes, artifacts, absolute claims |
150
151
  | `scripts/file-pr.sh` | the only way a pull request gets filed |
151
152
  | `scripts/verify-filed-pr.sh` | the filed pull request is what was meant, and CI settled |
@@ -134,6 +134,7 @@ uv tool install git+https://github.com/lenamonj/housebroken
134
134
  | `scripts/prior-art.sh` | issues and pull requests on the touched files, type stated, rulings quoted |
135
135
  | `scripts/comment-census.sh` | added code versus added comments, per branch |
136
136
  | `scripts/diff-defaults.sh` | default arguments and one-line wrappers added to keep call sites untouched |
137
+ | `scripts/claim-check.sh` | every falsifiable claim in a body or a reply, listed to re-derive |
137
138
  | `scripts/branch-check.sh` | the branch's mechanical facts: clean tree, file modes, artifacts, absolute claims |
138
139
  | `scripts/file-pr.sh` | the only way a pull request gets filed |
139
140
  | `scripts/verify-filed-pr.sh` | the filed pull request is what was meant, and CI settled |
@@ -48,6 +48,7 @@ usage: housebroken <subcommand> [args...]
48
48
  1 outside count outside contributors merged in the last 120 days
49
49
  2 prior-art issues and pull requests on the touched files, rulings quoted
50
50
  6 census added code lines against added comment lines, per branch
51
+ 6 claims every falsifiable claim in outbound text, listed to re-derive
51
52
  9 branch the mechanical facts about the branch: tree, modes, artifacts, claims
52
53
  9 file the only way a pull request gets filed
53
54
  10 verify the filed pull request is what was meant, and CI settled
@@ -90,6 +91,7 @@ case "$cmd" in
90
91
  outside) script=distinct-outside.sh ;;
91
92
  prior-art) script=prior-art.sh ;;
92
93
  census) script=comment-census.sh ;;
94
+ claims) script=claim-check.sh ;;
93
95
  branch) script=branch-check.sh ;;
94
96
  file) script=file-pr.sh ;;
95
97
  verify) script=verify-filed-pr.sh ;;
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "housebroken-cli"
7
- version = "0.3.0"
7
+ version = "0.4.0"
8
8
  description = "Agent-written pull requests that do not make a mess in someone else's house."
9
9
  dynamic = ["readme"]
10
10
  license = "MIT"
@@ -0,0 +1,67 @@
1
+ #!/bin/bash
2
+ # claim-check.sh - lists every claim in outbound text that a maintainer can
3
+ # falsify, so each one gets re-derived before it is sent.
4
+ #
5
+ # On microsoft/GSL #1272 a reply draft said "The five new static_asserts fail on
6
+ # main." A reviewer falsified it in one pass. The number had come from a red arm
7
+ # that grepped only for `static assertion failed`, so it counted five matches
8
+ # and never saw the twenty-one other errors beside them; and against the commit
9
+ # a maintainer would actually revert to, only four of the five fail. The
10
+ # sentence named a basis and was still wrong about it.
11
+ #
12
+ # So this does not try to judge a claim. Text checks cannot: the bad sentence
13
+ # named its revision and read perfectly. It lists them, and the rule in step 6
14
+ # is that every listed line is re-measured, at the moment of writing, against
15
+ # the exact revision the sentence names. The gap this closes is that until now
16
+ # every gate here read code and nothing read the prose, while the prose is what
17
+ # the maintainer reads first.
18
+ #
19
+ # Usage:
20
+ # bash claim-check.sh FILE
21
+ # bash claim-check.sh --help
22
+ #
23
+ # Exits 1 when it finds claims to re-derive, 0 when it finds none, 2 on a usage
24
+ # error. Exit 1 is not a refusal to send; it is a refusal to send unread.
25
+ set -u
26
+
27
+ usage() { awk 'NR>1 && /^#/ {sub(/^# ?/, ""); print; next} NR>1 {exit}' "$0"; }
28
+
29
+ case "${1:-}" in
30
+ --help|-h) usage; exit 0 ;;
31
+ "") echo "REFUSED: name the file holding the text" >&2; exit 2 ;;
32
+ esac
33
+ file="$1"
34
+ [ -f "$file" ] || { echo "REFUSED: $file does not exist" >&2; exit 2; }
35
+
36
+ # Strip fenced code and quoted logs: a number inside pasted output is evidence,
37
+ # not a claim being made.
38
+ body=$(awk '/^```/ {fence = !fence; next} !fence && !/^ *[|>]/ {print NR": "$0}' "$file")
39
+
40
+ quantified=$(printf '%s
41
+ ' "$body" | grep -nEi '[0-9]+ *(of|/) *[0-9]+|\b([0-9]+|one|two|three|four|five|six|seven|eight|nine|ten|no) +([a-z_-]+ +){0,3}(tests?|assertions?|static_asserts?|checks?|errors?|failures?|jobs?|files?|warnings?|projects?|commits?|suites?)\b' | cut -d: -f2-)
42
+
43
+ absolute=$(printf '%s\n' "$body" | grep -nEi \
44
+ '\b(only|exactly|always|never|every|all|none|nothing|everything|guaranteed|any)\b' \
45
+ | cut -d: -f2-)
46
+
47
+ found=0
48
+ if [ -n "$quantified" ]; then
49
+ found=1
50
+ echo "COUNTED: re-derive each, against the revision the sentence names, now:"
51
+ printf '%s\n' "$quantified" | sed 's/^/ /'
52
+ fi
53
+ if [ -n "$absolute" ]; then
54
+ found=1
55
+ echo "ABSOLUTE: falsify each against the code, not against your memory of it:"
56
+ printf '%s\n' "$absolute" | sed 's/^/ /'
57
+ fi
58
+
59
+ if [ "$found" -eq 0 ]; then
60
+ echo "claim-check: no falsifiable claim found in $file"
61
+ exit 0
62
+ fi
63
+ echo
64
+ echo "claim-check: $file makes claims a maintainer can check. Re-measure each"
65
+ echo "one before sending. A sentence that names its revision can still be wrong"
66
+ echo "about it; that is the failure this exists for."
67
+ exit 1
@@ -118,7 +118,11 @@ report it in one line and do not proceed to the next step.
118
118
  you reproduced on the fresh clone in this session, never a line carried
119
119
  from a journal. No tool footer, no session link, no
120
120
  co-author trailer, no typographic dashes. When a template asks whether AI
121
- was used, answer in one truthful sentence.
121
+ was used, answer in one truthful sentence. Run `housebroken claims` over
122
+ the body and re-measure every line it lists, now, against the exact
123
+ revision that sentence names. A claim that names its revision can still
124
+ be wrong about it, which is why the listing is the whole gate: the
125
+ re-derivation is yours to do.
122
126
 
123
127
  7. **Know the paperwork.**
124
128
  Before the first pull request to an organization, find its agreement: CLA,
@@ -157,7 +161,9 @@ report it in one line and do not proceed to the next step.
157
161
  on every open pull request. A list of who commented is not a read, and a
158
162
  conversion to draft is a review. Act on every human item, then run
159
163
  `housebroken inbox --ack`. Answer every maintainer comment the same day,
160
- in the user's voice. Rework what is asked for as a second commit so the reviewer sees
164
+ in the user's voice, and run `housebroken claims` over the reply before
165
+ it is posted: the only claim that has gone out wrong here was in a
166
+ reply, not a body. Rework what is asked for as a second commit so the reviewer sees
161
167
  the change. When the maintainer is
162
168
  right, concede in one sentence and let them close it. Never nudge a
163
169
  silent maintainer without the user's explicit word. After answering a
File without changes