---
name: techscan-2
description: Tech Score (1-5 star website/tech rating) continuation. Handover of the known-outcome scoring job, the one-owner-per-directory rule, and where the ledger and categoriser live. Read with techscan.md.
sources: [cowork]
aliases: [tech-score, casig-tech-score, stars]
---

# Tech Score, part 2 (continues [[techscan]])

## Product split (Ben's names)

[stated] Two products, two Cowork sessions.
[stated] **Tech Score** = the 1-to-5 star rating of a project based on its website and what we can see there. Lives in `/opt/casig`.
[stated] **Price Predict** = the runner prediction (scam / nowhere / 1-5M / 5-50M / huge runner). Lives in `/opt/trench`. See [[trench-model-2]].

## One owner per directory (rule, agreed this session)

Two Cowork sessions were editing `/opt/casig` at the same time on 14 Sep 2026 (a `score` table gained columns one session never defined; `bak-20260914-0402/` and `patch_casig2.py` appeared from the other). Rule from here:

- `/opt/casig` is owned by the **Tech Score session**.
- `/opt/trench` is owned by the **Price Predict session**.
- `/opt/cleaner` either may touch, but announce it first.

A session that needs a change in a directory it does not own asks the owner session instead of editing.

## Handover: the known-outcome scoring job

[stated] Ben approved handing this job to the Tech Score session ("Yes, you can hand it that job").

**The job.** Score the websites of the tokens whose real peak market cap we already know, so we can answer the actual question: do winners have better sites than losers.

- Source population lives in the Price Predict DB: **1,159 tokens with a known peak**. Split: 139 above $5M, 118 at $1M-5M, 239 at $100k-1M, 663 dead.
- About **125 of those already have a website on file** in the casig cache, so they can be scored with no new crawling.
- Work **biggest peak first**, so the strong-tech sample fills before the long tail.

**Constraints.**

- Tag these rows through the existing `cohort_of(age_min, mcap)` machinery in `ledger.py`. Do **not** add a new column for it. `training_rows(cohort='trench')` must stay clean; known-outcome rows that are not young launches belong in `reference_rows()`.
- **Time-shift caveat:** a mature project's site *today* is not its site at launch. A known-outcome score is evidence about the rubric, not a training row for a launch-time model, unless the snapshot really is from launch time.
- Ben's original idea was to score mature / high-market-cap projects to build a base of strong tech. Pushback given and accepted: known-outcome tokens are strictly better, because they carry a label. Mature-project scoring is still fine as a *rubric calibration* set, kept in `reference_rows()`.

**Known 5-star anchors already in the cache (Ben named SGT and H Farm):**

- hoodfarm.io `0x99f5359b422a47e4482b938979d5af9202531ea4` (5 stars)
- surrogate.finance `0x5f22f87723240963d2f516bcb7c1f099d4c27126` (5 stars)
- maul.lol `0x76a218d74e016d9a57319bc24f4e297001c6ce85`
- pairex.market `0xb8cf4ad387cfd607c66a207cfffc46498aacd9d6`

## State of `/opt/casig` at handover

- `ledger.py` — append-only score ledger. Contract address, final score, full breakdown of how it got there. Now also carries `cohort_of()`, `training_rows()`, `reference_rows()` (written by the other session).
- `kinds.py` — the categoriser. Two axes: **SHAPE** (meme / meme+tech / tech, what kind of object it is) and **SCORE** (1-5 within that shape, how good an example it is). 13 evidence-matched categories, an `unmatched` vocabulary harvest, and `propose()` which auto-proposes a new category once 4+ unmatched sites share a term. The category list grows itself over time, which was Ben's requirement.
- `stars.py` — the scorer. Ledger and categoriser wired in.
- `casig.py` — the crawler.
- `tech.py` — the lookup tool: `tech.py`, `top`, `<ca|symbol>`, `site <x>`, `why <n>`, `outcome`. Built because Ben's real point about the empty ledger was **access**, not coverage.
- `import_cache.py` — already run, imported 945 historical ratings. Top of scale went from 1 five-star to 4 five-star and 9 four-star.
- `outcome_backfill.py` — **stopped mid-run, wrote zero rows.** Nothing half-formed. This script is what the Tech Score session should take over or replace.

## Rules that bit us here and must not repeat

- **A host with no dot is not a domain.** X handles (`MEADGod` and similar) were being crawled as websites; 23 of the first 49 ledger rows were junk. The guard lives at the point of use, not only in `channels()`, because a caller bypassed it once.
- **Never rebuild a function from a prefix or a slice to the next `def` when patching.** Replace the exact span, then assert every expected symbol still resolves. Two patches silently deleted working code this way.
- **Never assert that a thing lacks a feature without opening it and looking.** Claimed the Tech Score ledger did not exist and built one; a richer one already existed.
- The categoriser must not read invented fields, and must not assume a field's type (`headings` is sometimes a count). The Cleaner has a `categoriser_reads` check for this.
- MEME_HINTS must stay tight. With `"$"` and `"degen"` in it, PAIREX classified as meme+tech.

## Still open

- Surface shape and category in the GMGN overlay popup and in the Price Predict report.
- Add shape and category as Price Predict features, then test the meta hypothesis: **category hit rate by time window** (certain project types do better in certain periods). This is the whole point of the meta idea.
- Build the locked reference set (~20 hand-checked projects spanning 1-5 stars) for the gate.
- A Cleaner page, rather than only the log and the printed scorecard. See [[the-cleaner]].
